• 締切済み

16進数の入力プログラムについて

16進数の入力プログラムについての課題が出たのですが作動しませんどこが間違っているか教えて頂けませんか #include<stdio.h> main() { int number; int ch; printf("please input: "); while(){ ch=getchar() if('\n'=ch) break; number=number*16; if('0'<=ch && ch<='9'){ number=number+(ch-'0'); } if('A'<=ch && ch<='F'){ number=number+(ch-'A'+10); } } printf("your input number is %d\n",number,number); }

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.5

printf については 余計な引数は無視する ため, 「余分な引数がある」というだけで「間違い」と断定するかどうかはかなり微妙 (レビューで突っ込まれまくることは確実だが, 「想定した動作」をするという意味では「間違っていない」ともいえる). あと, このプログラムでは (あるいは #3 のプログラムでも) ・「改行を入力せずに EOF が来る」と無限ループ ・ch の値が 'D' のときに「13 が加えられる」とは限らない という問題があるね. ついでにいうなら「小文字を無視するのは仕様ですか?」と突っ込んでおく. scanf 使っちゃダメなのかなぁ.

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.4

> どこが間違っているか まず、「期待している動作とどう違うのか」を自分で判断するようにしてください。 特に、エラーメッセージが出るときは、それをよく読みましょう。 例えば。 > while(){ コンパイルすると、ここでエラーになるはずです。メッセージはコンパイラによって違いますが、手許にあるものだとgccの場合 ファイル名:行番号:error: expected expression before ‘)’ token 訳: 「ファイル名」の「行番号」の箇所で、「)」の前に「式」が必要です。 となります。これから、whileのところでエラーになっていることがわかります。 ここで、教科書やマニュアルで、whileについて調べれば while(式) という書式になっていることがわかります。 比べると、while()では「式」がありません。 よって、修正するには「whileの()の中に『式』を書く」ということがわかります。 同様に > if('\n'=ch) break; これもエラーになっているはずです。メッセージはちょっと難しいかもしれませんが「代入できないものに代入しようとしている」という意味です。 でも、あなたはここでやりたいのは「比較」であって、「代入」ではないはずです。 面倒くさいかもしれませんが、プロでも同じことをやっています。 初級者なら、なおさら手を抜いてはいけません。 動作としての問題点は ・小文字は16進数ではないのか? ・16進数の文字以外の文字が入力されたらどうするのか? というのはどうなっているのでしょうか?これによっては、その対策を加える必要があります。 あと、#3の内容に少々つっこみを。 > "\n" は書式なので、... '\n' は 改行文字で、ASCIIコードの場合0x0Aです。 CRなら0x0dで'\r'です。 が、お書きの通り、端末からの入力の場合、キーボードのCRが自動で改行文字に変換されるようになっていることが多いので、'\n' == ch で問題ありません。 > 変数を先に書く方が良い 今回のようなケースでは,数学の式( 0≦c≦9 )に見た目が近い '0'<=ch && ch<='9' の方が好ましいと思います。 また、 =と==のミスを防ぐため、 定数等の変更不可の式==変数 と書くことを推奨するスタイルもあります。

すると、全ての回答が全文表示されます。
  • KEIS050162
  • ベストアンサー率47% (890/1879)
回答No.3

これで試してみてください。 #include <stdio.h> #define LF 0x0A int main(void) { int number; int ch; printf("please input: "); number = 0; while( 1 ) { ch=getchar(); if ( ch == LF ) break; number=number*16; if ( (ch >= '0' ) && (ch<='9') ) number=number+(ch-'0'); if ( (ch >= 'A') && (ch<='F') ) number=number+(ch-'A'+10); } printf("your input number is %d\n",number); return( 0 ); } --- いくつかアドバイス --- 1) while() -> while( 1)  ⇒ 無限ループにしてBreak条件を別途決めるやり方は、一般的ですが、()内は常にTrue(=1)を入れておく。 2) if ( ch = "\n" )  ⇒ 比較するので、 == を使う。( '=' を二個)。 "\n" は書式なので、CRが入力されたらBreakとしたいのであれば、上のサンプルの様に記述する。(ちなみにエンターキーが入力された時、getch() は LF (ラインフィード)を返す) また、” ” (ダブルコーテーション)は文字列を表すので、文字を表す場合は’ ’(シングルコーテーション)を使います。(後に出てくる if 文と同じ) 3) if('0'<=ch && ch<='9'){ ⇒ これでもコンパイルは通るが、変数を先に書く方が良い(かな)。 if ( ch >= "0" && ch <= '9' ) 私は、更に()でくくっているが、これは必須ではないです。ただ、個人的にはこの方がコーディングミスが少ないと思っています。 if ( (ch >= "0") && (ch <= '9') ) 4) number の初期化、printf文に二回 ⇒ 既に指摘されている通りですね。 変数定義の時に、 int number = 0; としても良いです。 計算結果が飛んでもない数値になる時は、たいてい、初期化されていない変数を使っていると思ってよいです。 見よう見まねでごりごりとコーディングしていくよりも、類似のサンプルなどを参考にして、囲碁や将棋の定石を覚えていく様なやり方の方が良いですね。 ご参考に。

すると、全ての回答が全文表示されます。
  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

numberの初期値が不定とか。 >printf("your input number is %d\n",number,number); で引数が余分じゃないか?とか。

すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

いっぱいあるけどたとえば while(){ とか if('\n'=ch) break; とか.

すると、全ての回答が全文表示されます。

関連するQ&A