A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wslinke 中级黑马   /  2015-4-12 19:57  /  1949 人查看  /  6 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 wslinke 于 2015-4-12 23:51 编辑

看到很多人都在问这道题,我也写了个方案,分享一下


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


  1. #include <stdio.h>
  2. #define kPriceA 6.92 //(元/公升)
  3. #define kPriceB 7.37
  4. #define kPriceC 7.67
  5. //服务类型折扣
  6. #define kDiscount1 0.05
  7. #define kDiscount2 0.1
  8. int main(int argc, const char * argv[]) {
  9.     double x,priceOfPetrol,discount,pay;
  10.     char z,y;
  11.     printf("请输入要添加的汽油量,按回车提交\n");
  12.     //输入汽油量,输入错误则报错退出
  13.     if (scanf("%lf",&x) != 1)
  14.     {
  15.         printf("输入有误!\n");
  16.         return 1;
  17.     }
  18.     //清空缓冲区
  19.     while(getchar()!='\n')continue;
  20.     printf("请输入汽油品种(a或b或c),按回车提交\n");
  21.     //输入汽油品种,输入错误则报错退出
  22.     if (scanf("%c",&y) != 1 || '\n' == y)
  23.     {
  24.         printf("汽油品种输入有误,程序结束!\n");
  25.         return 1;
  26.     }
  27.     //清空缓冲区
  28.     while(getchar()!='\n')continue;
  29.     //进入汽油品种判断
  30.     switch (y) {
  31.         case 'a':
  32.             priceOfPetrol = kPriceA;
  33.             break;
  34.         case 'b':
  35.             priceOfPetrol = kPriceB;
  36.             break;
  37.         case 'c':
  38.             priceOfPetrol = kPriceC;
  39.             break;
  40.          //输入有误,退出
  41.         default:
  42.         {
  43.             printf("汽油品种输入有误,程序结束");
  44.             return 1;
  45.         }
  46.             break;
  47.     }
  48.    
  49.     printf("请输入服务类型(f或m或e),按回车提交\n");
  50.     //输入服务类型,输入错误则报错退出
  51.     if (scanf("%c",&z)!=1|| '\n' == z)
  52.     {
  53.         printf("服务类型输入有误,程序结束!\n");
  54.         return 2;
  55.     }
  56.     //进入服务类型判断
  57.     switch (z) {
  58.         case 'f':
  59.             discount = 0.0;
  60.             break;
  61.         case 'm':
  62.             discount = kDiscount1;
  63.             break;
  64.         case 'e':
  65.             discount = kDiscount2;
  66.             break;
  67.         default:
  68.         {
  69.             printf("服务类型输入有误,程序结束!\n");
  70.             return 2;
  71.         }
  72.             break;
  73.     }
  74.     //清空缓冲区
  75.     while(getchar()!='\n')continue;
  76.     //计算最终结果
  77.     pay = x*priceOfPetrol*(1-discount);
  78.     printf("您一共需要支付%lf元.\n",pay);
  79.    
  80. }
复制代码
大家都觉得太长.. 我就删了过滤输入的代码
  1. #include <stdio.h>
  2. #define kPriceA 6.92 //(元/公升)
  3. #define kPriceB 7.37
  4. #define kPriceC 7.67
  5. //服务类型折扣
  6. #define kDiscount1 0.05
  7. #define kDiscount2 0.1
  8. int main(int argc, const char * argv[]) {
  9.    
  10.     double x,priceOfPetrol,discount,pay; //加油量,油的单价,折扣值,最终付款值
  11.     char z,y;//服务类型,汽油品种
  12.     printf("请输入要添加的汽油量,按回车提交\n");
  13.     //输入汽油量
  14.     scanf("%lf",&x);
  15.     //清空缓冲区
  16.     while(getchar()!='\n')continue;
  17.    
  18.     printf("请输入汽油品种(a或b或c),按回车提交\n");
  19.     //输入汽油品种
  20.     scanf("%c",&y);
  21.     //清空缓冲区
  22.     while(getchar()!='\n')continue;
  23.    
  24.     //进入汽油品种判断
  25.     switch (y) {
  26.         case 'a':
  27.             priceOfPetrol = kPriceA;
  28.             break;
  29.         case 'b':
  30.             priceOfPetrol = kPriceB;
  31.             break;
  32.         case 'c':
  33.             priceOfPetrol = kPriceC;
  34.             break;
  35.          //输入有误,退出
  36.         default:
  37.             return 1;
  38.     }
  39.    
  40.     printf("请输入服务类型(f或m或e),按回车提交\n");
  41.     //输入服务类型
  42.     scanf("%c",&z);
  43.     //进入服务类型判断
  44.     switch (z) {
  45.         case 'f':
  46.             discount = 0.0;
  47.             break;
  48.         case 'm':
  49.             discount = kDiscount1;
  50.             break;
  51.         case 'e':
  52.             discount = kDiscount2;
  53.             break;
  54.         default:
  55.             return 2;
  56.             break;
  57.     }

  58.     //计算最终结果
  59.     pay = x*priceOfPetrol*(1-discount);
  60.     printf("您一共需要支付%lf元.\n",pay);
  61.    
  62. }
复制代码


评分

参与人数 1技术分 +2 收起 理由
Micro + 2 很给力!

查看全部评分

6 个回复

正序浏览
这个代码的可读性,真是有点那个,希望楼主优化下!
回复 使用道具 举报
好长,我都没想出来怎么做呢
回复 使用道具 举报
哥们,看的好累啊,能不能优化一下啊
回复 使用道具 举报
#include <stdio.h>  int main(int argc, const char * argv[]) {     // 定义4个变量,一个是选择加油方式,一个是汽油品种,一个是加油量,一个是应付的钱     float x = 0.0f,pay = 0.0f;     char z ,y ;     //提示客户选择加油方式     printf("请选择加油方式,f 是自动加、m 是自己加、e 是协助加:\n");     //提示客户选择汽油品种     printf("请选择汽油品种,a类汽油、b类汽油、c类汽油:\n");     scanf("%c,%c",&z,&y);     //提示用户输入加油量     printf("请输入加油量:");     scanf("%f",&x);     switch (y) {         case 'a':             switch (z) {                 case 'f':                     pay = 6.92*x;                     break;                 case 'm':                     pay = 6.92*x*0.95;                     break;                 default:                     pay = 6.92*x*0.90;                     break;             }             break;         case 'b':             switch (z) {                 case 'f':                     pay = 7.37*x;                     break;                 case 'm':                     pay = 7.37*x*0.95;                     break;                 default:                     pay = 7.37*x*0.90;                     break;             }             break;         default:             switch (z) {                 case 'f':                     pay = 7.64*x;                     break;                 case 'm':                     pay = 7.64*x*0.95;                     break;                 default:                     pay = 7.64*x*0.90;                     break;              break;     }             break;     }     printf("应付:%.2f",pay);     return 0; }
回复 使用道具 举报
guanguan0622 发表于 2015-4-12 19:59
我累个去,看得我累死了!能不能在优化下!

:L去掉注释和筛选输入错误的语句 就剩下几句代码了啊
回复 使用道具 举报
我累个去,看得我累死了!能不能在优化下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马