2016-08-07 8 views
0

Я сделал свою долю изучения языка C и столкнулся с этой несогласованностью, для которой я не могу учесть. Я искал всюду и рассматривал все определения типа данных и реляционный синтаксис, но это вне меня.Ошибка при использовании элементов массива в условных операторах в C

Из книги C Как программировать возникает вопрос о преобразовании двоичного кода в десятичный преобразователь, где вход должен содержать 5 цифр. Я разработал следующий код для ввода числа и посредством операций деления и остатка разбил его на отдельные цифры и назначил каждому элемент в массиве. Проблема возникает, когда я пытаюсь проверить, что введенное число действительно двоичным проверяя каждый элемент массива, чтобы узнать, является ли это 1 или 0.

Вот код:

#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; 
} 

Может кто-нибудь объяснить меня почему независимо от ввода (независимо от того: 00000 или 12345), я всегда получаю сообщение об ошибке? Все остальное работает нормально. Благодарим вас за помощь.

Обновление: Если оператор if перемещается в цикл while раньше. Это должно все еще работать правильно?

Update2: Ничего, я заметил свою ошибку. Перемещение выражения if во время повторения до этого работает с учетом решения, предоставленного sps и Kunal Tyagi.

ответ

0

Одна проблема заключается в том, во время проверки, если число в двоичной или нет, вы возвращаетесь в неправильном месте. Вам нужно вернуть только 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 
    }     
} 

Существует еще одна проблема. Прежде чем преобразовать свой номер в десятичный, вам необходимо установить 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

Действительно, я сделал настройку, и она работала ужасно. Но теоретически оператор if должен работать так же хорошо, если раньше он включался в цикл while, но, похоже, это не так. –

+0

Nevermind, он работает хорошо. Спасибо за помощь. –

+0

@HectorSanabria Как уже упоминалось @dubafek в его ответе, вам также нужно установить 'n = 0;', прежде чем преобразовать число в десятичное. Я обновил ответ. Вы должны сделать это изменение, даже если кажется, что из-за этого вы не получаете никакой ошибки. – sps

1

После этого

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

n устанавливается как -1 поэтому при попытке преобразовать в десятичную заявление bin[n] фактически bin[-1] так она возвращает вам ошибку.

+0

Правильно, я только что заметил это и назначил от 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