電子書籍の厳選無料作品が豊富!

なかなかつくれない問題があります
このような問題です。
「キーボードから適当な数値を入力して、数値があらかじめ設定した目標値より大きいときは「大きい」と、小さいときは「小さい」と、一致したときは「あたり」と、メッセージを入力し、数値を20回入力しても目標値と一致しなかったときには残念と出力して実行を終了するようにプログラムを作成せよ。」
なるべく早い回答を望んでいます。

A 回答 (9件)

目標値の定数1個


入力数字の変数1個
カウンタ用変数1個を用意し、
入力したら1増やすカウンタと20回で抜けるif文と、さらにその内側でif文での目標値の比較を組合せれば、どうってことのない基本ルーチンだと思いますが・・
宿題を丸投げするのは、ここでは禁止です。

自分でコードを考え、どこがうまくいかないかを質問しなおしましょう。
そうすれば親切な回答が得られると思います。

この回答への補足

すいません 丸投げしたわけではないのです。
初めてこのサイトを使うのでいまいち良くわかりませんでした

#include<stdio.h>
int main(void)
{

int a,b,n;
n=0;
a=123;
while(n<22){
printf("Input date:");scanf("%d",&b);n++;
if(a>b) {puts("小さい!"); continue;}
else if(a<b) {puts("大きい!"); continue;}
else if(a=b) {puts("あたり"); break;}
printf("残念",n>20);
}
return 0;
}

こんな感じに作ったんですがどうもうまくいきません

補足日時:2008/05/12 23:04
    • good
    • 0

個人的には #6 と同じく continue を使わない方がいいと思います.


おそらく, 「普通レベルのプログラマにおける理解度」は
else > break > continue
だと思います. つまり, 「else の動作についてはほぼ確実に理解できているだろうけど break はちょっとあやしく, continue はますますあやしい」と思った方がいいです.
ついでにいえば, その「スッキリしている」ソースは危険だと思います>#8.
「21 <= iPoint などといった比較は不自然である」という問題もありますが, もっと大きくは「順序を間違えると確実にバグを作り込める」という危険性です. だいたい, その if 文のかたまりを書く人間がそんな else if を書くはずないです. 普通なら
if (iPoint <= 20) iRank = A;
else if (iPoint <= 40) iRank = B;
...
と書くことでしょう. もちろんこれでも「順番を間違えるとバグを作り込める」という危険性はありますが, else が入っているためコンパイラが気付いてくれる可能性があります.
または, 「仕様を正確に記述する」ということを念頭におくなら, 同じ else if を使わないにしても
if (0 <= iPoint && iPoint <= 20) iRank = A;
if (21 <= iPoint && iPoint <= 40) iRank = B;
...
とするでしょう.
ある意味では
int rank[] = { A, A, ..., B, B, ... };
と「得点からランクへの変換表」を用意するのが最も正しいのかもしれませんが.
    • good
    • 0

( else のキライな年寄りが、余分なことまで)



>始めて間もないもので簡単ではありません

 どこで「 else if 」の記述法を習得されたのでしょう。

 ★書籍名等を補足頂けないでしょうか。

No.6 さんの

>それ以外の continue 文は不要のはずです。

 「 else は不要のはずです」が私の考え。
-----------------------------------------------
★ソースをスッキリ(?)させてみました。

 ・ ▼ には、行かないことが判るかと・・。

 ・ではどうするか、(次の3行《のみ》が「回答」)
 
   「あたり」になったとき、フラグを立てる。
   while を抜けた後、フラグを見て、立って
   いなかったら、「残念」と出力。
   (フラグ:変数を1つ用意し・・)

  while( n < 22 ){

    printf( "Input date:" );

    scanf( "%d", &b );

    n++;

    if( a > b ){

      puts( "小さい!" );

      continue;
    }
    if( a < b ){

      puts( "大きい!" );

      continue;
    }
    puts( "あたり" );

    break;

    printf( "残念", n > 20 );  // ▼ 残念
  }
------申し訳ない、以降、ご質問とは離れます---------

★C言語を「難しい」とさせている一因は、else だ。

 と、年寄りは思っています。

★ else も goto 文のように・・、と思っています。
---------------------------------------------------
なぜ else が使われるのか・・ちょこっと思考。

 ・if(else) 文についての、固定観念(?)がある?。

 ・これは、C言語入門における「悪書」の影響?。

 ・悪書は、おつりを「引き算」で求めず◆「積み上げ」で
  求める人により書かれた???。

 (一度判定したものに、いつまでも◆囚われている?)
---------------------------------------------------
例)0点から100点までを、次のように5分するとき、

 A:0-20, B:21-40, C:41-60, D:61-80, E:81-100

---------区分から、そのまんま忠実(固定観念?)に

 if( 0 <= iPoint && iPoint <= 20 ) iRank = A;
  else if( 21 <= iPoint && iPoint <= 40 ) iRank = B;
   else if( 41 <= iPoint && iPoint <= 60 ) iRank = C;
    else if( 61 <= iPoint && iPoint <= 80 ) iRank = D;
     else if( 81 <= iPoint && iPoint <= 100 ) iRank = E;

---------とするより、ひねくれて(?)

 iRank = A;

 if( 21 <= iPoint ) iRank = B;
 if( 41 <= iPoint ) iRank = C;
 if( 61 <= iPoint ) iRank = D;
 if( 81 <= iPoint ) iRank = E;

----------の方がスッキリしている。ただし、

☆スッキリか否かはソースレベルのことで、コンパイラにより「最適化」は行われると思います。
☆スッキリしないソースの方が、場合によっては「実行速度」で優れる場合も考えられます。
☆スッキリしないソースの方が、「知的財産の保全」に有利です。

以上3点は、・・・蛇に足6本???。
--------------------------
(年寄りの考えの根底)
・スッキリしている → ミスの入り込む余地が小さい。

↑えっ?これを言いたいだけでダラダラと・・?。
    • good
    • 0

>  else if(a=b) {puts("あたり"); break;}


>  printf("残念",n>20);

「等しい」ことの比較の文法は?
教科書を見直してみましょう。
    • good
    • 0

>#include<stdio.h>


>int main(void)
>{
> int a,b,n;
> n=0;
> a=123;
> while(n<22){
>  printf("Input date:");scanf("%d",&b);n++;
>  if(a>b) {puts("小さい!"); continue;}
>  else if(a<b) {puts("大きい!"); continue;}
>  else if(a=b) {puts("あたり"); break;}
>  printf("残念",n>20);
> }
> return 0;
>}
>このように作ったのですが、20回で止まるのですが、残念と表示されません

いろいろ書いてみよう。

1. 変数には意味のある名前をつけましょう。
例) a が「あらかじめ設定した目標値」なんですよね。target_value とかにしましょう。

2. 定数は、C 言語であれば、#define あるいは enum で定義しましょう。
例) #define LOOP_COUNT 20

3. n がループのカウントのようですが、なぜ 22 と比較しているのですか?
n が 0からスタートして 21まで、22回ループしていませんか?
また、単純なループであれば for ループを使いましょう。

4. 一行にコードを詰め込みすぎです。基本的に一行に書くのは一文にしましょう。

5. "Input date: " は "Input data" の typo?

6. scanf() を使うのはやめましょう。エラーの時の処理ができません。
ユーザからの入力を受け取る場合は、文字列として入力を受け取って、数値かどうかなどを自前で確認しましょう。

7. なるべく、continue や break の類いは使用しないようにしましょう。
今回の場合、正解した場合に break してループを抜けるのは止むを得ませんが、それ以外の continue 文は不要のはずです。

8. printf() の書き方が間違っています。マニュアルを読みましょう。
また、「残念」と出力するのはループを抜けた後ですね。
    • good
    • 0

がると申します。


んと…ちと、順を追って。
#4さんも書かれてますが。まず「一つずつ分解して」書いていくほうがよいと思います。

ステップアップの方向としては…
・とりあえず20回ループ(ループするだけ
・20回ループして、数値を入力(入力されただけ:確認用に表示してもよいかも
・ループの前に数字を決めておいて、入力された値によって「小さい/あたり/大きい」と出力(あたりのあともループしっぱなし
・あたりになったときはループから抜けるようにする
・ループから抜けた時に、あたりがでていなかったら「残念」って表示する

くらいに細かく砕くと、途中までは出来て、途中から出来なくなる、んではないかと思います。
また経過とか教えていただければコメント出来るかと思います ^^
    • good
    • 0
この回答へのお礼

丁寧に回答していただき感謝します。
これを基に頑張ってみます

お礼日時:2008/05/12 23:32

まず、単に20回ループを回るだけのコードを書いてみてください。


データの入力や目標値との比較を行なうコードは、後から付け足していきましょう。
    • good
    • 0

簡単じゃないですか?



教科書もう一度よく読んでみてください。

あるいはもう、きっぱり諦めて別の道を探すのも手ですよ。
    • good
    • 0
この回答へのお礼

回答ありがとうございます
初めて間もないもので簡単ではありません

お礼日時:2008/05/12 23:03

> なるべく早い回答を望んでいます。



宿題の丸投げは、ここでは禁止事項です。

> なかなかつくれない問題があります

ということは、全くできないわけではないのですね。
でしたら、作成されたソースコードを見せてください。

この回答への補足

#include<stdio.h>
int main(void)
{
int a,b,n;
n=0;
a=123;
while(n<22){
printf("Input date:");scanf("%d",&b);n++;
if(a>b) {puts("小さい!"); continue;}
else if(a<b) {puts("大きい!"); continue;}
else if(a=b) {puts("あたり"); break;}
printf("残念",n>20);
}
return 0;
}
このように作ったのですが、20回で止まるのですが、残念と表示されません

補足日時:2008/05/12 22:51
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!