《C Prime Plus》第八章编程练习最后一题笔记

214 阅读5分钟

C prime plus 第八章编程练习第八题

题目:编写一个程序,显示一个提供加法、减法、乘法、除法的菜单。获得用户选择的选项后,程序提示用户输入两个数字,然后执行用户刚才选择的操作。该程序只接受菜单提供的选项。程序使用float类型的变量存储用户输入的数字,如果用户输入失败,则允许再次输入。进行除法运算时,如果用户输入0作为第二个数,程序应该提示用户重新输入一个新值。

题目分析:

  1. 欢迎页即是菜单,需要保持一定程度的文字内容的整齐。这里可以使用一个函数来负责欢迎页菜单的显示
  2. 获取用户选择的选项,应该使用getchar()获取用户的输入,并且只允许接收菜单选项的字符作为首字母,要注意处理掉用户输入的首字母之后的内容特别是换行符
  3. 接收到用户的选项后,应该用switch分支来处理用户选项。
  4. 提示用户输入要进行计算的两个数字,应该使用scanf()来获取用户输入,并对用户输入错误类型数据和用户输入时留下的换行符进行处理。
  5. 对于除法,要注意用户第二个数字输入为0时,应该提醒用户重新输入。

结构化代码:

  1. 欢迎页菜单
void Welcome() {
    printf("\nEnter the operation of your choice:\n");
    printf("a. add                   s.subtract\n");
    printf("m. multiply                d.divide\nq. quit\n");
}
  1. 获取用户选择的选项,只接受首字母并处理换行符;如果用户输入的是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);
  1. 对于除法,要特别处理一下,如果用户输入第二数字而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语言这一门基础又重要的编程语言~