C++实验报告.docx

上传人:b****6 文档编号:13159111 上传时间:2023-06-11 格式:DOCX 页数:90 大小:830.86KB
下载 相关 举报
C++实验报告.docx_第1页
第1页 / 共90页
C++实验报告.docx_第2页
第2页 / 共90页
C++实验报告.docx_第3页
第3页 / 共90页
C++实验报告.docx_第4页
第4页 / 共90页
C++实验报告.docx_第5页
第5页 / 共90页
C++实验报告.docx_第6页
第6页 / 共90页
C++实验报告.docx_第7页
第7页 / 共90页
C++实验报告.docx_第8页
第8页 / 共90页
C++实验报告.docx_第9页
第9页 / 共90页
C++实验报告.docx_第10页
第10页 / 共90页
C++实验报告.docx_第11页
第11页 / 共90页
C++实验报告.docx_第12页
第12页 / 共90页
C++实验报告.docx_第13页
第13页 / 共90页
C++实验报告.docx_第14页
第14页 / 共90页
C++实验报告.docx_第15页
第15页 / 共90页
C++实验报告.docx_第16页
第16页 / 共90页
C++实验报告.docx_第17页
第17页 / 共90页
C++实验报告.docx_第18页
第18页 / 共90页
C++实验报告.docx_第19页
第19页 / 共90页
C++实验报告.docx_第20页
第20页 / 共90页
亲,该文档总共90页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C++实验报告.docx

《C++实验报告.docx》由会员分享,可在线阅读,更多相关《C++实验报告.docx(90页珍藏版)》请在冰点文库上搜索。

C++实验报告.docx

C++实验报告

计算机学院软件学院

实验报告

 

学院:

计算机学院

课程名称:

C++面向对象

专业:

计算机应用技术

班级:

11级计算机专科1班

学号:

201113131121

姓名:

黄锡杏

指导教师:

朱俊岭

 

2012年12月21日

 

3.2实验二C++程序设计初步(2012/10/19第七周)

题目1计算员工周工资

1、程序源代码

(1)用if—elseif语句实现

#include

usingnamespacestd;

intmain()

{

doubleworktime;

doublewage,wageph;

cout<<"Pleaseinputemployee'sworktimeandwageph:

"<

cin>>worktime;

cin>>wageph;

if(worktime<=40)

wage=worktime*wageph;

elseif(worktime<=60)

wage=((worktime-40)*1.5+40)*wageph;

else

wage=(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph;

cout<<"Theemployee'swageis:

"<

return0;

}

(2)用Switch语句实现

#include

usingnamespacestd;

intmain()

{

intcount;//定义变量存储时间系数

doubleworktime;

doublewage,wageph;

cout<<"Pleaseinputemployee'sworktimeandwageph:

"<

cin>>worktime>>wageph;

if(worktime>60)

count=3;

else

count=worktime/20;//获得时间系数

switch(count)

{

case0:

//时间系数在0~1之间没有工资没有加倍

case1:

wage=worktime*wageph;

break;

case2:

wage=((worktime-40)*1.5+40)*wageph;//时间系数为2时按原来工资的1.5倍发放工资

break;

case3:

wage=(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph;//时间系数为3时按原来工资的3倍发放工资

break;

default:

break;

}

cout<<"Theemployee'swageis:

"<

return0;

}

2、运行结果

按要求输入三组测试数据,运行结果如下:

(经检验试验结果正确,代码无错误,实验成功)

3、程序调试

(1)、在用if-else时,如果if-else不配对系统则会报出以下错误:

因此使用if-else时要注意配对,他们是成对出现的。

(2)、在使用switch是要注意与case搭配,而且如果switch()括号内必须有循环判断参数,否则出现以下错误:

4、思考与扩展

如果程序运行时循环输入并给出计算结果,并当当用户输入0时程序结束,程序该修改为:

#include

usingnamespacestd;

intmain()

{

doubleworktime;

doublewage,wageph;

while

(1)//定义循环开始

{

cout<<"Pleaseinputemployee'sworktimeandwageph:

"<

cin>>worktime;

cin>>wageph;

if(worktime!

=0&&wageph!

=0)//进入循环的条件

{

if(worktime<=40)

wage=worktime*wageph;

elseif(worktime<=60)

wage=((worktime-40)*1.5+40)*wageph;

else

wage=(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph;

cout<<"Theemployee'swageis:

"<

}

else

exit(0);

}

return0;

}

运行结果如下:

题目2设计一个计算+、-、*、/的程序

1、程序代码

#include

usingnamespacestd;

#defineN100

intmain()

{

charop;//定义符号变量,代表+、-、*、/

intresult,operand1,operand2,t,i;//t为交换变量,i为循环变量

cout<<"pealseintputarithmeticexpression:

"<

for(i=0;i

{

cin>>operand1>>op>>operand2;

if((operand1!

=0)||(op!

='0')||(operand2!

=0))//当各变量都不为0时执行下列操作,否则跳过此switch操作

{

switch(op)

{

case'+':

result=operand1+operand2;

cout<

break;

case'-':

if(operand1

{

t=operand1;

operand1=operand2;

operand2=t;

}

result=operand1-operand2;

cout<

break;

case'*':

result=operand1*operand2;

cout<

break;

case'/':

if(operand2!

=0)//分母为0时不执行

{

result=operand1/operand2;

cout<

}

else

cout<<"输入错误!

"<

break;

default:

break;

}

}

else

exit(0);//跳出系统

system("pause");//让显示界面不消失

}

return0;

}

2、运行结果

按要求输入数据结果如下:

3、程序调试与改进

(1)、如果if((operand1!

=0)||(op!

='0')||(operand2!

=0))改成if((operand1!

=0)&&(op!

='0')&&(operand2!

=0))则不能进入循环执行后面的

因为并关系如果有一个0则整个循环都无法进入!

(2)、在进行减法时,如果没有判断,但前一个比后一个数小时则会出现负数,为了解决这个则加上判断

题目3计算生日时星期几

1、程序代码

#include

usingnamespacestd;

voidmain()

{

intyear,month,day;//定义变量y,m,d分别表示所求的那天的年月日

inti;//定义循环变量

cout<<"pleaseenteryearmonthday:

"<

cin>>year>>month>>day;

while(year!

=0&&month!

=0&&day!

=0)

{

inttotal=0;

for(i=1;i

(1)对所输入的年进行循环,

{

if((i%4==0&&i%100!

=0)||i%400==0)//判断是否为闰年

{

total+=366;

}

else

{

total+=365;

}

}

for(i=1;i

(2)对一年中的每月进行循环,其中1、3、5、7、8、10、12在原有天数的基础上加31天,以下以此类推

{

if(i==1||i==3||i==5||i==7||i==8||i==10||i==12)

{

total+=31;

}

elseif(i==4||i==6||i==9||i==11)

{

total+=30;

}

elseif((year%4==0&&year%100!

=0)||year%400==0)

{

total+=29;

}

else

{

total+=28;

}

}

total+=day;//total再加上这个月度过的天数即得从纪年开始到所求的那经过的总天数

cout<<"到目前为止总天数为:

"<

switch(total%7)//(3)total对7求余,就会得到星期数,由于公元一年一月一日是星期一有以下结果

{

case0:

cout<<"TadayisSunday"<

break;

case1:

cout<<"TadayisMonday"<

break;

case2:

cout<<"TadayisTuesday"<

break;

case3:

cout<<"TadayisWednesday"<

break;

case4:

cout<<"TadayisThursday"<

break;

case5:

cout<<"TadayisFriday"<

break;

case6:

cout<<"TadayisSaturday"<

break;

}

cout<<"pleaseenteryearmonthday:

"<

cin>>year>>month>>day;

}

}

2、运行结果

按要求输入数据显示结果如下:

3、程序调试

(1)循环while(year!

=0&&month!

=0&&day!

=0)的控制范围不对,执行输入一组数据时就会进入死循环

(2)在while循环体内执行年月循环时不能直接把输入的年月来作循环变量,因为会导致赋值错误!

所以我引入一个中间变量i,并定义for(i=1;i

问题得到解决。

3.3实验三函数与程序结构(2012/10/26第八周)

题目1分析程序运行结果

1、程序代码

#include

usingnamespacestd;

intn=0;

intfunc(intx=10);//声明带一个参数的func函数

voidmain()

{

inta,b;

a=5;

b=func(a);//b的值为调用func函数时的返回值a+b

cout<<"\nlocala="<

<<"localb="<

<<"globlen="<

a++;//a自增1

b=func(a);//a自增1后再次调用func函数

cout<<"\nlocala="<

<<"localb="<

<<"globaln="<

func();//调用空func函数,无参数时使用默认值

}

intfunc(intx)

{

inta=1;//a为临时变量,每次执行都需要重新赋值

staticintb=10;//b定义为静态存储变量,每次赋的新值都不变

a++;

b++;

x++;

n++;

cout<<"\nlocala="<

<<"localb="<

<<"parameterx="<

returna+b;

}

2、运行结果

3、程序分析

1)程序输出的五段内容分别是从函数func和主函数中输出的。

第一段和第三段从函数func中输出,第二段和第四段从主函数中输出。

2)在函数main和函数func中各自定义了局部变量a和b,它们的作用域在各自的函数范围之内,因此在两个函数中输出的a,b值是不相干的。

主函数中的a值开始为5,后来增1后变成6;主函数中的b值从函数func的返回值而来,而函数func返回的值是它的局部变量a和b的和,所以第二段和第四段中的b值分别为第一段和第三段中的a+b的值。

函数func中的局部变量a是一个临时变量,每次进入函数时都重新赋值为,然后被自增1,所以每次输出都是2;变量b是一个局部静态变量,所以在退出函数func时它能够保持原来的值,在第一次调用func时,b的初值为10,然后自增1,所以值为11,第二次调用func时,b的值保持为11,所以再次自增后,b值成为12。

3)n是一个全局变量,因此它的值可以在全局范围内被访问和修改‘在函数func中对n的修改可以反映到主函数中,这样在主函数中两次输出的n值分别为1和2。

4)函数func的参数x的初值由调用它的实在参数赋给,因此初值分别为5和6,在该函数中对x做了自增操作,所以输出的值分别为6和7。

5)函数func的参数有一个缺省值为10,所以在最后一次调用该函数时,X值变成10,在函数中增1后,X值变成11。

6)函数调用中发生数的传递是单向的,只能把实参的值传递给形参,而不能把实参的值反向传给形参,因此在函数调用中形参的值改变不会改变实参的值;函数中的形参和调用时的实参都是数组名时,传递方式为地址传递,此时形参和实参共用同一段内存;都是变量时,传递方式为值传递,而且实参与形参互不影响。

4、改变main()函数中a的值令a=10,改变func()函数中b的值令staticintb=10;程序运行结果如下:

5、思考与扩展

1)将函数func()中的变量staticintb=10;改为intb,此时b没有初始化,因此b的值就是地址值;程序运行结果:

2)如果将main()函数中定义变量的语句inta,b;移到程序第三行,程序运行结果是没有变化的,因为此时a,b为全局变量,在整个程序中都起作用,由于函数结构没有改变,因此结果是没有变化的。

题目2函数的递归调用和多文件结构

利用非递归方式实现

1、程序源代码

#include

usingnamespacestd;

doublefn(intn);//声明函数nn求n!

doubleCnr(intn,intr);//声明函数Cnr求C(n,r)

intmain()

{

intn,r;

while

(1)

{

cout<<"pleaseinputn&&r(输入00结束):

"<

cin>>n>>r;//输入00表示结束程序

if(n==0&&r==0)

break;

if(n<1||n

cout<<"输入无效!

"<

else

cout<

}

return0;

}

doublefn(intn)//定义函数nn求n!

{

doublesum=1;

for(inti=1;i<=n;i++)

sum=sum*i;

returnsum;

}

doubleCnr(intn,intr)//定义函数Cnr求C(n,r)

{

doubles1,s2,s3;

s1=fn(n);

s2=fn(r);

s3=fn(n-r);

returns1/(s2*s3);//Cnr的计算公式

}

2、运行结果

3、程序调试

(1)、定义求C(n,r)函数时,不能定义为C(intn)因为C是关键词,编译时会通不过,因此在定义函数时我避开了关键词。

(2)、定义两个double型函数时注意return的返回值:

如果都习惯了return0那么结果都是0,因此在执行return函数时注意要return的对象。

利用递归方式实现

1、程序代码

#include

usingnamespacestd;

doubleCnr(intn,intr);//声明递归函数

intmain()

{

intn,r;

while

(1)

{

cout<<"Pleaseinputn&&r:

"<

cin>>n>>r;

if(n==0&&r==0)//输入00表示结束程序

break;

if(n<1||n

cout<<"Inputinvalid!

"<

else

cout<

}

return0;

}

doubleCnr(intn,intr)//定义求C(n,r)

{

if(r==0)//判断是否满足递归结束条件

return1;

if(r==1)

returnn;

returnCnr(n,r-1)*(n-r+1)/r;//递归规律注意(/n和/r)

}

2、运行结果

3、程序调试

在最后归纳递归函数的时候,如果把

这一句换成

那么结果就会出现结果不对的情况:

原因就是递归错误!

4、思考与扩展

1、写递归函数需考虑的要素:

a.怎样取一个变量或多个往下递归(不是绝对,但是推荐这么做,变量在传递中要有变化)。

b.怎样终止递归,要设置一个合理的终止条件(原来的规律不能成立,函数体递归前的代码不再能重复)。

c.递归过程中的暂时或中间结果怎样保存(不是每一个递归都需考虑这个情况)。

2、在递归版本中,当n大到26万时系统将发生栈溢出报错;我个人觉得在递归与非递归之间觉得非递归函数比较好,因为它节省了存储空间,大大提高了程序的执行效率。

3、多文件结构中头文件的作用是:

避免调用函数时发生小错误;而将程序划分多个程序好处是:

1)、避免一而再,再而三地重复编译函数,因为编译器总是以文件为单位工作的。

如果一个文件中包含的函数太多,则由于被修改的函数总是少数的几个,所以大多数正确的函数都得重新编译一次;2)、使程序更加容易管理。

可以将程序按逻辑功能划分,分解成各个源文件,便于程序员的任务安排,以及程序调试;3)、把相关函数放到一特定源文件中。

题目3条件编译

1、第一种条件编译

1)程序源代码

#include

usingnamespacestd;

#defineyellow//定义一个标志符

intmain()

{

charch;

cout<<"请输入一个字母:

"<

cin>>ch;

while(ch<65||ch>90&&ch<97||ch>122)

{

cout<<"输入的不是字母,重新输入:

"<

cin>>ch;

}

#ifdefyellow//标志符存在时执行此段代码,否则执行else后的代码段

if(ch>=65&&ch<=90)

ch+=32;

cout<<"转换成小写字母为:

"<

#else

if(ch>=97&&ch<=122)

ch-=32;

cout<<"转换成大写字母为:

"<

#endif

return0;

}

2)、运行结果

标志符存在时结果为:

注析标志符时结果为:

与计划结果一致!

3)、程序调试

刚开始编译代码时没有定义标志符,导致后面的程序执行停止,没有达到条件编译的效果;在加上#defineyellow和#ifdefyellow后,此时就实现了条件编译的功能!

2、第二种条件编译

1)、程序代码

#include

usingnamespacestd;

#defineLETTER1

intmain()

{

charch;

cout<<"请输入一个字母:

"<

cin>>ch;

while(ch<65||ch>90&&ch<97||ch>122)

{

cout<<"输入的不是字母,重新输入:

"<

cin>>ch;

}

#ifLETTER1ch>=65&&ch<=90

ch+=32;

cout<<"转换成小写字母为:

"<

#else

a-=32;

cout<<"转换成大写字母为:

"<

#endif

return0;

}

2)、运行结果

3、思考和扩展

一般情况下,源程序中所有的行都参加编译。

但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。

有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句。

由条件编译的形式:

#ifdef标识符

程序段1

#else

程序段2

#endif

它的作用是:

当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。

3.5实验五指针和引用(2012-10-21第十周)

题目1程序分析

1、分析

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 经管营销 > 经济市场

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2