实验四答案.docx
《实验四答案.docx》由会员分享,可在线阅读,更多相关《实验四答案.docx(19页珍藏版)》请在冰豆网上搜索。
实验四答案
实验四选择结构程序设计答案
编程练习1:
简单if语句的用法
编写并调试程序:
从键盘输入一个任意大小的实数x,如果满足如下条件:
-29.5≤x≤29.5则输出x与其绝对值。
(以simple_if.c文件名保存)
源程序:
#include
#include
voidmain()
{doublex;
printf("请输入一个任意大小的实数x\n");
scanf("%lf",&x);
if(x>=-29.5&&x<=29.5)
printf("x=%lf,|x|=%lf\n",x,fabs(x));
}
编程练习2:
if-else语句的用法
修改练习1的程序,使得x满足-29.5≤x≤29.5时输出x与其绝对值,否则只输出x。
(以if_else.c文件名保存)
源程序:
#include
#include
voidmain()
{doublex;
printf("请输入一个任意大小的实数x\n");
scanf("%lf",&x);
if((x>=-29.5)&&(x<=29.5))
printf("x=%lf,|x|=%lf\n",x,fabs(x));
else
printf("x=%lf\n",x);
}
编程练习3:
if-elseif语句的用法
编写一个能够进行加减法运算的程序,要求:
从键盘任意输入两个实数,然后输入一个运算符,当运算符为“+”时对两个数进行加法运算,为“-”时对两个数进行减法运算,其它符号时,只显示输入的符号不进行运算。
(以if_else_if.c文件名保存)
源程序:
(方法1:
else子句中嵌套if-else结构)
#include
voidmain()
{doublex,y;
charch;
printf("请输入任意两个实数和一个数学运算符(如:
34.5+63.9)\n");
scanf("%lf%c%lf",&x,&ch,&y);
if(ch!
='+'&&ch!
='-')
printf("输入的运算符为%c号,不进行运算\n",ch);
else
if(ch=='+')
printf("输入的运算符为%c号,运算结果是:
%lf+%lf=%lf\n",ch,x,y,x+y);
else
printf("输入的运算符为%c号,运算结果是:
%lf-%lf=%lf\n",ch,x,y,x-y);
}
源程序:
(方法2:
if子句中嵌套if-else结构)
#include
voidmain()
{doublex,y;
charch;
printf("请输入任意两个实数和一个数学运算符(如:
34.5+63.9)\n");
scanf("%lf%c%lf",&x,&ch,&y);
if(ch=='+'||ch=='-')
if(ch=='+')
printf("输入的运算符为%c号,运算结果是:
%lf+%lf=%lf\n",ch,x,y,x+y);
else
printf("输入的运算符为%c号,运算结果是:
%lf-%lf=%lf\n",ch,x,y,x-y);
else
printf("输入的运算符为%c号,不进行运算\n",ch);
}
源程序:
(方法3:
使用switch语句,虽不符合练习要求,但对于此问题的确是一种好方法!
)
#include
voidmain()
{doublex,y;
charch;
printf("请输入任意两个实数和一个数学运算符(如:
34.5+63.9)\n");
scanf("%lf%c%lf",&x,&ch,&y);
switch(ch)
{
case'+':
printf("输入的运算符为%c号,运算结果是:
%lf+%lf=%lf\n",ch,x,y,x+y);break;
case'-':
printf("输入的运算符为%c号,运算结果是:
%lf-%lf=%lf\n",ch,x,y,x-y);break;
default:
printf("输入的运算符为%c号,不进行运算\n",ch);
}
}
编程练习4:
实验教材:
(P7-11:
实验3选择结构程序设计)
二、实验容
第10题
(1)有以下函数:
y=
编程求x=0.5、5、50时y的值。
源程序:
(方法1:
else子句中嵌套if-else结构)
#include
#include
voidmain()
{doublex,y;
printf("请输入分段函数自变量x的值(任意实数)\n");
scanf("%lf",&x);
if(x<1)
y=x;
else
if(x<10)/*或写成if(x>=1&&x<10),两个表达式等价*/
y=3-x/5;
else
y=3*x-11;
printf("自变量x=%lf,函数y=%lf\n",x,y);
}
源程序:
(方法2:
if子句中嵌套if-else结构)
#include
#include
voidmain()
{doublex,y;
printf("请输入分段函数自变量x的值(任意实数)\n");
scanf("%lf",&x);
if(x<10)
if(x<1)
y=x;
else
y=3-x/5;
else
y=3*x-11;
printf("自变量x=%lf,函数y=%lf\n",x,y);
}
源程序:
(方法3:
使用多分支的if-elseif结构)
#include
#include
voidmain()
{doublex,y;
printf("请输入分段函数自变量x的值(任意实数)\n");
scanf("%lf",&x);
if(x<1)
y=x;
elseif(x<10)
y=3-x/5;
else
y=3*x-11;
printf("y=f(%lf)=%lf\n",x,y);
}
注意:
方法1与方法3无本质上的区别。
(2)输入3个实数,编写程序判断能否以它们为边长构成三角形。
若能,则计算机三角形的面积,否则输出提示信息。
源程序:
#include
#include
voidmain()
{doublea,b,c,p;
printf("请任意输入三个实数:
\n");
scanf("%lf%lf%lf",&a,&b,&c);
if((a+b>c)&&(a+c>b)&&(b+c>a))
{
printf("以这三个实数为边长能构成三角形,");
p=(a+b+c)/2;
printf("其面积为%.2lf\n",sqrt(p*(p-a)*(p-b)*(p-c)));
}
else
printf("以这三个实数为边长不能构成三角形\n");
}
(3)输入年、月、日,计算出该日是该年的第几天
源程序:
(方法1)
#include"stdio.h"
main()
{inty,m,d,days;
printf("Pleaseinputdate(yyyy-mm-dd):
\n");
a1:
scanf("%d-%d-%d",&y,&m,&d);
if(y<=0||y>10000||m<=0||m>12||d<=0||d>31)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
if(y%4==0&&y%100!
=0||y%400==0)
{if(m==1)days=d;
if(m==2)days=31+d;
if(m==3)days=31+29+d;
if(m==4)days=31+29+31+d;
if(m==5)days=31+29+31+30+d;
if(m==6)days=31+29+31+30+31+d;
if(m==7)days=31+29+31+30+31+30+d;
if(m==8)days=31+29+31+30+31+30+31+d;
if(m==9)days=31+29+31+30+31+30+31+31+d;
if(m==10)days=31+29+31+30+31+30+31+31+30+d;
if(m==11)days=31+29+31+30+31+30+31+31+30+31+d;
if(m==12)days=31+29+31+30+31+30+31+31+30+31+30+d;}
else
{if(m==1)days=d;
if(m==2)days=31+d;
if(m==3)days=31+28+d;
if(m==4)days=31+28+31+d;
if(m==5)days=31+28+31+30+d;
if(m==6)days=31+28+31+30+31+d;
if(m==7)days=31+28+31+30+31+30+d;
if(m==8)days=31+28+31+30+31+30+31+d;
if(m==9)days=31+28+31+30+31+30+31+31+d;
if(m==10)days=31+28+31+30+31+30+31+31+30+d;
if(m==11)days=31+28+31+30+31+30+31+31+30+31+d;
if(m==12)days=31+28+31+30+31+30+31+31+30+31+30+d;}
printf("\n%d-%d-%disNo.%d.\n",y,m,d,days);
}
源程序:
(方法2)
#include
main()
{
intday,month,year,sum,leap;
printf("Pleaseinputdate(yyyy-mm-dd):
\n");
a1:
scanf("%d-%d-%d",&year,&month,&day);
if(year<=0||year>10000||month<=0||month>12||day<=0||day>31)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
switch(month)/*先计算某月以前月份的总天数*/
{
case1:
sum=0;break;
case2:
sum=31;break;
case3:
sum=59;break;
case4:
sum=90;break;
case5:
sum=120;break;
case6:
sum=151;break;
case7:
sum=181;break;
case8:
sum=212;break;
case9:
sum=243;break;
case10:
sum=273;break;
case11:
sum=304;break;
case12:
sum=334;break;
default:
printf("dataerror");break;
}
sum=sum+day;/*再加上某天的天数*/
if(year%400==0||(year%4==0&&year%100!
=0))/*判断是不是闰年*/
leap=1;
else
leap=0;
if(leap==1&&month>2)/*如果是闰年且月份大于2,总天数应该加一天*/
sum++;
printf("Itisthe%dthday.\n",sum);}
源程序:
(方法3:
需要用到循环语句)
#include"stdio.h"
main()
{inti,y,m,d,days;
printf("Pleaseinputdate(yyyy-mm-dd):
\n");
a1:
scanf("%d-%d-%d",&y,&m,&d);
if(y<0||y>10000||m<0||m>12||d<0||d>31)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
days=d;
if(y%4==0&&y%100!
=0||y%400==0)
for(i=1;iif(i==4||i==6||i==9||i==11)days=days+30;
elseif(i==2)days=days+29;
elsedays=days+31;
else
for(i=1;iif(i==4||i==6||i==9||i==11)days=days+30;
elseif(i==2)days=days+28;
elsedays=days+31;
printf("\n%d-%d-%disNo.%d.\n",y,m,d,days);
}
(4)求解任意的一元二次方程ax2+bx+c=0的根,a,b,c的值由键盘输入(考虑解的各种情况)。
源程序:
#include
#include
voidmain()
{
floata,b,c,p,x1,x2;
printf("请输入一元二次方程的三个系数a,b,c的值:
\n");
scanf("%f%f%f",&a,&b,&c);
p=b*b-4*a*c;
if(p<0)
printf("此方程没有实根!
\n");
elseif(p==0)
printf("此方程有两个相等的实根:
%f和%f\n",-b/(2*a),-b/(2*a));
else
printf("此方程有两个不等的实根:
%f和%f!
\n",(-b+sqrt(p))/(2*a),(-b-sqrt(p))/(2*a));
}
(5)一个3位数,如果它的各位数字之的立方和等于该数本身,则称其为水仙花数。
源程序:
#include
#include
voidmain()
{
intnum,a,b,c;
printf(“请任意输入一个三位正整数\n”);
scanf(“%d”,&num);
a=num/100;
b=num/10%10;
c=num%10;
if(num==pow(a,3)+pow(b,3)+pow(c,3))
printf("%d是水仙花数。
\n",num);
else
printf("%d不是水仙花数。
\n",num);
}
注意:
(1)三位的水仙花数有153、370、371、407
(2)学了循环以后如何编程呢
附加编程题
(1)给出一个不多于3位的正整数,编写程序:
①求出它是几位数。
②分别打印出每一位数字。
③按反序打印出每位数字。
例如:
原数是123,应输出321。
源程序:
(方法1:
使用三个并列的if结构)
#include"stdio.h"
main()
{intn;
printf("请输入一个不多三位的正整数\n");
label:
scanf("%d",&n);
if(n<=0||n>999)
{printf("数据错误!
请重新输入:
");gotolabel;}
if(n>=1&&n<=9)
{
printf("\n此数是一位数,");
printf("个位数字是%d",n);
printf("\n反序数字为%d\n",n);
}
if(10<=n&&n<=99)
{
printf("\n此数是两位数,");
printf("十位数字是%d,",n/10);
printf("个位数字是%d。
",n%10);
printf("\n反序数字为%d%d\n",n%10,n/10);
}
if(100<=n&&n<=999)
{
printf("\n此数是三位数,");
printf("百位数字是%d,",n/100);
printf("十位数字是%d,",n/10%10);
printf("个位数字是%d。
",n%10);
printf("\n反序数字为%d%d%d\n",n%10,n/10%10,n/100);
}
}
源程序:
(方法2:
使用if-elseif结构)
#include"stdio.h"
main()
{intn;
printf("请输入一个不多三位的正整数\n");
label:
scanf("%d",&n);
if(n<=0||n>999)
{printf("数据错误!
请重新输入:
");gotolabel;}
if(n>=1&&n<=9)
{
printf("\n此数是一位数,");
printf("个位数字是%d",n);
printf("\n反序数字为%d\n",n);
}
elseif(n<=99)
{
printf("\n此数是两位数,");
printf("十位数字是%d,",n/10);
printf("个位数字是%d。
",n%10);
printf("\n反序数字为%d%d\n",n%10,n/10);
}
elseif(n<=999)
{
printf("\n此数是三位数,");
printf("百位数字是%d,",n/100);
printf("十位数字是%d,",n/10%10);
printf("个位数字是%d。
",n%10);
printf("\n反序数字为%d%d%d\n",n%10,n/10%10,n/100);
}
}
(2)编程解决与日历有关的问题:
①输入年、月,求该月的天数。
②给出年、月、日,计算出该日是该年的第几天。
如输入2000,3,1,则输出61。
③1990年元旦是星期一,问1900年7月1日是星期几。
①源程序:
#include"stdio.h"
main()
{inty,m,d;
printf("Pleaseinputyear-month:
\n");
a1:
scanf("%d-%d",&y,&m);
if(y<=0||y>10000||m<=0||m>12)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
if(m==2)
if(y%4==0&&y%100!
=0||y%400==0)d=29;
elsed=28;
elseif(m==4||m==6||m==9||m==11)d=30;
elsed=31;
printf("%d-%dis%ddays.\n",y,m,d);
}
②
源程序:
(方法1)
#include"stdio.h"
main()
{inty,m,d,days;
printf("Pleaseinputdate(yyyy-mm-dd):
\n");
a1:
scanf("%d-%d-%d",&y,&m,&d);
if(y<=0||y>10000||m<=0||m>12||d<=0||d>31)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
if(y%4==0&&y%100!
=0||y%400==0)
{if(m==1)days=d;
if(m==2)days=31+d;
if(m==3)days=31+29+d;
if(m==4)days=31+29+31+d;
if(m==5)days=31+29+31+30+d;
if(m==6)days=31+29+31+30+31+d;
if(m==7)days=31+29+31+30+31+30+d;
if(m==8)days=31+29+31+30+31+30+31+d;
if(m==9)days=31+29+31+30+31+30+31+31+d;
if(m==10)days=31+29+31+30+31+30+31+31+30+d;
if(m==11)days=31+29+31+30+31+30+31+31+30+31+d;
if(m==12)days=31+29+31+30+31+30+31+31+30+31+30+d;}
else
{if(m==1)days=d;
if(m==2)days=31+d;
if(m==3)days=31+28+d;
if(m==4)days=31+28+31+d;
if(m==5)days=31+28+31+30+d;
if(m==6)days=31+28+31+30+31+d;
if(m==7)days=31+28+31+30+31+30+d;
if(m==8)days=31+28+31+30+31+30+31+d;
if(m==9)days=31+28+31+30+31+30+31+31+d;
if(m==10)days=31+28+31+30+31+30+31+31+30+d;
if(m==11)days=31+28+31+30+31+30+31+31+30+31+d;
if(m==12)days=31+28+31+30+31+30+31+31+30+31+30+d;}
printf("\n%d-%d-%disNo.%d.\n",y,m,d,days);
}
源程序:
(方法2)
#include
main()
{
intday,month,year,sum,leap;
printf("Pleaseinputdate(yyyy-mm-dd):
\n");
a1:
scanf("%d-%d-%d",&year,&month,&day);
if(year<=0||year>10000||month<=0||month>12||day<=0||day>31)
{printf("dataerror!
pleaseinputagain:
\n");gotoa1;}
switch(month)/*先计算某月以前月份的总天数*/
{
case1:
sum=0;break;
case2:
sum=31;break;
case3:
sum=59;break;
case4:
sum=90;break;
case5:
sum=120;break;
ca