今、こちらのサイトを使ってC言語の勉強をしています。
http://c-lang.sevendays-study.com/problemex3.html
このURLの先にある probex6-6(難易度:★★★) で詰まっています。
合計点の高い順に並べ替えをどのように書いたらいいかわかりません。
合計点を表示するところまでは、できました。
#include <stdio.h>
#define SIZE 5
typedef struct {
int id;
int kokugo;
int sugaku;
int rika;
int shakai;
int eigo;
}student_data;
void setData(student_data*, int, int, int, int, int, int);
void showData(student_data*);
typedef student_data student_type;
int sum(student_type*);
void main()
{
student_data data[SIZE];
int i;
int id[] = { 1001,1002,1003,1004,1005 };
int kokugo[] = { 82,92,43,72,99 };
int sugaku[] = { 43,83,32,73,72 };
int rika[] = { 53,88,53,71,82 };
int shakai[] = { 84,79,45,68,91 };
int eigo[] = { 45,99,66,59,94 };
for (i = 0; i < SIZE; i++) {
setData(&data[i], id[i], kokugo[i], sugaku[i], rika[i], shakai[i], eigo[i]);
}
printf("番号 国語 数学 理科 社会 英語 合計\n");
showData(data);
}
void setData(student_data* data, int id, int kokugo, int sugaku, int rika, int shakai, int eigo)
{
data->id = id;
data->kokugo = kokugo;
data->sugaku = sugaku;
data->rika = rika;
data->shakai = shakai;
data->eigo = eigo;
}
void showData(student_data*data)
{
int i;
for (i = 0; i < SIZE; i++) {
printf("%d %d %d %d %d %d ", data->id, data->kokugo, data->sugaku, data->rika, data->shakai, data->eigo);
sum(data);
printf("\n");
data++;
}
}
int sum(student_type* data) {
int goukei;
goukei = data->kokugo + data->sugaku + data->rika + data->shakai + data->eigo;
printf("%d", goukei);
return;
}
No.3ベストアンサー
- 回答日時:
ソート版です。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
typedef struct {
int id;
int kokugo;
int sugaku;
int rika;
int shakai;
int eigo;
} student_data;
typedef student_data student_type;
typedef struct {
student_type st;
int goukei;
} student_data2;
typedef student_data2 student_type2;
void setData(student_data2 *, int, int, int, int, int, int);
void showData(student_data2 *);
int sum(student_type2 *);
int compare(const void *data1,const void *data2);
void main()
{
student_data2 data[SIZE];
int i;
int id[] = { 1001, 1002, 1003, 1004, 1005 };
int kokugo[] = { 82, 92, 43, 72, 99 };
int sugaku[] = { 43, 83, 32, 73, 72 };
int rika[] = { 53, 88, 53, 71, 82 };
int shakai[] = { 84, 79, 45, 68, 91 };
int eigo[] = { 45, 99, 66, 59, 94 };
for (i = 0; i < SIZE; i++) {
setData(&data[i], id[i], kokugo[i], sugaku[i], rika[i], shakai[i],
eigo[i]);
}
printf("番号 国語 数学 理科 社会 英語 合計\n");
showData(data);
qsort(data,SIZE,sizeof(student_data2),&compare);
printf("番号 国語 数学 理科 社会 英語 合計\n");
showData(data);
}
void setData(student_data2 * data, int id, int kokugo, int sugaku, int rika,
int shakai, int eigo)
{
data->st.id = id;
data->st.kokugo = kokugo;
data->st.sugaku = sugaku;
data->st.rika = rika;
data->st.shakai = shakai;
data->st.eigo = eigo;
data->goukei = sum(data);
}
void showData(student_data2 * data)
{
int i;
for (i = 0; i < SIZE; i++) {
printf("%d %d %d %d %d %d ", data->st.id, data->st.kokugo, data->st.sugaku,
data->st.rika, data->st.shakai, data->st.eigo);
printf("%d", data->goukei);
printf("\n");
data++;
}
}
int sum(student_type2 * data)
{
int goukei;
goukei =
data->st.kokugo + data->st.sugaku + data->st.rika + data->st.shakai +
data->st.eigo;
return goukei;
}
int compare(const void *data1,const void *data2)
{
int ret;
student_type2 *d1 = (student_type2*)data1;
student_type2 *d2 = (student_type2*)data2;
ret = d2->goukei - d1->goukei;
return ret;
}
ありがとうございます。
できました~!!
qsortを勉強しておらず、手順がどうなっているか考えるのに手こずりました。。。
ちなみに、ソートを使わずに並べ替えする方法はありますでしょうか。。。
No.4
- 回答日時:
>ちなみに、ソートを使わずに並べ替えする方法はありますでしょうか。
。。簡単に思いつくのは、一旦、student_data data[SIZE];
の内容を、別のワーク(同じ構成)に移しておいて、
別のワークの1番大きいのを、student_data data[SIZE]の先頭にコピー
次に、2番目に大きいのをstudent_data data[SIZE]の2番目にコピー
・・・以下同様
のような方法でしょうか。
2番目、3番目に大きいのを探すのは大変なので、
1番大きいのを探して、コピーが終わったのち、その人の合計を-1にしておけば、次回も1番大きいのを探すと、それは自動的に2番目に大きいものになります。
めんどうな感じになりそうですね…
同じ結果でも書き方が色々あって面白いです。
構造体とポインタでちょっと躓いています。
もっと勉強して、自分でポンポン答え出せるように頑張ります^^
ソース2つも書いていただきありがとうございました。
No.2
- 回答日時:
student_dataを変えたくないということなのでラップして
student_data2を作りました。未ソートの状態です。これで同じ結果になります。尚、sumは印字をせず、合計を返すだけにしました。(これが本来のsumの姿です)次にソート版を投稿します。
-------------------------------------
#include <stdio.h>
#define SIZE 5
typedef struct {
int id;
int kokugo;
int sugaku;
int rika;
int shakai;
int eigo;
} student_data;
typedef student_data student_type;
typedef struct {
student_type st;
int goukei;
} student_data2;
typedef student_data2 student_type2;
void setData(student_data2 *, int, int, int, int, int, int);
void showData(student_data2 *);
int sum(student_type2 *);
void main()
{
student_data2 data[SIZE];
int i;
int id[] = { 1001, 1002, 1003, 1004, 1005 };
int kokugo[] = { 82, 92, 43, 72, 99 };
int sugaku[] = { 43, 83, 32, 73, 72 };
int rika[] = { 53, 88, 53, 71, 82 };
int shakai[] = { 84, 79, 45, 68, 91 };
int eigo[] = { 45, 99, 66, 59, 94 };
for (i = 0; i < SIZE; i++) {
setData(&data[i], id[i], kokugo[i], sugaku[i], rika[i], shakai[i],
eigo[i]);
}
printf("番号 国語 数学 理科 社会 英語 合計\n");
showData(data);
}
void setData(student_data2 * data, int id, int kokugo, int sugaku, int rika,
int shakai, int eigo)
{
data->st.id = id;
data->st.kokugo = kokugo;
data->st.sugaku = sugaku;
data->st.rika = rika;
data->st.shakai = shakai;
data->st.eigo = eigo;
data->goukei = sum(data);
}
void showData(student_data2 * data)
{
int i;
for (i = 0; i < SIZE; i++) {
printf("%d %d %d %d %d %d ", data->st.id, data->st.kokugo, data->st.sugaku,
data->st.rika, data->st.shakai, data->st.eigo);
printf("%d", data->goukei);
printf("\n");
data++;
}
}
int sum(student_type2 * data)
{
int goukei;
goukei =
data->st.kokugo + data->st.sugaku + data->st.rika + data->st.shakai +
data->st.eigo;
return goukei;
}
No.1
- 回答日時:
1.構造体の中に合計を追加するのは反則ですか。
typedef struct {
int id;
int kokugo;
int sugaku;
int rika;
int shakai;
int eigo;
int goukei; //追加
}student_data;
のようにすることです。
2.qsortを使うのが最も簡単ですが、それを使うのは反則ですか。
コメントありがとうございます。
どちらも反則ではありませんが、
1に関して「この構造体を使って」というルールがあるため悩んでいます・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
このQ&Aを見た人はこんなQ&Aも見ています
-
10代と話して驚いたこと
先日10代の知り合いと話した際、フロッピーディスクの実物を見たことがない、と言われて驚きました。今後もこういうことが増えてくるのかと思うと不思議な気持ちです。
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
とっておきの手土産を教えて
お呼ばれの時や、ちょっとした頂き物のお礼にと何かと必要なのに 自分のセレクトだとついマンネリ化してしまう手土産。 ¥5,000以内で手土産を用意するとしたらあなたは何を用意しますか??
-
いけず言葉しりとり
はんなりと心にダメージを与える「いけず言葉」でしりとりをしましょう。 「あ」あら〜しゃれた服着てはりますな 遠くからでもわかりましたわ
-
とっておきの「まかない飯」を教えて下さい!
飲食店で働く方だけが食べられる、とっておきの「まかない飯」。 働いてらっしゃる方がSNSなどにアップしているのを見ると、表のメニューには出てこない秘密感もあって、「食べたい!!」と毎回思ってしまいます。
-
c言語 構造体
C言語・C++・C#
-
strcmp
C言語・C++・C#
-
C言語の勉強しています。すみませんが、助けてください。
C言語・C++・C#
-
-
4
関数から配列を返すには?
C言語・C++・C#
-
5
Enterキーを押されたら次の処理に移るという事をしたい。
C言語・C++・C#
-
6
C言語の勉強しています。すみませんが、助けてください。
C言語・C++・C#
-
7
C言語の勉強しています。すみませんが、助けてください。
C言語・C++・C#
-
8
リスト構造のソートで悩んでます。。。
C言語・C++・C#
-
9
str系関数を使わずに二つの文字を結合する方法
C言語・C++・C#
-
10
構造体配列内の文字列検索のよい方法を教えてください
C言語・C++・C#
-
11
C言語に関する質問です
C言語・C++・C#
-
12
C言語初心者です。ファイルの読み書きについてです。
C言語・C++・C#
-
13
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
-
14
ファイルから読み込んだデータを構造体に格納できますか?
C言語・C++・C#
-
15
C言語初心者の質問失礼します。
C言語・C++・C#
-
16
C言語の構造体にてバブルソートが上手くいきません‥
C言語・C++・C#
-
17
バッファとは何ですか
C言語・C++・C#
-
18
fgets関数を使用したときの文字あふれについて
C言語・C++・C#
-
19
構造体のメンバをfor文で回したい
C言語・C++・C#
-
20
全角スペース
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
systemの戻り値を取得する方法
-
複数桁10進数の*桁目だけを抽出...
-
数字列を3桁ごとにカンマで区切...
-
因数分解を行うプログラムについて
-
【C++】関数ポインタの使い方
-
比較回数と交換回数表示について
-
#define _CRT_SECURE_NO_WARNIN...
-
if と配列の組み合わせ
-
C言語 エラーの原因がわからな...
-
ラップ関数とはどんなものですか?
-
3数の最大公約数
-
acceptをalarmでタイムアウトさ...
-
アスタリスクで正方形
-
C言語初心者です、、、お助けく...
-
ColorをRGBで指定する方法
-
課題なんですが・・・
-
(int *)の意味
-
式は定数値が必要です」という...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語での引数の省略方法
-
「指定されたキャストは有効で...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
ラップ関数とはどんなものですか?
-
(int *)の意味
-
c言語の配列を使ってサイコロを...
-
【C++】関数ポインタの使い方
-
(マルチスレッド)_beginthrea...
-
「{ } で囲むだけ」は正しい?
-
if と配列の組み合わせ
-
C言語でlookupのような関数って?
-
数字列を3桁ごとにカンマで区切...
-
課題でつまってます・・・
-
read関数をノンブロッキングで...
-
実数の整数部,小数部の取得
-
system関数がうまくいかない
-
商と剰余を同時に求める(C言語)
-
std::set<int> で、ある値が何...
おすすめ情報