2015-02-23 3 views
3

Я смущен о написании программы, которая берет символ «/» от пользователя и предупреждает пользователя не использовать 0 в числителе. Я создал программу, но мне нужен альтернативный метод использования инструкции goto.Альтернативный способ использования инструкции goto

# include <stdio.h> 
int main() 
{ 
    char o; 
    int num1,num2; 
    printf("Enter one operator like '+' '-' '/' '%%' '*' : "); 
    scanf("%c",&o); 
    printf("Enter 1st number: "); 
    scanf("%d",&num1); 
my: printf("Enter 2nd number: "); 
    scanf("%d",&num2); 

Ниже я хочу удалить эти две строки, но он должен достичь того же результата, что и он.

if(o=='/' && num2==0){ 
     printf("You can't divide by zero \n"); 
     goto my; 
    }  
    switch(o) { 
     case '+': 
      printf("%d + %d = %d",num1, num2, num1+num2); 
      break; 
     case '-': 
      printf("%d - %d = %d",num1, num2, num1-num2); 
      break; 
     case '*': 
      printf("%d * %d = %d",num1, num2, num1*num2); 
      break; 
     case '/': 
      printf("%d/%d = %d",num1, num2, num1/num2); 
      break; 
     case '%': 
      printf("%d %% %d = %d",num1, num2, num1%num2); 
      break; 
     default: 
      printf("Operator is not correct"); 
      break; 
    } 
    printf("\n\n"); 
    system ("pause"); 
} 
+1

Вы не должны удалять код и отвечать на любые вопросы – Gopi

+0

См. [Goto по-прежнему считается вредным] (http://stackoverflow.com/questions/46586/goto-flowing-considered-harmful/) для обсуждения плюсы и минусы «goto» в целом. –

+0

Вы должны проверить возвращаемое значение 'scanf', чтобы избежать неопределенного поведения и бесконечного цикла на EOF. – chqrlie

ответ

0

Существует несколько альтернатив, чтобы проверить мой.

while(1) 
{ 
    printf("Enter a number\n"); 
    if(scanf("%d",&num2) == 1) 
    { 
    if(o == '/' && num2 == 0) 
    { 
     printf("You can't divide by zero\n"); 
    } 
    else 
    break; 
    } 
} 
+0

, и если я использую числа с плавающей запятой, то как я могу ограничить при сравнении числа с плавающей запятой с знаком «==»? –

+0

Удалить инструкцию 'continue'. Здесь это не нужно. –

+0

@CoolGuy Вы правы. Я не вижу причин, почему он должен быть там. – Gopi

0

Преобразование его в петлю, как показано ниже:

do { 
    printf("Enter 2nd number: "); 
    scanf("%d",&num2); 
    if(o=='/' && num2==0){ 
     printf("You can't divide by zero \n"); 
     continue; 
    } else { 
     break; 
    } 
} while (1); 
+0

Я также пишу тот же код в числах с плавающей запятой, где число с плавающей запятой не разумно с пением «==». что я должен там делать? @SMA –

+0

Если это так, вам может потребоваться [здесь] (http://floating-point-gui.de/errors/comparison/) – SMA

+0

, если я вхожу 0.50 в num2, цикл не прерывался. Что мне там делать? –

8

Там нет ничего плохого goto в и себя!

Это то, что большинство людей не в состоянии понять, а не просто попугай плохо выбранный фрагмент из бумаги данного десятилетия назад, тот, который сам Дейкстра позже пришел к сожалению, о том, что-то вдоль линий, имеющих «плохое чувство что люди делают из нее религию ».

Если бы люди просто пытаются понять причины руководящих принципов, таких как использование goto, break и continue, или ограничение точек выхода из функций, и так далее, они были бы гораздо лучше, практикующие искусства.

Что Дейкстр фактически ругал, и то, что я согласен с беззаветно, было «необузданное использованием идти на заявление», в вычислительной среде, где было в основном мало что с точкой зрения итерации. Тот факт, что многие среды только имел goto, может привести к большому количеству кодов спагетти, очень трудно следовать.

Я на самом деле считают слепой догматизм в отрасли гораздо больше проблем, чем goto заявления никогда не были :-) Проблема с goto является его злоупотребление, так, как уже упоминалось, это может сделать код намного труднее следовать, и что Я, как правило, делать, когда я слышу эти высказывания, это спросить:

ли этот код трудно следовать или поддерживать, потому что это нарушает «правила»?

Если вы реструктурировать свой код следующим образом:

// =================================================== 
// Get the second number, disallowing zero if dividing. 
getSecondNum: 
    printf ("Enter 2nd number: "); 
    scanf ("%d", &num2); 
    if ((o == '/') && (num2 == 0)) { 
     printf ("You can't divide by zero \n"); 
     goto getSecondNum; 
    } 
// =================================================== 

вы бы трудно пытаться придумать решение, основанное do или while, который был более читаемым или понятно. Вы можете соответствовать читабельности, но вы часто обнаружите, что плохо выбранный выбор между нулем или более do и один или более while может отображать код less читаемый.

Для чего это стоит, это примерно так же близко, как я могу добраться до того же кода в не goto -при образом:

// =================================================== 
// Get the second number, disallowing zero if dividing. 
do { 
    printf ("Enter 2nd number: "); 
    scanf ("%d", &num2); 
    if ((o == '/') && (num2 == 0)) { 
     printf ("You can't divide by zero \n"); 
} while ((o == '/') && (num2 == 0)); 
// =================================================== 

но есть и другие проблемы, такие как дублирование кода. Это также может быть исправлено, но обычно это связано с использованием большего количества переменных или использованием break, который имеет точно та же проблема, что и goto здесь (b).


Таким образом, нижняя линия, сделать не взять как евангельскую то, что вы не понимаете, это не имеет значения, идет ли это от Дейкстры, Кнут, датских крон, или даже то, что другие боги вы можете верить в :-)

Подумайте о том, почему можно считать Евангелие в первую очередь, затем это, как вы решите, применяется ли он в той или иной ситуации (а).

Я часто использовать goto в автоматах, обработка ошибок и так далее, там, где он на самом деле упрощает код, иначе было бы труднее понять.


(а) Это включает в себя советы от случайных людей в сети, даже из тех, кого называют "paxdiablo" :-)


(б) Одна вещь, вы мощь хотите, чтобы пользователь вводил ноль даже для деления, а затем просто сортировал его в расчете с чем-то вроде:

case '/': 
    if (num2 == 0) 
     printf ("%d/0 is undefined, cannot divide by zero", num1); 
    else 
     printf ("%d/%d = %d", num1, num2, num1/num2); 
    break; 

Я бы предпочел бы уловить раньше, но это может быть жизнеспособным решением для вас.

+0

Я также пишу тот же код в числах с плавающей запятой, где число с плавающей запятой не является разумным с «==» пением. что я должен там делать? @paxdiablo –

+0

@ Zainab, сравнение чисел с плавающей запятой - это совершенно другой вопрос, который много раз задавался здесь на SO. В основном, вы проверяете «достаточно близко», а не равны, например, если разница составляет менее 0,00001% от среднего, в зависимости от всех видов вещей. Я бы предложил искать SO для вопросов, уже заданных по этой теме. – paxdiablo

+0

Я искал номер с плавающей запятой, и примерно получил смысл. Теперь, используя цикл while в целых переменных, если я вхожу в 0.50 в num2, цикл не прерывается. Что мне там делать? Почему он не выбирает действительное число до десятичной точки? –

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