質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.49%
C

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

Q&A

解決済

1回答

2758閲覧

C言語 昇順にしたいです

hacch

総合スコア15

C

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

0グッド

0クリップ

投稿2020/06/24 17:03

編集2020/06/24 17:06

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
......?????

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

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

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

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

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

dodox86

2020/06/24 17:08

過去のご質問を拝見するに、何かの課題でしょうか? C言語標準のライブラリqsortを応用して使っていいのか、自力で作ったコードで、昇順にソートするのか。
cateye

2020/06/24 17:11

>一緒に入れ替える事・・・構造体って分かりますか?
hacch

2020/06/24 17:39

ご返信ありがとうございます。 正直、そうですね。 課題の問題の一部がわからなかったです。ライブラリは追加せずに、新しい定義もせずに あの部分だけで簡単に解決させたいです。
dodox86

2020/06/24 18:13 編集

ソートとしては例えば簡単に「バブルソート」で、ソートする際に参照情報としてポインタを対象にすれば主記憶の領域の圧迫も無く、処理できると思います。これでイメージできますか?(方法はこれだけではないでしょうけど)
e-watt

2020/06/24 19:18 編集

>char *excellent[10]; >として別配列に格納したいです。 この型であることは必須でしょうか? int excellent[MAXSIZE] にして「何代目か」を入れた方がソートが簡単にできると思いますよ。([10]のまま選択ソートでも可能だけど) (meibo[][]もscore[]も中身を移動する必要がないし) (名前は meibo[excellent[i]] で参照する。)
thkana

2020/06/24 23:48

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11227375491 teratailには、ローカルルール https://teratail.com/help#posted-otherservice がありますので 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
guest

回答1

0

ベストアンサー

score[]を大きいもの順に並び替えをする。
例えばバブルソートの場合、
if (score[i] <score[i+1]) とのきにscore[i]とscore[j+1]を入れ替えるが、
s_meibo[i], s_meibo[i+1]も入れ替える。

C

1void swap(int i, int j) { 2 score[i] と score[j] を交換 3 s_meibo[i] と s_meibo[j] を交換 4}

を定義しておき、必要に応じて select_excellent() の中から呼べばいい。

投稿2020/06/24 23:36

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問