回答編集履歴
8
改良
test
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
for文とポインタのみで作成してみました。
|
2
2
|
|
3
|
-
|
3
|
+
改良してみました。minidxが使えませんでしたが。。。
|
4
4
|
|
5
5
|
```c
|
6
6
|
|
@@ -28,6 +28,70 @@
|
|
28
28
|
|
29
29
|
scanf("%lf",p);
|
30
30
|
|
31
|
+
|
32
|
+
|
33
|
+
for (q=arr; p - q > 0; q++){
|
34
|
+
|
35
|
+
if (*p < *q){
|
36
|
+
|
37
|
+
tmp = *q;
|
38
|
+
|
39
|
+
*q = *p;
|
40
|
+
|
41
|
+
*p = tmp;
|
42
|
+
|
43
|
+
}
|
44
|
+
|
45
|
+
}
|
46
|
+
|
47
|
+
}
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
printf("Sorted data\n");
|
52
|
+
|
53
|
+
p=arr;
|
54
|
+
|
55
|
+
for (p=arr; p - arr < N; p++ ){
|
56
|
+
|
57
|
+
printf("%f\n", *p);
|
58
|
+
|
59
|
+
}
|
60
|
+
|
61
|
+
return 0;
|
62
|
+
|
63
|
+
}
|
64
|
+
|
65
|
+
```
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
```c
|
70
|
+
|
71
|
+
#include <stdio.h>
|
72
|
+
|
73
|
+
#define N 5
|
74
|
+
|
75
|
+
|
76
|
+
|
77
|
+
int main()
|
78
|
+
|
79
|
+
{
|
80
|
+
|
81
|
+
double arr[N];
|
82
|
+
|
83
|
+
double tmp;
|
84
|
+
|
85
|
+
double *p,*q,*minidx;
|
86
|
+
|
87
|
+
printf("Please input %d double numbers\n", N);
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
for (p=arr; p - arr < N; p++ ){
|
92
|
+
|
93
|
+
scanf("%lf",p);
|
94
|
+
|
31
95
|
}
|
32
96
|
|
33
97
|
|
7
追加
test
CHANGED
@@ -176,6 +176,44 @@
|
|
176
176
|
|
177
177
|
付録
|
178
178
|
|
179
|
+
```c
|
180
|
+
|
181
|
+
/* バブルソートを行う */
|
182
|
+
|
183
|
+
int BubSort(int x[ ], int n)
|
184
|
+
|
185
|
+
{
|
186
|
+
|
187
|
+
int i, j, temp;
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
for (i = 0; i < n - 1; i++) {
|
192
|
+
|
193
|
+
for (j = n - 1; j > i; j--) {
|
194
|
+
|
195
|
+
if (x[j - 1] > x[j]) { /* 前の要素の方が大きかったら */
|
196
|
+
|
197
|
+
temp = x[j]; /* 交換する */
|
198
|
+
|
199
|
+
x[j] = x[j - 1];
|
200
|
+
|
201
|
+
x[j - 1]= temp;
|
202
|
+
|
203
|
+
}
|
204
|
+
|
205
|
+
}
|
206
|
+
|
207
|
+
/* ソートの途中経過を表示 */
|
208
|
+
|
209
|
+
ShowData(x, NUM_DATA);
|
210
|
+
|
211
|
+
}
|
212
|
+
|
213
|
+
}
|
214
|
+
|
215
|
+
```
|
216
|
+
|
179
217
|
```C
|
180
218
|
|
181
219
|
int main(void) {
|
6
追加
test
CHANGED
File without changes
|
5
追加
test
CHANGED
@@ -174,10 +174,34 @@
|
|
174
174
|
|
175
175
|
|
176
176
|
|
177
|
-
|
177
|
+
付録
|
178
|
+
|
178
|
-
|
179
|
+
```C
|
180
|
+
|
179
|
-
|
181
|
+
int main(void) {
|
182
|
+
|
180
|
-
|
183
|
+
double arr[5];
|
184
|
+
|
181
|
-
|
185
|
+
double *p,*q;
|
186
|
+
|
182
|
-
|
187
|
+
p=arr;
|
188
|
+
|
183
|
-
|
189
|
+
q=&arr[4];
|
190
|
+
|
191
|
+
printf("Pointer q-p:%d",q - p );
|
192
|
+
|
193
|
+
return 0;
|
194
|
+
|
195
|
+
}
|
196
|
+
|
197
|
+
```
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
|
206
|
+
|
207
|
+
|
4
追加
test
CHANGED
@@ -69,3 +69,115 @@
|
|
69
69
|
}
|
70
70
|
|
71
71
|
```
|
72
|
+
|
73
|
+
---
|
74
|
+
|
75
|
+
ポインターのみで作成すると言う事は、多分ポインターの課題だと思い作成しました。
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
```c
|
80
|
+
|
81
|
+
for (p=arr; p - arr < N - 1; p++){
|
82
|
+
|
83
|
+
for (q = arr + N - 1; q > p; q--) {
|
84
|
+
|
85
|
+
minidx=q-1;
|
86
|
+
|
87
|
+
if (*minidx > *q){
|
88
|
+
|
89
|
+
tmp = *q;
|
90
|
+
|
91
|
+
*q = *minidx;
|
92
|
+
|
93
|
+
*minidx = tmp;
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
}
|
98
|
+
|
99
|
+
}
|
100
|
+
|
101
|
+
```
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
> double arr[N];
|
106
|
+
|
107
|
+
double tmp;
|
108
|
+
|
109
|
+
double *p,*q,*minidx;
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
arrは、doubleの配列です、この場合doubleが5個並んで存在している事になります。
|
116
|
+
|
117
|
+
同様に他のポインター(*p,*q,*minidx)もdoubleで定義しています。
|
118
|
+
|
119
|
+
意味はp,q,minidxは、ダブルの値を持つアドレスを示すポインターです。
|
120
|
+
|
121
|
+
> for (p=arr; p - arr < N - 1; p++){
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
p=arr;
|
126
|
+
|
127
|
+
&arr[0](アドレス)がforの最初、p=arr;で配列arrの先頭アドレスを p にセットします。
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
p++
|
132
|
+
|
133
|
+
先にp++の説明ですが、ポインターをインクレメント(+1)すると次のdouble分の長さの分のアドレスがセットされます。p++するとarr[1]を指す事になります。これで配列arr[0],[1]...と順番に差します。
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
例として char *c = "abcd"; とした場合ポインターcは'a'のアドレスを指します。
|
138
|
+
|
139
|
+
c++すると'b'が指せますし、或いは*(c+1)とも表現できます。
|
140
|
+
|
141
|
+
|
142
|
+
|
143
|
+
p - arr < N - 1;
|
144
|
+
|
145
|
+
pはfor分の中でarrの配列を0,1,2,3と順番に差していき、最終の4になったら終了させたいので
|
146
|
+
|
147
|
+
pのアドレスが配列[3]を指したら抜けて為にp - arr < 4 と指定しています。
|
148
|
+
|
149
|
+
中はバブルソートなので4個までで終了です。(この辺は大丈夫と思いますが)
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
p - arr
|
154
|
+
|
155
|
+
ポインターを引き算だとアドレスの差が答えでは?と思いますが、ポインターの引き算は
|
156
|
+
|
157
|
+
p++;と同様な0,1,2,3,4のアドレスの差でなくポインターの差が得られます。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
> for (q = arr + N - 1; q > p; q--) {
|
162
|
+
|
163
|
+
|
164
|
+
|
165
|
+
昇順で並べると言う事なので極一般的バブルソートロジックを採用しています。(ググルとでます)
|
166
|
+
|
167
|
+
多くのサンプルは配列[i]で表現していますが、これをポインターに置き換えただけです。
|
168
|
+
|
169
|
+
今回は少ない回数で行う方法ですので、他の方法でも可能です。
|
170
|
+
|
171
|
+
|
172
|
+
|
173
|
+
つたない説明ですので、ご質問にてカバーさせていただきます。
|
174
|
+
|
175
|
+
|
176
|
+
|
177
|
+
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
3
訂正
test
CHANGED
@@ -32,11 +32,13 @@
|
|
32
32
|
|
33
33
|
|
34
34
|
|
35
|
-
for (
|
35
|
+
for (p=arr; p - arr < N - 1; p++){
|
36
36
|
|
37
|
-
for (
|
37
|
+
for (q = arr + N - 1; q > p; q--) {
|
38
38
|
|
39
|
+
minidx=q-1;
|
40
|
+
|
39
|
-
if(*
|
41
|
+
if (*minidx > *q){
|
40
42
|
|
41
43
|
tmp = *q;
|
42
44
|
|
2
訂正
test
CHANGED
@@ -34,8 +34,6 @@
|
|
34
34
|
|
35
35
|
for (q=arr; q - arr < N - 1; q++){
|
36
36
|
|
37
|
-
minidx = q;
|
38
|
-
|
39
37
|
for (minidx = q + 1; minidx - q < N; minidx++){
|
40
38
|
|
41
39
|
if(*q < *minidx){
|
1
訂正
test
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
|
15
15
|
{
|
16
16
|
|
17
|
-
double arr[N
|
17
|
+
double arr[N];
|
18
18
|
|
19
19
|
double tmp;
|
20
20
|
|