🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Q&A

解決済

2回答

2863閲覧

構造体で、4科目の合計点順に並び変えて表示する。

ksyiwk

総合スコア24

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

0グッド

0クリップ

投稿2019/12/24 09:51

C言語で構造体に格納された4科目の点数と合計点を高い順に表示したいのですが

番号 国語 数学 理科 社会 合計

1005 92 76 81 98 347
1005 92 76 81 98 347
1003 89 92 88 76 345
1002 78 65 70 62 275
1004 32 48 66 25 171

と番号1005が2度表示されて、1001が表示されません。どこがおかしいのでしょうか。

c言語

1#include<stdio.h> 2#define NINZU 5/* 学生の人数*/ 3#define KAMOKU 4/* 科目数*/ 4struct seiseki {/* 成績データ*/ 5 int no;/* 学生番号*/ 6 int ten[KAMOKU];/* 点数*/ 7 int goukei;/* 合計点*/ 8}; 9void set_goukei( struct seiseki *sp, int ninzu ); 10void sort_goukei( struct seiseki *sp, int ninzu ); 11int main( void ){ 12 struct seiseki mycls[NINZU] = { 13 {1001,85,74,63,90,0}, 14 {1002,78,65,70,62,0}, 15 {1003,89,92,88,76,0}, 16 {1004,32,48,66,25,0}, 17 {1005,92,76,81,98,0}, 18 }; 19 int i; 20 printf("番号 国語 数学 理科 社会 合計\n"); 21 set_goukei( mycls,NINZU );/* 合計点を求める*/ 22 sort_goukei( mycls,NINZU );/* 合計得点順に並べる*/ 23 /*** 結果の表示***/ 24 for ( i = 0; i < NINZU; i++ ) { 25 printf("%4d %4d %4d %4d %4d %4d\n",mycls[i].no, mycls[i].ten[0 26], mycls[i].ten[1],mycls[i].ten[2], mycls[i].ten[3], mycls[i].goukei ); 27} 28 29 return 0; 30} 31 32void set_goukei( struct seiseki *sp, int ninzu ){ 33 int i,j; 34for(i=0;i<ninzu;i++) { 35 for(j=0;j<ninzu-1;j++ ){ 36 (sp+i)->goukei=(sp+i)->goukei+(sp+i)->ten[j]; 37 } 38 } 39} 40 41void sort_goukei( struct seiseki *sp, int ninzu ){ 42 int i,j; 43 for (i=0;i<ninzu-1;i++){ 44 for (j=0;j<ninzu-1-i;j++){ 45 if((sp+j)->goukei<(sp+j+1)->goukei){ 46 *sp=*(sp+j); 47 *(sp+j)=*(sp+j+1); 48 *(sp+j+1)=*sp; 49 } 50 } 51 } 52} 53

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

修正しました。//修正のコメントを入れています。
尚、set_goukei内は修正しなくても動作しますが、NINZUが5件の場合のみ、たまたまうまくいっているだけです。NINZUが5件以外でも動作するようにしておきました。

C

1#include<stdio.h> 2#define NINZU 5 /* 学生の人数 */ 3#define KAMOKU 4 /* 科目数 */ 4struct seiseki { /* 成績データ */ 5 int no; /* 学生番号 */ 6 int ten[KAMOKU]; /* 点数 */ 7 int goukei; /* 合計点 */ 8}; 9void set_goukei(struct seiseki *sp, int ninzu); 10void sort_goukei(struct seiseki *sp, int ninzu); 11int main(void) 12{ 13 struct seiseki mycls[NINZU] = { 14 {1001, 85, 74, 63, 90, 0}, 15 {1002, 78, 65, 70, 62, 0}, 16 {1003, 89, 92, 88, 76, 0}, 17 {1004, 32, 48, 66, 25, 0}, 18 {1005, 92, 76, 81, 98, 0}, 19 }; 20 int i; 21 printf("番号 国語 数学 理科 社会 合計\n"); 22 set_goukei(mycls, NINZU); /* 合計点を求める */ 23 sort_goukei(mycls, NINZU); /* 合計得点順に並べる */ 24 /*** 結果の表示***/ 25 for (i = 0; i < NINZU; i++) { 26 printf("%4d %4d %4d %4d %4d %4d\n", mycls[i].no, 27 mycls[i].ten[0], mycls[i].ten[1], mycls[i].ten[2], 28 mycls[i].ten[3], mycls[i].goukei); 29 } 30 31 return 0; 32} 33 34void set_goukei(struct seiseki *sp, int ninzu) 35{ 36 int i, j; 37 for (i = 0; i < ninzu; i++) { 38 for (j = 0; j < KAMOKU; j++) { //修正 39 (sp + i)->goukei = (sp + i)->goukei + (sp + i)->ten[j]; 40 } 41 } 42} 43 44void sort_goukei(struct seiseki *sp, int ninzu) 45{ 46 int i, j; 47 struct seiseki temp; //修正 48 for (i = 0; i < ninzu - 1; i++) { 49 for (j = 0; j < ninzu - 1 - i; j++) { 50 if ((sp + j)->goukei < (sp + j + 1)->goukei) { 51 temp = *(sp + j); //修正 52 *(sp + j) = *(sp + j + 1); //修正 53 *(sp + j + 1) = temp; //修正 54 } 55 } 56 } 57} 58

投稿2019/12/25 02:47

tatsu99

総合スコア5493

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

sp=(sp+j);
この部分でspの中身が失われているのかと。

投稿2019/12/24 10:19

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問