Попытка получить переменную из getchar(), чтобы сохранить ее значение в простой программе расчета

Я изучаю C и пытаюсь создать эту программу, которая по порядку запрашивает ввод оператора (+,-,*,%), число, а затем другое число, используя scanf, printf и getchar(). Когда я делаю это, спрашивая оператора в последнюю очередь, это работает, но сначала я должен получить это от оператора.

Вот код, который я придумал, который работает (но не по порядку):

char operator;
int numbers[2];
int result;

printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);
printf("Enter operation:");
getchar();
operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}

printf("%d", result);

Это код, который не:

printf("Enter operation:");
getchar();
char operator = getchar();
if (operator == '+') {
result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
result = numbers[0] - numbers[1];
}
else if (operator == '*') {
result = numbers[0] * numbers[1];
}
else if (operator == '/') {
result = numbers[0] / numbers[1];
}
else {
result = 0;
}
printf("Enter the first number:");
scanf("%9d", &numbers[0]);
printf("Enter the second number:");
scanf("%9d", &numbers[1]);

printf("%d", result);

Этот дает случайную величину.

Если код не был в блоке, простите меня, я следовал инструкциям, как мог.


person user1780775    schedule 12.11.2012    source источник


Ответы (3)


Результат оператора присваивания вычисляется "прямо в момент": выражение...

result = a + b;

... не заставит result изменить свое значение, когда a или b изменят свои значения.

Вот почему ваш первый фрагмент работает, как и планировалось, а второй фрагмент показывает мусор, когда вы сначала пытаетесь вычислить результат какой-то бинарной операции над некоторыми значениями мусора (что numbers элементы массива хранят до того, что им что-то присвоили полезно), и только после этого попытайтесь получить какие-либо данные от пользователя.

Ключ result уже имеет какое-то значение к этому моменту, и это значение не изменится — если, конечно, вы не сделаете второе присваивание. )

Эту программу довольно легко исправить: просто отделите фактические вычисления от этой входной части. Так что...

if (operator == '+') {
  result = numbers[0] + numbers[1];
} 
else if (operator == '-') {
  result = numbers[0] - numbers[1];
}
else if (operator == '*') {
  result = numbers[0] * numbers[1];
}
else if (operator == '/') {
  result = numbers[0] / numbers[1];
}
else {
  result = 0;
}

... будет следовать ВСЕМ printf/scanf частям (очевидно, кроме той, которая печатает результат). Кстати, вы можете использовать switch для той же цели:

switch(operator) {
  case '+':
    result = numbers[0] + numbers[1]; break;
  case '-':
    result = numbers[0] - numbers[1]; break;
  case '*':
    result = numbers[0] * numbers[1]; break;
  case '/':
    result = numbers[0] / numbers[1]; break;
  default:
    result = 0;
}
person raina77ow    schedule 12.11.2012
comment
Спасибо, это имеет смысл. Я просто хочу знать, какая базовая книга по c научила бы меня тому, что подобные операции должны выполняться после того, как переменная имеет значение? Является ли язык программирования C достаточно базовым? Я кое-что читал, но мне интересно, будут ли преподавать все, что мне нужно знать, поскольку в начале говорится, что это предполагает некоторые знания. - person user1780775; 13.11.2012
comment
Что ж, книга K&R сама по себе является очень солидной базой для изучения не только языка C, но и CS в целом. Вам просто нужно дать себе время, чтобы... полностью переварить это, могу я сказать. ) Ключ, как обычно, в практике и экспериментах - возиться с вашим кодом, меняя небольшие его части, чтобы увидеть, какая разница, - это, на мой взгляд, лучший способ изучить CS. - person raina77ow; 13.11.2012
comment
Что же касается самой идеи переменных, хранящих отношения, а не значения — ну, вы определенно не одиноки в этом: на самом деле, вся парадигма под названием реактивное программирование построено вокруг него. ) - person raina77ow; 13.11.2012

Во второй части вы еще не прочитали значение 2-х чисел, но делаете над ними операции.

Кстати:

Вместо всех

if (operation == '+') 
// etc

вы можете заглянуть в оператор switch.

switch(operator) {
   case '+'
       number[0] + number[1];
       break;
   // etc
person dirkmaij    schedule 12.11.2012

похоже, у вас есть дополнительный вызов getchar()

printf("Enter operation:");
getchar();
char operator = getchar();

должно быть

printf("Enter operation:");
char operator = getchar();

В противном случае вы можете пропустить оператор, а также вам нужно сначала прочитать числа, прежде чем выполнять математику.

person iabdalkader    schedule 12.11.2012