C prime plus 第八章编程练习第八题
题目:编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用float类型的变量存储用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第二个数,程序应该提示用户重新输入一个新值。
题目分析:
- 欢迎页即是菜单,需要保持一定程度的文字内容的整齐。这里可以使用一个函数来负责欢迎页菜单的显示
- 获取用户选择的选项,应该使用
getchar()获取用户的输入,并且只允许接收菜单选项的字符作为首字母,要注意处理掉用户输入的首字母之后的内容特别是换行符! - 接收到用户的选项后,应该用
switch分支来处理用户选项。 - 提示用户输入要进行计算的两个数字,应该使用scanf()来获取用户输入,并对用户输入错误类型数据和用户输入时留下的换行符进行处理。
- 对于除法,要注意用户第二个数字输入为
0时,应该提醒用户重新输入。
结构化代码:
- 欢迎页菜单
void Welcome() {
printf("\nEnter the operation of your choice:\n");
printf("a. add s.subtract\n");
printf("m. multiply d.divide\nq. quit\n");
}
- 获取用户选择的选项,只接受首字母并处理换行符;如果用户输入的是
q,直接不进入循环,程序结束
while ((select = getchar()) != 'q') {
while (getchar() != '\n')continue;
}
printf("Bye~");
3.用switch分支处理用户的选项:
switch (select) {
case 'a': //加法
case 's': //减法
case 'm': //乘法
case 'd': //除法
defalut: //用户输入了不再考虑范围的错误选项后,提示用户。
4.用scanf()来接收用户输入的数字:
在这里,%g是以省去不必要的0来打印浮点数的方式,在日常生活中比较实用。
printf("Enter first number: ");
while (scanf("%f", &first_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //处理用户输入错误的信息及换行符
printf(" is not an number!\nPlease enter first number again (such as 2.5) : ");
}
printf("Enter second number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //处理用户输入错误的信息及换行符
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
printf("%g + %g = %g\n", first_number, second_number, first_number + second_number);
- 对于除法,要特别处理一下,如果用户输入第二数字而0时,要及时处理掉0:
while (second_number == 0) {
printf("0 is a available number, please enter another number: ");
while (scanf("%f", &second_number) != 1) { //重新进入输入第二个数字的环节
while ((ch = getchar()) != '\n') putchar(ch);
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
}
最后的完整代码:
#include <stdio.h>
void Welcome() {
printf("\nEnter the operation of your choice:\n");
printf("a. add s.subtract\n");
printf("m. multiply d.divide\nq. quit\n");
}
int main(void) {
char ch, select;
float first_number, second_number;
Welcome();
while ((select = getchar()) != 'q') {
while (getchar() != '\n')continue;
switch (select) {
case 'a':
printf("Enter first number: ");
while (scanf("%f", &first_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!\nPlease enter first number again (such as 2.5) : ");
}
printf("Enter second number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
printf("%g + %g = %g\n", first_number, second_number, first_number + second_number); //%g用于打印浮点型数据时省去不必要的0;
break;
case 's':
printf("Enter first number: ");
while (scanf("%f", &first_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!\nPlease enter first number again (such as 2.5) : ");
}
printf("Enter second number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
printf("%g - %g = %g\n", first_number, second_number, first_number - second_number);
break;
case 'm':
printf("Enter first number: ");
while (scanf("%f", &first_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!\nPlease enter first number again (such as 2.5) : ");
}
printf("Enter second number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
printf("%g * %g = %g\n", first_number, second_number, first_number * second_number);
break;
case 'd':
printf("Enter first number: ");
while (scanf("%f", &first_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!\nPlease enter first number again (such as 2.5) : ");
}
printf("Enter second number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
while (second_number == 0) {
printf("0 is a available number, please enter another number: ");
while (scanf("%f", &second_number) != 1) {
while ((ch = getchar()) != '\n') putchar(ch); //ch是作为一个载体来承担scanf读取错误而留下的数据流;
printf(" is not an number!");
printf(" is not an number!\nPlease enter second number again (such as 2.5) : ");
}
}
printf("%g / %g = %g\n", first_number, second_number, first_number / second_number);
break;
default:
printf("You enter a error selection, please try again!\n");
break;
}
Welcome();
while (getchar() != '\n')continue; //处理掉用户输入数字后留下的换行符
}
printf("Bye~");
return 0;
}
如有错误,欢迎指正,只为更好地学习C语言这一门基础又重要的编程语言~