《C++实验报告汇总.docx》由会员分享,可在线阅读,更多相关《C++实验报告汇总.docx(92页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、目录3.2实验二C+程序设计初步(2012“”9第七周)11 Tl 3*JoJ . 1题目2设ii1计算+、-、/的程序7题目3计算生日时星期几113.3实验三函数与程序结构(2012/10/26第八周)15题日 ! 分析3E序J口 杲 15题目2函数的递归调用和多文件结构20题目3条件编译263.5实验五 指针和引用(2012-10-21第十周)30题目1程序分析30题目2班级课程成绩计算35题目3排序查找403.8 实验类和对象(2012-11-23第十二周)43题目1图形类设计43题目2学生类设计48题目3人员管理533.9 实验九继承与派生(2012-12-1第十三周)60题目2教师干
2、部类603.10 实验十多态与虚函数63题目1图形类633.11 实验十一运算符重载68题目 1 重载, =68题目2重载加减法723.12 实验十二文件操作89题目1二进制文件操作893.2实验二C+程序设计初步(2012/10/19第七周)题目1计算员工周资1程序源代码(1)用ifelse if语句实现# i ncIudeus i ng namespace std;i nt ma i n ()doubIe workt i me;doubIe wage, wageph;coutP I ease i nput emp I oyee sworkt i meandwageph: end I ;c
3、i nworkt i me;c i nwageph;i f (workt ime=40) wage=workt ime*wageph;eIse i f(workt ime=60)wage二(workt i me-40)*1.5+40)*wageph;e I sewage= (workt ime-60)*3. 0+(60-40)*1.5) +40) *wageph;coutThe emp I oyee s wage i s: wageend I ;return 0;(2)用Switch语句实现# i no Iude us i ng namespace std;i nt ma i n ()(int
4、 counti 定义变量存储时间系数doubIe workt i me;doubIe wage, wageph;coutP I ease i nput emp I oyee s workt i me and wageph: end I ;c i nworkt i mewageph;i f (workt ime60) count=3;e I secount=workt i me/20; 获得时间系数sw i tch(count)(case 0: 时间系数在。1之间没有工资没有加倍case 1:wage: workt i me*wageph;break;case 2:wage= (workt i
5、me-40) *1.5+40) *wagephi 时间系数为 2 时 按原来工资的1.5倍发放工资break;case 3:wage=(workt i me-60)*3. 0+(60-40)*1.5)+40)*wageph;/时间系数为3时按原来工资的3倍发放工资break;default:break;coutThe emp I oyee s wage i s: wageend I ;return 0;)2、运行结果按要求输入三组测试数据,运行结果如下:(经检验试 睑结果正确,代码无错误,实验成功)3、程序调试(1)在用if-else时,如果if-else不配对系统则会报出以下错误:Cpp1.
6、cppH:C*shiyanCpp1.cpp(13) : error C2146: syntax error : missing *;* before identifier wage H:C*shiyanCpp1.cpp(14) : error C2181: illegal else without matching if 执行cl.exe时出错因此使用if-else时要注意配对,他们是成对出现的。(2)、在使用switch是要注意与case搭配,而且如果switch()括号内必须有循环判断参数,否则出现以下错误:H:C+shiyanCpp1-1.cpp(26) : error C2047: i
7、llegal defaultH:C+shiyanCpp1-1 .cpp(26) : error C2043: illegal break执行cl.exe时出错4、思考与扩展如果程序运行时循环输入并给出计算结果,并当当用户输入时程序结束,程序该修改为:# i ncIudeusing namespace std;i nt ma i n ()IdoubIe workt ime;doubIe wage, wageph;whi le(1)定义循环开始(coutP I ease i nput emp I oyee s worktime and wageph: end I ;c i nworkt i me;
8、c i nwageph;i f (wor kt i me! =0&wageph! =0) 进入循环的条件 (i f (workt i me=40)wage=workt ime*wageph;e I se i f (workt ime=60)wage= (workt ime-40)*1.5+40) *wageph;e I sewage二(workt i me-60) *3. 0+ (60-40) *1.5) +40) *wageph; cout,The emp I oyee s wagei s: wageend I ;)e I seex it 0);return 0;)运行结果如下:题目2设计个
9、计算+、/的程序1、程序代码#includeus i ng namespace std;#define N 100i nt ma i n ()(char op; 定义符号变量,代表+、 nt result, operandl, operand2, t, i ; t为交换变量,i 为 循环变量coutpea I se i ntput ar i thmet i c express i on: end I ;for (i=0;iN;i+)(c i noperand1 opoperand2;if (operandl !=0) | | (op ! = O) | | (operand2!=0) /当各变量
10、都不为时执行下列操作,否则跳过此switch操作switch (op)case :resuIt=operand1+operand2;coutoperand1opoperand2=resu I tend I ;break;case :i f (operand1operand2) 减法是若前一个比后个小时进行交换(t=operand1;operand1=operand2;operand2=t;resuIt=operand1-operand2;coutoperand1 opoperand2=resu Itend I ;break;caseresuIt=operand1*operand2;coutop
11、erand1 opoperand2=resu I tend I ;break;case /:i f (operand2!=0) 分母为时不执行(resuIt=operand1/operand2;coutoperand1 opoperand2=resu I tend I ;1e I secout输入错误! ”end I ;break;defauIt:break;11e I seexit(O) ; /跳出系统system(pause); 让显示界面不消失return 0;2、运行结果按要求输入数据结果如下:3、程序调试与改进(1)如果if (operand! !=0) | | (op!。)| |
12、(operand2!二0)改 成if (operand! !=0)&(op! = 0)&(operand?!=0)则不能进入循环 执行后面的case :if(operand2?=0)result=operand1/operand2;coutoperand1opoperand2*=resultelsecout 输入错误?endl;break;因为并关系如果有一个。则整个循环都无法进入!(2)、在进行减法时,如果没有判断,但前个比后一个数小时则会出现负数,为了解决这个则加上判断case :if(operand1oPerand2) 减法是若前个比后个小进行交换t=operand1;operand1=
13、operand2;operand2=t;result=operand1-operand2;coutoperand1opoperand2,=resultendl;break;题目3计算生日时星期几1、程序代码#includeus i ng namespace std;vo i d ma i n ()(int year, month, dayJ 定义变量y, m, d分别表示所求的那天的年月日int i ;定义循环变量coutp I ease enter year month day: end I ;c i nyearmonthday;while (year!=0&month!=0&day!=0)
14、i nt total=0;for (i=1 ; iyear ; i+) (1)对所输入的年进行循环,if (i%4=0&i%100!=0) 11 i%400=0)判断是否为闰年total+=366;)e I se(totaI+=365;)1for (i=1 ; imonth; i+) /(2)对一年中的每月进行循环, 其中1、3、57、8、10、12在原有天数的基础上加31天,以下以此 类推(if (i=1 | | i=31 | i=51 | i=71 | i=81 | i=10| | i=12)(totaI+=31;)else if(i =41|i=61|i=91|i=11)totaI+=3
15、0; else if (year%4=0 & year%100!=0) | |year%400=0) (totaI+=29;)e I se(totaI+=28;)tota l+=day;/tota I再加上这个月度过的天数即得从纪年开始到所求的那经过的总天数cout”到目前为止总天数为:tota I end I ;switch (tota l%7) / (3) tota I对7求余,就会得到星期数,由于公元一年一月一日是星期一有以下结果(case 0:cout Taday i s Sundayend I ; 若余数为,则输出这一天是星期日break;case 1:cout Taday i s
16、Mondayend I ;break;case 2:cout Taday i s Tuesdayend I ;break;case 3:cout Taday i s Wednesdayend I ;break;case 4:cout Taday i s Thursdayend I ;break;case 5:cout Taday i s Fr i dayend I ;break;case 6:cout Tadayi s Saturdayend I ;break;cout p I ease enter year month day: end I ;c i nyear monthday;2、运行结
17、果按要求输入数据显示结果如下:3、程序调试(1)循环whi Ie (year !=0&month!=0&day !=0)的控制范围不对, 执行输入组数据时就会进入死循环(2)在whi Ie循环体内执行年月循环时不能直接把输入的年月来 作循环变量,因为会导致赋值错误!所以我引入个中间变量i,并 定义for (i=1 ; iyear ; i+)和for (i=1 ; imonth; i+) 问题得到解决。3.3实验三函数与程序结构(2012/10/26第周)题目1分析程序运行结果程序代码# i no Iude us i ng namespace std;i nt n;i nt func (i nt
18、 x=10) ; /声明带一个参数的func函数vo i d ma i n 0(i nt a, b;a =5;b=func (a) ; /b的值为调用func函数时的返回值a+bcoutn I oca I a=aend I local b=bendlgloble n=nend I ;a+; /a 自增 1b=func (a) ; /a自增1后再次调用func函数coutn I oca I a=aend I local b=bend Igl oba I n=nend I ;func 0; 调用空func函数,无参数时使用默认值1i nt func (i nt x)(i nt a=1 ; /a为临
19、时变量,每次执行都需要重新赋值static int b=10; /b定义为静态存储变量,每次赋的新值都不变a+;b+;x+;n+;coutn I oca I a=aend Ilocal b=bendlparameter x x end I;return a+b;2、运行结果:.E:cpp实装在Vorkgroup (Teacher)上、实势三、DebugCppl. exe|-nlocal a=2 local b=ll parameter x=6local a=5 local b=13 globle n=llocal a=2 local b=12 parameter x7local a=6 loc
20、al b=14 global n=2local a=2 local b=13 parameter x=ll Press any key tocontinue.3、程序分析1)程序输出的五段内容分别是从函数func和主函数中输 出的。第一段和第三段 从函数func中输出,第二段和第四 段从主函数中输出。2)在函数main和函数func中各自定义了局部变量a和b, 它们的作用域在各自的函数范围之内,因此在两个函数中 输出的a, b值是不相干的。主函数中的a值开始为5J后来 增1后变成6;主函数中的b值从函数func的返回值而来, 而函数func返回的值是它的局部变量a和b的和,所以第 二段和第四段
21、中的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和24)函数func的参数x的初值由调用它的实在参数赋给,因 此初值分别为5和6,在该函数
22、中对x做了自增操作,所以 输出的值分别为6和7。5)函数func的参数有一个缺省值为1 0,所以在最后一次调用 该函数时,X值变成10,在函数中增1后,X值变成11。6)函数调用中发生数的传递是单向的,只能把实参的值传 递给形参,而不能把实参的值反向传给形参,因此在函数调 用中形参的值改变不会改变实参的值;函数中的形参和调用 时的实参都是数组名时,传递方式为地址传递,此时形参和 实参共用同一段内存;都是变量时,传递方式为值传递,而 且实参与形参互不影响。4、改变main ()函数中a的值令a = 10,改变func()函数中 b的值令static int b=10;程序运行结果如下: H:cp
23、p 在 Workgroup (Teacher)上供HDebug3改一.exe,_ 区local a=2 local b=ll paranetei* x=lllocal a=10 local b=13 globle n=llocal a =2 local b=12 parameter x=12local a=11 local b=14 global n=2local a=2 local b=13 parameter x=ll Press any key to continue5、思考与扩展1)将函数func 中的变量stat ic i nt b=10;改为i nt b, 此时b没有初始化,因此b
24、的值就是地址值;程序运行结果:2)如果将main ()函数中定义变量的语句inta, b;移到程序第三行,程序运行结果是没有变化的,因为此时a, b为 全局变量,在整个程序中都起作用,由于函数结构没有改变, 因此结果是没有变化的。题目2函数的递归调用和多文件结构利用非递归方式实现1、程序源代码# i ncIudeus i ng namespace std;doubIe fn (int n) ; /声明函数 nn 求 n!doub I e Cnr (i nt n, i nt r) ; /声明函数 Cnr 求 C (n, r) i nt ma i n ()I nt n, r ;wh i le(1)
25、coutp I ease i nput n&r (输入 结束): end I ;ci nnr ; 输入 表示结束程序i f (n0&r)break;if (n1 | |n 三I的姜nc习 n * double sum- F;Fo- in t: i - -! ;idouble Cnr* (int: n. in 七 r* Cnr* C ( n r* ) ;s3 - Fn ( n r* ;r*etzur-n s-|/(s2s3 ; /Cnr*jt;函数时注意要return的对象。利用递归方式实现1、程序代码# i ncIudeus i ng namespace std;doub I e Cnr (i
26、 nt n, i nt r); 声明递归函数i nt ma i n ()(1 nt n, r ;wh i le(1)IcoutP I ease i nput n & r : end I ;c i nnr;if (n=0&r。)输入 表示结束程序 break;if (n1 | |nr) /检查输入的合法性 cout I nput i nva lid! end I ;e I secoutCnr (n, r) end I ;return 0;)doub I e Cnr (i nt n, i nt r) 定义求 C(n, r)if (r=0) 判断是否满足递归结束条件return 1;i f (r=1
27、)return n;return Cnr (n, r-1)*(n-r+1)/rI 递归规律注意(/n 和/r)I2、运行结果J3、程序调试在最后归纳递归函数的时候,如果把returncnr(n:r-1).(n-r+1)/r;这一句换成 Eurn Cnr(n,r-1)*(n-r+1)/nJ那么结果就会出现结果不 对 的 情 况 :FJ ,EC programc+$SDebugC+3.2.2.exe【0 丨回屿Please input n & r: 10 2 9Please input n & r: 0 0原因就是递归错误!4、思考与扩展1、写递归函数需考虑的要素:a.怎样取个变量或多个往下递归(
28、不是绝对,但是推荐这 么做,变量在传递中要有变化)b.怎样终止递归,要设置个合理的终止条件(原来的规律 不能成立,函数体递归前的代码不再能重复).递归过程中的暂时或中间结果怎样保存(不是每个递归 都需考虑这个情况)。2、在递归版本中,当n大到26万时系统将发生栈溢出报错; 我个人觉得在递归与非递归之间觉得非递归函数比较好,因 为它节省了存储空间,大大提高了程序的执行效率。3多文件结构中头文件的作用是:避免调用函数时发生小 错误;而将程序划分多个程序好处是:1)、避免一而再, 再而三地重复编译函数,因为编译器总是以文件为单位工作 的。如果一个文件中包含的函数太多,则由于被修改的函数 总是少数的几
29、个,所以大多数正确的函数都得重新编译 次;2)、使程序更加容易管理。可以将程序按逻辑功能划 分,分解成各个源文件,便于程序员的任务安排,以及程序 调试;3)、把相关函数放到特定源文件中。题目3条件编译1、第一种条件编译1)程序源代码# i ncIudeus i ng namespace std;#def ine ye I low 定义一个标志符i nt ma i n ()(char ch;cout 请输入字母: end I ;c i nch;while (ch90&ch122)Icout输入的不是字母,重新输入:end I ;ci nch;#ifdef yellow 标志符存在时执行此段代码,
30、否则执行 else后的代码段if (ch=65&ch=97&ch=122)ch=32;cout 转换成大写字母为: ch . end I ;#end i freturn 0;I2)、运行结果标志符存在时结果为:注析标志符时结果为:与计划结果一致!3)、程序调试刚开始编译代码时没有定义标志符,导致后面的程序执 行停止,没有达到条件编译的效果;在加上#def i ne ye I low 和#ifdef yellow后,此时就实现了条件编译的功能!2、第二种条件编译1)、程序代码# i no Iude us i ng namespace std;# define LETTER 1i nt ma i
31、n ()(char ch;cout 请输入字母: end I ;c i nch;while(ch90&ch122)Icout输入的不是字母,重新输入:end I ;ci nch;# if LETTER 1 ch=65&ch二90ch+=32;cout 转换成小写字母为: ch . end I ;# e I sea一二32;cout 转换成大写字母为: ch . end I ;#end i freturn 0;2)、运行结果3、思考和扩展一般情况下,源程序中所有的行都参加编译。但是有时 希望对其中一部分内容只在满足一定条件进行编译,也就 是对一部分内容指定编译的条件,这就是“条件编译”。有时,
32、希望当满足某条件时对一组语句进行编译,而当条件不满足 时则编译另组语句。由条件编译的形式:# i fdef标识符程序段1# e I se程序段2# end i f它的作用是:当标识符已经被定义过(一般是用 #define命令定义),则对程序段1进行编译,否则编译程序 段2。3.5实验五 指针和引用(20121021第十周)题目1程序分析1分析原程序(1)代码及分析# i ncIudeus i ng namespace std;vo i d swapref (i nt *p1, i nt *p2) ; /函数声明i nt ma i n ()( coutend I ;int iv 仁888; 初始
33、化 iv1i nt *po i nter_1 ; /定义b整型的指针变量pointer_1=&iv1;cout i v1= i v1 end I ;cout*pointer_! =poi nter_1 end I ;cout&iv1 =&iv1 endI ;coutpoi nter_1 =poi nter_1end I ;couti nt i v2=666; /初始化 iv2i nt *pointer_2; 定义另一整型的指针变量 po i nter_2=& i v2;cout i v2= i v2end I ;cout*poi nter_2 =*poi nter_2endI ;cout&i
34、v2 =&i v2end I ;coutpointer_2 =pointer_2end I ;coutenendcout i v1二cout i v2二cout*po i nter_1 = cout*po i nter_2 = coutpoi nter_1 二 coutpoi nter_2 二i v1end I ;i v2end I ;*po i nter_1 end I*po i nter_2end Ipo i nter_1 end I ;po i nter_1 end I ;return 0;swap (po i nter_1, po i nter_2) ; /调用函数 swap ( vo
35、 i d swap (i nt *p1, i nt *p2) 函数定义 (int temp; 定义中间变量(作交换)temp二p1;*p1=*p2;*p2=temp;(2)、运行结果(3)、分析运用了两个普通变量pointer、pointer_2作为形参,当改变实参时,实现p1、P2的交换。2、如果将swap函数改为如下形式,则输出结果为:uoid swap(int *p1,int *p2) (int * temp;tenp=p1;p1=p2;p2=temp;分析:运用了两个指针变量pl、p2作为函数参数,即所谓的“传 址调用”,这种调用是双向的,在执行函数期间形参值发生的变化传 回给实参,因
36、为在调用函数时,形参和实参占用同一存储单元,实现 了值的交换。3、如果将swap函数改为如下形式,主函数中函数调用改为:swap( ivl,uoid swap(int &p1,int &p2)int temp;temp = p1;P1 = P2;p2 = temp;其结果为:分析:当程序调用函数swap时,实参ivl,iv2分别初始化了引用pl、p2,所以pl、p2分别是ivl、iv2的别名,对pl、p2的访问就是对ivl、 iv2的访问。调用函数sw叩后,引用的值交换了,即实参的值也随之 改变。4、思考与扩展普通变量作形参,参数的传递是从实参变量到形参变量的单方向上值的传递,改变形参不会影响
37、实参;指针作形参,在被调函数中,用指针类型形参接受该变量的地址,并改变形参所指向变量的值;引用作函数形参,形参是实参的引用,或者说是别名,函数操 纵的形参是实参的别名,因而可以改变实参的值。题目2班级课程成绩计算1、程序源代码(第一种方法实现)#include #define N 5using namespace std;int num5;定义字符串数组num50int i,j,sco55;定义一个二维数组来接收成绩数据int main()(void input_data();声明一个确定学生数的函数void averscore。;/声明一个求平均成绩的函数int avercourse(int
38、);/声明一个求平均分数的函数input_data();averscore();函数的调用while。!=0)cout请输入要求平均分课程的门数:;cinj;avercourse(j);) return 0;)void input_data()(for(i=0;iN;i+)(cout请输入第个学生的学号:;cinnumi;维数组用来接收学号的数据 for(j=0;j5;j+)(cout请输入第”j+l门课程的成绩; cinscoij;)void averscore()int avsco5,meimenpj5,sum=0,grade=0: 定义两个数组字符的 初始化for(i=0;iN;i+)
39、循环语句实现平均成绩的求值|sum=O;每次循环sum都要初始化for(j=0;j5;j+)(sum=sum+scoi j ;)avscoi=(sum/5);平均成绩等于五门成绩之和除以五)for(j=0;j5;j+)循环语句实现每门平均成绩等于各个学生同一 门成绩之和除以学生数(for(i=O;iN;i+)(grade=grade+scoi j;)meimenpjj=(grade/N);除以 n使计算量增加for(i=0;iN;i+)cout学号是学生的平均成绩为:avscoiendl;for(j=0;j5;j+)cout 第,课程的成绩sco jendl; int avercourse(int j)(float pjfengshu,sum=O;for(i=0;iN;i+)(sum=sum+scoij;)pjfengshu=(sum/N);cout第11门课程的平均分数是:pjfengshuendl;return 0;2、运行结果(输入组数据结果如下)3、分析(1)、建立数组和编写数组函数是注意数组名要对应;(2)、由于这个题目巧合(学生个数和科目的门数一致), 所以我在写代码是常常把下标值还有循环对象搞混。4、思考与拓展(1)、用二维数组名作为实参或形参,在被调用函数中 对形参数组定义时可以指定所有