いちばん失敗した人決定戦

16進数を入力するプログラムを作成するという課題がでたのですが、
下記の内容でコンパイルしたところ、'A'一文字は10を表示しましたが
3E8は148など、数と組み合わせるとまったく違う答えが表示されます。

どうしたらよいのか見当も付かず困っております、教えてください


#include<stdio.h>

main()
{
int number;
int ch;

printf("input ?");

number=0;
ch=getcher();
while(ch !='\n'){
if('0'<= ch && ch <= '9'){
number=number*10;
number=number+(ch-'0');
}

if('A'<= ch && ch <= 'F'){
number=ch-'A'+10;
}
ch=getcher;

}

printf("your input number is %d\n",number);
}

A 回答 (5件)

>どうしたらよいのか見当も付かず困っております、教えてください



 大きく2点(↓コメント付加部)について、思い違いというか、うっかりしています。

#include<stdio.h>

void main()
{
 int number = 0;
 int ch;

 printf( "input ? " );

 while( 1 ){

  ch = getchar();

  if( '\n' == ch ) break;

  number *= 16; // 3E8)16 は 3 * 16^2 + 14 * 16^1 + 8 * 16^0 = 1000)10

  if( ( '0' <= ch ) && ( ch <= '9' ) ){

   number += ( ch - '0' );
  }
  if( ( 'A' <= ch ) && ( ch <= 'F' ) ){

   number += ( ch - 'A' + 10 ); // 加算
  }
 }
 printf( "your input number is %d(%X)\n", number, number );
}
注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
    • good
    • 0

> 追加で質問なのですが、上記の場合、3は何処へ行ったのでしょうか?



消えています。

だから、3E8 くらいは処理を追いかけましょう。

3 を入れたらどういう経路をたどって、
E を入れたらどういう経路をたどって、
8 を入れたらどういう経路をたどるか。
    • good
    • 0
この回答へのお礼

なるほど
よく分かりました。

教えてくださり、ありがとうございます

お礼日時:2010/11/05 10:34

>かなり大きな数字になってしました。


って、具体的にはいくつになったのですか?

この回答への補足

確か、3E8を打ち込むと40923になったと思います。
学校のパソコンを使って走らせているため、はっきりしないのですが・・・

宜しくお願いします

補足日時:2010/11/05 10:37
    • good
    • 0

少なくとも、3E8 という入力例くらいは、ソースをたどってみましょう。



3 -> 3
E -> 14
8 -> 8

で、

3E8 -> 14 * 10 + 8 = 148

という計算をしているから。

どんなバグでも、毎回同じ結果になるバグは、「思った通りには動いてないけど、プログラムとしては正しく動いている」のです。

この回答への補足

回答ありがとうございます。

追加で質問なのですが、上記の場合、3は何処へ行ったのでしょうか?
計算結果から外れている?ようなのですが

補足日時:2010/11/04 14:16
    • good
    • 0

分からなくなったらフローシートに書き出してみてください。


ええ、始めに作ったフローシートではなく、プログラムを見てフローシートに書き出すんです。

16進数で入力して 10進数で表示すると言うのでしたら…

 1.キー入力を待つ
 2.Enterキーが押されたら10進数で表示して処理を終了する
 3.入力が有効なら10進数化する
 4.以前に入力された数値を【16倍】して新たに入力された数値を加える
 5.2へもどる

の手順はずです。
なんか、16倍しているステップがないんだけど大丈夫?

この回答への補足

素早い回答ありがとうございます。

ch=getchar();の下に
number=number*16+ch;

と付け足したのですが、かなり大きな数字になってしました。
何処がおかしいか教えてください

補足日時:2010/11/04 14:10
    • good
    • 0

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