• 締切済み

C言語の問題

C言語を勉強している初心者です。大学の課題なのですが、よくわかりません。 5人分の名前と点数を入力し、点数の良い順に並べ替えよ。並べ替えの部分には関数(配列またはポインタ)を使用すること。 点数を入力させるのは分かるのですが、同時に名前の文字列を入力させるのがわかりません。 ソートも名前と点数を同時に並べ替えるやり方がわかりません。 宜しくお願いします。何分、初心者なので…申し訳ありません。宜しくお願いします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「並べ替えの部分には関数(配列またはポインタ)を使用すること」の意味は分からんけど, 構造体の配列を作って qsort じゃいかんのだろうか?

  • ghost_orz
  • ベストアンサー率100% (1/1)
回答No.3

素人だけど、気分で書いてみた。 ───── #include <stdio.h> #include <stdlib.h> #define MY_BUFSIZ_MAX 17 typedef struct tag_Record { char name[MY_BUFSIZ_MAX]; int score; } Record; int compare(const void *arg1, const void *arg2); int main(int argc, char* argv[]) { char buf[MY_BUFSIZ_MAX]; Record rec[5]; int idx; const int recs = sizeof rec / sizeof rec[0]; /* 成績の入力 */ for (idx = 0; idx < recs; idx++) { printf("%d人目の名前を入力:", idx + 1); fflush(stdin); fgets(buf, sizeof buf, stdin); sscanf(buf, "%s", &rec[idx].name); while (1) { printf("%d人目の点数を入力:", idx + 1); fflush(stdin); fgets(buf, sizeof buf, stdin); if (sscanf(buf, "%d", &rec[idx].score) != 0) break; printf("点数の入力が異常です。\n"); } } /* 点数の良い順に並べ替え */ qsort((void*)&rec, recs, sizeof (Record), compare); /* 表示 */ printf("\n[結果表示]\n"); for(idx = 0; idx < recs; idx++) { printf("%-*s : %d 点\n", sizeof rec[0].name, rec[idx].name, rec[idx].score); } printf("\n"); return 0; } int compare(const void *arg1, const void *arg2) { /* 成績の良い順(得点の高い順)なので */ return ( ((Record*)arg2)->score - ((Record*)arg1)->score ); }

回答No.2

ミスった。namebufferとscorebufferも変数宣言先頭に持ってこないと。 #VC++ 2008でコンパイル通っちゃうからどうしても見落としちゃう int main(void){ scoredata * scores; int n = 5; int i; /* 変数宣言って最初にしか出来ないんだよね?*/ char namebuffer[1000]; char scorebuffer[4]; scores = (scoredata *)malloc(sizeof(scoredata) * n); for (i = 0;i < n ;i++){ printf("person %d:\n",i); printf("input name:\n",i); /* null文字の扱いがわからない */ fgets(&(namebuffer[0]),999,stdin); sscanf(&(namebuffer[0]),"%s",&(scores[i].name)); fflush(stdin); printf("input score:\n",i); fgets(scorebuffer,4,stdin); sscanf(scorebuffer,"%d",&(scores[i].score)); fflush(stdin);

回答No.1

C言語やっている人間じゃないんで間違ってるかも。 *いっぺんに扱う→構造体を使う *書こうと思えばもっと簡単に書けるんだが、その分視認性が下がるんで… ============= #include <stdio.h> #include <stdlib.h> typedef struct scoredata{ /* 本当はwchar_tとか使いたいんだけど、調べるのが面倒くさかった ポインタの宣言でなければ自分で領域確保しなくても確保されるよね? */ char name[1000]; long score; } scoredata; int compare(scoredata x,scoredata y){ return -(y.score - x.score); } /* 考えるのが面倒だから実装が楽な選択法をチョイス。 テンプレートだの、ジェネリクスだのがあれば汎用的にもできるかも。 */ void sort(scoredata ** pscores,int (*f)(scoredata x,scoredata y),int n){ int i; int j; int tempindex; scoredata tempscore ; scoredata * scores; scores = *pscores; for(i = 0;i < n-1;i++){ tempindex = i ; for(j = i + 1; j < n ;j++){ if((*f)(scores[i],scores[j]) < 0){ tempindex = j; } } tempscore = scores[i]; scores[i] = scores[tempindex]; scores[tempindex] = tempscore; } } int main(void){ scoredata * scores; int n = 5; int i; /* 変数宣言って最初にしか出来ないんだよね?*/ scores = (scoredata *)malloc(sizeof(scoredata) * n); for (i = 0;i < n ;i++){ printf("person %d:\n",i); printf("input name:\n",i); char namebuffer[1000]; /* null文字の扱いがわからない */ fgets(&(namebuffer[0]),999,stdin); sscanf(&(namebuffer[0]),"%s",&(scores[i].name)); fflush(stdin); printf("input score:\n",i); char scorebuffer[4]; fgets(scorebuffer,4,stdin); sscanf(scorebuffer,"%d",&(scores[i].score)); fflush(stdin); } sort(&scores,compare,n); for (i = 0;i < n ;i++){ printf("%s:%d\n",scores[i].name,scores[i].score); } free(scores); return 0; }

関連するQ&A

  • C言語

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ まではやったんですが(参考書で勉強)。 その次になにを勉強したらよく分からないので、 何を勉強するべきか教えてください。 将来的にこれっと言った作りたいものは決めていません。 お願いします。

  • C言語でゲーム

    今、独学でC言語を勉強しているんですが。 大きく、 条件処理、繰り返し処理、配列、関数、2次元配列、文字列、構造体、ファイル処理、乱数、検索、バブル・ソート、ポインタ を勉強したんですが。 もしも、ゲームを作るとしたら・・ もし、ボンバーマンみたいなのを作るとなるとどういう勉強をすればいいんでしょうか? もうひとつはHALOみたいなxbox関係などはどの様な勉強をすればいいんでしょうか? 質問が多いですが、よろしくお願いします。

  • C言語 よく使うのは?

    C言語の参考書で、例えば1章~8章まであるとすると、 1章~前半くらいは、printfや変数や、演算など出てきると思うんですが、後半にかけて、配列やポインタや関数など出てくると思います。 実際に仕事で、よく使うのを挙げるとどんなのですか?(例えば、ポインタはよく使うや配列もよく使うや) もちろん、変数や演算などが出来ないと条件分岐や配列もポインタも何も出来ないと思うんですが、 上手く言えないんですが、for文はよく使うから、ちゃんと理解していないとダメとか、仕事ではポインタがしょっちゅう使うとか、ありますか? 本屋さんで見ると、ポインタ専用の本や、関数専用の本があるので、よく使うのかなと思いました。 それか、難しく理解が難しいから、より詳しく書かれているんでしょうか? 上手く説明が出来ていないですが、よろしくお願いします。

  • c++がわかりません。

    何らかの成績(テストの点数)をキー ボードから次々に入力する."-1"を入力 することで入力を終了させることにする. また,入力は最大100件までとする. • 入力が終了したら,点数の小さい順に(昇 順に)並べ替え(ソート)を行い,結果を 画面上に表示する. こちらの条件のプログラムどんな感じですか? ある程度はわかっていますが最初から教えていただけるとありがたいです。

  • C言語

    以下のC言語のプログラムを教えてください。 お願いします。 (1)標準入力から文字列(2 文字以上)を入力し,文字数を計上すると共に,入力された文字列の逆順に入れ替える処理を実現してください.なお,以下の要件を満たしたプログラムを作成してください. ・ 入力された文字列は,char 型の配列(要素数50)で受け取ること ・ 文字数を計上するcount 関数(引数:配列のアドレス,戻り値:文字数)を定義 し,main 関数より呼び出すこと ・ 文字列を逆順に入れ替えるreverse 関数(引数:配列のアドレス,戻り値:無し) を定義し,main 関数より呼び出すこと ・ 標準出力の処理は,main 関数で記述すること 【プロトタイプ宣言】 int count(char *str); void reverse(char *str); 【実行結果】 文字列を入力してください(2 文字以上) apple 文字数 = 5 入れ換え前 apple 入れ換え後 elppa (2)char 型の配列(要素数50)を2 つ宣言し,標準入力から2 つの文字列を入力してください.そして,格納した字列を入れ替える関数(swapstr 関数)を作成し,入れ替え前と入れ替え後の配列内の値(文字列)を配列名とともに標準出力するプログラムを作成してください. 【プロトタイプ宣言】 void swapstr(char *str1, char *str2); 【実行結果】 2 つの文字列を入力してください apple strawberry 入れ換え前 配列str1 = apple 配列str2 = strawberry 入れ換え後 配列str1 = strawberry 配列str2 = apple

  • C言語でのソート方法

    学校でC言語でのソートをやっていてやりたい事が出来たのですがそれの簡単な方法がわかりません。 内容は「ソート方法をExcelの規定の並べ替え順序」にすることです。 わたしはif文を使ったり、並べ替え順序を配列にいれたりなどしかおもいつきません。 ほかになにかあるのでしょうか?(関数など) 参考:http://office.microsoft.com/assistance/hfws.aspx?AssetID=HP051996691041&CTT=1&Origin=EC010229831041&QueryID=ogP8lDGBO&respos=2

  • C言語

    C言語の問題を解いているのですが、 「3人分のテストの点数を入力するにあたり、入力のたびに、高い順になるように作成しなさい。」 という問題を作っています。 答えには、 「一番目の人の点数を入力」 50 「一番目までの結果: 50」 「二番目の人の点数を入力」 42 「二番目までの結果: 50 42」      のような感じになっています。この2番目までの結果の後に出てくる数字を42だけでなく、50 42と続けさせるにはどのように書いたらよいのでしょうか? よろしくお願いします。

  • C言語に関することについて教えてください

    学校の問題集にでてきた問題がわかりません、どうか教えてください 1 プログラムの役割、必要性について説明せよ 2 プログラムにおける変数と定数の役割を説明せよ。また、ローカル変数の有効な範囲について説明せよ。 3 C言語で使う変数が他について、宣言子と、printf関数、scanf関数それぞれにおいて対応する書式指定子を対応表にせよ。また、変数名を決める際に守るべき文法上の規則と、プログラマとして配慮すべき事項を説明せよ。 4 配列について、その役割と定義方法を説明せよ。 5 コンピュータにおける文字処理に必須なアスキーコードについて説明せよ。 6 C言語における文字列について、文字列定数、文字列変数を説明せよ。 7 C言語における繰り返し処理の文法(for,while,do~while)を、プログラムコード列を示して説明せよ。 8 C言語における条件判断の文法(if,else,else if)を、プログラム列を示して説明せよ。 9 繰り返し、条件判断において利用する論理式(等値演算子、関係演算子、論理演算子等で記迷する式)について、その記迷の方法を論理和、論理積も含めて説明せよ。 10 変数のアドレスについて説明せよ。また、ポインタについて、アドレスとの関連性を踏まえて、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 11 ポインタと配列の関係について、ポインタによる配列操作を列に説明せよ。 12 関数について、その役割と定義方法について説明せよ(戻りがた、関数名、引数リスト)。また、自作関数をそれらを利用するmain関数のプログラムコード例を示せ。 13 scanf関数の戻り値について、その内容を説明して、どのような際に利用すると便利か、プログラムコード例を示して説明せよ。 14 引数にポインタを利用する関数のプログラムコード例を示して、ポインタの必要性、重要性を説明せよ。 15 構造体について、その役割と定義方法を説明し、具体的な使い方のプログラムコード例を示せ。 16 ファイルポインタについて説明し、ファイル入出力の方法についてプログラムコード例を示して説明せよ。

  • c言語 配列 や ソート datファイル読み込みについて

    初投稿でC言語初心者なのでよろしくお願いします。 課題でdatファイルから100万個の数字を読み込んで、ソートのタイムを競うのがでました。 ソートのアルゴリズム等は分かるのですが、100万個の数字を読み込むのがわかりません。 datファイルには、縦にずらっと数字が並べられていてどこを区切り文字としてとりだすのとか。 int配列も100万個も格納できないので3次元配列つかうのかなと思ってみたりしてます。 どうやって格納すればソートで使いやすいかご教授お願いいたします。

  • c言語問題です。よろしくお願い致します。キーボード

    c言語問題です。よろしくお願い致します。キーボードから社会、理科の点数を整数として入力し、高い方の点数を表示しなさい。 (同じ点数の時はどちらの点数が表示されてもよい) なにぶん初心者な者でしてお手数ですが一からプログラミングを作成お願いします (たとえば♯include<stdio.h>からreturn 0;}まで、とか) なるべく早急にお願いいたします。 (fgets関数などの関数は使わずにすむ方法があればそれもお願いできれば)