• ベストアンサー

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% (8054/17224)
回答No.2

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

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

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

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

関連するQ&A

  • 10進数を2進数に変換したいのですが・・・

    こんばんは。 入力された10進数を2進数に変換するというプログラムを、一応作成することができたのですが、表示される結果が逆に表示されてしまいます。(例えば、4なら001) どのようにすれば、正しく表示することができるのでしょうか??ちなみにプログラムは #include<stdio.h> int main(void) { int num; printf("数字を入れてください。\n"); scanf("%d", &num); for(num = num ; num>1 ; num = num/2) printf("%d",num%2); printf("%d\n",num); return 0; } です。

  • 入力した数 警報

    警報をno回鳴らしたいです。 #include<stdio.h> void alert(int no){ int i; for(i=1;i<=no;i++){ putchar('\a'); } } int main(void){ int a; puts("整数を入力してください。"); scanf("%d",&a); alert(a); return(0);} 修正をお願いします。

  • 2進数の足し算(C言語)

    C言語初学者です。 タイトル通り、2進数の足し算をするプログラムを作っていますが、行き詰ってしまいました。 特に、桁上げをどうするか悩んでいます。 今の自分の考えでは、入力された数値を10で割り、その余りを足していけばできると思っていたのですが、やはり桁上げや繰り上がりに悩んでいます。 全然できてませんが以下ソースです。 #include <stdio.h> int main(void) { int a, b, i; do { printf("8桁以下の非負の2進数を入力してください(1つ目): "); scanf("%d" ,&a); if (a < 0) puts("負の数を入力しないでください。"); } while (a < 0); do { printf("8桁以下の非負の2進数を入力してください(2つ目): "); scanf("%d" ,&b); if (b < 0) puts("負の数を入力しないでください。"); } while (b < 0); a = a % 10; b = b % 10; よろしくお願いします。

  • 条件演算子

    このプログラムをIF文じゃなくて条件演算子を使って書き換えることはできますか? #include <stdio.h> int main(void) { int vx; printf("整数入力しなさい:"); scanf("%d,&vx"); if(vx) puts("その数は非0");   else puts("その数は0"); return(0); }

  • 素数であるかを判断するプログラムについて

    C言語を学習していて「独習C」48ページの次のプログラムが分かりませんでした。 ~~~~~~~~~~~~~~~~ #include <stdlib.h> #include <stdio.h> int main(void) { int num, i, is_prime; printf("判定したい数を入力してください"); scanf("%d", &num); /*ここからがわかりません*/ is_prime = 1; for(i=2; i<=num/2; i=i+1) if((num%i)==0) is_prime = 0; if(is_prime==1) printf("素数です"); else printf("素数ではありません"); return 0; } ~~~~~~~~~~~~~~~ 私はこうなると考えています。どこが間違っているでしょうか? numが0のとき、2<=0となり、素数 numが1のとき、2<=0.5となり、素数でない numが2のとき、2<=1となり、素数でない numが3のとき、2<=1.5となり、素数でない

  • c言語で平均をだす

    #include<stdio.h> int main(void) { int num; int sum; printf("テストの点数を入力してください。\n"); do{ scanf("%d",&num); sum+=num; }while(num); printf("テストの合計点は%dです\n",sum); return 0; } テストの平均点をだすプログラムを作りたいのですが、合計を出すまではわかったのですが、ここから、平均を出すようにするにはどうすればよいですか。

  • c言語の関数について

    .#include<stdio.h> int input_number(void); int main(void) { int num; int total = 0; while(){ num = input_number(); if(num == 0){ break; } total = total + input_number(); } printf("¥n合計値は%dです¥n", total); return 0; } int input_number(void) { int num; printf("数値を入力してください: "); scanf("%d", &num); return num; } 個人でcを勉強しております。 このプログラムで間違っているところを教えていただけませんでしょうか? 苦戦して困っております。できれば勉強法も教えてていただきたいです。 どうか宜しくお願いします。

  • 数字を当てさせるゲームについて

    #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int limit=0; int no; /*当てさせる値*/ int num; /*入力する値*/ int max=9; srand(time(NULL)); no=rand()%1000; do{ printf("あと%d回入力できます。数字を入力してください。\n",max-limit); scanf("%d",&num); limit++; if(num>no) { printf("大きいです。\n"); } else if(num<no) { printf("小さいです。\n"); } }while(num!=no || limit<max) if(num==no) { printf("正解です。"); printf("%d回で当たりました。",limit); } else { printf("残念ながら不正解です。") } return 0; } これは、0以上999以下の整数を入力させて9回以内にランダムで 入力した値を当てさせるゲームです。 質問内容としては 当てさせる数字を「0以上999以下の数字」→「0以上999以下の3の倍数」に変更するにはどうすればよいかです。 よろしくお願いいたします。

  • 最大値を求める

    3つの整数を入力して、最大値を求めるプログラムを作りたいのですが、整数を入力するところまでは うまくいくのですが、結果が、255、と出てしまいます。どこがおかしいのかが解かりません。 どなたか教えていただけませんか? 宜しくお願いします。 #include <stdio.h> int main(void) { int num[3]; int max, i, j; puts("三つの整数を入力してください"); for(i = 0; i < 3; ++i) { printf("整数%d:", (i + 1)); scanf("%d", &num[i]); } max = num[0]; for(j = 0; j < 3; ++j) { if(max < num[j]) { max = num[j]; } } printf("最大値は%dです。\n", max); return 0; }

  • scanf関数の戻り値について

    --------------------------------------- #include<stdio.h> int main(void) { int dt; while(scanf("%d",&dt)==1){ if(dt==0){ printf("0は入力しないでください\n"); puts(""); } else if(dt<0){ dt=-dt; printf("入力値の絶対値は「%d」です\n",dt); puts(""); } else{ printf("入力値の絶対値は「%d」です\n",dt); puts(""); } } return 0; } --------------------------------------- 以上のプログラムについて疑問があります。 scanf関数の戻り値が1の間、繰り返すというもので、入力の時に整数入力ですが、あえて実数である1.1を入れたとします。 scanfの戻り値は1で、dtには整数部の1だけ設定されていたので、これでもうまくいくのかと思ったのですが、次の入力はscanfの戻り値が0になっていて出来ませんでした。 何故0になっているのかわかりません。 入力バッファに何か残ってしまっているということなのでしょうか? 以上教えていただけると嬉しいです。