【質問】学校の課題では実行例が381回なのですが、以下のコードでは実行回数が1349回になってしまいます。「47〜55行目が違います」と返信が来ました。どう直せばいいですか?
【課題】
番号とテストの得点が格納されたデータファイルのファイル名(20 文字以内)をキーボードから入力し,構造体配列 seiseki にファイルのデータを保存してレコード件数を表示する.
その後,実行例の通り得点の降順にシェルソートで整列して表示させ,最後に配列要素の交換回数を表示させること(シェルソート以外の方法でプログラムした場合は受領しません).なお,ギャップは方法1(クヌースの方法)で求めること.
以上、よろしくお願いします。
c
1#include<stdio.h> 2#include<stdlib.h> 3int main(void) 4 5{ 6 char filename[21]; 7 FILE *fp; 8 struct seisekiA{ 9 int bango, tokuten; 10 }; 11 struct seisekiA seiseki[100]; 12 int n=0,cnt=0; 13 int i,j,work,gap,m; 14 15 printf("ファイル名を入力してください\n"); 16 scanf("%s",filename); 17 if((fp=fopen(filename,"r"))==NULL) 18 { 19 printf("FILE OPEN ERROR\n"); 20 exit(1); 21 } 22 printf("番号 得点\n"); 23 24 while(fscanf(fp,"%d%d",&seiseki[n].bango,&seiseki[n].tokuten)!=EOF) 25 { 26 printf("%4d %4d\n",seiseki[n].bango,seiseki[n].tokuten); 27 n++; 28 } 29 printf("レコード件数=%d\n",n); 30 printf("整列結果\n"); 31 32 gap=1; 33 while(gap*3+1 <= n) 34 gap = gap*3+1; 35 36 while(gap>0) 37 { 38 for(cnt=0; cnt<gap; cnt++) 39 { 40 i = gap+cnt; 41 while(i<n) 42 { 43 j = i; 44/************************************************ここから************************************************/ 45 while(j>=gap && seiseki[j-gap].bango<seiseki[j].bango,j>=gap && seiseki[j-gap].tokuten<seiseki[j].tokuten) 46 { 47 work = seiseki[j].tokuten; 48 seiseki[j].tokuten = seiseki[j-gap].tokuten; 49 seiseki[j-gap].tokuten = work; 50 51 work = seiseki[j].bango; 52 seiseki[j].bango = seiseki[j-gap].bango; 53 seiseki[j-gap].bango = work; 54/************************************************ここまで************************************************/ 55 56 j -= gap; 57 cnt++; 58 59 } 60 i += gap; 61 } 62 } 63 gap/=3; 64 } 65 66 for(i=0; i<n; i++) 67 { 68 69 printf("%4d %4d\n",seiseki[i].bango ,seiseki[i].tokuten); 70 } 71 72 fclose(fp); 73 printf("比較回数=%d\n",cnt); 74 75 return 0; 76} 77
回答1件
あなたの回答
tips
プレビュー