• ベストアンサー

2進数を10進数にしたいです。

大学の課題で 「キーボードに入力されたに2進数を10進数に直すプログラムを作成せよ」 という課題が出ました。 自分はC言語を始めてまだ1カ月ですが、自分なりに作成してみました。 どこがおかしいか指摘お願いします。 ちなみに大学の授業ではfor文までやりました。 #include <stdio.h> int main(void) { int num,no1,no2,no3,no4,no5,no6,no7,num2=0; do { puts("2進数を入力してください."); scanf("%d", &num); no1=num%10 no2=((num/10)%10)*2 no3=((num/100)%10)*4 no4=((num/1000)%10)*8 no5=((num/10000)%10)*16 no6=((num/100000)%10)*32 no7=((num/1000000)%10)*64 num2=no1+no2+no3+no4+no5+no6+no7 }while(num==0); puts("10進数に変換すると%dです。",num2); return (0); }

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.7

(1)キーボードから2進数を入力 つまり、キーボードからは"0"か"1"を入力しますよね。scanfだと、 数値解釈してしまうので、例えば、"11"を入力すると、3(Binary) ではなく11(Decimal)として変数に取り込まれます。 単に文字列入力とすべきではないでしょうか。 (2)桁数が分からないのにno1~7の決め打ち 入力される2進文字数が不特定なのに、このような決め打ちのプログ ラムは宜しくありません。 先に述べたようにnum自体は既に10進数として扱われているので、この 処置は前提が崩れています。 (3)puts("10進数に変換すると%dです。",num2); printfの間違いと思います。 (3)は愛嬌ですが、(1)、(2)は考え方の根底が誤っています。

その他の回答 (6)

  • titokani
  • ベストアンサー率19% (341/1726)
回答No.6

根本的な問題として、 2進数を入力してください. で、0以外を入力すると、無視されて、再度入力待ちになる。 0を入力すると、 10進数に変換すると0です。 と出て終了する。 という動作になっていますが。 do~whileの場所が問題ですし、終了条件も疑問です。 そもそも課題からして、do~whileでループさせる必要がないでしょう。 あと、入力できる2進数が7桁まですので、文字列で入力するようにしたほうがいいかと思います。 文字列についてはまだ習っていないのでしょうか。

  • yone_sk
  • ベストアンサー率34% (58/167)
回答No.5

授業ということなので、 質問者様のソースをベースにアドバイスさせていただきます。 せっかくfor文を習ったのでしたら --------------------------------- int i; int keta = 1; int bin = 1; num2 = 0; for (i=0; i<7; i++) {  no = ((num / keta) % 10) * bin;  num2 = num2 + no;  keta = keta * 10;  bin = bin * 2; } --------------------------------- 多少面倒なやり方をしてますが、勉強になると思います。 (だいぶ端折ってますので、足りない部分は補間してくださいw) 余力がありましたら、7を固定せずにキーボード入力された文字列から取得すると汎用性が増します。 動作の確認はしておりませんので、動作しなかったらゴメンナサイ・・・

noname#101770
noname#101770
回答No.4

せっかくなんで習ったことを使って書いてみると int num, n, sum, i; num= ここに2進数を n = 1; sum = 0; for(i = num; i > 0; i = i /10){  sum = sum + (i % 10) * n;  n = n * 2; } printf("%d", sum); ってな感じで

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

こんな難しいことをする必要はないのでは? エラーチェックを省略するなら... #include <stdio.h> #include <stdlib.h> int main(void) {  char s[256];  while (gets(s) != NULL && s[0] != '\0') {   printf("%lu\n", strtoul(s, NULL, 2));  }  return 0; } とするだけで十分かと思います。

  • f272
  • ベストアンサー率46% (8526/18247)
回答No.2

#1の人が言ってること以外には,ちょっと思いつくだけでも (1)入力が2進数になっていない場合の処理がない まあ,小さなプログラムだから省略でもいいけど。 (2)入力が2進で1111111(10進で128以上)の場合の処理がない これは練習だと思って考えてみて。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

どこがおかしいかというと、セミコロンのない箇所が数多くあり、 コンパイルエラーが出るところです。 「いや、手持ちのソースではそういうことはない!」とおっしゃるのでしたら、 お手持ちのソースを「そっくりそのまま」コピー&ペーストして載せてください。

関連するQ&A

専門家に質問してみよう