回答編集履歴
8
改良
answer
CHANGED
@@ -1,5 +1,37 @@
|
|
1
1
|
for文とポインタのみで作成してみました。
|
2
|
+
改良してみました。minidxが使えませんでしたが。。。
|
3
|
+
```c
|
4
|
+
#include <stdio.h>
|
5
|
+
#define N 5
|
2
6
|
|
7
|
+
int main()
|
8
|
+
{
|
9
|
+
double arr[N];
|
10
|
+
double tmp;
|
11
|
+
double *p,*q,*minidx;
|
12
|
+
printf("Please input %d double numbers\n", N);
|
13
|
+
|
14
|
+
for (p=arr; p - arr < N; p++ ){
|
15
|
+
scanf("%lf",p);
|
16
|
+
|
17
|
+
for (q=arr; p - q > 0; q++){
|
18
|
+
if (*p < *q){
|
19
|
+
tmp = *q;
|
20
|
+
*q = *p;
|
21
|
+
*p = tmp;
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
printf("Sorted data\n");
|
27
|
+
p=arr;
|
28
|
+
for (p=arr; p - arr < N; p++ ){
|
29
|
+
printf("%f\n", *p);
|
30
|
+
}
|
31
|
+
return 0;
|
32
|
+
}
|
33
|
+
```
|
34
|
+
|
3
35
|
```c
|
4
36
|
#include <stdio.h>
|
5
37
|
#define N 5
|
7
追加
answer
CHANGED
@@ -87,6 +87,25 @@
|
|
87
87
|
つたない説明ですので、ご質問にてカバーさせていただきます。
|
88
88
|
|
89
89
|
付録
|
90
|
+
```c
|
91
|
+
/* バブルソートを行う */
|
92
|
+
int BubSort(int x[ ], int n)
|
93
|
+
{
|
94
|
+
int i, j, temp;
|
95
|
+
|
96
|
+
for (i = 0; i < n - 1; i++) {
|
97
|
+
for (j = n - 1; j > i; j--) {
|
98
|
+
if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */
|
99
|
+
temp = x[j]; /* 交換する */
|
100
|
+
x[j] = x[j - 1];
|
101
|
+
x[j - 1]= temp;
|
102
|
+
}
|
103
|
+
}
|
104
|
+
/* ソートの途中経過を表示 */
|
105
|
+
ShowData(x, NUM_DATA);
|
106
|
+
}
|
107
|
+
}
|
108
|
+
```
|
90
109
|
```C
|
91
110
|
int main(void) {
|
92
111
|
double arr[5];
|
6
追加
answer
CHANGED
File without changes
|
5
追加
answer
CHANGED
@@ -86,6 +86,18 @@
|
|
86
86
|
|
87
87
|
つたない説明ですので、ご質問にてカバーさせていただきます。
|
88
88
|
|
89
|
+
付録
|
90
|
+
```C
|
91
|
+
int main(void) {
|
92
|
+
double arr[5];
|
93
|
+
double *p,*q;
|
94
|
+
p=arr;
|
95
|
+
q=&arr[4];
|
96
|
+
printf("Pointer q-p:%d",q - p );
|
97
|
+
return 0;
|
98
|
+
}
|
99
|
+
```
|
89
100
|
|
90
101
|
|
91
102
|
|
103
|
+
|
4
追加
answer
CHANGED
@@ -33,4 +33,59 @@
|
|
33
33
|
}
|
34
34
|
return 0;
|
35
35
|
}
|
36
|
-
```
|
36
|
+
```
|
37
|
+
---
|
38
|
+
ポインターのみで作成すると言う事は、多分ポインターの課題だと思い作成しました。
|
39
|
+
|
40
|
+
```c
|
41
|
+
for (p=arr; p - arr < N - 1; p++){
|
42
|
+
for (q = arr + N - 1; q > p; q--) {
|
43
|
+
minidx=q-1;
|
44
|
+
if (*minidx > *q){
|
45
|
+
tmp = *q;
|
46
|
+
*q = *minidx;
|
47
|
+
*minidx = tmp;
|
48
|
+
}
|
49
|
+
}
|
50
|
+
}
|
51
|
+
```
|
52
|
+
|
53
|
+
> double arr[N];
|
54
|
+
double tmp;
|
55
|
+
double *p,*q,*minidx;
|
56
|
+
|
57
|
+
|
58
|
+
arrは、doubleの配列です、この場合doubleが5個並んで存在している事になります。
|
59
|
+
同様に他のポインター(*p,*q,*minidx)もdoubleで定義しています。
|
60
|
+
意味はp,q,minidxは、ダブルの値を持つアドレスを示すポインターです。
|
61
|
+
> for (p=arr; p - arr < N - 1; p++){
|
62
|
+
|
63
|
+
p=arr;
|
64
|
+
&arr[0](アドレス)がforの最初、p=arr;で配列arrの先頭アドレスを p にセットします。
|
65
|
+
|
66
|
+
p++
|
67
|
+
先にp++の説明ですが、ポインターをインクレメント(+1)すると次のdouble分の長さの分のアドレスがセットされます。p++するとarr[1]を指す事になります。これで配列arr[0],[1]...と順番に差します。
|
68
|
+
|
69
|
+
例として char *c = "abcd"; とした場合ポインターcは'a'のアドレスを指します。
|
70
|
+
c++すると'b'が指せますし、或いは*(c+1)とも表現できます。
|
71
|
+
|
72
|
+
p - arr < N - 1;
|
73
|
+
pはfor分の中でarrの配列を0,1,2,3と順番に差していき、最終の4になったら終了させたいので
|
74
|
+
pのアドレスが配列[3]を指したら抜けて為にp - arr < 4 と指定しています。
|
75
|
+
中はバブルソートなので4個までで終了です。(この辺は大丈夫と思いますが)
|
76
|
+
|
77
|
+
p - arr
|
78
|
+
ポインターを引き算だとアドレスの差が答えでは?と思いますが、ポインターの引き算は
|
79
|
+
p++;と同様な0,1,2,3,4のアドレスの差でなくポインターの差が得られます。
|
80
|
+
|
81
|
+
> for (q = arr + N - 1; q > p; q--) {
|
82
|
+
|
83
|
+
昇順で並べると言う事なので極一般的バブルソートロジックを採用しています。(ググルとでます)
|
84
|
+
多くのサンプルは配列[i]で表現していますが、これをポインターに置き換えただけです。
|
85
|
+
今回は少ない回数で行う方法ですので、他の方法でも可能です。
|
86
|
+
|
87
|
+
つたない説明ですので、ご質問にてカバーさせていただきます。
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
3
訂正
answer
CHANGED
@@ -15,9 +15,10 @@
|
|
15
15
|
scanf("%lf",p);
|
16
16
|
}
|
17
17
|
|
18
|
-
for (
|
18
|
+
for (p=arr; p - arr < N - 1; p++){
|
19
|
-
for (
|
19
|
+
for (q = arr + N - 1; q > p; q--) {
|
20
|
+
minidx=q-1;
|
20
|
-
if(*
|
21
|
+
if (*minidx > *q){
|
21
22
|
tmp = *q;
|
22
23
|
*q = *minidx;
|
23
24
|
*minidx = tmp;
|
2
訂正
answer
CHANGED
@@ -16,7 +16,6 @@
|
|
16
16
|
}
|
17
17
|
|
18
18
|
for (q=arr; q - arr < N - 1; q++){
|
19
|
-
minidx = q;
|
20
19
|
for (minidx = q + 1; minidx - q < N; minidx++){
|
21
20
|
if(*q < *minidx){
|
22
21
|
tmp = *q;
|
1
訂正
answer
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
|
7
7
|
int main()
|
8
8
|
{
|
9
|
-
double arr[N
|
9
|
+
double arr[N];
|
10
10
|
double tmp;
|
11
11
|
double *p,*q,*minidx;
|
12
12
|
printf("Please input %d double numbers\n", N);
|