黑马程序员技术交流社区

标题: 已解决,关于scanf函数不能阻断代码运行问题 [打印本页]

作者: 大路朝天    时间: 2015-4-12 15:00
标题: 已解决,关于scanf函数不能阻断代码运行问题
屌丝写法,各位见笑了,这道题得到的启发是:如果一个源代码文件中需要多次从键盘等设备获取同类型内容,比如执行第15行代码获取char型,然后第31行又需要获取char型,那么如果没有第30行代码的清空输入区缓存,第31行是无法从键盘获取内容的,而应该是从缓存区获得了垃圾,从而第31行就达不到scanf函数的阻断效果了(它不会等在那傻等你输入,会直接跳过去,简直当你不存在!)。

  1. /*
  2. 某个自动加油站有 ‘a’,‘b’,‘c’三种汽油品种,单价分别为 6.92,7.37,7.64(元/公升),也提供了“自己加”或“协助加”两个服务等级,这样用户可以得到5%或10%的优惠,请编程序针对用户输入加油量x,汽油品种y和服务类型z(‘f’—自动加,‘m’—自己加,‘e’—协助加),(注:‘f’—自动加无优惠),计算应付款pay。(请用多分支选择switch语句)。
  3. */


  4. #include <stdio.h>

  5. int main(int argc, const char * argv[]) {
  6.    
  7.     //定义变量
  8.     double x,pay=0;
  9.     char a='a',b='b',c='c',z,y,f='f',m='m',e='e';
  10.     //提示用户输入,并接受数据
  11.     printf("请选择油品:'a'(6.92元/公升) 'b'(7.37元/公升) 'c'(7.64元/公升)\n");
  12.     scanf("%c",&y);
  13.     //判断输入合法性
  14.     if (y!='a' && y!='b' && y!='c') {
  15.         printf("你的语文是体育老师教的吧!\n");
  16.         return 0;
  17.     }else {
  18.         printf("请输入您要加的油量(公升):\n");
  19.         scanf("%lf",&x);
  20.         
  21.         //判断输入合法性
  22.         if (x<=0) {
  23.             printf("你个逗比,还能不能愉快的玩耍了!\n");
  24.             return 0;
  25.         }else {
  26.             printf("请选择服务等级:\n'f'—自动加(无优惠)'m'—自己加(优惠5%)'e'—协助加(优惠10%)\n");
  27.             rewind(stdin);
  28.             scanf("%c",&z);
  29.             //printf("输入内容是%c\n",z);
  30.             //z=f;
  31.             //判断输入合法性
  32.             if (z!='f' && z!='m' && z!='e') {
  33.                 printf("你真的是个逗比,不和你玩了!\n");
  34.                 return 0;
  35.             }else {
  36.                 if (y=='a'&&z=='f') {
  37.                     pay=6.92*x;
  38.                 }else if(y=='a'&&z=='m'){
  39.                     pay=6.92*x*0.05;
  40.                 }
  41.                 else if(y=='a'&&z=='e'){
  42.                     pay=6.92*x*0.1;
  43.                 }
  44.                 else if(y=='b'&&z=='f'){
  45.                     pay=7.37*x;
  46.                 }
  47.                 else if(y=='b'&&z=='m'){
  48.                     pay=7.37*x*0.05;
  49.                 }
  50.                 else if(y=='b'&&z=='e'){
  51.                     pay=7.37*x*0.1;
  52.                 }
  53.                 else if(y=='c'&&z=='f'){
  54.                     pay=7.64*x;
  55.                 }
  56.                 else if(y=='c'&&z=='m'){
  57.                     pay=7.64*x*0.05;
  58.                 }
  59.                 else if(y=='c'&&z=='e'){
  60.                     pay=7.64*x*0.1;
  61.                 }
  62.                 printf("您选择的是油品:%c,油量:%f(公升),服务等级:%c\n总费用是:%f\n",y,x,z,pay);
  63.             }
  64.     }
  65.    
  66.    
  67.    
  68.    
  69. }
  70.     return 0;
  71. }
复制代码

作者: 365616804    时间: 2015-4-12 15:02
对的 我也写出来了
作者: 大路朝天    时间: 2015-4-12 15:03
365616804 发表于 2015-4-12 15:02
对的 我也写出来了

你也遇到同样的问题了?
作者: Theshy    时间: 2015-4-12 16:01
这题不是要求用switch语句吗。。

作者: guyinghua901018    时间: 2015-4-12 16:54
我咋觉得这段时间发技术贴的都是咱班的
作者: 大路朝天    时间: 2015-4-12 19:38
Theshy 发表于 2015-4-12 16:01
这题不是要求用switch语句吗。。

两种都用
作者: 大路朝天    时间: 2015-4-12 19:39
guyinghua901018 发表于 2015-4-12 16:54
我咋觉得这段时间发技术贴的都是咱班的

都是为了那点黑马币,话说你这分够了,可以送我点黑马币。
作者: guyinghua901018    时间: 2015-4-12 19:50
大路朝天 发表于 2015-4-12 19:39
都是为了那点黑马币,话说你这分够了,可以送我点黑马币。

报上姓名.一组的还在排队
作者: kaiyan1208    时间: 2015-4-12 21:40
写得好  学习学习了
作者: bieny    时间: 2015-4-12 21:46
:loveliness:
作者: 365616804    时间: 2015-4-12 22:05
// 某个自动加油站有 ‘a’,‘b’,‘c’三种汽油品种,单价分别为 6.92,7.37,7.64(元/公升),也提供了“自己加”或“协助加”两个服务等级,这样用户可以得到5%或10%的优惠,请编程序针对用户输入加油量x,汽油品种y和服务类型z(‘f’—自动加,‘m’—自己加,‘e’—协助加),(注:‘f’—自动加无优惠),计算应付款pay。(请用多分支选择switch语句)。


#include <stdio.h>


int  main(){

  //定义加油量x,加油品种y,服务类型z,油品单价m,服务价n,总体费用pay
    float x,m,n,pay;
    x=m=n=pay=0.0;
    char y,z;

    //提示用户选择加油量x,汽油品种y和服务类型z
    printf("1请输入加油量()升\n");
    scanf("%f",&x);
    printf("2请输入加油品种(a=6.92/元,b=7.37/元,c=7.64/元)\n");
    scanf("%*c%c",&y);

    printf("3请输入服务类型(f-自动加,m—自己加,e—协助加)\n");
    scanf("%*c%c",&z);
   
   
    //分析与流程
    switch (y) {
   
     case 'a':
        m=6.92;
        break;
     case 'b':
        m=7.37;
        break;
     case 'c':
        m=7.64;
        break;
    }
   
    switch (z){
   
     case 'f':
            n=0;
            break;
     case 'm':
            n=0.05;
            break;
    case 'z':
            n=0.1;
            break;
   
    }
    //计算
    pay=x*m-(x*m*n);
   
    //printf ("请输入加油量%f\n",x);
   // printf("你选择加油级别%c\n",y);
   // printf("你择服务类型%c\n",z);
    printf("你的加油总体费用是:%.2f元\n",pay);
   
  return 0;  
}
作者: 365616804    时间: 2015-4-12 22:07
我这样写也可以啊
作者: 蓝鸟    时间: 2015-4-12 22:19
除了用scanf还能用别的吗?求解
作者: 大路朝天    时间: 2015-4-12 22:46
guyinghua901018 发表于 2015-4-12 19:50
报上姓名.一组的还在排队

四组的飘过
作者: 大路朝天    时间: 2015-4-12 22:49
365616804 发表于 2015-4-12 22:05
// 某个自动加油站有 ‘a’,‘b’,‘c’三种汽油品种,单价分别为 6.92,7.37,7.64(元/公升),也提供了 ...

高手,报上姓名
作者: 大路朝天    时间: 2015-4-12 22:50
蓝鸟 发表于 2015-4-12 22:19
除了用scanf还能用别的吗?求解

貌似还有个getchar可以获得字符
作者: 举举手    时间: 2015-4-12 22:52
赞又涨姿势了
作者: 大路朝天    时间: 2015-4-12 22:53
365616804 发表于 2015-4-12 22:05
// 某个自动加油站有 ‘a’,‘b’,‘c’三种汽油品种,单价分别为 6.92,7.37,7.64(元/公升),也提供了 ...

你这是大神写法,我的是屌丝写法

作者: 鹏jiqing    时间: 2015-4-12 23:30
好帖,赞一个
作者: guyinghua901018    时间: 2015-4-12 23:34
大路朝天 发表于 2015-4-12 22:46
四组的飘过

你都23个了,马上就够啦.    你这都属于高富帅了,就给屌丝们留条活路,别要了啊
作者: 康仔    时间: 2015-4-13 21:45
大神!!!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2