Вывод выводится как перевернутый вопросительный знак, а подсказка выходит дважды в программе калькулятора на C
Я пишу простую программу расчета, и я не могу получить какой-либо действительный вывод. Все, что я получаю, это перевернутый знак вопроса. Кроме того, в конце программы у меня есть запрос, чтобы спросить пользователя, хотели бы они ввести другой расчет. Однако, когда я ввожу вычисление, в консоли дважды появляется подсказка. Кто-нибудь знает, почему эти вещи происходят? Наконец, я могу использовать только getchar и putchar для обработки ввода и вывода. Заранее спасибо за помощь.
int addFunction( int, int);
int subtractFunction(int, int);
int multiplyFunction(int, int);
int modulusFunction(int, int);
float divideFunction(float, float);
int main(int argc, const char * argv[])
{
int num1 = 0, num2 = 0, result = 0;
char continuePrompt, iochar = 0, operator = 0;
do {
iochar = getchar();
getchar();
if ((iochar >= 0) && (iochar <= 20000)) {
num1 = iochar;
}
if ((iochar == '+') || (iochar == '-') || (iochar == '*') || (iochar == '/') || (iochar == '%')) {
operator = iochar;
}
if ((num1 >= 0) || ((iochar >= 0) && (iochar <= 20000))){
num2 = iochar;
}
switch (operator) {
case '+':
iochar = addFunction(num1, num2);
break;
case '-':
iochar = subtractFunction(num1, num2);
break;
case '*':
iochar = multiplyFunction(num1, num2);
break;
case '%':
iochar = modulusFunction(num1, num2);
break;
case '/':
iochar = divideFunction(num1, num2);
break;
}
putchar(iochar);
printf("Would you like to make another calulation? (y or n)");
scanf("%c", &continuePrompt);
} while (continuePrompt != 'n');
return 0;
}
int addFunction(int x, int y){
return x + y;
}
int subtractFunction(int x, int y){
return x - y;
}
int multiplyFunction(int x, int y){
return x * y;
}
int modulusFunction(int x, int y){
return x % y;
}
float divideFunction(float x, float y){
return x / y;
}
2 ответа
Функция getchar
и получает персонаж из консоли и putchar
ставит персонажа на консоль Это не общие функции ввода / вывода. Ваш код читается так, как вы ожидаете getchar
читать в десятичных представлениях целых чисел и putchar
напечатать десятичное представление целых чисел, но они не работают таким образом. Так как вы можете использовать только getchar
а также putchar
вам придется написать свои собственные методы ввода / вывода для них, чтобы проанализировать ваши входные данные и отобразить их правильно. Итак, сначала выясним, как анализировать и выводить целые числа. Затем используйте те методы, где вы ожидаете читать или писать целые числа (и плавающие, если вам нужно отобразить приблизительные значения для деления). Это может помочь иметь вспомогательный метод, который на самом деле захватывает "текущую" числовую строку, где бы вы ни находились в выражении.
Некоторые основы...
Символьное значение '0' не равно целочисленному значению 0 в ascii, оно имеет целочисленное значение 48. Если у вас только каждое число будет 1 цифрой, это будет что-то вроде:
char c = getchar();
// Assuming the user only will input a number...
int number = c - '0';
Для чтения целого числа с помощью только getchar() я бы сделал что-то вроде:
#include <stdio.h>
#include <math.h> // for pow
int getint()
{
char c;
char buffer[255]; // way larger than an integer will ever be I think...
int numlen = 0;
int number = 0;
int x;
int multfornegative = 1;
while ((c = getchar()) != '\n') {
buffer[numlen++] = c;
}
for (x = numlen - 1; x >= 0; x--) {
c = buffer[(numlen - 1) - x];
if (c == '-') {
multfornegative *= -1;
} else {
number += (c - '0') * (int)pow(10, x);
}
}
return number * multfornegative;
}
для вывода вы бы сделали что-то вроде...
void putint(int number)
{
char digit;
int x;
int start;
if (number < 0) {
putchar('-');
number *= -1;
}
start = log(number) / log(10);
for (x = start; x >= 0; x--) {
digit = ((number / (int)pow(10, x)) % 10) + '0';
putchar(digit);
}
}
Кроме того, попробуйте разбить ваш вход, то, как он у вас есть в цикле, приводит к путанице, которая портит вашу логику.
int num1;
char op;
int num2;
int ans;
do {
num1 = getint();
op = getchar(); getchar();
num2 = getint();
switch(op) {
case '+': ans = num1 + num2; break;
case '-': ans = num1 - num2; break;
// And so on...
}
putint(ans);
while (1);
Язык программирования Си - это удивительная книга для изучения Си, написанная самими изобретателями Си.