回答編集履歴

8

改良

2016/11/14 23:21

投稿

A.Ichi
A.Ichi

スコア4070

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

追加

2016/11/14 23:21

投稿

A.Ichi
A.Ichi

スコア4070

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

追加

2016/11/13 23:49

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
File without changes

5

追加

2016/11/13 23:41

投稿

A.Ichi
A.Ichi

スコア4070

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

追加

2016/11/13 23:41

投稿

A.Ichi
A.Ichi

スコア4070

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

訂正

2016/11/13 23:31

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -32,11 +32,13 @@
32
32
 
33
33
 
34
34
 
35
- for (q=arr; q - arr < N - 1; q++){
35
+ for (p=arr; p - arr < N - 1; p++){
36
36
 
37
- for (minidx = q + 1; minidx - q < N; minidx++){
37
+ for (q = arr + N - 1; q > p; q--) {
38
38
 
39
+ minidx=q-1;
40
+
39
- if(*q < *minidx){
41
+ if (*minidx > *q){
40
42
 
41
43
  tmp = *q;
42
44
 

2

訂正

2016/11/12 05:17

投稿

A.Ichi
A.Ichi

スコア4070

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

訂正

2016/11/12 04:32

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -14,7 +14,7 @@
14
14
 
15
15
  {
16
16
 
17
- double arr[N+1];
17
+ double arr[N];
18
18
 
19
19
  double tmp;
20
20