switch选择结构中,不论输入什么default后的语句总是执行,代码如下

zys60233 2015-09-16 05:43:35
//========计算5年本息和=========

# include <stdio.h>

int main()
{ //用户本息和计算程序

double sunA(void); //一次存5年
double sunB(void); //先存2年,再存3年
double sunC(void); //先存3年,再存2年
double sunD(void); //连续存5次1年期
double sunE(void); //活期存储
char c; //存放用户的选择
double M;
int i;
printf ("A:一次存5年期;\n");
printf ("B:先存2年期,到期后将本息再存3年期;\n");
printf ("C:先存3年期,到期后将本息再存2年期;\n");
printf ("D:存1年期,到期后将本息再存1年期,连续存5年;\n");
printf ("E:存活期存款。\n");
printf ("F:结束。\n");
printf ("请选择要进行的计算,输入选项前的代号:\n");
for (i=0;i<1000;i++)
{ //通过用户的选择进行相应的计算
c=getchar();
switch (c)
{
case'A':M=sunA();printf ("到期后的本息和为:%f\n",M);break;
case'B':M=sunB();printf ("到期后的本息和为:%f\n",M);break;
case'C':M=sunC();printf ("到期后的本息和为:%f\n",M);break;
case'D':M=sunD();printf ("到期后的本息和为:%f\n",M);break;
case'E':M=sunE();printf ("到期后的本息和为:%f\n",M);break;
case'F':i=1001;break;
default: printf ("请输入代号!\n");
}
}
return 0;
}


//=========sunA()=======
double sunA(void)
{ //一次存5年
double P;
P=1000*(1+0.0585);
return P;
}

//========sunB()=======
double sunB(void)
{ //先存2年,再存3年
double P;
P=1000*(1+2*0.0468);
P=P*(1+3*0.054);
return P;
}

//=======sunC()========
double sunC(void)
{ //先存3年,再存2年
double P;
P=1000*(1+3*0.054);
P=P*(1+2*0.0468);
return P;
}

//=======sunD()=======
double sunD(void)
{ //连续存5年
double P;
int i;
double k=1;
for (i=0;i<=4;i++)
{ //计算5年1年期的利润率
k=k*(1+0.0414);
}
P=1000*k;
return P;
}

//=======sunE()========
double sunE(void)
{ //活期存储
double P;
int i;
double k=1;
for (i=0;i<=20;i++)
{ //计算活期的利率
k=k*(1+0.0072/4);
}
P=1000*k;
return P;
}



...全文
1270 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
苏叔叔 2015-09-17
  • 打赏
  • 举报
回复
修改:

rewind(stdin);
c = getchar();
zys60233 2015-09-17
  • 打赏
  • 举报
回复
问题已经解决了,确实是有一个换行符留在了缓冲区
xiaobicai 2015-09-17
  • 打赏
  • 举报
回复
不太明白你的目的究竟是想干什么,你需要明确的说出来,才好为你解决问题。 我根据你的描述,大概猜测,你的目的是想在屏幕上出现提示:“请输入代号!”,那么, 就把这句:printf ("请输入代号!\n"); 放在c=getchar();这句的前面就可以了。 因为,每个case语句后边都有break,会被中断,从而跳出switch语句,只有当所有的case语句 都没有被执行,default语句才能被执行,否则,只要由一个case语句被执行,执行完后,立马就 跳出了switch{}了,不会再执行default了,所以,解决办法就是把printf ("请输入代号!\n"); 放在c=getchar();这句的前面。 不知上面的分析是否是你需要的。
lovemengmeng201314 2015-09-17
  • 打赏
  • 举报
回复
输入字符后,有个回车留在输入缓冲了,清除掉或者做下判断
zys60233 2015-09-16
  • 打赏
  • 举报
回复
引用 6 楼 赵4老师的回复:
 default: printf ("您输入了'\\x%02x‘,请输入代号!\n",(unsigned char)c);
能否解释一下你加的东西是干什么的,本人属于c语言刚入门阶段
zys60233 2015-09-16
  • 打赏
  • 举报
回复
引用 7 楼 qq_30446977的回复:
我看了你的代码,我觉得你说的问题出在了你的循环上。 第一次你输入一个值,被getchar()读取。但是有一个回车留在了输入流上。你的for继续循环,getchar()读取了回车,然后进行下面的程序,肯定会执行default。 在循环中一开始地方加一个fflush(stdin)应该就可以了。 你可以试试。
我看了你的代码,我觉得你说的问题出在了你的循环上。 第一次你输入一个值,被getchar()读取。但是有一个回车留在了输入流上。你的for继续循环,getchar()读取了回车,然后进行下面的程序,肯定会执行default。 在循环中一开始地方加一个fflush(stdin)应该就可以了。 你可以试试。[/quote] 再问一下,fflush(stdin)这个是干什么用的?
qq_30446977 2015-09-16
  • 打赏
  • 举报
回复
我看了你的代码,我觉得你说的问题出在了你的循环上。 第一次你输入一个值,被getchar()读取。但是有一个回车留在了输入流上。你的for继续循环,getchar()读取了回车,然后进行下面的程序,肯定会执行default。 在循环中一开始地方加一个fflush(stdin)应该就可以了。 你可以试试。
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
 default: printf ("您输入了'\\x%02x‘,请输入代号!\n",(unsigned char)c);
zys60233 2015-09-16
  • 打赏
  • 举报
回复
引用 2 楼 mujiok2003 的回复:
getchar()的返回值类型为int, 用char去接收, 数据可能被截断。 你的问题是什么?
如果我想用char型来接收getchar(),该怎么做?我的问题是default后的语句不论我输入哪个字符,都会执行
zys60233 2015-09-16
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
 default: printf ("您输入了'\x%02x‘,请输入代号!\n",(unsigned char)c);
我用VC++6.0,编译后出现error C2153: hex constants must have at least one hex digit 怎么解决
NexTor 2015-09-16
  • 打赏
  • 举报
回复
用赵老师的方法把default的情况打印出来看看,不就知道为什么
mujiok2003 2015-09-16
  • 打赏
  • 举报
回复
getchar()的返回值类型为int, 用char去接收, 数据可能被截断。 你的问题是什么?
赵4老师 2015-09-16
  • 打赏
  • 举报
回复
 default: printf ("您输入了'\x%02x‘,请输入代号!\n",(unsigned char)c);

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧