• ベストアンサー

C++、10個の数のmin&maxを求めるプログラム

C++でのプログラミングに関しての質問です。 ユーザーから与えられる10個の数のminとmax、averageを求めるプログラムを作らなければいけないのですが、if/elseで出す以外に方法はありますか? if/elseを使うとなると、かなりたくさん繰り返さなければいけないと思うので、もしもっと単純に求められるものがあれば、と思っています。 よろしくお願いします。

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

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

いったん配列等に格納してしまうのであれば、最小値と最大値はstd::min_elementとstd::max_elementで求められます。平均値はstd::accumulateで合計してから10で割ればよいかと思います。 > if/elseを使うとなると、かなりたくさん繰り返さなければいけないと思うので、 上のように、配列にいったん格納するのであれば、if文は不要です。 そうでない場合でも、せいぜいループの中に2つif文があれば十分でしょう。 ただし、エラーチェックを厳密に行うのであれば、もう少しif文が必要になるかと思います。

tak0yaki
質問者

お礼

こんにちは、早速のお返事ありがとうございました。 std::min_element!頭が回りませんでした。初心者なので10個のmin、maxでも高度なのです。精進ですね。 ありがとうございました!

その他の回答 (4)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.5

参考までに、if文を一切使わないコードです。 (エラーチェックは省略しています) #include <iostream> #include <algorithm> #include <numeric> #include <vector> int main() {  std::vector<int> v;  for (int i = 1; i <= 10; i++)  {   std::cout << i << "個目の整数?" << std::endl;   int value;   std::cin >> value;   v.push_back(value);  }  std::cout << "最小値:" << *std::min_element(v.begin(), v.end()) << std::endl;  std::cout << "最大値:" << *std::max_element(v.begin(), v.end()) << std::endl;  std::cout << "平均値:" << std::accumulate(v.begin(), v.end(), 0.0) / 10.0 << std::endl;  return 0; }

tak0yaki
質問者

お礼

わざわざコードまで、本当にありがとうございます。10個も数があるのに、これだけで済むんですね!すごい。 また、ヘッダの種類を勉強しなければ、と気づきました。色々ありますね。どういう時にどれを使えばいいのか、難しいです。 ありがとうございました。

noname#50176
noname#50176
回答No.4

No.3 です。 #define COUNT 3 // 整数の入力個数 を #define COUNT 10 // 整数の入力個数 にすれば10個入力できます。

tak0yaki
質問者

お礼

了解しました、ありがとうございます。 余談ですが、ヘッダが色々あって理解が難しいです!奥が深い。

noname#50176
noname#50176
回答No.3

一応、3項演算でコンパクトにしてみるとこんな感じです。 (考え方は皆さん、おっしゃるとおりです) #include <stdio.h> #define COUNT 3 // 整数の入力個数 int main() { int i,s[COUNT],min=0,max=0; double avg=.0; for (i=0;i<COUNT;i++) { printf("%d 個目の数値?",i+1); flushall(); scanf("%3d",&s[i]); min=s[i]<s[min]?i:min; max=s[i]>s[max]?i:max; avg=(i-COUNT+1)?avg+s[i]:(avg+s[i])/COUNT; } printf("最小値:%d / 最大値:%d 平均値:%.1f\n",s[min],s[max],avg); return 0; }

tak0yaki
質問者

お礼

分かりやすい例、ありがとうございます。とても助かりました。 当たり前ですが、色々な書き方があるのですね。応用を利かせられるようになりたいものです。 ありがとうございました!

  • BearCave
  • ベストアンサー率20% (189/909)
回答No.2

IFはループ内に2つ必要なだけですが、それでもダメでしょうか? これが一番単純な方法だと思います。 int number[10]; // ユーザーから与えられた10個の整数 int total = 0; int min = number[0]; int max = number[0]; for( int i = 0; i < 10; i++ ) { total += number[i]; if( number[i] < min ) min = number[i]; else if( number[i] > max ) max = number[i]; } int average = total / 10;

tak0yaki
質問者

お礼

ありがとうございました、恥ずかしながら、いちいち一つずつ比べなければいけないのかと思っていたのです。2つでよかったんですね。 頂いたコードも使って、いろいろな方法を勉強していきたいです。ありがとうございました!

関連するQ&A

  • Yesならこっちへ、NOならあっちへ(c++)

    取り組んでる課題で、Yとタイプしたら1のステップにいけて、Nとタイプしたら2のステップに行くというところでわからなくなってしまいました。Userにそういう選択させるのには何をどう書いたらいいのですか? --------------------------------------------------------------------- 問題:1から100までの整数をUserに選ばせ、Userに、「選んだ数字はXX以上ですか?」と質問を繰り返し、最後にUserの選んだ数字を当てるという課題です。(Userはそれに対してYes/Noでしか答えられません。) --------------------------------------------------------------------- int max=100; int min=0; int mid, x; int systemtype=y, sytemtype=n; main(){ while(1){ cout<<"1から100までで好きな数字を選んでね。"; cin>> x; if (n<=0 || n>=100){ break; } if (mid == (max + min)/2){ cout<<"選んだ数字は :" << mid << " より大きい? "<< endl; cout<<" y は YES, n は NO :" << endl; } else if(min == max){ cout<<"その数字は" << x <<endl; break; } else if(min == mid){ mid += ( max - mid)/2; cout<<"あなたの選んだ数は :" << mid <<" より大きい? "<<endl; } else if(max == mid){ mid -= (mid - min)/2; cout<<"あなたの選んだ数は:" << mid << " より大きい? "<< endl; } else cout<<"その数字は :"<< n <<endl; } return 0; }

  • MIN&MAXを出したいです

    男女の年齢から男のMINとMAXの年齢、女のMINとMAXの年齢を抽出するに困っています。 A B C D E F 1 女 56 男 43 女 67 2 女 40 男 56 男 39 3 男 57 女 60 女 57 4 女 53 男 70 女 45 5 男 62 女 47 男 52 6 女 37 女 45 女 49 7 男 62 女 64 女 39 こういう感じで表が作られています。MINとMAXの関数を使って一列づつ男女別に手動で選んで出すことはできるのですが、すると一列づつ同じ作業をしなきゃいけないのでもっと簡単な方法はないでしょうか?どういう関数を使えば良いでしょうか?仕事で必要になっています。教えてください。よろしくお願いします。

  • MAX,MIN関数で空白の値を返したいのですが?

    MAX,MIN関数で空白の値を返したいのですが、中々上手く行きません。 何方か、ご教授頂けないでしょうか、宜しくお願い致します。 ※本題 MAX,MIN関数などの場合、真の0値が返されるので0が表示されると思います。 A1:AV10が未入力の場合:=MAX(A1:AV10) =0 又、AVERAGE関数の場合は、対象となるセルが未入力の場合(#DIV/0!)エラー表示されるので、下記載の様に空白の値を返す事が出来ます。 「=IF(ISERROR(AVERAGE(AN3:AV3))=TRUE,"",AVERAGE(AN3:AV3))」 そこで質問なのですが! MAX,MIN関数で値が入力されて無いとエラーを返す方法は有りますか? AVERAGEと同様に空白の値を返したいと思ってます。 ただ、差分で0が返ってくる場合が有り、オプションでゼロ値の非表示等は使えません。

  • C++の関数等を使った書き方

    C++OpenCVで関数等を使ってプログラムをみやすくまとめたいのですが、教えていただけないでしょうか。 プログラムの内容はHSV変換をしています。 これをmain文より外に出したい場合どのような書き方をすればいいでしょうか。 返り値はHSVの3つがほしいです。 struct _HSV { int H; int S; int V; }HSV[2000][2000]; main(void){ 宣言 src_img = cvLoadImage (filename, CV_LOAD_IMAGE_COLOR); for(y = 0; y < src_img->height; y++) { for(x = 0; x < src_img->width; x++) { p[0] = src_img->imageData[src_img->widthStep * y + x * 3]; // B p[1] = src_img->imageData[src_img->widthStep * y + x * 3 + 1]; // G p[2] = src_img->imageData[src_img->widthStep * y + x * 3 + 2]; // R if (p[0] >= p[1] && p[0] >= p[2]) {max = p[0];} //Bがmax else if (p[1] >= p[0] && p[1] >= p[2]) {max = p[1];} //Gがmax else {max = p[2];} //Rがmax if (p[0] <= p[1] && p[0] <= p[2]) {min = p[0];} //Bがmin else if (p[1] <= p[0] && p[1] <= p[2]) {min = p[1];} //Gがmin else {min = p[2];} //Rがmin if(max==min){ HSV[y][x].H = 0; HSV[y][x].S = 0; HSV[y][x].V = p[0]; //R } else { if(max==p[2]){ //Rがmax HSV[y][x].H = 60 * (p[1]-p[0])/(max-min); } else if(max==p[1]) //Gがmax { HSV[y][x].H = 60 * (p[0]-p[2])/(max-min); HSV[y][x].H += 120; } else //Bがmax { HSV[y][x].H = 60 * (p[2]-p[1])/(max-min); HSV[y][x].H += 240; } if(HSV[y][x].H < 0) { HSV[y][x].H += 360; } } if(x % 60== 0){ fprintf(fp, "%d ,%d\n", HSV[y][x].H, HSV[y][x].S); } } } } 初歩的な質問ですみません。 できれば、関数以外でもこうすれば見やすい等ご指摘頂けると助かります。 よろしくお願いします。

  • 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++; } }

  • javaで素数を探すプログラム。

    javaで素数を探すプログラム。 初歩的なことかと思いますが、助言をお願いします。 if(a[i-1]) ←この部分がわかりません。これはどのような条件がなのでしょうか? class Prime { public static void main(String[] args) { int max = 100; // 素数を探す数の最大値 boolean[] a = new boolean[max]; // 素数かどうか判定する配列 // 配列の初期化 for(int i = 0; i < max; i++) a[i] = true; // 素数かどうか判定 for(int i = 2; i < max; i++) { if(a[i-1]) { for(int j = 2; i*j <= max; j++) a[i * j - 1] = false; } else continue; } // 結果を表示 for(int i = 1; i < max; i++) { if(a[i]) System.out.print((i + 1) + " "); } System.out.println(); } } このプログラム

    • ベストアンサー
    • Java
  • MAXデータから0を除いたMINデータを引きたい

    早速ですが、エクセルでセルに A1 2 A2 4 A3 0 A4 1 A5 3 がある場合、最大値は=MAX(A1:A5)で、0を除く最小値は=MIN(IF(A1:A5=0,"",A1:A5)で求められますがA6セルにMAX値から0を除くMIN値を表示させたく考えています。 計算式を=MAX(A1:A5)-MIN(A1:A5)だと0が含まれ、=MAX(A1:A5)-MIN(IF(A1:A5=0,"",A1:A5)だと、エラー(#VALUE!)となります。 どう設定すればよいか、ご知見ある方、ご教授よろしくお願いします。

  • 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); }

  • 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; }

  • 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++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

専門家に質問してみよう