• 締切済み

c言語プログラミングの質問です。

整数NとN個の整数を受け取り,受け取ったN個の整数のうち最大のものを表示するプログラムを記述せよ. ただし,N>0とする. 入出力例 入力 ⇒ 出力 3 2 1 8 ⇒ 8 5 13 14 11 12 15 ⇒ 15 2 -1 -2 ⇒ -1 という問題です。「3つの数の中から~」という場合はそれぞれa,b,cとおいて比較できるのですが、この問題のような場合はどうすればいいですか。

みんなの回答

  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.3

何個比較するかは、入力される N によって決まるので、N 回、比較しながら繰り返す形の構造となります。 下記例は、while 文を使って、Nを減算しながら繰り返す方法です。入力された値が前の値より大きければ、最も大きい値を更新しながら繰り返して比較していきます。保持する最も大きい値も、入力する値もそれぞれ一個でいいので、変数をむやみに増やす必要はないです。配列とかにする必要もないです。 例では、最も大きい値を max 、都度入力される値を m として毎回比較しています。 途中、 flg の処理があるのは、一番初めに入力された m を max にコピーして置くための処理です。入力される値の最小値が未定で、かつ負の整数もありえるので、maxを 0 で初期化出来ず、この方法にしました。(ちょっと分かり難いかな?)この辺りは色々工夫してみてください。 でも、肝心なのは、未定回数、繰り返しながら比較する、という全体の大まかな構造さえ分かれば、よいかと思います。 解答例 #include <stdio.h> void main(void) { int n,m; int max,flg=0; printf("N = "); scanf( "%d",&n ); while( n > 0 ) { printf("Number = "); scanf( "%d", &m ); if (flg == 0 ) { max = m; flg = 1; } else if ( m > max ) max = m; n -= 1; } printf("Max = %d\n", max ); }

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 考え方としては、最初の数字から順番に数字を見ていきます。最初の数字を見ている時は、その数字が最大ですね。次の数字を見る時は、今覚えている最大の数字と比較して大きい方を最大として覚える・・・どんどん続けて、最後まで見たとき、覚えている数字が最大値です。  ループでやることになりますね。  断片だけ示すと、 max = values[0]; for (i = 1; i < N; i++) { if (values[i] > max) max = values[i]; }  なんて感じになるでしょうか。  と普通なら、そうなりそうなものですが、例題の3行目だけが???です。  素直に見れば、答えは2になるはずなんですが・・・  もし、誤植なら、OKです。

  • maiko0333
  • ベストアンサー率19% (840/4403)
回答No.1

aを最大値と置けばいいです。 最初の数字をaに設定し、大きい値が来るとaに入れる ことの繰り返しです。

関連するQ&A

  • C言語のプログラミング (基礎)配列の問題ですが。

    次のような問題があって、プログラミングしてみたのですが、 コンパイルすると永久ループになってしまいます。 また、入力されるはずの整数が表示されません。 どうすればよいか教えていただけると助かります。 よろしくお願いします。 整数を順番に入力し、負の数が入力されたら、それまでに入力された非負の整数を、 入力された順番とは逆に全角空白で区切って出力するプログラムを作成しなさい。 自動評価の都合上、上記以外は表示しないこと。なお、入力は最大10回とする。 【0 1 2 3 4 -1 が入力された場合の表示例】 4 3 2 1 0       ************************************** #include <stdio.h> int main(void) { int num[10]; int n; for(n=1;n<11;n++){ printf("整数入力:¥n"); scanf ("%d", &num[n]); if(num[n]<0){ for(n=10;n>0;n--){ printf("%d ",num[n]); } } } }

  • C言語のプログラミング (基礎)教えてください。

    以下のような問題があります。 プログラムを作ってみたのですが、 コンパイルすると無限ループになったり、 正しく結果が出ません。 どのように直せば良いか教えていただけると助かります。 よろしくお願いします。 整数が入力される度に今までの合計を出力するプログラムを作成しなさい。なお、0 が入力されたら終了するものとする。 ただし、繰り返しの命令は while 文を使用し、条件は常に真 ( 1 ) とし、break 文を使うこと。 ▼実行例 整数:1     合計:1 整数:2     合計:3 整数:3     合計:6 整数:0 ******************************** #include<stdio.h> int main(void) { int n,sum; sum=0; while(1){ printf("¥n整数:"); scanf ("%d", &n); sum=sum+n; printf("¥n    合計:%d", sum); scanf ("%d", &sum);          if(n==0){ break;   } } }

  • C言語の質問

    「n の階乗 n! の計算を再帰式で表現したCプログラムを作成し、n=10, n=11, n=12 の出力結果を書きなさい。 プログラムではnの値は1から12までとせよ。 入出力については問わない。」です。お願いします。

  • 至急で、C言語の問題で解答解説お願いします。

    1実数を3つ(a,b,c)を読み込み3辺とする三角形ができるか判定(d(d-a)(d-b)(d-c)>0のとき三角形となる)しできなければ、三角形ではありません!というメッセージを表示し、できる場合は以下のヘロンの公式を用いて三角形の面積を求めるプログラムをC言語で答えてください。d=(a+b+c)/2 s=√{d(d-a)(d-b)(d-c) 2maxの整数値(≧1)をキーボードから入力し、その値に対応した図形を出力するプログラムをC言語で答えてください。 例 max1 max2 max3 * ** *** * ** *** * ** *** ** *** *** 3整数nをキーボード入力しnの値に応じて以下の図形を表示するプログラムをc言語で答えてください。 n=3 n=4 n=5 3 4 5 45 56 67 678 789 890 0123 1234 56789 4整数n(≧0)を入力し歯科の計算を実行するC言語プログラムを答えてください。2つの自然数nとmを読み込みn個の中からm個を取り出すときの組み合わせの数を計算せよ。ただし、n!を計算する関数long fact (int n)を定義し必ずそれを用いること。 5 1つのscanfで2つの10進数を入力し8進数と16進数で表示するプログラムをC言語で答えてください。 6 実数aを入力し少数第1位で四捨五入する関数g(a)をマクロ定義で入力した値の少数第1位を四捨五入して出力するプログラムをC言語で答えてください。 7 4つの実数w,x,y,zを読み込みその最大値を出力するプログラムをC言語で答えてください。ただし、2つの実数の大きいほうを求める関数 double my may (double x,double y)を定義し、その関数を用い、if文を用いないでc言語で答えてください。

  • C言語 10進数→2進数

    キーボードで入力された1以上の正の整数n(1~15)を2進数(4bit)で出力するプログラムを作りたいんですが、 出力例に書かれている内容、 -出力例- 正の整数:12 整数 12 を2進数表記すると下位bitより 0011 となります。 ---- 上記の下位bit、というのはどういう意味でしょうか? また、この下位bitというものをどうやってプログラム上で 表記すればいいのでしょうか? 教えてください。

  • C言語でのソースファイル

    n個の整数データを入力し、最後に平均を出力 nは最初に入力する(nは自然数) 平均は小数部まで求める 実行例として 入力するデータ数は? 3 NO. 1 :12 NO. 2 :7 NO. 3 :4 以上3個の平均 :7.666667 こんな感じにしたいのですができません どなたか教えてください。 お願いします。

  • C言語について  

    わからないのでよろしくお願いします。何回やってもうまく表示できません。 整数を入力し、入力された整数の数だけ「*」を横一列に表示し、最後に改行するプログラムを while 文を使って作りなさい。 但し、0または負の値が入力された場合は、「*」は表示せず、改行のみを表示すること。 ▼10が入力された場合の実行例 ********** #include<stdio.h> int main(void) { int n, kai; scanf("%d",&n); printf("\n nyuryoku=%d",n); while(0<kai){ kai=kai--; printf("*"); } kai=n; printf("\n"); }

  • C言語の質問です。

    プログラムを書こうとしているのですが、行き詰まるっているのでアドバイスください。 ○データ 0 0 1 2 2 3 4 5 5 5 8 8 10 10 ・ ・ ・ このような整数がだんだん増えていく(1万以上の整数まで増えていく)書式のデータがあるとします。 僕の作りたいプログラムは 一万個以上あるすべてのデータを読み込んで個数を出す。というものです。 言葉で表現するのが難しいので例を出しますと 最終的にほしいものは データをすべて読み込んで 同じ整数がない整数の個数 同じ整数が2つの整数の個数 同じ整数が3つの整数の個数      ・      ・ 同じ整数が10つの整数の個数      ・      ・    このような情報がほしいと考えています。 例のデータで考えますと 同じ整数がない整数 =3 同じ整数が2つの整数=4 同じ整数が3つの整数=1 になります。 私が考えているやり方の手順 (1) データを読み込む (2) 読み込んだ整数のそれぞれのすべての個数を出す。    例:1=2個 15=1個 289=3個  (3) 出した個数の数を数えて出力。 という流れです。 私が行き詰まっているプログラム int main(void) { int i, n, hako[?];  ←1万個以上あるので箱を何個用意すればいいかわかりません   // n は読み込んだデータ。 FILE *fp;         配列を使おうと思っているのですが。。。 fp=fopen("FILENAME","r"); ←データの読み込み if(fp==NULL) { printf("file open error!!\n"); exit(1); } for(i=1;i<?;i++);  ←すべての箱をゼロクリアしたいのですが箱の個数がわかりません hako[i]=0; while(fsacanf(fp, "%d\n", &n)!=EOF){ if(i>n){hako[i]++;}  if(i=n){ i++; hako[i]++; } printf("%d = %d\n", i ,hako[i]); } fclose(fp); return 0; } とりあえずは流れ(2)までのプログラムを書きたいと考えています。 配列が苦手なので混乱しています。 配列のhako[]のところで間違っていると思うのですがよくわからないので質問してみました どうぞよろしくお願いします。

  • C言語、この場合の記述の仕方

    次の問題をどのように記述すればいいのかわかりません。 ・任意の整数を3つ入力して、その中から最大値だけを出力するプログラムを書け。 ex) 3 6 9 と入力した場合 最大値9 問題文からして if を使うのだと思うのですが、 いまいち想像ができません。 #include <stdio.h> int main() { ここから下の書き方がわかりません。 3つの整数を出力しろっていうことだから int a,b,c; のように最初に3つ記述すればいいのでしょうか? また、「最大値のみ表示する」という風にするには どのように記述すればいいのでしょうか? 2つなら if、else でなんとかできるような気がするのですが3つとなると・・・ 全然イメージが沸いてきません・・・。

  • C言語 n!のプログラミング

    C言語で、入力されたnについてのn!を求めるプログラムを書きました。 #include<stdio.h> int main() { int total=1,i,n; scanf("%d",&n); for(i=1;i<=n;i++){ total*=i; } printf("%d",total); } しかし、このままだとn=13くらいからオーバーフローしてしまって、n=100やn=10000といった大きな数の場合のn!が求められませんよね? 万進法という方法を使って、10000未満の数を配列の要素に割り当てる(説明が正しいかわかりませんが…)と、うまくいくと聞きました。 万進法とはどのようなものでしょうか?やり方を教えてください。 また、C言語での、このプログラムの一例もできれば教えてください。 ですが、今一番知りたいのはどういう手順でプログラムを書けばいいのかということですので、そちらの方を詳しく教えてください。

専門家に質問してみよう