みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【続】コマンドライン引数を使って2進数を10進数に変換させたい

先日も同じプログラムについて質問させていただきました。まだ解決しないので再度、質問させてください。私なりに考えてコードを書いたのですが、おもったように2進数を10進数に変換出来ません。C言語を習い始めたばかりで難しいコードが解りません。出来ましたら作成途中のコードをベースに正常に動くプログラムを教えていただければ幸いです。仕様としては、コマンドラインを使って引数を持たせて動くようにすることです。作成環境は「Windows XP」「Visual Studio .net 2003」
--------------------------------------------------------
<作成したコード>
// binary.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
#include "stdafx.h"
#include <stdlib.h>
int _tmain(int argc, _TCHAR* argv[])
{
int i=0,n=0;
char decimal[ 128 ], binary[ 128 ];
if( argc < 2 ){
printf("2進数を入力してください。\n");
return 0;
}
//printf( "arg[0] = %s\n", argv[0] );
//printf( "arg[1] = %s\n", argv[1] );
for( i=0; argv[1][i] != '\0'; i++ ){
binary[i] = argv[1][i];
}
binary[i] = '\0';
//空白文字のチェック///////////////////////////////////////////////
for( i=0; i<binary[i]; i++ ){
if( binary[ i ] != ' ' ){
decimal[ n ] = binary[ i ];
n++;
}
}
//'\0'を代入(文字列の終端)///////////////////////////////////////////////////
decimal[ n ]='\0';

//「0」と「1」のループ///////////////////////////////////////////////////////
for( i=0; i<decimal[i]; i++ ){
if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){//「0」または「1」の判断
}else{
printf("エラー\n 「0」と「1」以外の文字が入力されております\n");//エラーメッセージ
}
}
//桁数のループ//////////////////////////////////////////////////////////////
int m = 0;
for( i=0; i<'\0'; i++ ){
m = m +1 ;
}
//桁数の判断////////////////////////////////////////////////////////////////
if( m == 8 ){
}else{
printf("エラー\n2進数(0,1)を8桁、入力して下さい。\n");//エラーメッセージ
}
//add・初期化////////////////////////////////////////////////////////////////
int add = 0;
//decimal[0]~decimal[7]の判断///////////////////////////////////////////////
if( decimal[ 0 ] == '1' ){
add += 128;
}
if( decimal[ 1 ] == '1' ){
add += 64;
}
if( decimal[ 2 ] == '1' ){
add += 32;
}
if( decimal[ 3 ] == '1' ){
add += 16;
}
if( decimal[ 4 ] == '1' ){
add += 8;
}
if( decimal[ 5 ] == '1' ){
add += 4;
}
if( decimal[ 6 ] == '1' ){
add += 2;
}
if( decimal[ 7 ] == '1' ){
add += 1;
}
//2進数を10進数に変換した値の出力////////////////////////////////////////////
printf("2進数を10進数に変換した値は %d \n",add);

return 1;

}
--------------------------------------------------------
近くにC言語を相談出来る方がいません、この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。

投稿日時 - 2008-01-21 22:15:54

QNo.3701336

すぐに回答ほしいです

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

★2進数→10進数の変換は難しいですか?
>出来ましたら作成途中のコードをベースに正常に動くプログラムを教えていただければ幸いです。
 ↑
 ベースにしたくありません。
 反面教師的には参考になりますが…。
・ソースを見たところポインタを使っていませんね。
 それから繰り返し処理をすればいいところがNGです。
>この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。
 ↑
 過去質問も参考にしてみましたか?
 http://oshiete1.goo.ne.jp/qa3698732.html→『コマンドライン引数を使って2進数を10進数に変換させたい』
 http://oshiete1.goo.ne.jp/qa3690048.html→『8桁の2進数を10進数に変換する方法を教えてください。』
 過去のソースコードを見たら全然進んでいないみたいですね。
>(1)このプログラム(8桁の2進数を10進数に変換)をする際は、最後に出力する時(printf)以外は関数を使ってはいけません。
>(2)キーボードから2進数を入力させる。
>(3)空白(ブランク)が入力されても変換可能にする。
>(4)入力された2進数は8桁にし、8桁以上の場合はエラーを出す。
>(5)2進数の「0」と「1」以外の文字が入力された場合はエラーを出す。
>(6)バイナリ変換をし、変換結果を出力する。
 ↑
 この仕様通りに順番に作り上げればいいですが、何処でつまづいていますか?
 ポインタを使えば空白(ブランク)のカットが楽になります。
 下に私的によりサンプルを載せておきます。
 ソースコードを見比べて何処がまずかったのかを補足に書いて下さい。
 補足にサンプルの理解度コメントを待っています。

サンプル:
#include <ctype.h>
#include <stdio.h>

// メイン関数
int main( int argc, char *argv[] )
{
 char *binary;
 int decimal;
 int number;
 int i;
 
 // 引数の有無をチェック
 if ( argc <= 1 ){
  printf( "error:8桁の2進数を引数で指定して下さい。\n" );
  return 1;
 }
 // 8桁2進数の文字列をセット
 binary = argv[ 1 ];
 // 空白を読み飛ばす
 while ( isspace(*binary) ){
  binary++;
 }
 // 『0』と『1』のチェック
 for ( i = 0 ; binary[i] != '\0' ; i++ ){
  if ( (binary[i] != '0') && (binary[i] != '1') ){
   printf( "error:0と1以外の数字が指定されています。\n" );
   return 2;
  }
 }
 // 8桁以上かチェック
 if ( i > 8 ){
  printf( "error:8桁より大きい桁は指定できません。\n" );
  return 3;
 }
 // 2進数→10進数の変換
 decimal = 0;
 for ( i = 0 ; binary[i] != '\0' ; i++ ){
  number = (binary[i] - '0');   // 文字→数値に変換
  decimal = (decimal * 2 + number);  // 最下位の桁から10進数値を作成
 }
 // 結果の出力
 printf( "入力の文字列:%s\n", binary );
 printf( "出力の整数値:%d\n", decimal );
 return 0;
}
以上。

投稿日時 - 2008-01-22 18:48:02

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

○明らかにおかしいところ
> //「0」と「1」のループ
> for( i=0; i<decimal[i]; i++ ){
forループの継続条件がおかしい。
(i番目の文字の文字コードとiを比較してどうする?)

> if(( decimal[ n ] == '0' ) || ( decimal[ n ] == '1' )){ //「0」または「1」の判断
直前で
 decimal[ n ]='\0';
としてるからdecimal[ n ]が'0'や'1'と一致することは絶対にない。

> //桁数のループ
> int m = 0;
> for( i=0; i<'\0'; i++ ){
> m = m +1 ;
> }
継続条件が意味不明。
'\0'==0なのでループは一回も回らず
mは結局0のまま。

○間違いとは言い切れないが気持ち悪いところ
> char decimal[ 128 ], binary[ 128 ];
decimalには一度も「10進数表記された文字列」は格納されていないのに、
decimalという変数名なのは違和感がある。

> //decimal[0]~decimal[7]の判断
ループ使って書く気はない?
8桁限定なのもどうにかしたい。

> return 1;
正常終了の時は普通0をreturnする。

○もっと楽できるところ(自力で全処理を書くのが目的だったら無視してください。)
> for( i=0; argv[1][i] != '\0'; i++ ){
> binary[i] = argv[1][i];
> }
> binary[i] = '\0';
文字列のコピーはstrcpyでできる。
(文字列を書き換える気がないなら、charポインタの代入だけして参照しても良い)

>//桁数の判断
文字列の長さはstrlenで調べられる。



以下は試しに書いてみたサンプル。
(そのコードをベースにする気は無かったからほぼ別物ですが。)
-----------------------------------------------------------
/*全角空白は削除してください*/
#include<stdio.h>
int main(int argc, char *argv[])
{
 int number=0;
 char *binary;

 if( argc > 1 ){
  binary = argv[1];
 }
 else{
  printf("2進数を入力してください。\n");
  return 1;
 }

 //2進数表記文字列->数値
 //自力でやる必要がないならstrtolでも使えばいい
 for(; *binary != '\0'; binary++){
  if(*binary != '0' && *binary != '1'){
   //0,1以外の文字は無視して次へ
   continue;
  }
  number*=2;
  if(*binary == '1'){
   number++;
  }
 }
 printf("2進数を10進数に変換した値は %d \n",number);

 return 0;
}

投稿日時 - 2008-01-21 23:59:56

ANo.1

空白チェックと『0』『1』チェックのループの終了条件がおかしいですよね

質問する際に実行手順と実行結果、期待する結果を投稿したほうがいいですよ
ついでに ソースをアップするなら 字下げなどをして少しでも見やすいソースにしましょう
このサイトの場合行頭からの半角スペースは削除されますので全角スペースなど対処しましょう

iはループカウンタです deciaml[i]やbinary[i]は'0'または'1'です
iは0からカウントアップされますが decimalやbinaryも文字終端では止まりません
i<decimal[i] だと iがdecimal配列のi番目の要素未満ならループ続行となります
したがって decimal[i]が'0'なら iが48(0x30)未満なら続行になります
これは意図した動きですか

投稿日時 - 2008-01-21 23:48:59

あなたにオススメの質問