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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Q&A

解決済

3回答

3965閲覧

2次元配列の条件分岐がわからない。

langhtorn

総合スコア105

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

0グッド

0クリップ

投稿2020/06/10 02:54

編集2020/06/10 03:11

###実現したいこと
合格基準はすべての試験科目の点数が60点以上かつその人の平均点が70点以上。
合格者を表示したい。
###問題点
ご指摘いただいたところを治しましたところ満たしていないはずの2番さんが表示されてしまいました。

学籍番号1 70 60 80 学籍番号2 75 58 90 学籍番号3 75 80 90 学籍番号4 65 80 60 学籍番号5 60 100 60 合格者一覧 1番 210点 平均70.00 2番 223点 平均74.33 3番 245点 平均81.67 5番 220点 平均73.33

条件分岐が間違っているとおもうのですがどう変えればいいのかわかりません。ご指摘お願いします。
###コード

C

1/*2次元配列を用いた項目別成績の集計プログラム*/ 2#include<stdio.h> 3#define NUMBER 5 //学籍番号 4#define SUBJECT 3 //教科数 5int main(void) 6{ 7 int i,j; 8 int ssum=0; //合格者の人数 9 int tensu[NUMBER][SUBJECT+1]={0}; //項目別の点数 10 int succs[NUMBER]; //合格者のリスト 11 double avg[5]; 12 for(i=0;i<NUMBER;i++){ 13 printf("学籍番号%d\n",i+1); 14 for(j=1;j<=SUBJECT;j++){ 15 //printf("項目%d:",j); 16 scanf("%d",&tensu[i][j]); 17 tensu[i][0]+=tensu[i][j]; 18 avg[i]=(double)tensu[i][0]/SUBJECT; 19 /*printf("平均点:%.2f\n",avg[i]); //デバック用 20 printf("合計点:%2d\n",tensu[i][0]);*/ 21 if(tensu[i][j]>=60 && avg[i]>=70){ //すべてが60点以上かつ平均70点以上 22 succs[ssum++]=i; 23 } 24 } 25 } 26 printf("合格者一覧\n"); 27 for(i=0;i<ssum;i++){ 28 printf("%2d番 %3d点 平均%.2f\n",succs[i]+1,tensu[succs[i]][0],(double)tensu[succs[i]][0]/SUBJECT); 29 } 30 return 0; 31}

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

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

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

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

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

thkana

2020/06/10 11:45

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13226565128 teratailでは「マルチポスト」は推奨されていません。https://teratail.com/help#posted-otherservice 「禁止」ではありませんが、それでもやるんだ、というなら書かれているように「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」
guest

回答3

0

if(tensu[i][j]>=60 && avg[i]>=70){ //合計180点以上かつ平均70点以上

avg[i]が平均点で、かつ70点以上なのはいいですが
tensu[i][j]が合計点なのか?
なぜ60と比較することで「合計180点以上」になるのか?は考えないといけません。

また、「合計180点以上」では「平均60点以上」と何も変わらない事に注意が必要です。

投稿2020/06/10 03:03

asm

総合スコア15149

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

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

0

C

1 if(tensu[i][j]>=60 && avg[i]>=70){ //合計180点以上かつ平均70点以上 2 succs[ssum++]=i; 3 }

ここでのjは、上でループを抜けきった後なので、4になっています。結果、配列の範囲外を参照する形となっていて、まともな比較条件ではありません。

投稿2020/06/10 02:59

maisumakun

総合スコア146018

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

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

0

ベストアンサー

なぜにわざわざ難しく考えるんだろう。
なぜにすべてをmainに詰め込もうとするんだろう。
解決したい問題を分割し、それを関数で解決すればいいのに。

C

1#include<stdio.h> 2 3#define NUMBER 5 //学籍番号 4#define SUBJECT 3 //教科数 5 6// 総得点を返す 7int sum(int score[]) { 8 int result = 0; 9 int i; 10 for ( i = 0; i < SUBJECT; ++i ) { 11 result += score[i]; 12 } 13 return result; 14} 15 16// score[0]~score[SUBJECT-1]のすべてが60点以上 17// かつ sum(score) >= 70*SUBJECT なら 1、さもなくば 0 を返す 18int pass(int score[]) { 19 int i; 20 for (i = 0; i < SUBJECT; ++i) { 21 if ( score[i] < 60 ) return 0; 22 } 23 if ( sum(score) >= 70*SUBJECT ) return 1; 24 else return 0; 25} 26 27int main(void) { 28 int i, j; 29 int tensu[NUMBER][SUBJECT]; 30 31 // 得点表を作る 32 for (i = 0; i < NUMBER; i++) { 33 printf("学籍番号%d\n", i + 1); 34 for (j = 0; j < SUBJECT; j++) { 35 //printf("項目%d:",j); 36 scanf("%d", &tensu[i][j]); 37 } 38 } 39 40 // 合格者のみプリント 41 printf("合格者一覧\n"); 42 for (i = 0; i < NUMBER; i++) { 43 if ( pass(tensu[i]) ) { // 合格してたら書く。 44 printf("%2d番 %3d点 平均%.2f\n", 45 i+1, sum(tensu[i]), (double)sum(tensu[i])/SUBJECT ); 46 } 47 } 48 return 0; 49}

投稿2020/06/10 04:36

編集2020/06/10 04:45
episteme

総合スコア16612

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

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

langhtorn

2020/06/13 04:36

関数で考えた方がすっきりしていていいかもしれません。ありがとうございました。
episteme

2020/06/13 05:18 編集

いいに決まってんじゃない? 合格条件が変わっても関数pass()を修正するだけなんだし。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問