@Kaktys_DH

Пожалуйста откритикуйте код на си и дайте советов?

#include <stdio.h>
int main()
{

float num_1 = 0;
float num_2 = 0;
float result = 0;
char wait[2] = {0};
char vopros[2] = {0};
char vopros_2[2] = {0};

do {
printf("\n\t\t\t\t\tКАЛЬКУЛЯТОР 3.0");

printf("\nВведите первое число: ");
scanf("%f", &num_1);

printf("\nВведите второе число: ");
scanf("%f", &num_2);

printf("\nВыберите действие - +, -, *, /: ");
scanf("%s", wait);

if (wait[0] == '+') {
result = num_1 + num_2;
}

else if (wait[0] == '-') {
result = num_1 - num_2;
}

else if (wait[0] == '*') {
result = num_1 * num_2;
}

else if (wait[0] == '/') {
result = num_1 / num_2;
}

else {
  printf("Ошибка синтаксиса\n");
}

if (  ( wait[0] == '/' && (num_1 == 0 && num_2 == 0) )  ||  ( wait[0] == '/' && (num_1 == 0 || num_2 == 0) )  ) {

printf("\n\nТЫ ЧТО-ТО ДЕЛАЕШЬ НЕ ТАК!!!\n\n");
}
goto metka;

printf("%f %s %f = %f\n", num_1, wait, num_2, result);

do {
printf("Хотите воспроизвести действие еще с одним числом?(Y/n)");
scanf("%s", vopros_2);

if (vopros_2[0] == 'n') {
   vopros_2[0] = 'N';
}

else if (vopros_2[0] != 'n' || vopros_2[0] != 'N') {
num_1 = 0;
num_2 = 0;
char wait[2] = {0};

printf("Введите число\n");
scanf("%f", &num_1);

printf("\nВыберите действие - +, -, *, /: ");
scanf("%s", wait);

if (wait[0] == '+') {
result = result + num_1;
}
else if (wait[0] == '-') {
result = result - num_1;
}
else if (wait[0] == '*') {
result = result * num_1;
}
else if (wait[0] == '/') {
result = result / num_1;
}
else {
  printf("Ошибка синтаксиса\n");
}

printf("Result - %.6f\n", result);
}


}
while (vopros_2[0] != 'N');
metka:
printf("Хотите попробывать еше раз? (Y/n): ");
scanf("%s", vopros);

if (vopros[0] == 'n') {
vopros[0] = 'N';
}

}
while (vopros[0] != 'N');

return 0;
}
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 1
@TheCalligrapher
Проблемы, в порядке возникновения

1. В С предпочитайте int main(void) вместо int main()
2. Необоснованное использование типа float вместо типа double.
3. Какая-то странная смесь нелокализованных и локализованных объявлений переменных, в т.ч. переменных с одинаковыми именами в вложенных областях видимости. Напр. wait
4. scanf("%s", wait); никак не защищен от переполнения. И это при том, что буфер wait имеет минимальный размер. Лучше scanf("%1s", wait);. Разумеется, это не решит всех потенциальных проблем с некорректным вводом...
5.
if (  ( wait[0] == '/' && (num_1 == 0 && num_2 == 0) )  ||  ( wait[0] == '/' && (num_1 == 0 || num_2 == 0) )  )
- что это за странная двойная проверка одного и того же?
6. goto здесь совсем не уместно.
7. Что это вообще за странное дублирование одного и тот же кода?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы