实验6.docx
《实验6.docx》由会员分享,可在线阅读,更多相关《实验6.docx(11页珍藏版)》请在冰豆网上搜索。
实验6
实验6函数与预处理1
(2)
请将自己报告部分,文字和程序代码,加粗
认真阅读并操作,按实验指导书P171至P175的要求,完成下面实验内容和要求。
自测练习
3.设计一个打印年历的程序。
要求:
打印每个月的月历的功能有一个独立的函数完成,程序运行时,主程序通过若干次调用该函数完成年历的输出。
注意处理闰年问题。
如:
2015年月历(部分截屏)
提示:
⑴完成如下程序代码(根据被调函数声明和主函数中的调用,参考每个函数体内提示的功能完成被调函数定义):
#include
#include
usingnamespacestd;
voidprintmonth(intm);//5个被调函数声明
voidprintheed(intm);
intdaysofmonth(intm);
intisleep(inty);
intfirstday(inty);
intyear,weekday,h,d;//定义全局变量
intmain()
{
inti;
cout<<"输入年份:
";
cin>>year;
weekday=firstday(year);
cout<<"\n\n";
cout<for(i=1;i<=12;i++)
{
printmonth(i);
cout<<"\n";
}
cout<<"\n\n";
return0;
}
voidprintmonth(intm)
{printheed(m);
/*功能:
1、调用printheed(m),输出月历首行形式并确定m月第1天的位置
2、从第1天输出改月其它天的日历,注意换行控制格式*/
}
voidprintheed(intm)
{inty=year;
intz=firstday(y);
intw=1;
intl;
intq=daysofmonth(m);
cout<if(d==0)//只用来找到第一个月的第一天的位置,后面几个月不再做
h=z;/*功能:
1、输出月历首行形式:
m月日一二三四五六*/
for(l=1;l<=h+1;l++)
cout<<"";
for(w=1;w<=7-h;w++)
{
cout<}
cout<d++;
intb=0;
h=0;
for(inti=w;i<=q;i++)
{if(b%7==0)
cout<<"";
cout<h++;
h=h%7;
b++;
if(b%7==0)
cout<}
}
intdaysofmonth(intm)
{inty=isleep(year);
intq;
switch(m)
{case1:
case3:
case5:
case7:
case8:
case10:
case12:
q=31;break;
case4:
case6:
case9:
case11:
q=30;break;
case2:
if(y==1)
q=29;
elseq=28;
}
returnq;
/*功能:
判断m月多少天,返回值是m月的天数,注意闰年*/
}
intisleep(inty)
{intn=y;
intt=1;
if(n%400!
=0&&n%100==0||n%4!
=0)t=0;
returnt;
/*功能:
判断y是否为闰年,是返回1,否返回0,闰年判断表达式见上机指导P19二、填空题第5题*/
}
intfirstday(inty)
{intq;
intsum=0;
intz;
for(inti=0;i<=year-1;i++)
{q=isleep(i);
if(q==0)
sum=sum+365;
if(q==1)
sum=sum+366;
}
z=(sum+6)%7;
returnz;
/*功能:
判断该月的第一天是星期几?
思路:
这个问题需找一个参照点,如设2000年1月1日为参照点,这天是星期六,则可计算该月的第一天距离参照点有多少天,(注意闰年要多加1天)如2012年4月1日与2000年1月1日相差4474天,4474%7=1,所以2012年4月1日是星期日。
返回值是y月第1天是星期几*/
}
⑵运行结果截图
4.有一个8层灯塔,每层所点灯数都等于该层上一层的两倍,一共有765盏灯,求塔底的灯数。
思路:
采用的是一种穷举算法,即对塔顶的灯数从1盏开始,依次检验8层灯的总数是否为765盏,若是,则找到答案,若不是,则塔顶灯数加1进行下一次测试。
⑴阅读给出的程序代码,分析算法的循环实现过程,为循环体内的每条语句加注释,说明功能)
#include
#include
usingnamespacestd;
intmain()
{
intn=1;//设n为最顶层灯数
intsum=0;
while(n)
{
for(intj=0;j<8;j++)//从顶层到底层循环
sum+=pow(2,j)*n;//累加求和
if(sum==765)//判断是否为765
break;//是,则跳出循环
else{
sum=0;
n++;//不是,则调整顶层灯数加一
}
}
cout<<"最底层灯数是:
"<<128*n<return0;
}
⑵要求:
设计一个函数计算塔顶灯数为n盏时,8层灯的总灯数,并在主函数中调用。
Ø修改后的代码如下:
#include
#include
usingnamespacestd;
ints(intn);
intsum=0;
intmain()
{
intn;
cout<<"输入顶层灯数:
"<cin>>n;
cout<<"最底层灯数是:
"<s(n);
return0;
}
ints(intn)
{
for(intj=0;j<8;j++)
sum+=pow(2,j)*n;
cout<return0;
}
Ø运行结果截图
5.数字反射(此题为新增内容)
编写一个函数,接收一个整数值,返回这个数中数字逆序后的结果值。
例如:
给定数7631,函数返回1367.
思路:
通过%10运算与循环的结合,可依次获得给定数的每位数字。
例如:
7631%10=1,获得了个位数;7631/10=763,即丢掉了个位数字。
继续下去,可依次得到数字1、3、6、7.
边循环边将每次得到的数字添加到需返回的数值中。
例如:
0*10+1=1;1*10+3=13;13*10+6=136;136*110+7=1367.
⑴程序代码如下(重要语句请加注释提高程序的可读性):
#include
#include
usingnamespacestd;
intmain()
{
inta,i;
cout<<"输入数字:
"<cin>>a;
for(;a!
=0;)
{i=a%10;
cout<
a=a/10;}
cout<return0;
}
⑵运行结果截图
6.猜数字游戏(此题为新增内容)
编写一个程序,可以玩“猜数字”的游戏。
具体描述如下:
程序在1~1000之间的整数中随机选择需要猜的数。
然后显示:
Ihaveanumberbetween1and1000.
Canyouguessmynumber?
Pleasetypeyourfirstguess.
玩家于是输入猜想的第一个数。
程序会做出如下响应之一:
ExcellentYouguessedthenumber!
Wouldyouliketoplayagain(yorn)?
Toolow.Tryagain.
Toohigh.Tryagain.
如果玩家的猜测是不正确的,程序应继续循环,直到玩家最终猜对为止。
此过程中程序要一直提醒玩家是猜大了(Toolhigh)还是猜小了(Toollow),这样帮助玩家尽快获得正确的答案。
提示:
①思路:
通过rand()函数产生随机数。
关于rand()的介绍和使用方法,请参考教材P112例5-4说明:
②。
②程序流程介绍如下:
Ø产生一个让玩家猜想的介于1~1000的数,并显示提示。
Ø通过循环检测玩家猜想是否正确。
Ø如正确,输出相应提示并退出循环;如不正确,输出相应提示,继续循环。
③本题中关于函数的使用不做具体限制,可使用函数,也可不使用函数。
若使用函数,可将本程序按功能进行分解,每一个子功能应用函数。
⑴程序代码如下(重要语句请加注释提高程序的可读性):
#include
#include
usingnamespacestd;
intmain()
{
intx,a,b;
charm='y';
x=rand();
cout<<"Ihaveanumberbetween1and1000."<cout<<"Canyouguessmynumber?
"<cout<<"Pleasetypeyourfirstguess."<while(m!
='n')
{
cout<<"Pleasetypeyourguess."<cin>>a;
b=a-x;
if(b>0)cout<<"Toohigh.Tryagain."<if(b<0)cout<<"Toolow.Tryagain."<if(b==0){cout<<"ExcellentYouguessedthenumber!
";break;}
else
cout<<"Wouldyouliketoplayagain(yorn)?
";
cin>>m;
}
cout<cout<<"随机数是:
"<return0;
}
⑵运行结果截图