实验五嵌套结构1.docx
《实验五嵌套结构1.docx》由会员分享,可在线阅读,更多相关《实验五嵌套结构1.docx(19页珍藏版)》请在冰豆网上搜索。
![实验五嵌套结构1.docx](https://file1.bdocx.com/fileroot1/2023-1/22/75ef4f9c-55c1-4470-a108-67b174cb6637/75ef4f9c-55c1-4470-a108-67b174cb66371.gif)
实验五嵌套结构1
实验五复合嵌套结构
(1)理解嵌套结构的形成方法,学习自顶向下,逐步细化的算法设计方法
(2)熟悉循环嵌套结构、复合嵌套结构
(3)学习嵌套结构的典型算法
任务一改错(error02_01.cpp)
打开程序error02_01.cpp改正程序中的错误,判断一个数是否是素数。
素数就是只能被1和自身整除的正整数,1不是素数,2是素数。
#include
#include
intmain(void)
{
intcount,i,m;
printf("number:
");
scanf("%d",&m);
for(i=2;i<=m;i++)
if(m%i==0)printf("%d不是素数\n",m);
elseprintf("%d是素数\n",m);
printf("\n");
return0;
}
改错后的源程序:
#include
#include
intmain(void)
{
intcount,i,m,n;
printf("number:
");
scanf("%d",&m);
n=sqrt(float(m));
for(i=2;i<=n;i++)
if(m%i==0)
break;
if(i<=n)
printf("%d不?
是º?
素?
数ºy\n",m);
else
printf("%d是º?
素?
数ºy\n",m);
printf("\n");
getchar();
getchar();
return0;
}
任务二 掌握使用if…else语句(ex5_1.cpp)
题目要求
打开程序文件ex02_01.cpp,修改下面程序中的4个子函数中的代码 ,能按每一部分的要求得出相应的输出。
修改只限于增加圆括号(是花括号吧?
),和代码的缩进方式。
当然代码的缩进方式对程序的执行没有影响,但可增加代码的可读性。
(也可能什么修改也不要做)。
#include
voidpaint_1(intx,inty);
voidpaint_2(intx,inty);
voidpaint_3(intx,inty);
voidpaint_4(intx,inty)
voidmain()
{
intx,y;
x=5,y=8;
paint_1(x,y);
paint_2(x,y);
paint_3(x,y);
y=7;
paint_4(x,y);
}
voidpaint_1(intx,inty)
{
printf("\nsection1:
\n");
if(y==8)
if(x==5)
printf("@@@@@\n");
else
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
voidpaint_2(intx,inty)
{
printf("\nsection2:
\n");
if(y==8)
if(x==5)
printf("@@@@@\n");
else
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
voidpaint_3(intx,inty)
{
printf("\nsection3:
\n");
if(y==8)
if(x==5)
printf("@@@@@\n");
else
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
voidpaint_4(intx,inty)
{
printf("\nsection4:
\n");
if(y==8)
if(x==5)
printf("@@@@@\n");
else
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
Section1:
假定x=5,y=8,输出为:
Section2:
假定x=5,y=8,输出为:
Section3:
假定x=5,y=8,输出为:
Section4:
假定x=5,y=7,输出为:
修改后的源程序:
voidpaint_3(intx,inty);
voidpaint_4(intx,inty);
voidmain()
{
intx,y;
x=5,y=8;
paint_1(x,y);
paint_2(x,y);
paint_3(x,y);
y=7;
paint_4(x,y);
getchar();
getchar();
}
voidpaint_1(intx,inty)
{
printf("\nsection1:
\n");
if(y==8)
{
if(x==5)
printf("@@@@@\n");
}
else
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
voidpaint_2(intx,inty)
{
printf("\nsection2:
\n");
if(y==8)
{
if(x==5)
printf("@@@@@\n");
}
else
{
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
}
voidpaint_3(intx,inty)
{
printf("\nsection3:
\n");
if(y==8)
{
if(x==5)
printf("@@@@@\n");
else
{
printf("#####\n");
printf("$$$$$\n");
}
}
printf("&&&&&\n");
}
voidpaint_4(intx,inty)
{
printf("\nsection4:
\n");
if(y==8)
{
if(x==5)
printf("@@@@@\n");
}
else
{
printf("#####\n");
printf("$$$$$\n");
printf("&&&&&\n");
}
}
任务三编程身高预测(ex5_2.cpp)
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。
小孩成人后的身高与其父母的身高和自身的性别密切相关。
设faHeight为其父身高,moHeight为其母身高,身高预测公式为
男性成人时身高=(faHeight+moHeight)×0.54cm
女性成人时身高=(faHeight×0.923+moHeight)/2cm
此外,如果喜爱体育锻炼,那么可增加身高2%;如果有良好的卫生饮食习惯,那么可增加身高1.5%。
编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好),利用给定公式和身高预测方法对身高进行预测。
源程序清单:
#include
voidmain()
{
doublefaHeight,moHeight,height;
charsex,sports,diet;
printf("Pleaseenterthesex(ForM):
");
scanf("%c",&sex);
printf("Pleaseenterfather'sheight(cm):
");
scanf("%lf",&faHeight);
printf("Pleaseentermother'sheight(cm):
");
scanf("%lf",&moHeight);
printf("Whetheryoulikesportsornot(YorN):
");
getchar();
scanf("%c",&sports);
printf("Whetheryouhaveagoodeatinghabits(YorN):
");
getchar();
scanf("%c",&diet);
if(sex=='F')
height=(faHeight*0.923+moHeight)/2;
else
height=(faHeight+moHeight)*0.54;
if(sports=='Y')
height=height*1.02;
if(diet=='Y')
height=height*1.015;
printf("Thepredictionofyouradultheightis%.2f",height);
getchar();
getchar();
}
任务四编程打印表格ex5_3.cpp
创建程序文件ex02_03.cpp,完成下面功能,
Bunyan木材公司需要创建一个木材的工程特性表格。
木材的尺寸由底长和高(英寸)给出。
工程师需要知道木材的以下信息:
横截面积=底*高
惯性力矩=底*高3/12
截面系数=底*高2/6
所有者要求木材的底边尺寸为2、4、6、8和10英寸,高度为2、4、6、8、10和12英寸,制作一张具有表头的表格来显示这些值和计算出的工程属性。
表格的框架如下所示
木材尺寸横截面积惯性力矩截面系数
2*2
2*4
2*6
2*8
2*10
2*12
4*2
4*4
......
源程序清单:
#include
voidmain()
{
inti,j;
doublea,b,c;
printf("木材尺寸横截面积惯性力矩截面系数\n");
for(i=2;i<=10;i=i+2)
for(j=2;j<=12;j=j+2)
{
a=i*j;
b=i*j*j*j/12.0;
c=i*j*j/6.0;
printf("%2d*%2d%12.2f%10.2f%10.2f\n",i,j,a,b,c);
}
getchar();
getchar();
}
任务五编程天气统计ex5_4.cpp
创建程序文件ex02_05.cpp,编写一个程序处理一组日最高气温。
程序需要统计并打印出高温天数(最高温度为华氏85或更高),舒适天数(最高温度为华氏60~85),以及寒冷天数(最高温度小于华氏60),最后显示平均温度。
用下面数据测试你的程序:
5562687459454158606765788288919290938780787972686159
1.源程序清单:
#include
voidmain()
{
intday;//存放总的天数
inti;//控制循环
inttem;//存放温度
doubleavr=0;//存放平均温度
printf("请输入总的天数:
");
scanf("%d",&day);
inthotday=0,warmday=0,coldday=0;
//统计各个类型的天数
for(i=1;i<=day;i++)
{
scanf("%d",&tem);
if(tem>=85)hotday++;
elseif(tem>=60)warmday++;
elsecoldday++;
avr+=tem;
}
avr/=day;
//输出
printf("\n高温天数为:
%d,舒适天数为:
%d,寒冷天数为:
%d,平均温度为:
%.1f。
\n",hotday,warmday,coldday,avr);
}
2.运行结果
3。
实现算法(自然语言描述)
1、输入总天数day
2、循环i从1到day,步长1
(1)输入一个天气tem
(2)如果tem>=85则hotday++;
否则如果tem>=60则warmday++;
否则coldday++;
(3)累计天气到arv
3、计算平均温度:
arv/day
4、输出高温天数,舒适天数,寒冷天数,平均温度。
任务六编程穷举法ex5_5.cpp
创建程序文件ex02_04.cpp,使用穷举法求解下面问题:
鸡、兔同笼,共50个头,170只脚。
问鸡、兔各有多少只?
1.源程序清单:
#include
voidmain()
{
intche;//存鸡的只数
for(che=1;che<=50;che++)
{
if((che*2+(50-che)*4)==170)printf("鸡%d只,兔%d只\n",che,50-che);
}
}
2.运行结果
3。
实现算法(自然语言描述)
循环鸡的数量从1穷举到50,步长1
如果鸡*2+(50-鸡)*4等于170,则输出结果。
任务七补充选做编程构造数ex5_6.cpp
创建程序文件ex02_05.cpp,请写一个函数intsetbits(intx,intp,intn,inty),它求出把整数x从左端第p位开始的n个位用y的最右边的n个位替换,其它位都不变的那个整数。
例如x:
8458573p:
3n:
4y:
983284函数的结果应为8432843,
但n如果超出x的长度,取x的有效长度,
例如:
x:
8458573p:
5n:
4y:
983284函数的结果应为8458284,
p超出x长度视为无效数据,y不足需要替换的位数视为无效数据。
返回不同的错误编码,在调用时输出不同的错误提示。
1.源程序清单:
#include
intsetbits(intx,intp,intn,inty);
intreverse(intn);
voidmain()
{
intx,p,n,y;
intresult;
printf("请依次输入x,p,n,y:
");
scanf("%d%d%d%d",&x,&p,&n,&y);
result=setbits(x,p,n,y);
if(result==-1)
printf("无效数据,p超出x长度!
\n");
else
if(result==-2)
printf("无效数据,y不足需要替换的位数\n");
else
printf("结果为:
%d\n",result);
}
intsetbits(intx,intp,intn,inty)
{
intresultNum=0;//结果
intreplaceNum=0;//y最右n位数
inth=1;
inti=0,bit;
intn_x=0;
resultNum=x;
while(resultNum)
{resultNum/=10;
n_x++;
}
if(p>n_x)
{
return-1;//p超出x长度视为无效数据
}
//构造替代数:
y的最右n位数
for(i=1;i<=n;i++)
{replaceNum+=y%10*h;
y=y/10;h=h*10;
if(y==0)break;
}
if(ireturn-2;//y不足需要替换的位数,视为无效数据
//从右面取位,构造新数的倒置数例:
x:
8458573p:
3n:
4y:
983284replaceNum=3284resultNum:
3482348
i=n_x;
while(x)
{
if(i>p+n-1)
{bit=x%10;
}
else
if(i>=p)
{bit=replaceNum%10;
replaceNum/=10;
}
else
{bit=x%10;}
resultNum=resultNum*10+bit;
i--;
x=x/10;
}
returnreverse(resultNum);//返回resultNum的倒置数
}
//倒置n:
123=>321
intreverse(intn)
{intresult=0;
while(n)
{result=result*10+n%10;
n/=10;
}
returnresult;
}
2.运行结果
3。
实现算法(自然语言描述)
intsetbits(intx,intp,intn,inty)
1.求x的位数n_x
n_x=0;resultNum=x
循环当resultNum不为0
(1)n_x++;
(2)resultNum整除10
2.如果p>n_x,替换的起始位大于x的位数出错返回-1
3.求替代数:
y的最右n位数replaceNum
replaceNum置0,权位置1
循环i从1到n
(1)取y的最右一位数bit乘以权位累加到replaceNum
(2)y整除10
(3)权位乘10
(4)如果y为0,所有位数都取完,跳出循环
4.如果y不足需要替换的位数(i5.从后向前取位,得到新数的倒置数
i指向最后一位n_x
循环当x不为0
(1)如果取位位置i小于P或>p+n-1,则取x的最后一位bit
否则取replaceNum的最后一位bit,replaceNum整除10
(2)将bit构造到resultNum:
resultNum=resultNum*10+bit
(3)i—
(4)x整除10
6.求倒置所求的结果:
调用函数reverse
参考程序2:
#include
#include
intsetbits1(intx,intp,intn,inty);//方法一:
逐位生成
intsetbits2(intx,intp,intn,inty);//方法二:
分各部分生成
intgetRight(intx);
intgetlen(intx);
voidmain()
{
intx,y,des;
//printf("inputtwonumbers");
//scanf("%d%d",&x,&y);
des=setbits2(8458573,9,5,953284);
if(des==-1)
printf("p超出x长度\n");
elseif(des==-2)
printf("y不足需要替换的位数\n");
else
printf("newnum=%d",des);
system("pause");
}
intsetbits1(intx,intp,intn,inty)
{intxl,yl,xr,newint,bit,newy;
xl=getlen(x);//获取x的长度
yl=getlen(y);//获取y的长度
//无效数据检查
if(p>xl)
return-1;
if(n>yl)
return-2;
//替换长度n超出x的长度,调整替换长度到x的最后一位
if(p+n-1>xl)
n=xl-p+1;
//从y中取替换串的倒置串newy
inti=1;newy=0;
for(i=1;i<=n;i++)
{bit=y%10;
newy=newy*10+bit;
y=y/10;
}
//构造新的整数
xr=getRight(getlen(x));//构造x的权位,例如:
x:
8458573权位为:
1000000
newint=0;
i=1;
while(xr)//从前往后逐位取x的每一位数字
{
if(i
{bit=x/xr;
}
else
if(i
{bit=newy%10;
newy/=10;
}
else//第p+n位到最后一位取x中的数字位
{bit=x/xr;
}
//将bit构造到newint中
newint=newint*10+bit;
//修正x,权位xr,计数位i
x=x%xr;
xr=xr/10;
i++;
}
returnnewint;
}
intsetbits2(intx,intp,intn,inty)
{intxl,yl,r1,r2,r3,p1,p2,p3,newint,newy;
xl=getlen(x);
yl=getlen(y);
if(p>xl)
return-1;
if(n>yl)
return-2;
if(p+n-1>xl)
n=xl-p+1;
//取x的第一位到第p-1位
r1=getRight(xl-p+2);
p1=x/r1*r1;
//取y的后n位
r2=getRight(n+1);
r3=getRight(xl-p-n+2);
p2=(y%r2)*r3;
//取x的第p+n位到最后一位
p3=x%r3;
//构造newint
newint=p1+p2+p3;
returnnewint;
}
intgetlen(intx)
{intn=0;
while(x)
{n++;;
x/=10;
}
returnn;
}
intgetRight(intn)
{intright=1;
for(inti=1;i<=n;i++)
right=right*10;
returnright/10;
}