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

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

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

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

Q&A

解決済

4回答

1154閲覧

出力結果が思い通りに行きません

Teemro_431265

総合スコア29

C

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

0グッド

0クリップ

投稿2018/07/07 08:52

7人分の成績を入力した後にその評定が出るようにしたいのですが下記のような表示になってしまいます。
7人分の評点を入力してください。
50 80 70 100 60 0 35
1 : 50 C
2 : 80 A
3 : 70 B
4 : 100 A
5 : 60 C
6 : 0 F
6 : 35 D
^C
一番下の出力を7:35 D としたいです。またC-cを押さないと次の作業に移れません。
色々探って見たところ自分としてはfor(i=1;N+1;i++)のところがうまく言っていないんじゃないかと思います。

c

1#include<stdio.h> 2#define N 7 3int main(){ 4 int i,l,num[N]; 5 printf("7人分の評点を入力してください。\n"); 6 7 8 for(i=1;i < N+1;i++){ 9 10 for(l=0;l < N;l++){ 11 12 scanf("%d",&num[N]); 13 14 15 if(num[N] >= 80){ 16 printf("%d : %d A\n",i,num[N]); 17 } 18 19 20 else if(65 <=num[N] && num[N] < 80){ 21 printf("%d : %d B\n",i,num[N]); 22 } 23 24 25 else if(50 <= num[N] && num[N] < 65){ 26 printf("%d : %d C\n",i,num[N]); 27 } 28 29 30 else if(35 <= num[N] && num[N] < 50){ 31 printf("%d : %d D\n",i,num[N]); 32 } 33 34 else{ 35 printf("%d : %d F\n",i,num[N]); 36 } 37 38 } 39 40 } 41 return 0; 42}

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

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

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

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

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

guest

回答4

0

ベストアンサー

numは7要素の配列ですので、num[0]からnum[6]を利用できます。
逆に言えば、num[7]にアクセスすることは出来ません。

ループはfor(i = 0; i < N; i++)を使い、出力する際に1加えた値を使って下さい。

C

1if(80 <= num[i]) { 2 printf("%d : %d A\n", i+1, num[i]); 3} 4// 直前の条件が偽なので、num[i]が80未満であることは分かりきっている 5else if(65 <= num[i]) { 6 printf("%d : %d B\n", i+1, num[i]); 7} 8

num[N]に何度もアクセスしようとしているのも大いに謎です。


またC-cを押さないと次の作業に移れません。

二重ループにしてるからでは?

投稿2018/07/07 08:57

編集2018/07/07 09:07
LouiS0616

総合スコア35660

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

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

Teemro_431265

2018/07/07 10:14

num[N]になんどもアクセスしようとしているというのはどういうことですか? 一番最後にprintfで表示するということですか?
LouiS0616

2018/07/07 10:18

ご自身のプログラム内にnum[N]と何回書いてあるか見てみましょう。 本来なら宣言時の一回だけしか書いてはなりません。 --- N要素の配列には、0からN-1番目までの要素があります。 N番目にアクセスすると未定義の動作を起こし、何が起きるか予測できなくなります。
Teemro_431265

2018/07/07 10:28

わかりました。scanfの後だからnum[N]の中にすでに要素が入っていてそれを使えるものだと思っていました。 では次の質問なのですが、二重ループだとC-c押さないとプログラムが続いている状態になってしまう感じですか?
LouiS0616

2018/07/07 10:31

二重ループにする意味がそもそもないですからね。 紙に簡単にロジックを書いてみると良いかと。
LouiS0616

2018/07/07 10:35

このプログラム、結局は『数を入力し、それに対応する評価を出力』するミニプログラムをN回繰り返しているだけです。二重ループが登場する余地がありません。 配列や入力バッファが絡むのでちょっとややこしくなってはいますが。
Teemro_431265

2018/07/07 10:54

え、ほんとですか(笑) そうですね、もう一度ゆっくり考え直して見ます。 ありがとうございます。
退会済みユーザー

退会済みユーザー

2018/07/08 02:24

横から失礼します。 点数を判定するところを一つにまとめると2重for文で書くこともできます。 (私が書いたソースコードを載せておきます。)
LouiS0616

2018/07/08 07:53

@Stars1024 さん 確かに可能ではありますね。コードとして洗練されるかどうかはちょいとわかりませんが。
guest

0

二重ループで入力待ちをしているため、(N+1)*N回の入力をするまで終わらないプログラムになっています。

C

1 for(i=1;i < N+1;i++){ 2 for(l=0;l < N;l++){ 3 scanf("%d",&num[N]);

また、書き込み場所が配列外(num[7])の位置で固定されている点も問題です。

投稿2018/07/07 09:06

編集2018/07/07 09:08
shiron46

総合スコア111

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

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

Teemro_431265

2018/07/07 10:16

というのはscanfの場所が悪いということですか?
shiron46

2018/07/07 10:34

それよりも、ここではそもそも何回繰り返したいのか考える必要があります。 ご自身のプログラムは、その通りの繰り返し回数になっているでしょうか?
Teemro_431265

2018/07/07 11:05

一応人数が決められているので人数分繰り返したいです。 左側の数字はなっていませんが成績の判定はできていると思います。
shiron46

2018/07/07 11:24

私はだいぶ遠回しに表現していますが、LouiS0616さんと同じことを指摘していることにはお気づきでしょうか。 もう一度、ご自身のプログラムをよく振り返ってみてください。
Teemro_431265

2018/07/07 12:29

なんとなくは同じことを言われている気はします。 わかりました、ありがとうございます。
guest

0

a.c

c

1#include<stdio.h> 2 3#define N (7) 4 5char grade(int num) { 6 char ans; 7 8 if (num >= 80) { 9 ans ='A'; 10 } else if (num >= 65) { 11 ans = 'B'; 12 } else if (num >= 50) { 13 ans = 'C'; 14 } else if (num >= 35) { 15 ans = 'D'; 16 } else { 17 ans = 'F'; 18 } 19 return ans; 20} 21 22int main() { 23 int num[N]; 24 25 printf("7人分の評点を入力してください。\n"); 26 for(int i = 0; i < N; i++) { 27 scanf("%d", &num[i]); 28 } 29 30 for(int i = 0; i < N; i++) { 31 printf("%d: %3d %c\n", i + 1, num[i], grade(num[i])); 32 } 33 return 0; 34}

実行例
イメージ説明

投稿2018/07/08 08:55

katoy

総合スコア22324

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

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

guest

0

こんにちは、点数を判定するところをfor文でまとめて書くと以下のようにすることもできます。
(あくまでも点数の最大値が100であることを前提に書いています。)
評価する点数の境界線のところを配列に格納し、それに対応する評価をchar型の配列で用意します。 

また、人数の7などは定数なので#defineで定義しましょう。

C

1#include <stdio.h> 2#include <stdlib.h> 3 4#define BUFSIZE 256 5#define MEMBER 7 6#define SCORE_TYPE 6 7 8int main(void) 9{ 10 char buf[BUFSIZE]; 11 int data[MEMBER]; 12 int i,j; 13 int score[SCORE_TYPE] = {0,35,50,65,80,101}; 14 char result[SCORE_TYPE] = "FDCBA"; 15 printf("%d人分の評点を入力してください。\n",MEMBER); 16 17 for(i = 0; i < MEMBER; i++){ 18 printf("%d人目 ->",i + 1); 19 fgets(buf,BUFSIZE,stdin); 20 data[i] = strtol(buf,NULL,10); 21 } 22 for(i = 0; i < MEMBER; i++){ 23 for(j = 0; j < SCORE_TYPE - 1; j++){ 24 if(score[j] <= data[i] && data[i] < score[j + 1]){ 25 printf("%d : %d %c \n",i + 1,data[i],result[j]); 26 break; 27 } 28 } 29 } 30 return 0; 31}

投稿2018/07/08 02:22

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問