質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

90.52%

  • C

    3670questions

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

  • プログラミング言語

    679questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

C言語での実行結果が意図したものと違う

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 230

owl_AtR

score 1

C言語で自然数を3つ打つと最も大きな自然数を排出してくれるコードを書いています。

include <stdio.h>

int main(){
int x,y,z;
printf ("1つめの自然数を入力してください。"); scanf ("%d",&x);
printf ("2つめの自然数を入力してください。"); scanf ("%d",&y);
printf ("3つめの自然数を入力してください。"); scanf ("%d",&z);
if (x > y && z){
printf ("%dが最も大きい自然数です。",x);
}
else if (y > x && z){
printf ("%dが最も多きい自然数です。",y);
}
else if (z > x && y){
printf ("%dが最も大きい自然数です。",z);
}
}

この様なものを書きました。

しかし、一つ目に2.二つ目に1,三つ目に3、と打つと最も大きな自然数が2と出てきてしまいます。

何故でしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+2

include <stdio.h>

int main(){
  int x,y,z;

  printf ("1つめの自然数を入力してください。"); scanf ("%d",&x);
  printf ("2つめの自然数を入力してください。"); scanf ("%d",&y);
  printf ("3つめの自然数を入力してください。"); scanf ("%d",&z);

  if (x > y && z){
    printf ("%dが最も大きい自然数です。",x);
  }
  else if (y > x && z){
    printf ("%dが最も多きい自然数です。",y);
  }
  else if (z > x && y){
    printf ("%dが最も大きい自然数です。",z);
  }
}

ご質問の際、回答者が見やすいように、
上のようにコードは必ず囲んでください。

それに、見やすくなるだけで、問題解決に一歩前進します。


#include <stdio.h>

まず、プリプロセッサには、冒頭に「#」が要ります。

  if (x > y && x > z){

さて本題、上のような判定に、if文の各行を直せば良いでしょう。

ご質問のコードで想定しているような使い方はできないんですね。
細かい仕様は、「C言語 論理演算子」で検索して調べてください。

printf ("x: %dが最も大きい自然数です。",x);

あと細かいですが、xyzを区別する表現を入れた方が良いと思います。
そういう風に、プログラム内部の情報を増やすと、間違いが減ります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 20:18 編集

    回答してくださりありがとうございます。
    このサイトを使用するのが初めてだったのですみません…次回からは見やすいよう質問させて頂きます!

    #の抜けはコピーする際に抜けてしまった様です。

    if文の各行は指摘いただいたとおりに直しておきます。

    C言語 論理演算子で検索してみたいと思います。

    お力添えありがとうございました!

    キャンセル

+2

2 < 1 && 3
の時、2が最も大きいと出力されてしまうのはどうしてなんでしょう?

端的にいうと、やりたいことと書いてることが違うからです。

if (x > y && z){
} else if (y > x && z){
} else if (z > x && y){

上から順に、

  • xがyより大きい、かつ、zが0でない
  • 上記を満たさない場合、yがxより大きい、かつ、zが0でない
  • 上記を満たさない場合、zがxより大きい、かつ、yが0でない

と、書いてあります。
cateyeさんがコメントしているのは、
 2>1 && 3 != 0って書いてあるので、xが表示されます。という指摘です。

書きたかったのは、

if (x > y && x > z)


みたいな感じでしょうか。(同じ値だと何も出力されないケースがありますが)

ちなみに・・・
if文の評価はゼロ(false)でないことを確認するので、zとかyを、そのまま書いちゃうと
z が 0でなければ、この部分は真になります。(これに加えて、x > yが真なので、x が表示されます)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 21:25

    if文の評価というものを初めて知りました!そうなんですね!

    ご回答頂きありがとうございました

    キャンセル

+1

if (x > y && z){

は、 x > y と同時に z を評価します。
C の条件文の真偽値は、0 が 偽、0以外は 真になります。
x > y で z が 0でなければ、この条件文は真になります。

よって 

printf ("%dが最も大きい自然数です。",x);

が出力されます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/13 19:48

    > z が 0でなければ、この条件文は 常に真になります。
    論理積において、これは誤りでは?

    キャンセル

  • 2017/11/13 19:54

    失礼、見誤っていました。

    キャンセル

  • 2017/11/13 19:56

    >x > y と同時に z を評価します。
    ではなく"x > y" が成り立つときに z を評価します。ですねd^^;
    ・・・したがって、 2>1 && 3 != 0・・・と評価されます。

    キャンセル

  • 2017/11/13 20:13

    すいません…ほんとに初心者なんで仰っている意味がよく理解出来ていません…
    2 < 1 && 3
    の時、2が最も大きいと出力されてしまうのはどうしてなんでしょう?

    キャンセル

  • 2017/11/13 20:20

    解決致しました!
    皆さんご回答ありがとうございました!

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    素数判定[C言語]

    ある整数を与えて、素数かどうか判定するというプログラムを作ったのですが、コンパイル出来て実行してみたところ、プログラムが停止してしまいました。 ミスの場所を教えてください。解説もあ

  • 受付中

    点数別分布グラフ

    点数分布のグラフですが、少し長いように感じました。もう少し短くすることはできますか? またこのコードに対して何かご意見がありましたらお願いします。 #inc

  • 解決済

    【C言語】スタックをリストで実現するプログラム

    毎度お世話になっております。 高橋麻奈さんの「やさしいC アルゴリズム」をみて勉強しているのですが、リストを使ったスタックのコードで、がコンパイルエラーになってしまいました。 コ

  • 解決済

    コードを見てダメ出しや指摘などお願いします。

    #include <stdio.h> int main(void){     double a;     double b;        char o;  //演算子    

  • 解決済

    for文 scanf など全般

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。   ■■な機能を実装中に以下のエラーメッセー

  • 解決済

    約数判定 変数に読み込めない

    include <stdio.h> int main(void){ int x,y; scanf("%d%d",x,y); if(x%y) puts("no");

  • 解決済

    c言語 入門レベル問題 double

    練習問題通りにコーデングしたいですが、なぜこいう実行結果になってしまいましたか? #include <stdio.h> double tanka,suryo,kingaku

  • 解決済

    VineLinux Leafpadでの計算プログラムでの少数の扱い

     前提・実現したいこと VineLinuxでLeafpadを用いてプログラムを書いています。 その内容は、一次方程式の文字にそれぞれ数字を代入し未知数xの値を表示させるというもので

同じタグがついた質問を見る

  • C

    3670questions

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

  • プログラミング言語

    679questions

    プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。