【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.18931

2進数を10進数にする方法
投稿者---HirO(2004/12/31 15:03:39)


以前10進数を2進数にするプログラムを作りましたが、
今回は2進数を10進数にするプログラムを作ってみました。

ちなみに以下の方法で計算しています

--------------
16 8 4 2 1
--------------
1から倍になっていく表を用意し、
その数字の上に1つずつ、2進数を置いていき、
1の下の数字を合計する

1  0 1 0 1   ←2進数
--------------
16 8 4 2 1
--------------
↓   ↓   ↓
16  + 4 + 1 = 21   ←答え



それで、組んでみたソースがこれです

#include<stdio.h>

int Taiou(int i) //表の対応する数字を出す関数
{
int taiou_ans=0 , j=0;

if(i = 0){
taiou_ans = 1;
}
else{

taiou_ans = 2 * 2; //2つ分の乗数処理を行う
i = i - 2; //上の処理のため指数から2を引く

for(j=0 ; j<i ; j++) //残った指数をansにかけていく
{
taiou_ans = taiou_ans * 2;
}
}
return taiou_ans;
}


int main(void)
{
char [20];
int mojisuu=0 , i=0 , ans=0;

printf("2進数を入力してください>");
scanf("%s",a);

while(a[mojisuu] == '\0'){ //文字数を調べる
mojisuu++; //
} //

mojisuu--; //配列は0から始まるため、ズレの修正
while(mojisuu>=0){
if(a[mojisuu] == 1){ //a配列の後ろから順番にサーチしていき、1であれば対応した数字を足す
ans = ans + Taiou(int i);
}
i++;
mojisuu--;
}

printf("結果[%d]\n",ans);

return 0;
}


これをコンパイルしようとすると、以下のエラーと警告が出ます

警告 W8060 0002.c 9: おそらく不正な代入(関数 Taiou )
警告 W8004 0002.c 7: 'j' に代入した値は使われていない(関数 Taiou )
警告 W8004 0002.c 7: 'taiou_ans' に代入した値は使われていない(関数 Taiou )
エラー E2040 0002.c 28: 宣言が正しく終了していない(関数 main )
エラー E2451 0002.c 32: 未定義のシンボル a(関数 main )
エラー E2188 0002.c 41: 式の構文エラー(関数 main )

全て、なぜ出るのか解決できません・・・


もしかしたら、乗算を行う演算子や、2進数から10進数に変換する方法が、
C言語に用意されてるかもしれません、しかし、入門書に載ってなかったので、
手動で行いました。もしもそのようなものがあれば、教えていただけると幸いです。


何分初心者なので、明らかにおかしい構文があったり、
変数名もごちゃごちゃだったりする部分がありますが、
どうかよろしくお願いします。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:2進数を10進数にする方法 18936 もぐりん 2004/12/31 17:43:39


No.18936

Re:2進数を10進数にする方法
投稿者---もぐりん(2004/12/31 17:43:39)


まず、【掲示板ご利用上の注意】は読みましたか?
読んでいれば、
※ソースの添付は「HTML変換ツール」で字下げ!
※環境(OSとコンパイラ)や症状は具体的に詳しく!
は理解できているはずです。
Visual C++ 6(SP6)でコンパイルしましたが、以下のようなエラーです。
どこがエラーなのか自分で調べてください。
それが終わってから質問してください。

------------------------------------------------------------------
C:\Work>cl demo2.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

demo2.c
demo2.c(26) : error C2143: 構文エラー : ';' が '[' の前に必要です。
demo2.c(27) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
demo2.c(30) : error C2065: 'a' : 定義されていない識別子です。
demo2.c(32) : error C2065: 'mojisuu' : 定義されていない識別子です。
demo2.c(32) : error C2109: 配列または、ポインタでない変数に添字が使われました。
demo2.c(38) : error C2109: 配列または、ポインタでない変数に添字が使われました。
demo2.c(39) : error C2065: 'ans' : 定義されていない識別子です。
demo2.c(39) : error C2143: 構文エラー : ')' が 'type' の前に必要です。
demo2.c(39) : error C2198: 'Taiou' : 実引数が少なすぎます。
demo2.c(39) : error C2059: 構文エラー : ')'
demo2.c(41) : error C2065: 'i' : 定義されていない識別子です。

C:\Work>
------------------------------------------------------------------



この投稿にコメントする

削除パスワード

No.18942

Re:2進数を10進数にする方法
投稿者---HirO(2004/12/31 23:15:00)


>まず、【掲示板ご利用上の注意】は読みましたか?
>読んでいれば、
>※ソースの添付は「HTML変換ツール」で字下げ!
>※環境(OSとコンパイラ)や症状は具体的に詳しく!
>は理解できているはずです。

申し訳ありませんでした。
OS Windows Me
コンパイラ Borland C++ 5.5
です。
字下げに関しては、書き込み内容の修正ができないようなので、
次回から気をつけます。すいません。

そして、エラー内容の書き込み、ありがとうごいます。
ちょっと良く解らない部分があったので、
質問させて頂きます


>Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
>
>demo2.c
>demo2.c(26) : error C2143: 構文エラー : ';' が '[' の前に必要です。
すいません、完全にミスしていました。
char [20]などと、ワケの解らないことをしていましたが、
正しくは char a[20]でした。
エラー内容とは違いますが、恐らくこれのことかと思いました。

>demo2.c(27) : error C2143: 構文エラー : ';' が 'type' の前に必要です。
ちょっと良く解りません。27行目は
int mojisuu=0 , i=0 , ans=0; ですが、どうしていいのか解りません・・・

>demo2.c(30) : error C2065: 'a' : 定義されていない識別子です。
最初の通り、char [20] という間違った宣言のためでした。

>demo2.c(32) : error C2065: 'mojisuu' : 定義されていない識別子です。
while(a[mojisuu] == '\0'){  ですが、
mojisuuは宣言されているはずですし・・・もしかしたら、
char [20] の間違った宣言によるものでしょうか?

>demo2.c(32) : error C2109: 配列または、ポインタでない変数に添字が使われました。
これもやはり char [20]によるものですかね・・・

>demo2.c(38) : error C2109: 配列または、ポインタでない変数に添字が使われました。
上と同じだと思います

>demo2.c(39) : error C2065: 'ans' : 定義されていない識別子です。
よく解りません、ansは宣言されいると思うのですが・・・

>demo2.c(39) : error C2143: 構文エラー : ')' が 'type' の前に必要です。
typeとは何でしょうか?')'をつけるような理由もわかりません

>demo2.c(39) : error C2198: 'Taiou' : 実引数が少なすぎます。
引数は1つではダメなのでしょうか?
入門書を見る限りでは、1つでも複数でも大丈夫そうなのですが
ちなみに39行目は ans = ans + Taiou(int i); です

>demo2.c(39) : error C2059: 構文エラー : ')'
よく解りません・・・何故でしょうか

>demo2.c(41) : error C2065: 'i' : 定義されていない識別子です。
iは宣言しています


結局修正したのは、
char [20];  →   char a[20];
だけです。
そうすると、Borland C++では
警告 W8060 0002.c 7: おそらく不正な代入(関数 Taiou )
警告 W8004 0002.c 5: 'j' に代入した値は使われていない(関数 Taiou )
警告 W8004 0002.c 5: 'taiou_ans' に代入した値は使われていない(関数 Taiou )
エラー E2188 0002.c 39: 式の構文エラー(関数 main )

だけになりました。

解らないことだらけで申し訳ありません。
どうかよろしくお願いします。


この投稿にコメントする

削除パスワード

No.18943

Re:2進数を10進数にする方法
投稿者---あかま(2005/01/01 04:14:37)


39行目を
ans = ans + Taiou(i);
にしてください。
これでコンパイラエラーは取れると思います。


この投稿にコメントする

削除パスワード

No.18946

Re:2進数を10進数にする方法
投稿者---HirO(2005/01/01 14:18:42)


ありがとうございます。

なるほど・・・
本当に初歩的なミス、すいませんでした。
やってみたところ、
コンパイルできました。


しかし、いかなる数字を入れても、結果は0としか出ません。
10101と入れれば、21と出るはずなんですが・・・
while部分がおかしくて、一度も
ans = ans + Taiou(i);
が実行されていないのでしょうか、

それとも、Taiou関数がおかしいのでしょうか・・・

一日考えてみたんですが、よく解りません。
できれば指南お願いします


この投稿にコメントする

削除パスワード

No.18948

Re:2進数を10進数にする方法
投稿者---あかま(2005/01/01 15:06:18)


main関数の間違ってるっぽいところを直しました。
Taiouはご自分で。
#include<stdio.h>

int Taiou(int i) //表の対応する数字を出す関数
{
    int taiou_ans=0 , j=0;
    
    if(i == 0){//ここを修正
        taiou_ans = 1;
    }
    else{
        taiou_ans = 2 * 2; //2つ分の乗数処理を行う
        i = i - 2; //上の処理のため指数から2を引く

        for(j=0 ; j<i ; j++) //残った指数をansにかけていく
        {
            taiou_ans = taiou_ans * 2;
        }
    }
    return taiou_ans;
}


int main(void)
{
    char a[20];
    int mojisuu=0 , i=0 , ans=0;
    
    printf("2進数を入力してください>");
    scanf("%s",a);
    while(a[mojisuu] != '\0'){ //ここを修正&strlen()を使うとよい
        mojisuu++; //
    } //

    mojisuu--; //配列は0から始まるため、ズレの修正
    while(mojisuu>=0){
        if(a[mojisuu] == '1'){ //ここを修正
            ans = ans + Taiou(i);
        }
        i++;
        mojisuu--;
    }

    printf("結果[%d]\n",ans);

return 0;
}




この投稿にコメントする

削除パスワード

No.18949

Re:2進数を10進数にする方法
投稿者---RAPT(2005/01/01 15:12:10)


> while(a[mojisuu] == '\0'){ //文字数を調べる
>     mojisuu++; //
> } //
上記の場合、1文字でも入力があれば、whileブロック内に入りません。
再度条件等を見直してください。

また、処理の前後にprintfなどで変数の値を確認してみると良いでしょう。
# デバッガにその機能があれば、それを使うと便利。

> if(a[mojisuu] == 1){ 
仮に、変数 a の中身が、"101" だとして、mojisuu == 0 だとすると、
a[mojisuu] == '1' であって、a[mojisuu] != 1 となります。

前者は数字、後者は数値の比較になります。




この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧