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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

1回答

2129閲覧

C言語の分布表示についての質問です。

yokise

総合スコア3

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2020/05/14 15:22

身長の分布を3センチ刻みで表示するプログラムを書きたいのですが、3センチ刻みで表示するやり方が思い付かず質問させて頂きました。すでにデータの大きさや数値は決まっている状態です。

###実行のイメージ

身体検査一覧表
氏名     身長 視力
AKASAKA Tadao 162 0.3
KATOH Tomiaki 173 0.7
SAITOU Syouji 175 2.0
TAKEDA Shinya 171 1.5
NAKAGAWA Masaki 168 0.4
HAMADA Tetsuaki 174 1.2
MATSUTOMI Akio 169 0.8
身長の分布
140〜 : 0人
143〜 : 0人
146〜 : 0人
149〜 : 0人
152〜 : 0人
155〜 : 0人
158〜 : 0人
161〜 : 1人
164〜 : 0人
167〜 : 2人
170〜 : 1人
173〜 : 3人
176〜 : 0人
179〜 : 0人
182〜 : 0人
185〜 : 0人
188〜 : 0人
191〜 : 0人
194〜 : 0人
197〜 : 0人
200〜 : 0人

######私が途中まで書いたプログラムです

c

1#include<stdio.h> 2#define HMAX 200/*身長の最大値*/ 3 4typedef struct{ 5char name[20]; /*氏名*/ 6int height; /* 身長*/ 7double vision; /*視力*/ 8}PhysCheck; 9 10 11/*身長の分布を求める*/ 12void dist_height(const PhysCheck dat[], int n, int dist[]) 13{ 14 int i; 15 for(i=0;i<HMAX;i++) 16 dist[i]=0; 17 18 for(i=0; i<HMAX; i++) 19 if(dat[i].height >= 140 && dat[i].height <= 200) 20 dist[(int)(dat[i].height)]++; 21} 22 23 24int main(void) 25{ 26 int i; 27 PhysCheck x[] = { 28 {"AKASAKA Tadao", 162, 0.3}, 29 {"KATOH Tomiaki", 173, 0.7}, 30 {"SAITOU Syouji", 175, 2.0}, 31 {"TAKEDA Shinya", 171, 1.5}, 32 {"NAKAGAWA Masaki", 168, 0.4}, 33 {"HAMADA Tetsuaki", 174, 1.2}, 34 {"MATSUTOMI Akio", 169, 0.8}, 35 }; 36 37 int nx = sizeof(x)/sizeof(x[0]); /*人数*/ 38 int hdist[HMAX]; /*身長の分布*/ 39 40 puts("身体検査一覧表"); 41 puts("氏名        身長 視力"); 42 puts("---------------------------"); 43 for(i=0;i<nx;i++) 44 printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); 45 46 47 dist_height(x, nx, hdist); /*身長の分布を求める*/ 48 49 printf("\n身長の分布\n"); 50 for(i=0;i<HMAX;i=i+3) 51 printf("%d〜 : %d人\n", i, hdist[i]); 52 53 return 0; 54 55} 56

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

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

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

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

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

guest

回答1

0

ベストアンサー

各分布の人数を格納する配列hdistを、3cm刻みにしてしまえば良いと思います。それに加えて身長140cmを基点とすることで、hdist[0]の範囲を140 <= n < 143, hdist[1]の範囲を143 <= n < 146...とするように管理することができます。

C

1#include<stdio.h> 2 3#define HMAX 200 /* 身長の最大値*/ 4#define HMIN 140 /* 身長の最低値(cm) */ 5#define HDIV 3 /* 分布の刻み(cm) */ 6 7typedef struct{ 8char name[20]; /*氏名*/ 9int height; /* 身長*/ 10double vision; /*視力*/ 11}PhysCheck; 12 13 14/*身長の分布を求める*/ 15void dist_height(const PhysCheck dat[], int n, int dist[]) 16{ 17 int i; 18 for(i=0;i<HMAX;i++) 19 dist[i]=0; 20 21 /* NG!!! 領域外配列要素 dist[200]にアクセスしてしまうコード */ 22 for(i=0; i<HMAX; i++) 23 if(dat[i].height >= 140 && dat[i].height <= 200) 24 dist[(int)(dat[i].height)]++; 25} 26 27/* 修正したコード */ 28void dist_height2(const PhysCheck dat[], int n, int dist[], int dist_num) 29{ 30 int i; 31 for (i = 0; i< dist_num; i++) { 32 dist[i] = 0; 33 } 34 35 for (i = 0; i < n; i++) { 36 if (HMIN <= dat[i].height && dat[i].height <= HMAX) { 37 /* HMINを基点として、HDIV刻みの配列要素を +1 */ 38 int pos = (dat[i].height - HMIN) / HDIV; 39 dist[pos]++; 40 } 41 } 42} 43 44int main(void) 45{ 46 int i; 47 PhysCheck x[] = { 48 {"AKASAKA Tadao", 162, 0.3}, 49 {"KATOH Tomiaki", 173, 0.7}, 50 {"SAITOU Syouji", 175, 2.0}, 51 {"TAKEDA Shinya", 171, 1.5}, 52 {"NAKAGAWA Masaki", 168, 0.4}, 53 {"HAMADA Tetsuaki", 174, 1.2}, 54 {"MATSUTOMI Akio", 169, 0.8}, 55 }; 56 57 int nx = sizeof(x)/sizeof(x[0]); /*人数*/ 58 59 /* 身長の分布を3cm刻みの配列で用意 */ 60#define HDIST_NUM (((HMAX - HMIN) + (HDIV - 1)) / HDIV) 61 62 int hdist[HDIST_NUM]; /* 身長の分布 */ 63 64 puts("身体検査一覧表"); 65 puts("氏名        身長 視力"); 66 puts("---------------------------"); 67 for(i=0;i<nx;i++) 68 printf("%-18.18s%4d%5.1f\n", x[i].name, x[i].height, x[i].vision); 69 70 71// dist_height(x, nx, hdist); /*身長の分布を求める*/ 72 dist_height2(x, nx, hdist, HDIST_NUM); 73 74 printf("\n身長の分布\n"); 75 for (i = 0; i < HDIST_NUM; i++) { 76 printf("%d〜 : %d人\n", HMIN + HDIV * i, hdist[i]); 77 } 78 79 return 0; 80}

Windows10/WSL(Ubuntu)上での実行結果です。

sh

1$ gcc -Wall t1.c -o t1 2 3$ ./t1 4身体検査一覧表 5氏名        身長 視力 6--------------------------- 7AKASAKA Tadao 162 0.3 8KATOH Tomiaki 173 0.7 9SAITOU Syouji 175 2.0 10TAKEDA Shinya 171 1.5 11NAKAGAWA Masaki 168 0.4 12HAMADA Tetsuaki 174 1.2 13MATSUTOMI Akio 169 0.8 14 15身長の分布 16140〜 : 0人 17143〜 : 0人 18146〜 : 0人 19149〜 : 0人 20152〜 : 0人 21155〜 : 0人 22158〜 : 0人 23161〜 : 1人 24164〜 : 0人 25167〜 : 2人 26170〜 : 1人 27173〜 : 3人 28176〜 : 0人 29179〜 : 0人 30182〜 : 0人 31185〜 : 0人 32188〜 : 0人 33191〜 : 0人 34194〜 : 0人 35197〜 : 0人 36$

投稿2020/05/14 17:28

編集2020/05/14 17:42
dodox86

総合スコア9183

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

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

yokise

2020/05/18 06:19

返信遅くなりすいません そのやり方でうまく行けました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問