先日も同じプログラムについて質問させていただきました。まだ解決しないので再度、質問させてください。私なりに考えてコードを書いたのですが、おもったように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言語を相談出来る方がいません、この場をお借りして解決の糸口を見つけたいです。宜しくお願いします。
No.3ベストアンサー
- 回答日時:
★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;
}
以上。
No.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;
}
No.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)未満なら続行になります
これは意図した動きですか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
反転した数値を表示させるやり方
-
sscanfとscanfの違いがよくわか...
-
CStringのFindで文字列検索を行...
-
fgets関数を使用したときの文字...
-
charと%c , %s の関係について
-
文の意味
-
C++
-
教えていただけませんか?C言語...
-
文字列中に含まれる文字の個数...
-
fgetsで拾われる改行文字を削除...
-
C言語のステップ数をカウントす...
-
atoiでの文字列以外のエラー処...
-
C言語 空白の行(改行のみ)が...
-
C言語で可変長から固定長に変換...
-
16進数の文字列
-
strstrを利用しない文字列検索...
-
文字の入れ替えについて
-
C言語で16進数文字列から16進数...
-
1行の文字列を時間差で表示する...
-
既約分数の表示プログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
sscanfとscanfの違いがよくわか...
-
反転した数値を表示させるやり方
-
C言語のステップ数をカウントす...
-
Cで「大文字、小文字の判定」は...
-
charと%c , %s の関係について
-
ある文字列で2回目3回目に出現...
-
itoaわかりません
-
fgets関数を使用したときの文字...
-
fgetsで拾われる改行文字を削除...
-
C言語で16進数文字列から16進数...
-
CStringについて
-
文字列中に含まれる文字の個数...
-
strstrを利用しない文字列検索...
-
文の意味
-
エディットボックスに入力され...
-
文字列の途中に「0」がある場...
-
C++
-
putsとputcharの違い?
-
教えていただけませんか?C言語...
おすすめ情報