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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

942閲覧

視力の人数分布が上手くいかない

Cpro

総合スコア15

C

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/06/29 04:04

C言語で名前、身長、視力を入力させて一覧表と視力の分布表を求めるプログラムを作っています。
一覧表を作成するところまでは上手くいっているのですが、視力の分布がどうしても期待した動作になってくれません。

###コード

c

1#include<stdio.h> 2#include<string.h> 3 4#define VMAX 21 5 6typedef struct { 7 char name[20]; 8 int height; 9 double visual; 10}Physical; 11 12 13int input(Physical a[]); 14int output(Physical a[],int n); 15int distribution(Physical a[], int n); 16 17 18 19 20int main(void) 21{ 22 Physical x[30]; //30人のPhysical型の構造体の配列 23 24 int number = input(x); //入力関数 25 26 output(x, number); //出力関数 27 28 distribution(x, number); 29 30 return 0; 31} 32 33 34//入力関数 35int input(Physical a[]) 36{ 37 int n = 0; //人数 38 int i; 39 char exit[] = "exit"; 40 41 //exitと入力されたらループを終了する 42 for (i = 0;; i++) { 43 printf("%3d人目 名前(終了時はexitと入力) : ", i + 1); scanf_s("%s", a[i].name,20); 44 if (strcmp(a[i].name, exit) == 0) break; //ループ終了 45 46 printf(" 身長           : "); scanf_s("%d", &a[i].height); 47 printf(" 視力 : "); scanf_s("%lf", &a[i].visual); 48 49 n++; 50 51 printf("\n"); 52 } 53 54 return n; 55 56} 57 58 59//出力関数 60int output(Physical a[], int n) 61{ 62 int i; 63 64 printf("\n\n"); 65 printf(" 身体検査一覧表\n"); 66 printf("\n"); 67 printf("+----------------------------------------------+\n"); 68 printf("| 番号 | 氏名 | 身長 | 視力 |\n"); 69 printf("+----------------------------------------------+\n"); 70 71 for (i = 0; i < n; i++){ 72 printf("| No.%-2d | %-20.18s | %3d |%5.1f |\n", i + 1, a[i].name, a[i].height, a[i].visual); 73 } 74 75 printf("+----------------------------------------------+\n"); 76 77 return 0; 78} 79 80int distribution(Physical a[], int n) 81{ 82 int visual10; 83 double visual1; 84 int visuallist[VMAX]; 85 int i; 86 87 88 //visuallistの配列要素を全て0にする 89 for (i = 0; i < VMAX; i++) 90 visuallist[i] = 0; 91 92 for (i = 0; i < n; i++) { 93 if (a[i].visual >= 0.0&&a[i].visual <= VMAX / 10.0) 94 visuallist[(int)(a[i].visual * 10)]++; 95 } 96 97 printf("視力の分布\n"); 98 99 for (visual10 = 0; visual10 < VMAX; visual10++) { 100 visual1 = (double)(visual10 + 1) / 10; 101 printf("%3.1f~ : %d人\n", visual1, visuallist[i]); 102 } 103 104 return 0; 105}

###コンパイラ
コンパイラで、

1人目 名前(終了時はexitと入力) : Tadao

身長           : 162 視力 : 0.3

2人目 名前(終了時はexitと入力) : Tomiaki

身長           : 173 視力 : 0.7

3人目 名前(終了時はexitと入力) : Syouji

身長           : 175 視力 : 2.0

4人目 名前(終了時はexitと入力) : exit

と入力すると、視力の分布表は

視力の分布

0.1~ : 1人
0.2~ : 1人
0.3~ : 1人
0.4~ : 1人
0.5~ : 1人
0.6~ : 1人
0.7~ : 1人
0.8~ : 1人
0.9~ : 1人
1.0~ : 1人
1.1~ : 1人
1.2~ : 1人
1.3~ : 1人
1.4~ : 1人
1.5~ : 1人
1.6~ : 1人
1.7~ : 1人
1.8~ : 1人
1.9~ : 1人
2.0~ : 1人
2.1~ : 1人

と出力してしまいます。

正しく分布表を作るにはどのような点を改善すればいいのかどなたか教えていただけないでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

C

for (visual10 = 0; visual10 < VMAX; visual10++) {
visual1 = (double)(visual10 + 1) / 10;
printf("%3.1f~ : %d人\n", visual1, visuallist[i]);
}

visuallist[i]って、変じゃないでしょうか。iはこのループには関係無いですよね。


余程古いCを書いているのでなければ、カウンタ変数はfor文の初期化部で宣言できます。
そのようにすれば、カウンタ変数の混同を避けられます。

例えば、このように。

C

1for(int i = 0; 条件部; 更新部) {

投稿2019/06/29 04:07

編集2019/06/29 04:09
LouiS0616

総合スコア35658

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

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

Cpro

2019/06/29 05:02

本当ですね…回答ありがとうございました!解決しました。 for文を混同しないためにも気を付けます。
pepperleaf

2019/06/29 05:17

> visual1 = (double)(visual10 + 1) / 10; なんで、 0.9 の人が 1.0~になりますが、これで良い?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問