@Kaktys_DH

Хочу узнать мнение хороших программистов на C(СИ) о моем калькуляторе, можно каких-нибудь советов?

Хочу узнать мнение хороших программистов на C(СИ) о моем калькуляторе, можно каких-нибудь советов? Это мой первый проект на С.

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

  int num_1;
  int num_2;
  int result;
  char wait[2];
  char vopros[2];
  char vopros_2[2];


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


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

  printf("\nВведите второе число: ");
  scanf("%d", &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;
}

printf("%d %s %d = %d\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("%d", &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;
}

printf("Result - %d\n", result);
  }
}
while (vopros_2[0] != 'N');


printf("Хотите попробывать еше раз? (Y/n): ");
scanf("%s", vopros);

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

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

return 0;
}
  • Вопрос задан
  • 182 просмотра
Пригласить эксперта
Ответы на вопрос 1
CityCat4
@CityCat4
Внимание! Изменился адрес почты!
Ну... для первого проекта пойдет - все равно как правило первый проект - это место набивания шишек и натыкания на общие места...

Юзер - дебил! Исходят всегда из этого. Он вводит чушь. Он делает совсем не то, что от него оиждают. Он игнорирует предупреждения. ВСЕ его действия должны проверяться. ВСЕ результаты должны проверяться.

Переменные, которые будут управлять программой - обязательно инициализировать! Выборы, которые управляют программой - проверять! Что произойдет, если юзер введет любой другой символ, кроме знака операции? Правильно, SIGSEGV :) Потому что result не имеет значения, а в нелепом каскадном if обработка ситуации "юзер ввел ерунду" не предусмотрена и в printf() пойдет неинициализированная переменная :)

Избегай каскадных if, когда можно использовать case

scanf() оправдан только тогда, когда нужно преобразовать число, в твоем случае нужно использовать getchar()

Вместо усложнения кода двойным условием (n или N) стоит использовать tolower()/toupper(), чтобы условие было одно

Вычисления целочисленные и будут давать неожиданный результат с нецелыми операндами. Например 4 / 2 даст 2 (как и должно быть), но 5 / 2 - тоже даст 2!

Нет обработки операций с нулем - например при делении на нуль программа скорее всего получит SIGILL

В общем, есть над чем работать :)
Ответ написан
Ваш ответ на вопрос

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

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