8.8编写一个程序,显示提供加法、减法、乘法的菜单,该程序只接受菜单提供的选项,程序提示用户输入两个数字......
2018-01-04 12:24
1176 查看
#include <stdio.h> char get_choice(void); int check_first_input (void); int check_second_input (void); float add(void); float subtract(void); float multiply(void); float divide(void); int main(void) { char choice; while ((choice = get_choice()) != 'q') { switch(choice) { case 'a': add(); break; case 's': subtract(); break; case 'm': multiply(); break; case 'd': divide(); break; default :printf("please enter the right word.\n");continue; } } printf("done!"); return 0; } char get_choice(void) { char choice; printf("Enter the operation of your choice: \n"); printf("a. add s. subtract \n"); printf("m. multiply d. divide\n"); printf("q. quit\n"); choice = getchar(); while(getchar() !='\n') continue; return choice; } float add(void) { float first_number,second_number; float result; first_number = check_first_input(); second_number = check_second_input(); result = first_number + second_number; printf("%.1f + %.1f = %.1f\n",first_number,second_number,result); return result; } float subtract(void) { float first_number,second_number; float result; first_number = check_first_input(); second_number = check_second_input(); result = first_number - second_number; printf("%.1f - %.1f = %.1f\n",first_number,second_number,result); return result; } float multiply(void) { float first_number,second_number; float result; first_number = check_first_input(); second_number = check_second_input(); result = first_number * second_number; printf("%.1f * %.1f = %.1f\n",first_number,second_number,result); return result; } float divide(void) { float first_number,second_number; float result; first_number = check_first_input(); second_number = check_second_input(); while (second_number == 0) { printf("enter a number other than 0: "); second_number = check_second_input(); } result = first_number / second_number; printf("%.1f / %.1f = %.1f\n",first_number,second_number,result); return result; } int check_first_input (void) { int input; printf("please enter the first number: "); while ((scanf("%d",&input)) == 0) { printf("%s is not an number.\n",input); printf("please enter a number,such as 2.5,-1.78E8,or 3:1"); scanf("%d",&input); } return input; } int check_second_input (void) { int input; printf("please enter the second number: "); while ((scanf("%d",&input)) == 0) { printf("%s is not an number.",input); printf("please enter a number,such as 2.5,-1.78E8,or 3"); scanf("%d",&input); } return input; }
在输入都为数字时候程序可以执行相应的操作,但是有两个问题: 1. 当输入为字母的时候会出错, 2. 在一次输入计算完毕后 在输入时候菜单栏会显示两次 如图:
第一个错误:没有搞懂 函数scanf ,我的想法是scanf(“%d”,choice)当choice输入的不是整数型时候,利用printf的%s来输出字母,这里出错了,对于%d输入的scanf 如果输入的是字符比如a 时候,scanf()将会停在那里,并把a放回输入中,不会把值赋给指定的变量。这样在程序后面如果有%c的字符输入语句将先读取字母a,但是如果程序中只有%d形式的转换说明,则scanf就一直无法越过a读取下一个字符。
修改:
在scanf(“%d”,input)不成功时,利用getchar()来输出非数字字符,这里的getchar()获得是上次input的值,并不是再从键盘获取的值。
第二个:错误出现在于scanf与getchar混用时候的错误,如图在输入22【enter】 1【enter】时候,后面的那个enter 这个换行符留在了输入队列中,而下一次的重新输入m时遇到的是getchar()函数,这就使得getchar()函数先获取【enter】的字符‘\n’,这样就不符合输入出现提示再次重新输入。 那么问题来了 为什么两次获取数字 first_number second_number 都使用了scanf(“%d”),那么为什么前一次获取first_number的操作不会影响到下一次的
seond_number的操作呢? 因为scanf函数在转换格式使用%d 的时候 会自动筛掉回车和空格 , 也就是说 上一次的sanf所留下来的回车字符对下一个sanf没有影响。但是第二次的scanf的回车遇到的是getchar()(如果遇到%c的scanf也一样)这就有影响了。
修改:
在scanf后面的加上 while(getchar() !='\n') continue;
我之前想法是这边的不等于改成等于,但是一旦这样修改那么Enter将会进入while, 那么这个enter键将被使用而不会将输入送入缓存区,这样表现出的就是第二次输入后无法进入程序,如图:
其实这个while的作用并不是为了检测到Enter键的时候进入while(这样就会导致输入无法进入缓存区),而是利用getchar()这个函数将在输入队列中的【Enter】提取出来,这样下一个get_choice中的getchar()函数就不会提取到上一次输入的【Enter】。
修改后的代码:
#include <stdio.h>
char get_choice(void);
int check_first_input (void);
int check_second_input (void);
float add(void);
float subtract(void);
float multiply(void);
float divide(void);
int main(void)
{
char choice;
while ((choice = get_choice()) != 'q')
{
switch(choice)
{
case 'a': add(); break;
case 's': subtract(); break;
case 'm': multiply(); break;
case 'd': divide(); break;
default :printf("please enter the right word.\n");continue;
}
}
printf("done!");
return 0;
}
char get_choice(void)
{
char choice;
printf("Enter the operation of your choice: \n");
printf("a. add s. subtract \n");
printf("m. multiply d. divide\n");
printf("q. quit\n");
choice = getchar();
while(getchar() !='\n')
continue;
return choice;
}
float add(void)
{
float first_number,second_number;
float result;
first_number = check_first_input();
second_number = check_second_input();
result = first_number + second_number;
printf("%.1f + %.1f = %.1f\n",first_number,second_number,result);
return result;
}
float subtract(void)
{
float first_number,second_number;
float result;
first_number = check_first_input();
second_number = check_second_input();
result = first_number - second_number;
printf("%.1f - %.1f = %.1f\n",first_number,second_number,result);
return result;
}
float multiply(void)
{
float first_number,second_number;
float result;
first_number = check_first_input();
second_number = check_second_input();
result = first_number * second_number;
printf("%.1f * %.1f = %.1f\n",first_number,second_number,result);
return result;
}
float divide(void)
{
float first_number,second_number;
float result;
first_number = check_first_input();
second_number = check_second_input();
while (second_number == 0)
{
printf("enter a number other than 0: ");
second_number = check_second_input();
}
result = first_number / second_number;
printf("%.1f / %.1f = %.1f\n",first_number,second_number,result);
return result;
}
int check_first_input (void)
{
int input;
char ch;
printf("please enter the first number: ");
while ((scanf("%d",&input)) == 0)
{
while ((ch = getchar()) != '\n') //这里的getchar()获得是上次input的值,并不是再从键盘获取新的值
putchar(ch);
printf(" is not an number.\n");
printf("please enter a number,such as 2.5,-1.78E8,or 3 : ");
}
while(getchar() !='\n') //我之前想法是这边的不等于改成等于,但是一旦这样修改那么Enter将会进入while
continue; // 那么这个enter键将被使用而不会将输入送入缓存区。
return input;
}
int check_second_input (void)
{
int input;
char ch;
printf("please enter the second number: ");
while ((scanf("%d",&input)) == 0)
{
while ((ch = getchar()) != '\n')
putchar(ch);
printf(" is not an number.");
printf("please enter a number,such as 2.5,-1.78E8,or 3 :");
}
while(getchar() !='\n')
continue;
return input;
}
9ba1
相关文章推荐
- 实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。 例如:输入t
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 使用main函数的参数,实现一个整数计算器,程序可以接受三个参数,第一个参数“-a”选项执行加法,“-s”选项执行减法,“-m”选项执行乘法,“-d”选项执行除法,后面两个参数为操作数。
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- 编写一个程序,用户输入两个数,求其加减乘除,并用消息框显示计算结果。
- 编写一个程序,要求输入两个浮点数,然后打印出用二者的差值除以二者的乘积所得的结果。在用户非数字的输入之前程序循环处理输入值。
- 编写一个程序,对用户输入的任意一组数字字符如{3,1,4,7,2,1,1,2,2},输出其中出现次数最多的字符,并显示其出现次数。如果有多个字符出现次数均为最大且相等,则输出最先出现的那个字符和它出现
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。 程序运行效果如图:
- 编写一个菜单驱动程序的雏形。该程序显示一个提供4个选项的菜单——每个选项用一个字母标记。
- 编写程序,提示用户输入一个整数,然后显示一个金子塔形状的图案
- lesson 9:编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中
- 编写一个应用程序,用户分别从两个文本框输入学术的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。
- 2 编写一个应用程序,用户分别从两个文本框输入学生的姓名和分数,程序按成绩排序将这些学生的姓名和分数显示在一个文本区中。 程序运行效果如图:
- 实现一个简单的菜单程序,运行时显示"Menu:A(dd) D(elete) S(ort) Q(uit),Select one: "提示用户输入。输入A、D、S时分别提示"数据已经增加、删除、排序"