後期からプログラミングの授業を受けていて、今は選択処理を勉強しているのですが、難しく苦戦しています。
「3つの数のうち最大値を求める」という課題が出されたのですが、途中までしか分からないため、どなたか助けていただけませんでしょうか。
#include<stdio.h>
int main()
{
float x,y,z; /*変数の宣言*/
/*キーボードから入力*/
printf("実数を3つ入力してください。¥n")
scanf("%f%f%f",&x,&y,&z);
printf("x=%f y=%f¥n",x,y,z);
if(x>y){
if(x>z){
printf("x=%f,y=%f,z=%fのうち最大値は%fです。¥n",x,y,z,x);
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答7件
0
ごり押しなら・・・変数を一個^^;
c
1 int max=x; 2 // 3 if( y > max ){ 4 max= y; 5 } 6 if( z > max ){ 7 max= z; 8 }
投稿2019/11/17 07:30
編集2019/11/17 07:38総合スコア6851
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
今の方針のまま、つまりif文でごり押すなら次のように考えれば良いでしょう。
C
1if(xがy以上 かつ xがz以上) { 2 最大値x 3} 4if(yがx以上 かつ yがz以上) { 5 最大値y 6} 7if(zがx以上 かつ zがy以上) { 8 最大値z 9}
ただし上記の方法は冗長(無駄が多い)です。
- 最大値が確定した後も判定が続く
- 一つ目のif文と二つ目のif文の条件を満たさなかったら、三つめは判定するまでもなく真
else節を上手く使うとこの辺り効率化することができます。おそらくここが課題のミソでしょう。
投稿2019/11/17 07:12
総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/19 02:08
0
ベストアンサー
なんか、途中までできているような気がします。できていないのはif文をどのように組み合わせて、そのときどうなるかだと思います。頭の中で考えてもよくわからないときはフローチャートを書くことも方法の一つです。たとえば、こんな感じです。(mermaidというのを使っています)
mermaid
1graph TD 2S(Start) --> I[read x, y, z] 3I --> D[float n] 4D --> XY{x > y} 5XY -->|true| XZ{x > z} 6XZ --> |true| X[n = x] 7XZ --> |false| Z1[n = z] 8XY --> |false| YZ{y > z} 9YZ --> |true| Y[n = y] 10YZ --> |false| Z2[n = z] 11X --> P[print n] 12Y --> P 13Z1 --> P 14Z2 --> P 15P --> E[End]
フローチャート自体が正しいかは、指でなぞりながら確認してください。フローチャートはロジックの組み立てが問題ないか確認するための重要なモノなので、ここで間違いがあったら大変です。三つの数値の最大値を求めるのに、比較は二回だけで済むことをちゃんと理解しましょう。例えばx > yかつx > zなら、yとzのどちらが大きくても最大値はxです。x > yかつx <= zならzは必ずyよりも大きいはずなので、zが最大値なると言ったようにです。
フローチャートではx > yで分岐して、その後またそれぞれが分岐して、最終的にnに何を入れるのかを決めています。もちろん、nにいれずに、その場で出力としても良いでしょう。大事なのは分岐が二段階になっていると言うことです。この分岐はif文に相当します。つまりはif文も2段階、そして、パターンは2x2の4パターンが出てくると言うことです。まずは、この4パターンを書いて、それぞれ埋めていくといいと思います。
C
1if (x > y) { 2 if (x > z) { 3 // パターン1 4 } else { 5 // パターン2 6 } 7} else { 8 if (y > z) { 9 // パターン3 10 } else { 11 // パターン4 12 } 13}
個々で大事なのはインデントをちゃんとすると言うことです。インデントがちゃんとなっていないと、どの{と}が対応しているのかわからず、本当に正しい2段構成になっているのかわかりません。
ここまできたらわかりますね。フローチャートに従って4パターンそれぞれを埋めれば完成と言うことです。
【おまけ】
先程の文は次のようにも書けます。
if (x > y) { if (x > z) { // パターン1 } else { // パターン2 } } else if (y > z) { // パターン3 } else { // パターン4 }
これは本文であげたコードと全く同じです。if (x > z) {...}
を{}で囲むか囲まないかの違いだからです。言語によってはelse if
の所がelif
やelsif
など特殊なキーワードに変化し、if文としてまとめて扱う場合があります。こうなると、見方が変わってきて、「条件に一致するまで、探しに行く」ような雰囲気が持たれます。Cもまた、そのような見方をするために、インデントも上のような形になる場合がほとんどです。
Cに慣れないうちは、いや、むしろ、Cに慣れたとしても、今回のコードに限ってはこのような書き方はお勧めしません。せっかくフローチャートで分岐二段であると考えていたのに、上のようなコードではフローチャートと同じになっているのかぱっと見わからなくなるからです。だから、今回は、ちょっと冗長になっていても、{}で囲んで同じ構成になるようにしています。
投稿2019/11/17 08:21
編集2019/11/17 08:24総合スコア21737
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/19 02:06
0
2通りの方法があります。
案1:3つの数をそれぞれ比べる
⇒対象が4つや5つになると、ロジックの考え直しが必要
案2:配列に対象の数を入れ、ループして、配列の中での最大の数を調べる
⇒対象の数が増えても同じロジックでできる
⇒ループの処理方法を学び済みである必要がある
案1で行くとして、まずは2つの数の場合のプログラムを書いてみましょう。
出来たら、3つの数にしてみましょう。
3つの場合、
x >= y の時・・・x と z の大きいほうが最大値
x < y の時・・・y と z の大きいほうが最大値
と、2つの場合の最大値を求める問題に帰着できます。
投稿2019/11/17 07:10
編集2019/11/17 07:17総合スコア85882
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/19 02:08
0
... 選択処理を勉強 ... 「3つの数のうち最大値を求める」 ...
一番大きい数をもとめるなら、こんなふうにできます。
comp.c
c
1#include <stdio.h> 2 3int main() { 4 float x, y, z; /* 変数の宣言 */ 5 float ans; 6 7 /* キーボードから入力 */ 8 printf("実数を3つ入力してください。\n"); 9 scanf("%f%f%f",&x, &y, &z); 10 printf("x=%f y=%f z=%f\n", x, y, z); 11 12 ans = x; 13 if (ans < y) { 14 ans = y; 15 } 16 if (ans < z) { 17 ans = z; 18 } 19 printf("x=%f,y=%f,z=%fのうち最大値は%fです。\n", x, y, z, ans); 20} 21
3つの数字のうち何番目が一番大きいかを求めるならどんなふうにしますか?
(3つと同じ値だったり、一番大きいものが2つの場合も考慮する必要があります)
if での比較は、天秤での重さ比較に相当します。
少ない回数でなにかを探すというのはなかなか難しいことがあります。
こんなパズルがあります。
- 天秤を使って重さの違う金貨をみつけよう
https://analytics-notty.tech/find-different-weight-coin-using-balance/
投稿2019/11/17 22:02
編集2019/11/19 15:45総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/11/19 02:04
0
どっちか大きい方を入れればいいと思いまっす
投稿2019/11/17 07:01
編集2019/11/17 07:02総合スコア88038
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。