#c
#c
Вопрос:
Я пишу программу для простого калькулятора, который принимает строку (без пробелов) с двумя операторами и одним операндом и выводит результат. Моя программа компилируется просто отлично, но во время выполнения я получаю сообщение об ошибке Windows перестала работать. Что может быть причиной этого? Я думаю, что это хорошо связано с логикой моей программы. Вот мой код:
#include <stdio.h>
#include <math.h>
int main()
{
int operand_1 = 0, operand_2 = 0, i = 0, result = 0;
char string[10], *ptr, operation;
ptr = string;
printf("Enter the expression:n");
gets(string);
//puts(string);
while(*ptr==0||*ptr==1||*ptr==2||*ptr==3||*ptr==4||*ptr==5||*ptr==6||*ptr==7||*ptr==8||*ptr==9)
{
operand_1 = operand_1 ((int)*ptr)*pow(10,i);
i ;
ptr ;
}
operation = *ptr;
ptr ;
i=0;
while(ptr!=NULL)
{
operand_2 = operand_2 ((int)*ptr)*pow(10,i);
i ;
ptr ;
}
switch(operation)
{
case ' ':
result = operand_1 operand_2;
case '-':
result = operand_1 operand_2;
case '*':
result = operand_1 * operand_2;
case '/':
result = operand_1 / operand_2;
case '%':
result = operand_1 % operand_2;
}
printf("%d",result);
}
Комментарии:
1. Прежде всего — прекратите использование
gets
. Эта функция опасна и больше не является частью C2. Во-вторых,
ptr
это указатель наstring
, но вы сравниваете его с числами.3. Что вы имели
while(ptr!=NULL)
в видуwhile(*ptr!= 0)
?4. «Перестал работать» обычно означает, что он застрял в бесконечном цикле. Узнайте с помощью отладчика, где вы застряли. Это очень важный навык. Помните, что «компилируется нормально» ничего не значит о том, насколько корректен ваш код.
5.Обратите внимание, что
case
операторы «проваливаются», поэтому вы должныbreak
использовать каждый из них, иначе конечным результатом будет то, что вы будете запускать каждый из них для операции, подобнойприведенной вверху.
Ответ №1:
Я решил проблему, а также улучшил логику программы, чтобы она работала нормально.
#include <stdio.h>
#include <math.h>
int main()
{
while(1)
{
int operand_1 = 0, operand_2 = 0, i = 0, result = 0;
char string[10], *ptr, operation;
ptr = string;
printf("nEnter the expression:");
scanf("%s",string);
if (*ptr=='q' || *ptr=='Q' amp;amp; *(ptr 1)=='u' || *(ptr 1)=='U' amp;amp; *(ptr 2)=='i' || *(ptr 2)=='I' amp;amp; *(ptr 3)=='t' || *(ptr 3)=='T')
{
printf("nBye");
break;
}
while(*ptr>='0' amp;amp; *ptr<='9')
{
operand_1 = operand_1*10 (*ptr - 48);
i ;
ptr ;
}
operation = *ptr;
ptr ;
i=0;
while(*ptr>='0' amp;amp; *ptr<='9')
{
operand_2 = operand_2*10 (*ptr-48);
i ;
ptr ;
}
if(operand_2 == 0)
{
printf("nDivision by zero");
continue;
}
switch(operation)
{
case ' ':
result = operand_1 operand_2;
break;
case '-':
result = operand_1 - operand_2;
break;
case '*':
result = operand_1 * operand_2;
break;
case '/':
result = operand_1 / operand_2;
break;
case '%':
result = operand_1 % operand_2;
break;
}
printf("nResult = %d",result);
}
}
Надеюсь, это поможет кому-то нуждающемуся 🙂
Комментарии:
1. Спасибо! Возможно, было бы полезно кратко объяснить, в чем заключалась проблема, а также исправить отступ вашего обновленного кода.