回答編集履歴

1

追加

2017/06/12 16:54

投稿

A.Ichi
A.Ichi

スコア4070

test CHANGED
@@ -183,3 +183,189 @@
183
183
 
184
184
 
185
185
  ```
186
+
187
+
188
+
189
+ こちらの方が分かり易いと思います。最小値で入れ替えが発生します。
190
+
191
+ ```c
192
+
193
+ #include <stdio.h>
194
+
195
+ #include <string.h>
196
+
197
+
198
+
199
+ typedef struct
200
+
201
+ {
202
+
203
+ char name[40];
204
+
205
+ int population;
206
+
207
+ int area;
208
+
209
+ double density;
210
+
211
+ } pref_t;
212
+
213
+
214
+
215
+ pref_t syokika(char name[], int population, int area)
216
+
217
+ {
218
+
219
+ pref_t z;
220
+
221
+ strcpy(z.name, name);
222
+
223
+ z.population = population;
224
+
225
+ z.area = area;
226
+
227
+ z.density = (double)population / (double)area;
228
+
229
+
230
+
231
+ return (z);
232
+
233
+ }
234
+
235
+
236
+
237
+ void sentaku_sort(pref_t pref[47])
238
+
239
+ {
240
+
241
+
242
+
243
+ int i, j, p;
244
+
245
+ double min;
246
+
247
+ pref_t temp, mini;
248
+
249
+ int sw = 0; //入れ替えスイッチ
250
+
251
+
252
+
253
+ for (i = 0; i < 46; i++)
254
+
255
+ {
256
+
257
+ sw=0;
258
+
259
+ mini = pref[i]; //暫定的に先頭を最小の人口密度とする
260
+
261
+ for (j = i + 1; j < 47; j++) //このループを抜けるとminiに人口密度が最小の都道府県が入る
262
+
263
+ {
264
+
265
+ if (mini.density > pref[j].density)
266
+
267
+ {
268
+
269
+ p = j; //人口密度最小がどこにあったのかを記憶しておく
270
+
271
+ mini = pref[j]; //人口密度が最小の都道府県そのものを入れる
272
+
273
+ sw=1;
274
+
275
+ }
276
+
277
+ } //中のループここまで
278
+
279
+ //ここからは実際に構造体ごと入れ替える
280
+
281
+ if (sw==1){
282
+
283
+ temp = pref[i];
284
+
285
+ pref[i] = mini;
286
+
287
+ pref[p] = temp;
288
+
289
+ }
290
+
291
+ }
292
+
293
+ }
294
+
295
+
296
+
297
+ int main()
298
+
299
+ {
300
+
301
+
302
+
303
+ char name[40];
304
+
305
+ int area;
306
+
307
+ int population;
308
+
309
+ FILE *fp;
310
+
311
+ fp = fopen("prefectures.txt", "r");
312
+
313
+ pref_t pref[47];
314
+
315
+ int i = 0;
316
+
317
+
318
+
319
+ if (fp == NULL)
320
+
321
+ {
322
+
323
+ printf("そのファイルは存在しません。\n");
324
+
325
+ }
326
+
327
+ else
328
+
329
+ {
330
+
331
+ while (fscanf(fp, "Name:%s Area:%d Population:%d\n", name, &area, &population) == 3)
332
+
333
+ {
334
+
335
+ pref[i] = syokika(name, population, area);
336
+
337
+ i++;
338
+
339
+ }
340
+
341
+ printf("%s\n",pref[46].name);//test1
342
+
343
+ sentaku_sort(pref);
344
+
345
+ printf("ここまでその2\n");//test2
346
+
347
+
348
+
349
+ for (i = 0; i < 47; i++)
350
+
351
+ {
352
+
353
+ printf("都道府県名:%s,面積:%d,人口:%d,人口密度:%lf\n", pref[i].name, pref[i].area, pref[i].population, pref[i].density);
354
+
355
+ }
356
+
357
+
358
+
359
+ }
360
+
361
+
362
+
363
+ fclose(fp);
364
+
365
+ return 0;
366
+
367
+ }
368
+
369
+ ```
370
+
371
+