🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

7回答

7894閲覧

3つの数のうち最大値を求める

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

1グッド

0クリップ

投稿2019/11/17 06:52

編集2019/11/17 06:57

後期からプログラミングの授業を受けていて、今は選択処理を勉強しているのですが、難しく苦戦しています。
「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ページで確認できます。

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

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

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

guest

回答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
cateye

総合スコア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

LouiS0616

総合スコア35668

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 02:08

ありがとうございます! 大変助かりました!
guest

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]

mermaidで出力したフローチャート図

フローチャート自体が正しいかは、指でなぞりながら確認してください。フローチャートはロジックの組み立てが問題ないか確認するための重要なモノなので、ここで間違いがあったら大変です。三つの数値の最大値を求めるのに、比較は二回だけで済むことをちゃんと理解しましょう。例えば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の所がelifelsifなど特殊なキーワードに変化し、if文としてまとめて扱う場合があります。こうなると、見方が変わってきて、「条件に一致するまで、探しに行く」ような雰囲気が持たれます。Cもまた、そのような見方をするために、インデントも上のような形になる場合がほとんどです。

Cに慣れないうちは、いや、むしろ、Cに慣れたとしても、今回のコードに限ってはこのような書き方はお勧めしません。せっかくフローチャートで分岐二段であると考えていたのに、上のようなコードではフローチャートと同じになっているのかぱっと見わからなくなるからです。だから、今回は、ちょっと冗長になっていても、{}で囲んで同じ構成になるようにしています。

投稿2019/11/17 08:21

編集2019/11/17 08:24
raccy

総合スコア21737

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 02:06

ありがとうございました! とても分かりやすかったです!!
guest

0

「2つのうち大きい側の値を返す関数」を作るのはどうでしょう.

//aとbのうちの大きい側の値を返す関数 float Max( float a, float b ){ return (aとbの大きい方); }

そうすれば,x,y,zのうちの最大は

float Max_Of_XYZ = Max( x, Max(y,z) );

と書けるので,すっきりするのではないでしょうか.

投稿2019/11/17 07:37

fana

総合スコア11985

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 02:07

ありがとうございます! 参考になりました!!
guest

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
otn

総合スコア85882

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 02:08

ありがとうございます! 助かりました!
guest

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
katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 02:04

ありがとうございます! 助かりました!!
guest

0

どっちか大きい方を入れればいいと思いまっす

投稿2019/11/17 07:01

編集2019/11/17 07:02
y_waiwai

総合スコア88038

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

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

LouiS0616

2019/11/17 07:03

これは回答ですか?
y_waiwai

2019/11/17 07:04

提案、ですねw
退会済みユーザー

退会済みユーザー

2019/11/19 02:09

ご提案ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問