C言語で、昇順にしたいです。char meibo[45][50]; に歴代US大統領名簿が格納されてあり、例えば第ID代iの大統領氏名はprintf("%s", meibo[i]);で画面表示できる。
float score[100];には各々の大統領の業績が1から100までの数値(float型)で格納されてある。(注:業績の数値は乱数で決めたもので事実ではありません)
この中の業績優秀者のトップ10のリストを
char excellent[10][50];
として別配列に格納したいです。
ですが、excellent[][]に名簿データをコピーして保存すると、meibo[][]のみならずexcellent[][]の領域も必要であるため、主記憶を浪費することとなってしまう。
そこで、
char *excellent[10];
を準備する。このポインターの配列に、その名簿の対応するポインター(アドレス)を格納することで、
n番目の業績優秀者の氏名が、
for (n=0; n<10;n++) printf("%s", excellent[n]);と即座に表示できるようにしたいです。
これを実現する関数 void select_excellent()定義したいです。
以下のプログラムで、あとやることは
scoreを昇順にすることと、meiboも一緒に入れ替える事かと思いますが、どのようにすればいいでしょうか??構造体を使えというご意見もあるかと思いますが、この場合を考えたいです。
C
1コード 2 3#include <stdio.h>#include <stdlib.h>#include <string.h>#define FILENAME "meibo.csv"#define MAXSIZE 45 4 5char meibo[MAXSIZE][50];//オリジナルの名簿(大統領の氏名:第1代大統領は meibo[0]) 6float score[MAXSIZE];//業績の配列: 第 i 代大統領の業績は score[i] 7char *excellent[10];//業績トップ10の大統領の氏名 8char *s_meibo[MAXSIZE]; //名簿をscore順に並べ替えるときに使うポインターの配列 9void select_excellent(); 10 11int main(void) { 12 int i, j; 13 FILE *rfp; 14 char strline[100]; 15 char *str; 16 int line; 17 //名簿ファイルから氏名とスコアを読み込む 18 if ((rfp=fopen(FILENAME, "r"))==NULL) { 19 fprintf(stderr, "%s is not found!\n", FILENAME); 20 exit(1); 21 } 22 line = 0; 23 while (fgets(strline, 100, rfp)!=NULL) { 24 strcpy(meibo[line], strtok(strline, ",")); //氏名部分を取り出しmeibo[line]に格納 25 str =strtok(NULL, ","); //カンマの次に書かれたスコア部分を文字列strに格納 26 score[line] = atof(str); //文字列のスコアをfloat型に変換して保存 27 line++; 28 } 29 fclose(rfp); 30 31 for (line=0; line<MAXSIZE; line++) { 32 printf("%s, score=%f\n", meibo[line], score[line]); 33 } 34 35 36 37 //名簿をスコアー順に並べ替えるときに使う配列 38 for (i=0; i<MAXSIZE; i++) { 39 s_meibo[i] = meibo[i]; 40 } 41 42 43 select_excellent() ; 44 45 printf("----- Top10 Presidents -----"); 46 for (i=0; i<10; i++) { 47 printf("%d %s score=%f\n", i+1, excellent[i], score[i]); 48 } 49 return 0; 50} 51 52void select_excellent(int n) //ここのint nは合ってもなくても大丈夫です。 53{ 54/*ここから教えてもらいたいです。 55 score[]を大きいもの順に並び替えをする。 56 例えばバブルソートの場合、if (score[i] <score[i+1]) とのきにscore[i]とscore[j+1]を入れ替えるが、 57 s_meibo[i], s_meibo[i+1]も入れ替える。 58ここまで教えてもらいたいです。*/ 59 60 61for(i=0;i<10;i++){ 62excellent[i]=s_meibo[i]; //並び替えした後にexcellent[0]からexcellent[9]にs_meibo[0]からs_meibo[9]を代入する。あってる、、? 63} 64} 65
実行例はこんな感じです。
$ ./a.out
George Washington, score=34.294319
John Adams, score=50.967831
Thomas Jefferson, score=6.703236
James Madison, score=2.001076
...中略(読み込んだ名簿を表示する部分)
George Walker Bush, score=13.772470
Barack Hussein Obama II , score=88.351112
Donald John Trump, score=22.837034
------ Top 10 Presidents -----
1 William Howard Taft score=97.924606
2 Gerald Rudolph Ford Jr. score=94.910759
......?????
回答1件
あなたの回答
tips
プレビュー