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

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

ただいまの
回答率

90.35%

  • C

    3965questions

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

c言語 whileを使った文について教えて下さい。 初心者で初歩的な質問かもしれませんがよろしくお願いします。

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 277

EEE

score 2

C言語について質問です。初心者なので、初歩的な質問ですがよろしくお願いいたします。
点数(point)を入力すると最高得点(max)と最低点(min)を表示するプログラムを作っています。
ifでもできるのですがwhileを使いたいです。
内容としてはwhile(1)でctrl+cするまで終わらないプログラムで、入力した値とmax,minと比較して条件にあったら代入するといったプログラムを書いたつもりです。
しかし、結果は画像の右下の通りで、1回目はうまくいってるのですが、2回目から『前の点数→点数を入力→結果』といって順番で表示されてしまいます。一回めのように結果を表示し、改行で点数を入力といった表示にしたいのです。
イメージ説明

#include <stdio.h>

int main(void)
{
    int  max = 0, min = 100;

    while(1)
    {
        int point;
        printf("点数を入力 >>");
        scanf("%d\n", &point);

        if(point >= 0)
        {
        if(point>max){max = point;}
        if(point<min){min = point;}
        }
        printf("最高点%d:最低点%d\n", max, min);
    }

    return(0);
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

この例に関してだけいうと、

        scanf("%d\n", &point);


        scanf("%d", &point);


に変えたら動きますよね。
"%d" は、空白や改行文字は読み飛ばしてくれるので。

こういう練習問題と解いている段階(かなりの初心者)でしたら、それでいいんでは?
他の方が助言しているとおりscanfなどの返り値チェックは本当は必要ですけども。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 22:50

    ありがとうございます
    \nなくしたら動きました。

    キャンセル

  • 2018/05/25 23:13

    誤って数字以外の文字を入力すると困った事態に。

    キャンセル

  • 2018/05/27 15:16

    whileの使い方を学ぶ自主課題ですよね。課程の進度がI/Oエラーの正しい処理にはほどとおいので問題ないでしょう。
    EOFを入れても困ったことになります。

    キャンセル

0

#include <stdio.h>

int main(void)
{
    int  max = 0, min = 100;
    char line[100];

    while(1)
    {
        int point;
        printf("点数を入力 >>");
        fgets(line, sizeof line, stdin);
        sscanf(line, "%d\n", &point);

        if(point >= 0)
        {
        if(point>max){max = point;}
        if(point<min){min = point;}
        }
        printf("最高点%d:最低点%d\n", max, min);
    }

    return(0);
}


scanfは使い方が難しいので、fgets + sscanfを使いましょう。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 07:31

    今回は単純なので良いですが、一般的にはscanf/sscanf/fscanfなどでは返り値をチェックする必要があります。

    キャンセル

  • 2018/05/25 22:51

    ありがとうございます。
    一応完成しましたので、
    今後の参考にさせていただきます。

    キャンセル

0

scanf を含む入出力の動作には注意が必要です。
プログラムの動作を1ステップずつ追ってみましょう。

printf("点数を入力 >>");
scanf("%d\n", &point);
// 1. scanf で入力を待機
//    → ユーザが "20 -1\n" と入力
// 2. stdin のバッファに "20 -1\n" が蓄えられる
// 3. stdin のバッファから "20 " までを読み取る
//    ※scanf は空白を改行と同一視します
// 4. point に 20 が代入される
if(point >= 0) { /* ... ここの処理は狙い通り行われる */ }
printf("最高点%d:最低点%d\n", max, min);  /* ここも OK */

/* while ループの最初に戻る */

printf("点数を入力 >>");
scanf("%d\n", &point);
// 5. scanf で入力を待機
//    → ユーザが "60 -1\n" と入力
// 6. stdin のバッファに "60 -1\n" が追加され、"-1\n60 -1\n" となる
// 7. stdin のバッファから "-1\n" までを読み取る
// 8. point に -1 が代入される
if(point >= 0) { /* 通過しない! */ }
printf("最高点%d:最低点%d\n", max, min);  /* if 文を飛ばすので前と同じ値が出力される */

/* while ループの最初に戻る */

printf("点数を入力 >>");
scanf("%d\n", &point);
// ⑦ stdin のバッファに "60 -1\n" があるので、scanf はそこから読み取る(入力を待機しない)
// ⑧ point に 60 が代入される
if(point >= 0) { /* ... 今回は通過する */ }
printf("最高点%d:最低点%d\n", max, min);  /* => 60:20 */
// 以下略

ポイントは、scanf は空白を改行と同一視するということと、stdin のバッファです。
そもそも入力に -1 を付けているのは「そうしないとうまくプロンプトが出ないから」みたいな理由だと思いますが、そういう「めんどくさいし、とりあえず狙い通り動いてるからいいや」という所にこそバグがあるものです。
まあ、今回の場合はそもそも狙い通り動いていなかったわけですけど……。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/25 22:52

    ありがとうございます。
    とてもわかりやすく、助かります。
    今後の勉強にもなりました。
    また機会があればよろしくお願いします。

    キャンセル

  • 2018/05/25 22:53

    確かに-1はよくわからずつけていたので今後はちゃんと気をつけて、プログラムを作っていこうと思います。

    キャンセル

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

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

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

  • C

    3965questions

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

  • トップ
  • Cに関する質問
  • c言語 whileを使った文について教えて下さい。 初心者で初歩的な質問かもしれませんがよろしくお願いします。