- 締切済み
C言語の問題
C言語を勉強している初心者です。大学の課題なのですが、よくわかりません。 5人分の名前と点数を入力し、点数の良い順に並べ替えよ。並べ替えの部分には関数(配列またはポインタ)を使用すること。 点数を入力させるのは分かるのですが、同時に名前の文字列を入力させるのがわかりません。 ソートも名前と点数を同時に並べ替えるやり方がわかりません。 宜しくお願いします。何分、初心者なので…申し訳ありません。宜しくお願いします。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
「並べ替えの部分には関数(配列またはポインタ)を使用すること」の意味は分からんけど, 構造体の配列を作って qsort じゃいかんのだろうか?
- ghost_orz
- ベストアンサー率100% (1/1)
素人だけど、気分で書いてみた。 ───── #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 ); }
- himajin100000
- ベストアンサー率54% (1660/3060)
ミスった。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);
- himajin100000
- ベストアンサー率54% (1660/3060)
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; }