Cプログラムで最大と最小の身長を求める方法

このQ&Aのポイント
  • Cプログラムで10人の身長を入力し、配列を使って最大と最小の身長を求める方法について教えてください。
  • 現在のプログラムでは一人の身長データしか入力できないため、どのように修正すればよいか教えてください。
  • プログラムのコードを以下に示します。最大の身長はX.X、最小の身長はY.Yです。
回答を見る
  • ベストアンサー

cプログラム

次の10人の身長を入れ、最大と最小を配列を使って求めるプログラムなんですが、この場合だと一人の身長データしか入力できません どのように直せばいいでしょうか? #include <stdio.h> main () { float h[10],max,min; int i; max=-999; min=999; for(i=0;i<=9;i=i+1){ printf("%d番目の身長を入力してください\n",i+1); scanf("%5.1f",&h[i]); if(h[i]>max){ max=h[i]; } if(h[i]<min){ min=h[i]; } } printf("最大の身長は%5.1f,最小の身長は%5.1fです。\n",max,min); return(0); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

やっと、お答えできる理解が出来ました。何しろ、scanfって、あんまり使ったことがなかったので、いい勉強になりました。 scanf(%5.1f",h[i]); の「5.1」は、最大フィールド幅と呼ばれ、入力の最大幅を示しています。 これは、標準入力の事ですから、必ず文字列なわけです。従って、ここに少数を指定することは、出来ないようです。 ここを、「5」とすると、5桁以上の入力は次の関数の引数に回されるので試してみてください。当然ですが、この桁数にキー入力時の小数点は含まれます。

longagodsg
質問者

お礼

なるほど! 正常に動作しました、 丁寧に教えていただきありがとうございました

その他の回答 (6)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.7

>格納した後、使ってないですよ。 もっと正確に書くと、「最大値・最小値を求めるためだけに配列に格納する必要は 全くないのでは?」ってことです。

longagodsg
質問者

お礼

ありがとうございました!

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.6

>ここに少数を指定することは、出来ないようです。 誤:少数 正:小数 ところで、質問者さん。 入力した値を配列に格納する必要は、本当にあるんですか? 格納した後、使ってないですよ。

longagodsg
質問者

お礼

そうですねー 自分もそう思うのですが、配列を使って(条件に合う)プログラムを組む という課題でしたので配列を使いました

回答No.5

すみません、引数に&を付け忘れました。

longagodsg
質問者

お礼

ありがとうございました!

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.3

軽くテストしてみましたが、scanfで動作がおかしくなっているようですね。 仕様の詳細には詳しくないですが、小数点以下を指示すると問題があるようです。 /* scanf("%5.1f",&h[i]); */ scanf("%5f",&h[i]);

longagodsg
質問者

お礼

正常に動作しました! ありがとうございました

回答No.2

処理系と実行環境を書いてみてください。

longagodsg
質問者

お礼

回答ありがとうございます 処理系はコンパイラ 実行環境はよくわからないのですが、TeraTermをつかってます

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

おかしくないと思うけど、どうおかしいのですか?

longagodsg
質問者

お礼

1番目の身長を入力してください 122 2番目の身長を入力してください 3番目の身長を入力してください 4番目の身長を入力してください 5番目の身長を入力してください 6番目の身長を入力してください 7番目の身長を入力してください 8番目の身長を入力してください 9番目の身長を入力してください 10番目の身長を入力してください 最大の身長は 0.0,最小の身長は 0.0です。 u224226@cc[4]% このようになってしまいます

関連するQ&A

  • C言語で勉強中(max,min)の出し方

    C言語で勉強中(max,min)の出し方 maxまで表示が正しく出るようになったんですが、minでは終了時に入力の-999が表示されます。 今後、平均まで出るようにと考えているのですが、未だにminで思考停止中です。何がなんだかわかりません。どなたか、お助けください。 #include<stdio.h> main(void) { float cm,kg,m,bmi,max,min; int nin; cm=kg=nin=0; max=0; min=-0; printf("身長(cm)と体重を入力してください。\n"); while (cm=250,kg=200){ scanf("%f %f",&cm , &kg); max=min=cm; if(cm>max) max=cm; if(cm<min) min=cm; if(cm == -999 ||kg == -999) break; /*-999で終了 */ nin ++; m=cm/100.0 ; /* Mに変換 */ bmi=kg / m / m; /* BMIの計算 */ printf("身長%5.1f ",cm); printf("体重%5.1f ",kg); printf("BMI値%7.1f",bmi ); if(bmi>=25) printf("肥満です。\n"); if(bmi<18.5) printf("低体重です。\n"); if(bmi <25 && bmi>=18.5) printf("**.* \n"); } printf("総人数%d\n",nin); printf("最大身長%3.1fcm",max); printf( "最低身長%3.1fcm",min); return 0; }

  • プログラミング(C言語)についての質問です

    3つの整数の入力を受け付け、最大と最小を求める関数を作成し得られた結果を表示するプログラミングを作成したつもりなのですが、うまく作動しません。(コンパイルはできますが、結果が無茶苦茶になります。) ご教授宜しくお願いします。 それと、課題文にはポインタを使って最大値と最小値を同時に求めるようにと書いてあったのですが、それもよくわからないです。 今回初めてポインタと配列の受け渡しについて習ったのでよくわかっていない部分も多いと思うのですが、何卒宜しくお願いします。 ちなみに関数の形自体は void minmax(int data[],int *min,int *max){} で決まっています。 #include <stdio.h> void minmax(int data[],int *min,int *max){ int i; *min=*max=data[0]; printf("1st intenger:"); scanf("%d",&data[0]); printf("2st intenger:"); scanf("%d",&data[1]); printf("3st intenger:"); scanf("%d",&data[2]); for(i=1;i<3;i++){ if(*max<data[i]){ *max=data[i]; } if(*min>data[i]){ *min=data[i]; } } } int main(void){ int data[3],min,max; minmax(data,&min,&max); printf("最小値は%dで最大値は%dです",min,max); return 0; }

  • C言語 最大値と最小値を求めて表示するプログラム

    はじめまして。 C言語を学習中です。 下記の問題演習の解答として記載されているプログラムがどうしても理解できません。 特にプログラムの最後の方のwhile文で最大値と最小値の判定をしているのかと思いますが、どのような計算をして判定しているのでしょうか。 while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; 具体的に教えてください。 よろしくお願い致します。 ●問題 0~100の範囲で入力された複数の数値の中から、 最大値と最小値を求めて表示するプログラムを作成せよ。 -1が入力された場合は入力の終わりと判定する。 ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。 また、入力された数値を記憶する配列の要素数は10とし、 それ以上入力された場合はエラーが起きても仕方ないこととする。 ヒント:配列の中に -1 があればデータの終わりだと判断できる。 ヒント:最小値を探すには、最大値を記憶した変数との比較を繰り返せば良い。 ●解答 #include <stdio.h> void maxmin(int array[],int *max,int *min); int main(void) { int i = 0,array[10],max,min; do { printf("%d 番目の数:",i + 1); scanf("%d",&array[i]); i++; } while (array[i - 1] != -1); maxmin(array,&max,&min); printf("最大値 %d : 最小値 %d\n",max,min); return 0; } void maxmin(int array[],int *max,int *min) { int i = 0; *max = 0; *min = 100; while (array[i] != -1) { if (array[i] > *max) *max = array[i]; if (array[i] < *min) *min = array[i]; i++; } }

  • C言語のプログラムについてです

    5人の名前と身長を入力し、1番高い人の名前と身長を表示せよというものです。 下記のソースプログラムをコンパイルすると warning: format ‘%s’ expects type ‘char *’, but argument 2 has type ‘char (*)[10]’ と表示されます。どこを修正すればよいのでしょうか? またこのプログラムにはchar関数を使っていますが、char関数というのも良く分かりません その解説も付け加えていただけると幸いです#include <stdio.h> #include <string.h> int main(void) { int i,sincho,max_sincho; char max_namae[10],namae[10]; max_sincho=0; for(i=1;i<=5;i++){ printf("名前: "); scanf("%s", &namae); printf("身長: "); scanf("%d", &sincho); if(sincho>max_sincho){ max_sincho=sincho; strcpy(max_namae,namae); } } printf("身長が一番高い人は%sさんで%d cmです。\n", max_namae,max_sincho); return 0; }

  • 処理の流れの説明のしかたがわかりません。

    プログラムの課題が出たのですがソースコードはなんとか穴埋めでできたのですが説明文を簡単につけなければならないのですがあんまり理解してないのでどのように説明したら良いかよくわかりません。お願いします。 10個の整数を配列し保存しそのデータのうちから最大値と最小値を表示するプログラムです。 #include <stdio.h> void main(void) { int data[10]; int i; int max,min; for(i=0;i<10;i++){ printf("input data No. %d ->",i+1); scanf("%d",&data[i]); } max=data[0]; min=data[0]; for(i=1;i<10;i++){ if(data[i]>max){ max=data[i]; } if(data[i]<min){ min=data[i]; } } printf("MAX = %d\n",max); printf("MIN = %d\n",min); } .

  • C言語のソートプログラム

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",&n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<n;i++){ printf("a[%d]",i); scanf("%d",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[%2d]=%d\n",i,a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これを実行すると 最初に入力した配列の順番のまま表示されてしまいます。 例えば n=4 a[0]7 a[1]4 a[2]6 a[3]1 a[i]のソート結果 a[0]7 a[1]4 a[2]6 a[3]1 のようにです。 しかしプログラミング上では for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]       temp=a[i];       a[i]=a[j];            a[j]=temp;        }        }        } のようにiとjを比較して a[0]がa[1]より大きければa[0]とa[1]を交換する。 あとはa[0]とa[2], a[0]とa[3]...a[3]とa[4]まで for文の続く限り繰り返すように書いたはずです。 まだ勉強し始めた私にはどこが間違っているのか分からないので 分かる方はご指摘をお願いします。

  • 空Enterの扱い方

    3つの整数を入力し、最大値を出力するプログラムを作りました。 最大値をさがすステップに入る前に、 「最大値を出力しますか?(y/n)」と聞いてy+Enterで実行するようになっています。この部分を、 y+Enter もしくは 空Enter で実行するにはどのように変更すればよいのでしょうか?大変お手数ですが、教えてください。 よろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(){ int i,max,max_no,a[3]; char YN[2]; printf("整数を3つ入力してください。\n"); for(i=0;i<3;i++){ printf("%d番目の整数: ",i+1); scanf("%d",&a[i]); } printf("最大値を出力しますか?(y/n):"); scanf("%s",YN); if(YN[0]=='y'){ printf("最大値をさがします。\n"); } else{ exit(0); } max_no=0; max=a[max_no]; for(i=1;i<3;i++){ if(a[i]>max){ max=a[i]; max_no=i; } } printf("最大値は %d 番目のデータ %d です。\n",max_no+1,max); return 0; }

  • 配列の和を求めるプログラム

    キーから入力したデータを配列に入力した後、その和を求めるプログラムを作成したいのですが、プログラミング初心者の私にはさっぱりわかりません。 和を求めたいのに平均値が出てきてしまいます。 どこが間違っているのか教えてください。 #include <stdio.h> float data[5]; float total(int max); void main(void) { int cnt = 0; float d; printf("please input a data: "); scanf("%f", &d); while((cnt < 5) && (d > 0.0)) { data[cnt] = d; cnt++; printf("please input a data: "); scanf("%f", &d); } printf("total data: %5.2f\n", total(cnt)); } float total(int max) { int i; float total = 0.0; for(i = 0; i < max; i++) { total += data[i]; } return total / max; }

  • プログラムが間違っているようなのですが

    ファイルからデータを読み込み、そのファイル内のデータの最大値・最小値を求めるプログラムを作ろうとしているのですが、実行結果が 最大値:0 最小値:0 となり、max2とmin2にうまく値が入っていないようなのです。 main関数にsub_main;を追記してみたりと色々試しているのですが、うまくいきません。 ファイルの読み込みがうまくいっていないのでしょうか。 もしくはポインタの使い方がまずいのでしょうか。 ファイルの内容は 20 40 30 ・ ・ ・ という感じの、不規則な数字の羅列で、今は10個入っています(データ個数が分からない場合も考えているのですが・・・)。 プログラム初心者なので難しいことはあまり分からないですが、助言を頂ければ嬉しいです。 #include<stdio.h> int sub_main(int *tensu,int *max,int *min) { int i=0; FILE *fp; fp = fopen("11.txt","r"); while(fscanf(fp,"%d",&*tensu)!=EOF); { for(i=0;i<10;i++) { if(*tensu+i>*max) *max=*tensu+i; if(*tensu+i<*min) *min=*tensu+i; } } fclose(fp); } main() { int max2=0,min2=0; int *max=&max2; int *min=&min2; printf("最大値:%d\n最小値:%d\n",max2,min2); }

  • Visual C++でのプログラミング

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<=n;i++){ printf("a[%d]",i); scanf("%d\n",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[i]=%d\n",a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これをVisual C++でデバックすると 『test.exeの0x0fcbe42e(msvcr100d.dll)にハンドルされていない例外が発生しました:0C0000005: 場所 0x00000000 に書き込み中のアクセス違反が発生しました。』 と表示されて実行できません。 今日インストールしたばかりなのでどこでエラーが起きているのかわかりません。 これはプログラミングとVisual C++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

専門家に質問してみよう