实验4分支结构程序设计.docx
《实验4分支结构程序设计.docx》由会员分享,可在线阅读,更多相关《实验4分支结构程序设计.docx(14页珍藏版)》请在冰豆网上搜索。
实验4分支结构程序设计
学号
班级
1.练习题一
编写程序,计算练习一分段函数的值。
(1)用scanf函数输入x的值。
(2)运行程序时,分别按x的值小于0、x的值在0-15之间、x的值大于15三种情况输入数据,检查输出的y值是否正确。
#include<>
intk=1;voidtest();//程序是否继续
voidmain()
{
while(k==1)
{
intx,y,c;
printf("Inputx:
");
scanf("%d",&x);
while((c=getchar())!
='\n'&&c!
=EOF);
if(x<0)
{
y=x+10;
printf("x=%d,y=x+10=%d\n",x,y);
}
elseif(x<15)
{
y=3*x+5;
printf("x=%d,y=3*x+5=%d\n",x,y);
}
else
{
y=2*x-10;
printf("x=%d,y=2*x-10=%d\n",x,y);
}test();
}
}
voidtest()
{charc;
printf("Testagain?
y/n\n");
if((c=getchar())=='n'||c=='N')//只有当输入N或n时才终止程序
k=0;
}
运行结果截图:
思考题及问题:
判断x的值在0-15之间可否使用表达式“0<=x<15”?
为什么?
正确的表示方法是什么?
答案:
不可。
因为一个条件判断表达式中最多只能有一个运算符。
正确的表示方法是x>=0&&x<15.
2.练习题二
输入3个数字,判断他们是否能构成三角形,如果不能,输出提示信息;否则判断它是直角、等边、等腰还是普通三角形。
#include<>
intk=1;voidtest();
voidmain()
{
while(k==1)
{
inta,b,c,d;
printf("Inputa,b,c:
");
scanf("%d,%d,%d",&a,&b,&c);
while((d=getchar())!
='\n'&&c!
=EOF);//清空输入缓存区
if(!
(a>0&&b>0&&c>0&&a+b>c&&a+c>b&&b+c>a))
printf("三条边无法构成三角形。
\n");
else
if(a*a+b*b==c*c||a*a==b*b+c*c||b*b==a*a+c*c)
printf("这是一个直角三角形\n");
elseif(a==b&&b==c)
printf("这是一个等边三角形\n");
elseif(a==b||b==c||a==c)
printf("这是一个等腰三角形\n");
else
printf("这是一个普通三角形\n");
test();
}
}
voidtest()
{charc;
printf("Testagain?
y/n:
");
if((c=getchar())=='n'||c=='N')//只有当输入N或n时才终止程序
k=0;
}
运行结果截图:
思考题及问题:
判断三角形的类型时需要用到各种判断条件,入等边三角形的判断条件是3条边相等,该判断条件可否描述为“a=b=c”?
为什么?
答案:
不能,“=”在C语言中是赋值符号,在条件判断式中是一个永真式,会引起语义错误。
1.练习题三
编写一个程序,输出给定的某年某月的天数。
要求:
采用switch语句实现。
程序代码:
#include<>
voidmain()
{
intyear,mon,days,leap;
printf("年.月:
");
scanf("%4d.%2d",&year,&mon);
switch(mon)
{
case1:
case3:
case5:
case7:
case8:
case10:
case12:
days=31;break;
case4:
case6:
case9:
case11:
days=30;break;
case2:
if(year%4==0&&year%100!
=0||year%400==0)
leap=1;
else
leap=0;
if(leap)
days=29;
else
days=28;
}
printf("%d年%d月的天数为%d天\n",year,mon,days);
}
运行结果截图:
思考题及问题:
1本程序所给代码中的switch语句没有default语句可以吗?
default语句应该在switch语句的什么位置?
可以。
Default语句可以在{}之间的任意位置。
2本程序所给代码中的最后一个case语句中,没有break正确吗?
请解释。
正确。
在switch语句中,当找到符合条件的case时,执行该case语句及之后的其他情况的语句,故C语言会在case语句和default语句后加break;防止执行下面的语句。
而最后一个case语句后无其他语句,故没有break语句也正确。
1.自测练习一
编写程序,计算逻辑表达式的值。
假设inta=0,b=1,c=1,d=3;
(1)表达式a*b&&c-d、c-d&&a*b是多少?
为什么?
程序代码:
#include<>
voidmain()
{
inta=0,b=1,c=1,d=3;
printf("%d,%d",a*b&&c-d,c-d&&a*b);
}
运行结果截图及原因:
a*b=0,逻辑假,由于与运算的短路性,&&右边的表达式不进行,直接为0;
c-d=-2,逻辑真,为1,故第二个运算式为1&&0=0.
(2)表达式—a||++b&&--c的值是多少?
变量a、b、c的值分别是多少?
为什么?
程序代码:
#include<>
voidmain()
{
inta=0,b=1,c=1,d=3;
printf("%d\n",-a||++b&&--c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
运行结果截图及原因:
++b即b的值为2,是真值1,--c值即c的值为0,假值0。
-a即a的值为0,假值0.
故结果为0||1&&0=1&&0=0,
(3)表达式++b&&--c||--a的值是多少?
变量a、b、c的值分别是多少?
为什么?
程序代码:
#include<>
voidmain()
{
inta=0,b=1,c=1,d=3;
printf("++b&&--c||--a=%d\n",++b&&--c||--a);
printf("a=%d,b=%d,c=%d",a,b,c);
}
运行结果截图及原因:
++b即b的值为2,是真值1,--c值即c的值为0,假值0。
--a即a的值为-1,真值1.
故结果为1&&0||1=1,
2.自测练习二
设整型变量a、b、c分别存放从键盘输入的3个整数。
编写C程序,按从大到小排列这3个数,使a成为最大值,c成为最小值,并且按序输出这3个数。
源程序代码:
#include<>
voidmain()
{
inta[3]={0},t,j,i,k;
for(i=0;i<=2;i++)
{
printf("Input%c:
",i+97);
scanf("%d",&a[i]);
}
for(j=0;j<=2;j++)//冒泡法
{
for(i=0;i<=2-j;i++)
if(a[i]t=a[i],a[i]=a[i+1],a[i+1]=t;
}
printf("a=%d,b=%d,c=%d\n",a[0],a[1],a[2]);
}
运行结果截图:
3.自测练习三
从键盘输入一个小于六位的正整数,判断它是几位数,并按照相反的顺序输出各位上的数字,例如输入1234,输出为4321。
源程序代码:
#include<>
#include
voidmain()
{
inti=4,a[6]={0},k=0;
printf(“请输入一个小于六位的正整数:
");
scanf("%d",&a[5]);
while(a[5]<(int)pow(10,i))//判断输入数据的位数
i--;
k=i+1;
printf("它是%d位数",k);
a[i+1]=a[5];
for(;i>=1;i--)
{
a[i]=a[i+1]%(int)pow(10,i);
a[i+1]=a[i+1]/(int)pow(10,i);
}
for(i=1;i<=k;i++)//倒序输出
printf("%d",a[i]);
printf("\n");
}
运行结果截图:
4.自测练习四
假设今天是星期日,编写一个程序,求n〔n由键盘输入〕天后是星期几。
源程序代码:
#include<>
voidmain()
{
intn,t;
printf("假设今天是星期日,求n天后是星期几\n输入n=");
scanf("%d",&n);
t=n%7;
switch(t)
{
case0:
printf("n天后还是星期日\n");break;
case1:
printf("n天后是星期一\n");break;
case2:
printf("n天后是星期二\n");break;
case3:
printf("n天后是星期三\n");break;
case4:
printf("n天后是星期四\n");break;
case5:
printf("n天后是星期五\n");break;
case6:
printf("n天后是星期六\n");
}
}
运行结果截图:
5.自测练习五
假定向香港邮寄包裹的收费规则如下:
首先,包裹重量向上取整到最近的15g的倍数,然后按书上表格收费,编写一个程序根据用户输入的包裹的重量和里程计算邮费。
包裹邮费计算表
重量〔g〕
收费〔元〕
15
5
30
9
45
12
60
14〔每足1000km加1元〕
75及以上
15〔每足1000km加2元〕
源程序代码:
#include<>
intk=1,c=0;//全局变量
voidtest()
{
printf("Testagain?
y/n:
");
if((c=getchar())=='n'||c=='N')//只有当输入N或n时才终止程序
k=0;
}
voidmain()
{
while(k==1)
{
intm,s;
printf("请输入包裹重量(g)");
scanf("%d",&m);
printf("请输入里程数(km)");
scanf("%d",&s);
while((c=getchar())!
='\n'&&c!
=EOF);//清空输入缓存区
if(m%15!
=0)m=(m/15+1)*15;//取m为15的倍数
s/=1000;
printf("收费:
");
if(m<=15)printf("5元");
elseif(m<=30)printf("9元");
elseif(m<=45)printf("12元");
elseif(m<=60)printf("%d元",14+s);
elseprintf("%d元",15+2*s);
printf("\n");
test();
}
}
运行结果截图: