#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
int main() {
char n;
printf("Programma che svolge ogni tipo di operazione aritmetica tra 2 numeri a e b\n'n' per chiudere\nPremere 'invio' per continuare\n");
double somma, differenza, prodotto, quoziente, a, b, resto;
while (n = getchar() != 'n') {
printf("Inserisci a\n");
scanf("%lf", &a);
if (isalpha(a)) {
printf("Errore! non hai inserito un numero");
}
printf("Inserisci b\n");
scanf("%lf", &b);
if (isalpha(b)) {
printf("Errore! non hai inserito un numero");
}
somma = a + b;
differenza = a - b;
prodotto = a * b;
quoziente = a / b;
resto = fmod(a, b);
printf("somma = %.2lf + %.2lf = %.2lf\n", a, b, somma);
printf("differenza = %.2lf - %.2lf = %.2lf\n", a, b, differenza);
printf("prodotto = %.2lf * %.2lf = %.2lf\n", a, b, prodotto);
printf("quoziente = %.2lf / %.2lf = %.2lf\n", a, b, quoziente);
printf("resto = %.2lf %% %.2lf = %.2lf\n", a, b, resto);
fflush(stdin);
}
return 0;
}
另一个问题(除了标题之外): 我如何(如果检查它)返回主函数(然后重新启动程序以进行while循环)?
答案 0 :(得分:1)
您的计划有几个问题:
您将c
定义为char
,int
应该是unsigned char
以及特殊值EOF
使用stdin
从getchar()
读取字节。
测试while (n=getchar()!='n')
不会将字节红色存储到n
,它会存储比较结果(getchar() != 'n')
。要存储字节并测试其值,请使用while ((n = getchar()) != 'n')
isalpha()
期望int
的值为unsigned char
或特殊值EOF
,由getchar()
返回。将double
传递给不符合此约束的值会调用未定义的行为。如果要检查用户是否键入了数字,请检查scanf()
的返回值:它应返回1.
转换printf
类型的double
格式为%f
。 l
中的%lf
会被忽略。
fflush(stdin);
根据C标准调用未定义的行为。要阅读stdin
的剩余部分,请使用scanf("%*[^\n]"), scanf("%*c");
以下是更正后的版本:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
int main(void) {
int n, res;
double somma, differenza, prodotto, quoziente, a, b, resto;
printf("Programma che svolge ogni tipo di operazione aritmetica tra 2 numeri a e b\n"
"'n' per chiudere\nPremere 'invio' per continuare\n");
while ((n = getchar()) != EOF && n != 'n') {
printf("Inserisci a: ");
while ((res = scanf("%lf", &a)) != 1) {
printf("Errore! non hai inserito un numero\n");
if (res == EOF)
exit(1);
scanf("%*[^\n]"), scanf("%*c");
}
printf("Inserisci b: ");
while ((res = scanf("%lf", &b)) != 1) {
printf("Errore! non hai inserito un numero\n");
if (res == EOF)
exit(1);
scanf("%*[^\n]"), scanf("%*c");
}
somma = a + b;
differenza = a - b;
prodotto = a * b;
quoziente = a / b;
resto = fmod(a, b);
printf("somma = %.2f + %.2f = %.2f\n", a, b, somma);
printf("differenza = %.2f - %.2f = %.2f\n", a, b, differenza);
printf("prodotto = %.2f * %.2f = %.2f\n", a, b, prodotto);
printf("quoziente = %.2f / %.2f = %.2f\n", a, b, quoziente);
printf("resto = %.2f %% %.2f = %.2f\n", a, b, resto);
scanf("%*[^\n]"), scanf("%*c");
}
return 0;
}
注意:
scanf
返回正确转换的格式数。它在文件末尾返回EOF
。如果用户输入了无法转换为数字的内容,您的来电将返回0
。如果你到达文件末尾,它将返回EOF
。我将返回值存储到res
,并将其与1
进行比较。如果它等于1
,则程序可以继续,如果不同,我打印错误消息,刷新剩余的行并重新开始输入操作,除非我们到达文件末尾,我们应该在哪里退出程序以避免无限循环。scanf("%*[^\n]")
消耗与换行符不同的任何字符并丢弃它们。 scanf("%*c")
读取下一个字符(如果有)并将其丢弃。如果我们尚未到达结束文件,则此字符将为'\n'
。 scanf("%*c")
相当于getchar()
。