• ベストアンサー

C言語のプログラミングで、ある条件で並び変えるプログラミングが分かりません。

以下のプログラミングができません。 どなたか分かる人はいませんか? 構造体studentを以下のように定義する。 struct student{ char name[20]; int kokugo, sansu, eigo;/* 各科目の点数を記録する変数 */ }; 10人分のデータが配列に記録されている。合格者の人数を表示し,合格者が先にくるように配列の中身を並べ替える。その後、配列の内容を表示させる。合格の条件は少なくとも2科目以上で80点以上をとっていることとする。 10人分のデータはmain文のはじめに配列に入れておく。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#include <stdio.h> struct student{ char name[20]; int kokugo, sansu, eigo; }; int judge(struct student st) { return (st.kokugo >= 80) + (st.sansu >= 80) + (st.eigo >= 80); } int main(void) { struct student st[10] = {{"a", 60, 60, 60}, {"b", 85, 60, 60}, {"c", 60, 85, 85}, {"d", 85, 60, 60}, {"e", 85, 85, 85}, {"f", 85, 85, 60}, {"g", 60, 60, 60}, {"h", 85, 60, 85}, {"i", 60, 60, 60}, {"j", 85, 85, 85}}, st0; int i, j; for(i = 0; i < 10; i ++){ printf("%s %d %d %d\n", st[i].name, st[i].kokugo, st[i].sansu, st[i].eigo); } for(i = j = 0; i < 10; i ++){ if(judge(st[i]) >= 2){ st0 = st[j]; st[j] = st[i]; st[i] = st0; j ++; } } putchar('\n'); for(i = 0; i < 10; i ++){ if(i == j) puts("---------------------*"); printf("%s %d %d %d\n", st[i].name, st[i].kokugo, st[i].sansu, st[i].eigo); } return 0; }

bad-pc
質問者

お礼

ご回答ありがとうございました。 とても参考になりました。

その他の回答 (2)

回答No.2

for文とif文でソートかけてみては

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

http://www.google.co.jp/search?hl=ja&q=%E6%A7%8B%E9%80%A0%E4%BD%93+%E3%82%BD%E3%83%BC%E3%83%88&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja 構造体のソートで、合格条件に合っているかどうかを並び替えればよいかと。 80点以上の科目がいくつあるかカウントする変数を用意して、 kokugoが80点以上なら+1、 sansuが80点以上なら+1、 eigoが80点以上なら+1とやって、最後にカウントが2以上であれば、 「少なくとも2科目以上で80点以上をとっている」ということになるでしょう。 # 条件に「点数の高い順」とか追加されると多少手間は増えますが。

関連するQ&A

  • 構造体についてです。

    typedef struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }STUDENT; と、 struct student{ int id; char name[20]; int kokugo; int sansu; int eigo; }; の違いはなんでしょう? 私は下記をよく使うのですが・・・。 typedefについて詳しく知りたいです。

  • c言語 構造体

    大学での内容なのですが,『名前,数学の点数,英語の点数,国語の点数を格納できる(メンバに持つ)構造体を宣言し,この構造体の配列を用いて,3人分の情報をキーボードから入力後,各科目の平均点を画面に表示するプログラムを作成せよ.』という問題で,自分なりに作ってみたのですがうまくいきません.どなたか教えていただけませんか? 一応自分で作ったものを下に載せておきます. ================================================================ #include <stdio.h> #include <string.h> struct test { char name[20]; int sugaku; int eigo; int kokugo; }; int main(void) { struct test suzuki; int (suzuki.sugaku), (suzuki.eigo), (suzuki.kokugo); strcpy(suzuki.name, "Suzuki"); printf("氏名:鈴木 一馬\n"); printf("数学:"); scanf("%d", &suzuki.sugaku); printf("英語:"); scanf("%d", &suzuki.eigo); printf("国語:"); scanf("%d", &suzuki.kokugo); struct test tanaka; int tanaka.sugaku, tanaka.eigo, tanaka.kokugo; strcpy(tanaka.name, "Tanaka"); printf("氏名:田中 二郎\n"); printf("数学:"); scanf("%d", &tanaka.sugaku); printf("英語:"); scanf("%d", &tanaka.eigo); printf("国語:"); scanf("%d", &tanaka.kokugo); struct test yamamoto; int yamamoto.sugaku, yamamoto.eigo, yamamoto.kokugo; strcpy(yamamoto.name, "Yamamoto"); printf("氏名:山本 三弘\n"); printf("数学:"); scanf("%d", &yamamoto.sugaku); printf("英語:"); scanf("%d", &yamamoto.eigo); printf("国語:"); scanf("%d", &yamamoto.kokugo); printf("数学の平均点は%dです。\n", ((suzuki.sugaku + tanaka.sugaku + yamamoto.sugaku) / 3.0)); printf("英語の平均点は%dです。\n", ((suzuki.eigo + tanaka.eigo + yamamoto.eigo) / 3.0)); printf("国語の平均点は%dです。\n", ((suzuki.kokugo, + tanaka.kokugo + yamamoto.kokugo) / 3.0)); return (0); } ================================================================

  • C言語について教えてください。

    名前、身長、体重をメンバとする構造体オブジェクトを要素とする配列を宣言・定義する。 (1)名前、身長、体重を構造体オブジェクトのメンバに格納する関数 (2)平均身長を計算する関数 (3)平均体重を計算する関数 をそれぞれ定義し、その関数の機能を確認するプログラムを作成する。 構造体オブジェクトの各メンバは以下の値をもつとする。 Name Height(cm) Weight(kg) Tom 174.2 72.3 Jerry 152.3 49.2 Spike 168.6 84.8 ただし、平均身長と平均体重は呼び出し元の関数(関数main())で表示する。 また(2)(3)については、生徒の人数が変更されても処理できる関数を作成する。 [実行結果の例] 平均身長:165.0cm 平均体重: 68.0kg [ヒント] 構造体の配列でまとめられたデータから平均身長あるいは平均体重を計算する関数 <返却値型><関数名>(構造体の配列の受け渡しに対応した仮引数の宣言、生徒の人数) この問題について教えてください。 下のプログラムは自分でつかりかけたプログラムです。 #include <stdio.h> #include <string.h> struct student { char name[6]; double height; double weight; }; struct student set_student(char *n, double h, double w) { struct student ss; strcpy(&ss.name[0], n); ss.height = h; ss.weight = w; return ss; } int main(void) { struct student seito[3]; seito[0] = set_student("Tom", 174.2, 72.3); seito[1] = set_student("Jerry", 152.3, 49.2); seito[2] = set_student("Spike", 168.6, 84.8); return 0; } (2)(3)計算の計算する関数を定義し、表示させる方法がよく分かりません。具体的に教えてもらえませんか。よろしくお願いします。

  • C言語による構造体の値渡しについて

    以下プログラムを作成しました。 1.read_file関数によりファイルを読み込み。 2.avg_kokugo関数により、国語の平均点を出す。 という流れで組まれているのですが、 1.read_file関数実行時に、dat構造体を渡しています。 2.read_file関数内で、fscanfによる読み込みを行い、dat[i].name,&dat[i].kokugo,&dat[i].sansuに格納しているみたいに感じます。 ここで、疑問なのが、 「構造体を値渡しでdatをread_file関数に渡してる」と思っているのですが、 「read_file関数から、値渡しで渡された構造体datに、値を格納することはできるのでしょうか?」 本を参考にして勉強していたのですが、 「構造体は、値渡しの時に読み込みはできるが、更新はできない」 と書かれていたのです。(ポインタ参照渡しの時は可能。) なぜ今回、read_file関数から、構造体datに値の格納ができるのでしょうか? 更新と新規格納は意味が異なるからなのでしょうか? ご教授よろしくお願いします。 <ソース> #include <stdio.h> //グローバル #define FNAME "test.txt" struct score{ char name[20]; int kokugo; int sansu; }; int read_file(struct score dat[],int n); float avg_kokugo(struct score dat[],int n); int main(void){ struct score dat[3]; int ret; float kokugo; float sansu; ret= read_file(dat,3); if(ret <0){ return 0; } kokugo = avg_kokugo(dat,3); printf("国語の平均 %.1f\n",kokugo); return 0; } int read_file(struct score dat[],int n){ FILE *fp; //ファイルポインタ int i; fp=fopen(FNAME,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return -1; //-1によるプログラム強制終了 } //データ読み込み i=0; //datに保存していく。 while((fscanf(fp,"%s%d%d",dat[i].name,&dat[i].kokugo,&dat[i].sansu)) != EOF){ i=i+1; //ファイル件数読み込み } fclose(fp); return 0; } float avg_kokugo(struct score dat[],int n){ int sum; //合計 float answer; int i; sum=0; for(i=0;i<n;i++){ sum = sum + dat[i].kokugo; } //平均点を求める answer =(float)sum / (float)n; return answer; }

  • プログラミング言語C

    名前(char name[20]),年齢(intage),身長(double height),体重(double weight)の4つのメンバを持つ構造体であるperson型を宣言し,以下のようなプログラムを作成せよ. 1.1つの構造体変数を宣言し,それぞれのメンバの値を入力させ表示する. 2.構造体person型の配列を作成し,3人分のデータを入力して表示する. 3.BMIを求める関数double bmi(person *p) を作成し,入力した3人分のデータからそれぞれのBMIを求め表示する. BMIとはBody Mass Indexのことで肥満度を表す指数 体重をw(kg),身長をt(m)とすると,BMI = w/t2 解答お願いします。

  • C言語

    よろしくお願いします。  下記の構造体タグ「seiseki」を使って,表に示すデータをもつ構造体配列「list」を作成する.  関数に構造体配列「list」のアドレスを渡す.  関数で構造体ポインタ「*list」を利用して,一番点 数の高い者(1名限定)を調べ,その名前を表示する. struct seiseki{ char name[30]; int score; name score }; 表 佐藤 80 鈴木 75 田中 95 高橋 90

  • C言語のファイルの読み書き

    以下のようなプログラムを作成したいのですが、どうしても作成できません。 さまざまなサイトを参考にしたのですが、まったく理解できませんでした。 具体的なプログラム式をご教授願います。 よろしくおねがいします…。 1)複数の学生の情報を読み取り配列を行う struct student a [LIST_SIZE_A] 2)配列に代入した情報をファイルに書き込む fopen("…","w"); … fclose() 3)配列に代入した情報をファイルに追加する fopen("…","a"); … fclose() 4)ファイルの内容を表示する fopen("…","r")

  • C言語でファイルを表示させるプログラミングがわかりません。

    以下のC言語のプログラミングがわかりません。どなたかわかりませんか? ファイルdata.txtに人の名前と生年月日を追記し、ファイルをいったん閉じてから開きなおし、ファイルの内容を表示するプログラムを作成する。 同じプログラムを2度実行すると、前に入力したときの人の名前と生年月日も表示されるようになる。 複数人のデータが連続して入力できるように工夫する。形式は以下のようにスペースとコンマで区切って記録する。(文字列の後ろにはスペースを入れるように注意する。) Taro , 1985, 6,23 Jiro ,1983, 7,31 そして、 半角の名前と 生年月日(三つの数字)がコンマで区切って各人に対してファイルに記録できるようにする。 一人分のデータが一行で記録されている。 1回の実行で,複数人のデータを連続して入力できる。 全然わからなくて以下のようなことしかできませんでした。 #include<stdio.h> int main() { char name[20]; int i,j,k; scanf("%s ,%d, %d, %d", name, &i, &j, &k); printf("%s ,%d, %d, %d", name, i, j, k); }

  • C言語の文字列を含んだ構造体

    下記のサイトに構造体のことが書かれています。 http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html その中の (3)構造体の初期化 の記述で  //構造体の型宣言  struct student{   int no; // 学籍番号   char name[256]; // 氏名   int year; // 学年   char student_class[256]; // クラス  }; と書かれています。 次の(4)構造体のデータ参照では、  //構造体の型宣言  struct OLD{   int no; //番号   char *name; //名前   int s_year; //年   char s_class; //クラス  }; と書かれています。 ここで質問です。 前者の名前は char name[256] ですが、 後者の名前は char *name になっています。 name[256] と *name では何が違うのでしょうか? どういうときに使い分けるのでしょうか?

  • c言語 

    データを構造体の配列に格納したいのですが、このやり方ではできませんでした。どうすればいいですか? (ファイル内のデータを読み込んで格納しようとしています。) typedef struct dataset{ int price; char id; char name; }data; int main(void) { FILE *f = fopen("input.txt","r"); FILE *output = fopen("output.txt","w"); char order[100]; char name[100]; char id[100]; int price; int num = 0; while(fscanf(f,"%s",order) != EOF){ fscanf(f,"%s%s%d",product->name[num],product->id,&product[num].price); num++; } } return 0; } input.txt CD Kenji 300 DVD Nanako 350 PC Koki 1000 ........