2016-08-07 5 views
0

私はC言語の勉強の正当な部分を尽くしてしまいましたが、この矛盾を説明できませんでした。私はどこでも検索し、すべてのデータ型定義とリレーショナル構文を見直しましたが、それは私を超えています。C言語の条件文に配列要素を使用するとエラーが発生する

Cのプログラムから、入力が5桁でなければならないバイナリから10進への変換を行う質問があります。私は、次のコードを開発して、数を取り、除算と余り演算を行い、それを個々の数字に分割し、それぞれを配列の要素に代入します。

#include <stdio.h> 

int power (int x, int y); //prototype 

int main(void) 
{ 
    int temp, bin[5], test; 
    int n=4, num=0; 
//get input 
    printf("%s","Enter a 5-digit binary number: "); 
    scanf("%d", &temp); 

//initialize array 
    while(n>=0){ 
     bin[n]=temp/power(10,n); 
     temp %= power(10,n); 
     n--; } 

//verify binary input 
for (test=4; test>=0; test--){ 
    if ((bin[n]!=0)&&(bin[n]!=1)){ 
     printf("Error. Number entered is not binary.\n"); 
     return 0; } 

//convert to decimal 
    while(n<=4){ 
     num+=bin[n]*power(2,n); 
     n++; } 

    printf("\n%s%d\n","The decimal equivalent of the number you entered is ",num); 
    return 0; 
} 

//function definition 
int power(int x, int y) 
{ 
    int n, temp=x; 
    if(y==0) return 1; 
    for(n=1; n<y; n++){ 
     temp*=x; } 
    return temp; 
} 

誰かがに説明してもらえ:トラブルは、私は番号が入力されていることを確認しようとすると、確かに、それはここでは1または0

あるコードであるかどうかを確認するために、各配列要素をチェックして、バイナリだっ発生します私はなぜ入力に関係なく(00000か12345か)、私はいつもエラーメッセージを受け取るのですか?他のすべてがうまくいくようです。 ありがとうございます。

更新:if文をwhileループに移動する前に。これはまだ正しく動作するはずですか?

Update2:心配しないで、私の間違いに気づいた。 if文をwhile繰り返し前に移動すると、spsとKunal Tyagiによって提供された解が与えられます。この

while(n>=0){ 
    bin[n]=temp/power(10,n); 
    temp %= power(10,n); 
    n--; } 

n

答えて

0

1つの問題は、数がバイナリであるかどうかをチェックしながら、あなたは間違った場所に戻ってきている、ということです。あなたはifだけを返す必要があります番号はバイナリではありません。しかし、あなたはifの状態の外に戻っています。だから、あなたのプログラムは入力が何であっても返します。

for (test=4; test>=0; test--){ 
    if ((bin[test]!=0)&&(bin[test]!=1)) 
     printf("Error, numbered entered was not binary.\n"); 
     // Issue here, you are returning outside if 
     return 0; } //exit program 

あなたはにいることを変更することができます。

for (test=4; test>=0; test--){ 
    if ((bin[test]!=0)&&(bin[test]!=1)) { 
     printf("Error, numbered entered was not binary.\n"); 
     // Return inside the if 
     return 0; // exit program 
    }     
} 

1つのより多くの問題があります。数字を10進数に変換する前に、n = 0を設定する必要があります。

//convert to decimal 
n = 0; /* need to set n to zero, because by now 
      n will be -1. 
      And initially when n is -1, accessing 
      bin[-1] will result in undefined behavior 
     */ 
while(n<=4){ 
    num+=bin[n]*power(2,n); 
    n++; } 
+0

実際、私は調整を行い、それはterrifically働いた。しかし理論的にはif文は前のwhileループに含まれていれば同様に動作するはずですが、そうではありません。 –

+0

それはうまくいきません。あなたの助けを借りていただきありがとうございます。 –

+0

@HectorSanabria @dubafekが彼の答えで述べたように、数値を10進数に変換する前に 'n = 0; 'を設定する必要もあります。私は答えを更新しました。そのためにあなたが何らかのエラーを起こしていないように見えても、あなたはその変更を行う必要があります。 – sps

1

は、それはあなたのエラーを返しますが、声明bin[n] 10進数に変換しようとするので、実際にbin[-1]ある-1として設定されています。

+0

正しく、私はこれに気付き、10進数に変換する前に0からnを割り当てました。ありがとうございます –

0

これは宿題のようですが、問題は角括弧内にあります。より具体的には23行目です。インデントにもかかわらず、その行は論理if文の一部ではありません(C言語では問題ありません)。 条件を確認した後、プログラムはtest=4で終了します。

ソリューション:

if ((bin[test]!=0)&&(bin[test]!=1)) { // << this brace 
     printf("Error, number entered was not binary.\n"); 
     return 0; } } //exit program // notice 2 braces here 
関連する問題