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

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

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

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

Q&A

解決済

5回答

836閲覧

C言語の条件文について

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

1クリップ

投稿2020/06/11 05:57

3つのテストの点数を5人分入力して、すべての科目の点数が60点以上かつ平均点が70点以上の人の番号と平均点を出力するというプログラムなのですが、すべての科目の点数がx点以上かつ平均点がy点以上という条件をif文で書こうとしても配列を用意して(例えばa[]は点数の配列、配列の要素数はテストの数、yは合計点とする)a[0]>=x && a[1]>=x &&..a[n]>=x && scr>=yという冗長な条件文しか思いつきません。3つのテストでなく20つぐらいのテストでも簡潔に書くことのできる方法が知りたいです。下のコードでは上の条件のような限られた条件でしかうまく動作しません。(理由がすべての科目の点数に対しての条件文を書いていないことは分かっています)

#include<stdio.h>
#define A 5
#define B 3

int main(void) {
int scr[A][B], cl[A],t = 0;
double fig[A];
for (int i = 0; i < A; i++) {
int tmp = 0;
printf("%d番 :",i+1);
for (int k = 0; k < B; k++) {
scanf_s(" %d", &scr[i][k]);
if(scr[i][k]>=60) tmp = tmp + scr[i][k];
}
if (tmp >= 210) {
cl[t] = i+1;
fig[t] = tmp / 3.0;
t++;
}
}
printf("合格者一覧\n");
for (int i = 0; i < t; i++) {
printf("%d番 : %.2f\n", cl[i], fig[i]);
}
return 0;

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

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

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

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

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

guest

回答5

0

簡潔に、かつ柔軟にですか。

C

1#include <stdio.h> 2 3#define N_STUDENT 5 // 生徒の人数 4#define N_SUBJECT 3 // 科目数 5#define MIN_SCORE 60 // 各科目の最低点 6#define MIN_AVERAGE 70 // 平均点の最低点 7 8int main(void) 9{ 10 int n = 0; // 合格者数 11 int id[N_STUDENT]; // 合格者番号 12 double ave[N_STUDENT]; // 合格者平均点 13 for (int i = 1; i <= N_STUDENT; i++) { 14 int sum = 0, pass = 1; // 合計点、合格フラグ 15 printf("%d番 :", i); 16 for (int k = 0; k < N_SUBJECT; k++) { 17 int score; 18 scanf("%d", &score); 19 if (score < MIN_SCORE) pass = 0; // 合格取り消し 20 sum += score; 21 } 22 if (sum < MIN_AVERAGE * N_SUBJECT) pass = 0; // 合格取り消し 23 if (pass) id[n] = i, ave[n++] = (double)sum / N_SUBJECT; 24 } 25 puts("合格者一覧"); 26 for (int i = 0; i < n; i++) 27 printf("%d番 : %.2f\n", id[i], ave[i]); 28}

投稿2020/06/11 13:34

kazuma-s

総合スコア8224

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

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

0

下記でいかがでしょうか?

#include<stdio.h> #define A 5 #define B 3 #define TH1 60 #define TH2 70.0f int main(void) { int scr[A][B], cl[A],t = 0; double fig[A]; for (int i = 0; i < A; i++) { int tmp = 0; printf("%d番 :",i+1); for (int k = 0; k < B; k++) { scanf_s(" %d", &scr[i][k]); } if( (getMinArr(&scr[i], B) >= TH1) // 最小値が60以上 && (getAveArr(&scr[i], B) >= TH2)) // 平均値が70以上 { cl[t] = i+1; fig[t] = getAveArr(&scr[i], B); t++; } } printf("合格者一覧\n"); for (int i = 0; i < t; i++) { printf("%d番 : %.2f\n", cl[i], fig[i]); } return 0; } // 配列の最小値を返す(ただし、Sizeが0の時は-1を返す) int getMinArr(int arr[], int size) { int i; int Min = arr[0]; if(size == 0){ return -1; } for(i=0;i<size;i++){ if(Min > arr[i]){ Min = arr[i]; } } return Min; } // 配列の平均値を返す(ただし、Sizeが0の時は-1を返す) double getAveArr(int arr[], int size) { int i; double Ave = 0; if(size == 0){ return -1; } for(i=0;i<size;i++){ Ave += arr[i]; } return Ave/size; }

投稿2020/06/11 07:02

takayukid

総合スコア20

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

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

退会済みユーザー

退会済みユーザー

2020/06/11 12:42

回答ありがとうございます。初心者にも分かりやすいコードで助かりました。ただ一つメソッドの呼び出し側で&scr[i]というように&が付いている理由がよく分かりませんでした。
takayukid

2020/06/12 02:16

&scr[i]は、関数の引数に2次元配列の1次元目の要素iの先頭アドレスを渡すためです。 getMinArr(), getAveArr()の引数に配列の先頭アドレスarr[]を受け取り、 arr[]からサイズ(size)分の要素の中から、最小値、平均値を算出するようにしています
guest

0

ベストアンサー

C

1// score[0]~score[n-1] の合計を返す 2int sum(int score[], int n) { 3 int result = 0; 4 int i; 5 for ( i = 0; i < n; ++i ) { 6 result += score[i]; 7 } 8 return result; 9} 10 11// score[0]~score[n-1]のすべてが60点以上 12// かつ sum(score) >= 70*n なら 1、さもなくば 0 を返す 13int pass(int score[], int n) { 14 int i; 15 for (i = 0; i < n; ++i) { 16 if ( score[i] < 60 ) return 0; // 60点未満だったら即不合格 17 } 18 // ここに達したら合格かもしれない。が... 19 if ( sum(score) >= 70*n ) return 1; // うん、合格!! 20 else return 0; // 平均70点未満だと不合格 21}

投稿2020/06/11 06:40

編集2020/06/11 15:26
episteme

総合スコア16614

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

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

退会済みユーザー

退会済みユーザー

2020/06/11 11:55

回答ありがとうございます。ぱっと見理解できないところがあるので自分で調べて紐解いてみます。
退会済みユーザー

退会済みユーザー

2020/06/11 12:12

理解できました。ありがとうございました。
guest

0

「すべての科目の点数がx点以上」をチェックする必要があるので、
案1) これを展開して全て書く(またはマクロで展開する)
案2) for文等のloop処理内で判定する
のどちらかしかありえません。
それから、「60」、「210」、「3.0」とかのマジックナンバーはやめてdefine文で書いておかないと、条件が変わって修正が必要になった時に該当個所を探すのがたいへんです。

投稿2020/06/11 07:04

sage

総合スコア1216

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

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

0

すべての科目の点数が60点以上かつ平均点が70点以上、という判定を行う関数を作りましょう
そうすれば単純なループとif文で事が済みます

C

1struct _tensu{ 2 int rika; 3 int sansu; 4 int syakai; 5} 6 7... 8int hantei(struct _tensu* t) 9{ 10 if(i->tika<60 || t->sansu<60 || t->syakai<60) return 0; 11 if((i->tika+t->sansu+t->syakai)<(70*3)) return 0; 12 return 1; 13} 14 15struct _tensu tensu[5]; // 5人分 16 17... 18 19for(int i=0;i<5;i++){ 20 if(hantei(tensu+i)){ 平均点出す } 21}

投稿2020/06/11 06:49

y_waiwai

総合スコア87774

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問