名前、面積、人口、人口密度からなる構造体を配列で宣言し、テキストファイルから都道府県名、人口、面積を読み取って、そこから人口密度を計算し、配列に代入したら、人口密度でソート(選択ソート)し、表示せよという問題です。
C
1#include <stdio.h> 2#include <string.h> 3 4typedef struct 5{ 6 char name[40]; 7 int population; 8 int area; 9 double density; 10} pref_t; 11 12pref_t syokika(char name[], int population, int area) 13{ 14 pref_t z; 15 strcpy(z.name, name); 16 z.population = population; 17 z.area = area; 18 z.density = (double)population / (double)area; 19 20 return (z); 21} 22 23void sentaku_sort(pref_t pref[47]) 24{ 25 26 int i, j, p; 27 double min; 28 pref_t temp, mini; 29 30 for (i = 0; i < 46; i++) 31 { 32 min = pref[i].density;//暫定的に先頭を最小の人口密度とする 33 for (j = i + 1; j < 47; j++) //このループを抜けるとminiに人口密度が最小の都道府県が入る 34 { 35 if (min > pref[j].density) 36 { 37 p = j; //人口密度最小がどこにあったのかを記憶しておく 38 mini = pref[j]; //人口密度が最小の都道府県そのものを入れる 39 } 40 } //中のループここまで 41 //ここからは実際に構造体ごと入れ替える 42 temp = pref[i]; 43 pref[i] = mini; 44 pref[p] = temp; 45 } 46} 47 48int main() 49{ 50 51 char name[40]; 52 int area; 53 int population; 54 FILE *fp; 55 fp = fopen("prefectures.txt", "r"); 56 pref_t pref[47]; 57 int i = 0; 58 59 if (fp == NULL) 60 { 61 printf("そのファイルは存在しません。\n"); 62 } 63 else 64 { 65 while (fscanf(fp, "Name:%s Area:%d Population:%d\n", name, &area, &population) == 3) 66 { 67 pref[i] = syokika(name, population, area); 68 i++; 69 } 70 printf("%s\n",pref[46].name);//test1 71 sentaku_sort(pref); 72 printf("ここまでその2\n");//test2 73 74 for (i = 0; i < 47; i++) 75 { 76 printf("都道府県名:%s,面積:%d,人口:%d,人口密度:%lf\n", pref[i].name, pref[i].area, pref[i].population, pref[i].density); 77 } 78 79 } 80 81 fclose(fp); 82 return 0; 83} 84 85``````prefectures.txt 86 87Name:HOKKAIDO Area:83454 Population:5679000 88 89Name:AOMORI Area:9235 Population:1474000 90 91┇ 92┇ 93 94Name:OKINAWA Area:2272 Population:1329000 95
sentaku_sortが機能しておらず、実行してもtest2の「ここまでその2」が表示されていません。
test1はきちんと表示できているので、配列に代入自体は実装できています。
何か間違った書き方をしてしまっているのでしょうか…
ご教授お願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/12 16:17
2017/06/13 01:59 編集
2017/06/13 02:00