C言語関係掲示板

過去ログ

No862 整数型配列に対するクイックソートのプログラム

[戻る] [ホームページ]
No.11135

お願いします!!☆
投稿者---kiyomi(2003/12/12 20:25:24)


私自身未熟者なので、どこがどう間違っているのか、
なぜエラーが出てしまうのか分かりません。
ご指導いただけたら嬉しいです。
お願いします!!


問1 (q2-1.c)
ファイルkokudo.txtを読み込み,国道番号順(昇順)に整列を行うプログラムq2-1.cを作成せよ. kokudo.txtの整列結果はファイルq2-1.txt に保存すること.


/* 整数型配列に対するクイックソートのプログラム */

#include <stdio.h>

typedef struct{
int number;
char siten[20];
char syuten[20];
double kyori;
}
kokudo;


void quick_sort (kokudo a[], int left, int right)
{
int i, j;
int pivot;
int kokudo x;

if(left >= right) return;

pivot = a[right].number;
i = left; j = right-1;
for(;;){
while(a[i].number < pivot) i++;
while(i < j && pivot < a[j].number) j--;
if(i < j){
x = a[i]; a[i] = a[j]; a[j] = x;
}else {
break;
}
}
x = a[i]; a[i] = a[right]; a[right] = x;

quick_sort (a, left, i-1);
quick_sort (a, i+1, right);
}



/* 動作テスト用の関数 */
int main (void)
{
data kokudo[100];

FILE *infp;
FILE *outfp;
char sline[LEN];
int i = 0;
int michi;

infp=fopen("kokudo.txt", "r");
if(infp == NULL){
printf("can not open file\n");
exit(1);
}

while(fgets(sline,LEN,infp) != NULL){
sscanf(sline,"%d %s %s %lf\n", &data[i].number, data[i].siten, data[i].syuten, &data[i].kyori);
michi = i;
i++;
}fclose(infp);

quick_sort(data, 0, michi);

outfp=fopen("q2-1.txt", "w");

for(i = 0; i < michi; i++){
fprintf(outfp,"%d %s %s %lf\n", &data[i].number, data[i].siten, data[i].syuten, &data[i].kyori);
}
fclose(outfp);
}

☆↓ kokudo.txt です☆
238 Abashiri Wakkanai 320.8
274 Sapporo Shibetsu 302.9
38 Takikawa Kushiro 297.6
229 Otaru Esashi 287.5
5 Hakodate Sapporo 282.7
275 Sapporo Hamatonbetsu 281.6
40 Asahikawa Wakkanai 249.8
39 Asahikawa Abashiri 217.0
242 Abashiri Obihiro 184.7
273 Obihiro Monbetsu 168.0
237 Asahikawa Urakawa 160.8
230 Sapporo Kitahiyama 159.7
228 Hakodate Esashi 151.5
241 Teshikaga Obihiro 151.2
336 Urakawa Kushiro 150.6
239 Abashiri Rumoi 149.4
12 Sapporo Asahikawa 145.2
244 Abashiri Nemuro 143.5
243 Abashiri Nemuro 140.8
36 Sapporo Muroran 131.9
231 Sapporo Rumoi 129.1
232 Wakkanai Rumoi 128.8
236 Obihiro Urakawa 126.7
44 Kushiro Nemuro 124.1
334 Rausu Bihoro 121.6
240 Kushiro Abashiri 117.9
391 Kushiro Abashiri 116.2
235 Muroran Urakawa 116.1
278 Hakodate Mori 114.2
276 Esashi Tomakomai 110.2
452 Yubari Asahikawa 109.6
333 Asahikawa Tanno 106.5
272 Kushiro Shibetsu 100.0
453 Sapporo Date 88.8
37 Oshamanbe Muroran 81.1
337 Chitose Otaru 77.1
227 Hakodate Esashi 69.8
234 Iwamizawa Tomakomai 69.5
451 Rumoi Takikawa 54.9
393 Otaru Kucchan 51.4
233 Asahikawa Rumoi 50.9
335 Rausu Shibetsu 42.7
392 Kushiro Honbetsu 35.0
277 Esashi Yakumo 33.2
279 Hakodate Hakodate 1.8
280 Fukushima Hakodate 0.0
338 Hakodate Hakodate 0.0
450 Asahikawa Monbetsu 0.0





No.11136

Re:お願いします!!☆
投稿者---たか(2003/12/12 20:58:23)


> int kokudo x;

> data kokudo[100];

kokudoっていうのは構造体のtypedefですから、型名とみなせます。
ゆえに上の2つの変数宣言はエラーです。

/* 整数型配列に対するクイックソートのプログラム */

#include <stdio.h>
#include <stdlib.h>

#define LEN 128

typedef struct {
  int number;
  char siten[20];
  char syuten[20];
  double kyori;
} kokudo;


void quick_sort (kokudo a[], int left, int right)
{
  int i, j;
  int pivot;
  kokudo x;

  if(left >= right) return;

  pivot = a[right].number;
  i = left; j = right-1;
  for(;;) {
    while(a[i].number < pivot) i++;
    while(i < j && pivot < a[j].number) j--;
    if (i < j) {
      x = a[i]; a[i] = a[j]; a[j] = x; 
    } else {
      break;
    }
  }
  x = a[i]; a[i] = a[right]; a[right] = x;

  quick_sort (a, left, i-1);
  quick_sort (a, i+1, right);
}

/* 動作テスト用の関数 */
int main(void)
{
  kokudo data[100];

  FILE *infp;
  FILE *outfp;
  char sline[LEN];
  int i = 0;
  int michi;

  infp = fopen("kokudo.txt", "r");
  if (infp == NULL) {
    printf("can not open input file\n");
    exit(1);
  } 

  while (fgets(sline, LEN, infp) != NULL) {
    sscanf(sline,"%d %s %s %lf\n", &data[i].number, data[i].siten, data[i].syuten, &data[i].kyori); 
    michi = i;
    i++;
  }

  fclose(infp);

  quick_sort(data, 0, michi);

  outfp = fopen("q2-1.txt", "w");
  if (outfp == NULL) {
    printf("can not open output file\n");
    exit(1);
  } 
  
  for (i = 0; i < michi; i++)
    fprintf(outfp,"%d %s %s %lf\n", data[i].number, data[i].siten, data[i].syuten, data[i].kyori);

  fclose(outfp);

  return 0;
}