ページ 11

線形リストの課題についてお願いします

Posted: 2007年2月06日(火) 23:56
by umaibo
お世話になっております
下記の課題、よろしければお願いしますl

seiseki.cを修正し、合計点が高い順に生徒の成績が表示されるようにしなさい。
ただし、出力の部分を修正せずに、新しいデータを読み込んだら新規セルを線形リストのしかるべき位置に挿入するようなコーディングとすること。

lseiseki.c は、リスト2に示すような成績に関するデータを読み込み、リスト3に示すような成績表を出力するプログラムである。


1 /* lseiseki.c 成績データを線形リストを用いて処理する */
2 #include <stdio.h>
3 #include <malloc.h>
4
5 typedef struct seiseki{ /* 成績情報セルの構造 */
6 char name[20] ; /* 氏名 */
7 int score[5] ; /* 国語・数学・社会・理科・英語の点 */
8 struct seiseki *next;
9 } SEISEKI;
10
11 int main()
12 {
13 char fname[100]; /* 入力ファイルの名前 */
14 FILE *fp; /* ファイル管理構造体のアドレス */
15
16 char name[20]; /* データ読み込み用の変数 */
17 int kokugo, sansuu, syakai, rika, eigo ;
18
19 SEISEKI *root=NULL; /* 成績リストの根を指すポインター */
20 SEISEKI *p,*q; /* 成績リスト探索用のポインター変数 */
21 SEISEKI *x ; /* 新規セルへのポインター */
22 int sum; /* 合計点 */
23 int i,j;
24
25 printf( "成績ファイルの名前を指定して下さい>" );
26 gets( fname );
27 if( (fp=fopen(fname,"r")) ==NULL){
28 printf( "成績ファイルがオープン出来ません\n" );
29 exit(-1);
30 }
31
32 /* 成績データの読み込み */
33 while( 1 ){
34 if( fscanf( fp,"%s%d%d%d%d%d",name,&kokugo,&sansuu,
35 &syakai,&rika,&eigo ) != 6 ) break;
36 x = (SEISEKI *)malloc( sizeof(SEISEKI) );
37 if( x==NULL ) {
38 printf( "メモリー不足です\n" );
39 break;
40 }
41 strcpy( x->name, name );
42 x->score[0] = kokugo; x->score[1] = sansuu;
43 x->score[2] = syakai; x->score[3] = rika; x->score[4] = eigo;
44 x->next = NULL;
45 if( root== NULL ){
46 root = x;
47 }
48 else{
49 for( p=root; p->next!= NULL; p=p->next );
50 p->next = x;
51 }
52 }
53 fclose( fp ); /* これ以降ファイルはアクセスしない */
54
55 /* 成績データの表示 */
56 printf( "氏名 国語 算数 理科 社会 英語 合計\n");
57 for( p=root; p != NULL ; p = p->next ){
58 printf( "%10s",p->name );
59 for( i=0,sum=0 ; i<5 ; i++) {
60 sum += p->score;
61 printf( "%4d ",p->score);
62 }
63 printf( "%4d\n",sum);
64 }
65
66 /* 成績データの解放 */
67 for( p=root; p!=NULL ; ){
68 q = p->next;
69 free(p);
70 p = q;
71 }
72
73 return(0);
74 }

リスト2 seiseki.txt のリスト
katou 81 85 56 82 71
furukawa 65 73 65 83 80
shimizu 77 93 90 81 92
yamada 89 76 83 74 77
adachi 62 50 70 65 90
satou 90 85 91 92 95
doi 80 85 60 79 85
gotou 75 45 55 43 60
hasimoto 83 72 85 72 91
ueda 60 63 60 77 76
takahashi 80 100 70 85 79

リスト3 lseiseki.exe の出力の様子
氏名 国語 算数 理科 社会 英語 合計
katou 81 85 56 82 71 375
furukawa 65 73 65 83 80 366
shimizu 77 93 90 81 92 433
yamada 89 76 83 74 77 399
adachi 62 50 70 65 90 337
satou 90 85 91 92 95 453
doi 80 85 60 79 85 389
gotou 75 45 55 43 60 278
hasimoto 83 72 85 72 91 403
ueda 60 63 60 77 76 336
takahashi 80 100 70 85 79 414

Re:線形リストの課題についてお願いします

Posted: 2007年2月07日(水) 00:15
by box
> seiseki.cを修正し、合計点が高い順に生徒の成績が表示されるようにしなさい。
> ただし、出力の部分を修正せずに、新しいデータを読み込んだら新規セルを線形リストのしかるべき位置に挿入するようなコーディングとすること。

この仕様を満たすため、ご自分ではどこまで考えているかを示してください。