2011-05-15 3 views
0

Эта программа предназначена для применения rot13 для ввода. Однако при компиляции я получаю предупреждения о том, что строки 20, 23, 29 не влияют на код, а строка 17 - недостижимый код. Когда что-либо вводится, оно просто продолжает программу и оставляет пустое пространство. Что не так?Код недействителен и код недоступен

int main() 
{ 
int c; 

while ((c = getchar()) != EOF) 
    putchar(r13(c)); 

return 0; 
} 

int r13(int c) 
{ 

if((tolower(c) >='a' && c <='z')) 
    { 
     if((c) < 'm') 
      (c = c + 13); 
     else 
     { 
       (c = c - 13); 

     } 
    } 

    else 
     c = c; 
    return (isalpha(c)); 
} 

EDIT: я тупо поставил туда вернуться, не замечая, что фиксирует недостижимую ошибку. Но я до сих пор не знаю, почему c + 13 и c-13 не имеют никакого эффекта?

EDIT: Я хотел создать программу в C, которая была кодировщиком/декодером rot13. Это оригинальный код и отлично работает. Однако я хотел преобразовать в модульный дизайн, и моя нехватка знаний привела меня к неудаче. Надеюсь, это поможет людям понять, что я пытаюсь сделать.

int main(void) 
{ 
int c,e; 

while((c=getchar())!=EOF) 
{ 
    if(c >='A' && c <='Z') 
    { 
     if((e = c + ROT) <= 'Z') 
      putchar(e); 
     else 
     { 
       e = c - ROT; 
      putchar(e); 
     } 
    } 
    else if(c >='a' && c <='z') 
    { 
     if((e= c + ROT) <= 'z') 
      putchar(e); 
     else 
     { 
      e = c - ROT; 
      putchar(e); 
     } 
    } 
    else 
     putchar(c); 
} 

return 0; 
} 

EDIT: хорошо, наконец, фик его, так много глупых ошибок, спасибо за помощь. Также программа должна спросить пользователя, хотят ли они ввести другое значение и, если это так, повторите этот процесс. Есть так много способов сделать это, просто интересно, что вы, ребята, думаете, это лучший способ сделать это.

+0

действительно делают эти утверждения, '(c + 13);', '(c - 13);' и 'c;'. Я не знаю много о c, но в C# они бессмысленны. – Jodrell

ответ

0

вы перенастройка перед тем if()

int r13(int c) 
{ 
    return (isalpha(c));  //put it last line of your function 

    if((tolower(c) >='a' && c <='z')) //this will be unreachable 
    ..... 
} 

Объяснение:

return оператор отправляет обратно поток управления без выполнения кода ниже return заявления, когда ваша r13(int c) функции вызываются.

0

Ваш код ... странный ... Любой код после строки 13 не может быть достигнут по мере возврата isalpha(c). Компилятор прав.

Вы также должны уделять внимание эстетике кода (уродливый код может привести к подобным ошибкам).

0

Оператор возврата на звезду вашей функции r13 эффективно выполняет весь остальной код в функции «мертвый код».

1

Да, они не имеют эффекта. Трудно догадаться, что вы имели в виду, но вы просто пропустили перед ними ключевые слова return?

1

Вам нужно c = c + 13; или c = c - 13;, чтобы изменить значение c. Для возврата значения c вам необходимо return c;

1

Что вы ожидаете от (c + 13);? Это просто оценивает ... но ничего не делает. Он не будет изменять c. Чтобы изменить значение c, чтобы указать значение c + 13, вам необходимо написать c = c + 13; Имейте в виду, что вы объявили c как «int», а не «char».

Кроме того, что случилось с else c;

Что это должен делать?

Я думаю, вам будет полезно изучать основы программирования. В частности, = является оператором присваивания.Способ его работы заключается в том, что выражение справа от = «назначено» переменной (или константе) слева. Итак, чтобы увеличить c на 13, вам нужно будет написать c = c + 13;. Это оценивает c + 13, а затем придерживается этого значения внутри c.

Другой ключевой концепцией является return внутри функций. Возврат значения завершает функцию и предоставляет это значение для того, что вызывало функцию. Помните, что компьютер выполняет все последовательно, поэтому, если вы вставляете оператор return в начале вашей функции, остальная часть кода не будет выполняться.

Смежные вопросы