C++实验报告汇总_第1页
C++实验报告汇总_第2页
C++实验报告汇总_第3页
C++实验报告汇总_第4页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

目录TOC\o"1-5"\h\z\o"CurrentDocument"3.2实验二C++程序设计初步(2012“〇”9第七周) 11Tl3^*JoJ. 1题目2设ii 1•计算+、-、・、/的程序 7题目3计算生日时星期几 11\o"CurrentDocument"3.3实验三函数与程序结构(2012/10/26第八周) 15题日!分析そ3E序Jる口杲 15题目2函数的递归调用和多文件结构 20题目3条件编译 26\o"CurrentDocument"3.5实验五指针和引用(2012-10-21第十周) 30\o"CurrentDocument"题目1程序分析 30题目2班级课程成绩计算 35题目3排序查找 40\o"CurrentDocument"实验ハ类和对象(2012-11-23第十二周) 43题目1图形类设计 43题目2学生类设计 48题目3人员管理 53\o"CurrentDocument"实验九继承与派生(2012-12-1第十三周) 60\o"CurrentDocument"题目2教师干部类 60\o"CurrentDocument"实验十多态与虚函数 63题目1图形类 63\o"CurrentDocument"实验十一运算符重载 68题目1重载<,>,== 68题目2重载加减法 72\o"CurrentDocument"实验十二文件操作 89题目1二进制文件操作 893.2实验二C++程序设计初步(2012/10/19第七周)题目1计算员工周エ资1ゝ程序源代码(1)用if—elseif语句实现#incIude<iostream>usingnamespacestd;intmain(){doubIeworktime;doubIewage,wageph;cout«"PIeaseinputempIoyee's worktime andwageph:"«endI;cin»worktime;cin»wageph;if(worktimeく=40)wage=worktime*wageph;eIseif(worktime<=60)wage二((worktime-40)*1.5+40)*wageph;eIsewage=(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph;cout«"TheempIoyee'swageis:"«wage«endI;return0;](2)用Switch语句实现#inoIude<iostream>usingnamespacestd;intmain()(intcounti〃定义变量存储时间系数doubIeworktime;doubIewage,wageph;cout«"PIeaseinputempIoyee'sworktimeandwageph:"«endI;cin»worktime»wageph;if(worktime>60)count=3;eIsecount=worktime/20;〃获得时间系数switch(count)(case0:〃时间系数在。〜1之间没有工资没有加倍wage:worktime*wageph;break;wage=((worktime-40)*1.5+40)*wagephi〃时间系数为2时按原来工资的1.5倍发放工资

break;wage=(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph; //时间系数为3时按原来工资的3倍发放工资break;default:break;}cout«"TheempIoyee'swageis:"«wage«endI;return0;)2、运行结果按要求输入三组测试数据,运行结果如下:(经检验试睑结果正确,代码无错误,实验成功)3、程序调试(1)ゝ在用if-else时,如果if-else不配对系统则会报出以下错误:Cpp1.cppH:\C**shiyan\Cpp1.cpp(13):errorC2146:syntaxerror:missing*;*beforeidentifier'wage'H:\C**shiyan\Cpp1.cpp(14):errorC2181:illegalelsewithoutmatchingif执行cl.exe时出错・因此使用if-else时要注意配对,他们是成对出现的。(2)、在使用switch是要注意与case搭配,而且如果switch()括号内必须有循环判断参数,否则出现以下错误:H:\C++shiyan\Cpp1-1.cpp(26):errorC2047:illegaldefaultH:\C++shiyan\Cpp1-1.cpp(26):errorC2043:illegalbreak执行cl.exe时出错・4、思考与扩展如果程序运行时循环输入并给出计算结果,并当当用户输入〇时程序结束,程序该修改为:#incIude<iostream>usingnamespacestd;intmain()IdoubIeworktime;doubIewage,wageph;while(1) 〃定义循环开始(cout«"PIeaseinputempIoyee'sworktimeandwageph:"«endI;cin»worktime;cin»wageph;if(worktime!=0&&wageph!=0)〃进入循环的条件(if(worktime<=40)wage=worktime*wageph;eIseif(worktimeく=60)wage=((worktime-40)*1.5+40)*wageph;eIsewage二(((worktime-60)*3.0+(60-40)*1.5)+40)*wageph;cout«,'TheempIoyee'swageis:"«wage«endI;)eIseexit¢0);}return0;)运行结果如下:题目2设计ー个计算+、ー、・、/的程序1、程序代码#include<iostream>usingnamespacestd;#defineN100intmain()(charop;〃定义符号变量,代表+、ー、・ヽ[\ntresult,operandl,operand2,t,i;〃t为交换变量,i为循环变量cout«"peaIseintputarithmeticexpression:"«endI;for(i=0;i<N;i++)(cin»operand1»op»operand2;if((operandl!=0)||(op!='O')||(operand2!=0))//当各变量都不为〇时执行下列操作,否则跳过此switch操作switch(op){case':resuIt=operand1+operand2;cout<<operand1«op«operand2«"="«resuIt«endI;break;case:if(operand1<operand2)〃减法是若前一个比后个小时进行交换(t=operand1;operand1=operand2;operand2=t;}resuIt=operand1-operand2;cout«operand1<<op«operand2«"="«resuIt«endI;break;caseresuIt=operand1*operand2;cout«operand1<<op«operand2«"="«resuIt«endI;break;case'/':if(operand2!=0)〃分母为〇时不执行(resuIt=operand1/operand2;cout«operand1<<op«operand2«"="«resuIt«endI;1eIsecoutくぐ输入错误!”くくendI;break;defauIt:break;11eIseexit(O);//跳出系统system("pause");〃让显示界面不消失return0;2、运行结果按要求输入数据结果如下:3、程序调试与改进(1)ゝ如果if((operand"!!=0)||(op!ゴ。‘)||(operand2!二0))改成if((operand"!!=0)&&(op!='0')&&(operand?!=0))则不能进入循环执行后面的case:if(operand2?=0)result=operand1/operand2;cout<<operand1<<op<<operand2<<*'="<<result<<endl;>elsecout«"输入错误?••く<endl;break;因为并关系如果有一个。则整个循环都无法进入!(2)、在进行减法时,如果没有判断,但前ー个比后一个数小时则会出现负数,为了解决这个则加上判断case:if(operand1<oPerand2)〃减法是若前ー个比后个小进行交换<t=operand1;operand1=operand2;operand2=t;}result=operand1-operand2;cout<<operand1<<op<<operand2<<,,="<<result<<endl;break;题目3计算生日时星期几1、程序代码#include<iostream>usingnamespacestd;voidmain()(intyear,month,dayJ〃定义变量y,m,d分别表示所求的那天的年月日inti; 〃定义循环变量cout«"pIeaseenteryearmonthday:"«endI;cin»year»month»day;while(year!=0&&month!=0&&day!=0)inttotal=0;for(i=1;i<year;i++)〃(1)对所输入的年进行循环,if((i%4==0&&i%100!=0)11i%400==0) 〃判断是否为闰年total+=366;)eIse(totaI+=365;)1for(i=1;i<month;i++)//(2)对一年中的每月进行循环,其中1、3、5ゝ7、8、10、12在原有天数的基础上加31天,以下以此类推(if(i==1||i==31|i==51|i==71|i==81|i==10||i==12)(totaI+=31;)elseif(i==41|i==61|i==91|i==11)totaI+=30;elseif((year%4=0&&year%100!=0)||year%400=0)(totaI+=29;)eIse(totaI+=28;))total+=day; //totaI再加上这个月度过的天数即得从纪年开始到所求的那经过的总天数coutくく”到目前为止总天数为:"くくtotaIくくendI;switch(total%7)//(3)totaI对7求余,就会得到星期数,由于公元一年一月一日是星期一有以下结果(case0:cout«"TadayisSunday"«endI;〃若余数为〇,则输出"这一天是星期日"break;cout«"TadayisMonday"«endI;

break;cout«''TadayisTuesday"«endI;break;cout«"TadayisWednesday"«endI;break;cout«"TadayisThursday"«endI;break;cout«"TadayisFriday"«endI;break;cout«cout«"TadayisSaturday"«endI;break;cout«"pIeaseenteryearmonthday:"«endI;cin»year»month»day;2、运行结果按要求输入数据显示结果如下:3、程序调试(1)循环whiIe(year!=0&&month!=0&&day!=0)的控制范围不对,执行输入ー组数据时就会进入死循环(2)在whiIe循环体内执行年月循环时不能直接把输入的年月来作循环变量,因为会导致赋值错误!所以我引入ー个中间变量i,并定义for(i=1;i<year;i++)和for(i=1;i<month;i++)〇问题得到解决。3.3实验三函数与程序结构(2012/10/26第ハ周)题目1分析程序运行结果ハ程序代码#inoIude<iostream>usingnamespacestd;intnニ〇;intfunc(intx=10);//声明带一个参数的func函数voidmain0(inta,b;a=5;b=func(a);//b的值为调用func函数时的返回值a+bcout«"\nIocaIa="«a«endI«"localb="«b«endl«"globlen="«n«endI;a++;//a自增1b=func(a);//a自增1后再次调用func函数cout«"\nIocaIa="«a«endI«"localb="くくbくくendI«"globaIn="«n«endI;func0;〃调用空func函数,无参数时使用默认值1intfunc(intx)(inta=1;//a为临时变量,每次执行都需要重新赋值staticintb=10;//b定义为静态存储变量,每次赋的新值都不变a++;b++;x++;n++;cout«"\nIocaIa="くくaくくendI«"localb="«b«endl«"parameterxゴくくxくくendI;returna+b;2、运行结果:セ.E:\cpp实装在Vorkgroup(Teacher)上、实势三、Debug'Cppl.exe"|-]n]locala=2localb=llparameterx=6locala=5localb=13globlen=llocala=2localb=12parameterx~7locala=6localb=14globaln=2locala=2localb=13parameterx=llPressanykeytocontinue.3、程序分析1)程序输出的五段内容分别是从函数func和主函数中输出的。第一段和第三段从函数func中输出,第二段和第四段从主函数中输出。2)在函数main和函数func中各自定义了局部变量a和b,它们的作用域在各自的函数范围之内,因此在两个函数中输出的a,b值是不相干的。主函数中的a值开始为5J后来增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;程序运行结果如下:■"H:\cpp^^在Workgroup(Teacher)上供^H\Debug\3改一.exe, __®区」locala=2localb=llparanetei*x=lllocala=10localb=13globlen=llocala=2localb=12parameterx=12locala=11localb=14globaln=2locala=2localb=13parameterx=llPressanykeytocontinue5、思考与扩展1)将函数func〇中的变量staticintb=10;改为intb,此时b没有初始化,因此b的值就是地址值;程序运行结果:2)如果将main()函数中定义变量的语句inta,b;移到程序第三行,程序运行结果是没有变化的,因为此时a,b为全局变量,在整个程序中都起作用,由于函数结构没有改变,因此结果是没有变化的。题目2函数的递归调用和多文件结构利用非递归方式实现1、程序源代码#incIude<iostream>usingnamespacestd;doubIefn(intn);//声明函数nn求n!doubIeCnr(intn,intr);//声明函数Cnr求C(n,r)intmain()Intn,r;while(1)cout«"pIeaseinputn&&r(输入〇〇结束):"くくendI;cin»n»r;〃输入〇〇表示结束程序if(nニニ0&&rニニ〇)break;if(n<1||n<r)〃检查输入的合法性coutくく"输入无效!”入endI;eIsecout«Cnr(n,r)«endl;}return0;)doubIefn(intn)//定义函数nn求n!(doubIesum二1;for(inti二1;iく二n;i++)sum二sum*i;returnsum;doubIeCnr(intn,intr) //定义函数Cnr求C(n,r)doubIes1,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的返回值:doublef=n(±nt:n>’ガテ三I的姜ダnc习てn*<doublesum-F;Fo»-<int:i--!;i<-n;i-*-*)sum3"sum-»i;letzulcsum;>doubleCnr*(int:n.in七r*> ✓ Cnr*C(n»r*)<doublesi9s29s3;si・午n(n):s2-Fn(r*>;s3-Fn(n—r*>;r*etzur-ns-|/(s2«s3>;//Cnr*jt;函数时注意要return的对象。利用递归方式实现1、程序代码#incIude<iostream>usingnamespacestd;doubIeCnr(intn,intr);〃声明递归函数intmain()(ntn,r;while(1)Icout«"PIeaseinputn&&r:"«endI;cin»n»r;if(n=0&&rニニ。)〃输入〇〇表示结束程序break;if(n<1||n<r)//检查输入的合法性cout«"Inputinvalid!"«endI;eIsecout«Cnr(n,r)«endI;}return0;)doubIeCnr(intn,intr)〃定义求C(n,r)if(r=0)〃判断是否满足递归结束条件return1;if(r==1)returnn;returnCnr(n,r-1)*(n-r+1)/rI〃递归规律注意(/n和/r)I2、运行结果JJ3、程序调试在最后归纳递归函数的时候,如果把return'cnr(n:r-1).(n-r+1)/r;这一句换成EurnCnr(n,r-1)*(n-r+1)/nJ那么结果就会出现结果不对的情况:FJ,E\Cprogram\c++$S\Debug\C++3.2.2.exe・ 【0丨回・屿・Pleaseinputn&&r:1029Pleaseinputn&&r:00原因就是递归错误!4、思考与扩展1、写递归函数需考虑的要素:a.怎样取ー个变量或多个往下递归(不是绝对,但是推荐这么做,变量在传递中要有变化)〇b.怎样终止递归,要设置ー个合理的终止条件(原来的规律不能成立,函数体递归前的代码不再能重复)〇〇.递归过程中的暂时或中间结果怎样保存(不是每ー个递归都需考虑这个情况)。2、在递归版本中,当n大到26万时系统将发生栈溢出报错;我个人觉得在递归与非递归之间觉得非递归函数比较好,因为它节省了存储空间,大大提高了程序的执行效率。3ゝ多文件结构中头文件的作用是:避免调用函数时发生小错误;而将程序划分多个程序好处是:1)、避免一而再,再而三地重复编译函数,因为编译器总是以文件为单位工作的。如果一个文件中包含的函数太多,则由于被修改的函数总是少数的几个,所以大多数正确的函数都得重新编译ー次;2)、使程序更加容易管理。可以将程序按逻辑功能划分,分解成各个源文件,便于程序员的任务安排,以及程序调试;3)、把相关函数放到ー特定源文件中。题目3条件编译1、第一种条件编译1)程序源代码#incIude<iostream>usingnamespacestd;#defineyeIlow〃定义一个标志符intmain()(charch;coutくぐ’请输入—字母:"くくendI;cin»ch;while(ch<651|ch>90&&ch<971|ch>122)Icoutくく"输入的不是字母,重新输入:"くくendI;cin»ch;}#ifdefyellow〃标志符存在时执行此段代码,否则执行else后的代码段if(ch>=65&&ch<=90)ch+=32;coutくぐ转换成小写字母为:"くくchくぐ’."くくendI;#eIseif(ch>=97&&ch<=122)ch~=32;coutくく"转换成大写字母为:"くくchくく"."くくendI;#endifreturn0;I2)、运行结果标志符存在时结果为:注析标志符时结果为:与计划结果一致!3)、程序调试刚开始编译代码时没有定义标志符,导致后面的程序执行停止,没有达到条件编译的效果;在加上#defineyeIlow和#ifdefyellow后,此时就实现了条件编译的功能!2、第二种条件编译1)、程序代码inoIude<iostream>usingnamespacestd;defineLETTER1intmain()(charch;coutくぐ’请输入—字母:"くくendI;cin»ch;while(ch<65||ch>90&&ch<97||ch>122)Icoutくく"输入的不是字母,重新输入:"くくendI;cin»ch;}ifLETTER1ch>=65&&chく二90ch+=32;coutくぐ转换成小写字母为:"くくchくく"."くくendI;eIsea一二32;coutくぐ转换成大写字母为:"くくchくく"."くくendI;#endifreturn0;2)、运行结果3、思考和扩展一般情况下,源程序中所有的行都参加编译。但是有时希望对其中一部分内容只在满足一定条件オ进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。有时,希望当满足某条件时对一组语句进行编译,而当条件不满足时则编译另ー组语句。由条件编译的形式:ifdef标识符程序段1eIse程序段2endif它的作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2。3.5实验五指针和引用(2012・10・21第十周)题目1程序分析1ゝ分析原程序(1)代码及分析#incIude<iostream>usingnamespacestd;voidswapref(int*p1,int*p2);//函数声明intmain()(cout«" "«endI;intiv仁888;〃初始化iv1int*pointer_1;//定义—"b整型的指针变量pointer_1=&iv1;cout«"iv1 ="«iv1«endI;cout«"*pointer_!="くく・pointer_1«endI;cout«"&iv1="«&iv1«endI;cout«"pointer_1="«pointer_1«endI;

cout«intiv2=666;//初始化iv2int*pointer_2;〃定义另一^整型的指针变量pointer_2=&iv2;cout«"iv2 ="«iv2«endI;cout«"*pointer_2="«*pointer_2«endI;cout«"&iv2="«&iv2«endI;cout«"pointer_2="«pointer_2«endI;cout«""«en"«endcout«"iv1 二cout«"iv2 二cout«"*pointer_1=cout«"*pointer_2=cout«"pointer_1二cout«"pointer_2"«en"«endcout«"iv1 二cout«"iv2 二cout«"*pointer_1=cout«"*pointer_2=cout«"pointer_1二cout«"pointer_2二«iv1«endI;«iv2«endI;«*pointer_1«endI«*pointer_2«endI«pointer_1«endI;«pointer_1«endI;return0;inttemp;〃定义中间变量(作交换)temp二・p1;*p1=*p2;*p2=temp;(2)、运行结果(3)、分析运用了两个普通变量pointer」、pointer_2作为形参,当改变实参时,实现p1、P2的交换。2、如果将swap函数改为如下形式,则输出结果为:uoidswap(int*p1,int*p2)(int*temp;tenp=p1;p1=p2;p2=temp;分析:运用了两个指针变量・pl、・p2作为函数参数,即所谓的“传址调用”,这种调用是双向的,在执行函数期间形参值发生的变化传回给实参,因为在调用函数时,形参和实参占用同一存储单元,实现了值的交换。3、如果将swap函数改为如下形式,主函数中函数调用改为:swap(ivl,uoidswap(int&p1,int&p2)<liv2);>inttemp;tempiv2);>inttemp;temp=p1;P1=P2;p2=temp;其结果为:分析:当程序调用函数swap时,实参ivl,iv2分别初始化了引用pl、p2,所以pl、p2分别是ivl、iv2的别名,对pl、p2的访问就是对ivl、iv2的访问。调用函数sw叩后,引用的值交换了,即实参的值也随之改变。4、思考与扩展①普通变量作形参,参数的传递是从实参变量到形参变量的单方向上值的传递,改变形参不会影响实参;②指针作形参,在被调函数中,用指针类型形参接受该变量的地址,并改变形参所指向变量的值;③引用作函数形参,形参是实参的引用,或者说是别名,函数操纵的形参是实参的别名,因而可以改变实参的值。题目2班级课程成绩计算1、程序源代码(第一种方法实现)#include<iostream>#defineN5usingnamespacestd;intnum[5];〃定义字符串数组num[50]inti,j,sco[5][5];〃定义一个二维数组来接收成绩数据intmain()(voidinput_data();〃声明一个确定学生数的函数voidaverscore。;//声明一个求平均成绩的函数intavercourse(int);//声明一个求平均分数的函数input_data();averscore();〃函数的调用while。!=0){coutくぐ请输入要求平均分课程的门数:";cin»j;avercourse(j);)return0;)voidinput_data()(for(i=0;i<N;i++)(cout<ぐ请输入第" ぐ个学生的学号:";cin»num[i];〃ー维数组用来接收学号的数据for(j=0;j<5;j++)(cout<<"请输入第”《j+l<ぐ门课程的成绩ア;cin»sco[i][j];))}voidaverscore()intavsco[5],meimenpj[5],sum=0,grade=0:〃定义两个数组字符的初始化for(i=0;i<N;i++)〃循环语句实现平均成绩的求值|sum=O;〃每次循环sum都要初始化for(j=0;j<5;j++)(sum=sum+sco[i][j];)avsco[i]=(sum/5);〃平均成绩等于五门成绩之和除以五)for(j=0;j<5;j++)〃循环语句实现每门平均成绩等于各个学生同一门成绩之和除以学生数(for(i=O;i<N;i++)(grade=grade+sco[i][j];)meimenpj[j]=(grade/N);〃除以n»使计算量增加}for(i=0;i<N;i++)cout«"学号是学生的平均成绩为:"«avsco[i]«endl;for(j=0;j<5;j++)cout<ぐ第"ぐ,课程的成绩"《scoロ][j]«endl;}intavercourse(intj)(floatpjfengshu,sum=O;for(i=0;i<N;i++)(sum=sum+sco[i][j];)pjfengshu=(sum/N);cout<ぐ第11门课程的平均分数是:"<<pjfengshu«endl;return0;2、运行结果(输入ー组数据结果如下)3、分析(1)、建立数组和编写数组函数是注意数组名要对应;(2)、由于这个题目巧合(学生个数和科目的门数一致),所以我在写代码是常常把下标值还有循环对象搞混。4、思考与拓展(1)、用二维数组名作为实参或形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小,但是不能省略第二维的大小,这是由编译器原理限制。题目3排序查找1ゝ程序代码#include<iostream>#defineN15usingnamespacestd;voidsort(int*p)(inti,j,temp;for(i=0;i<N;i++)for(j=l;j<N-i;j++)if(*(p+j-l)v*(p+j))(temp=*(p+j-l);*(p+j-l)=*(p+j);*(p+j)=temp;)1intfind(int*p,intkey)(inti,high,low,mid;low=0;high=N-l;

mid=(high+low)/2;while(low<=high&&*(p+mid)!=key)if(key>*(p+mid))high=mid-l;elselow=mid+l;mid=(low+high)/2;}if(low<=high)returnmid+1;elsereturn0;voidmain()(int*p,number[N],i,key,pos;for(i=0;i<N;i++)〃输入I5个整数{cout«"输入第"ぐ个整数:";cin»number[i];}p=number;sort(p);〃从大到小排序cout<<"排序后的结果:"«endi;for(i=0;i<N;i++)(cout«""«*(p+i);)cout<〈"输入要查找的数:"<<endl;cin»key;pos=find(p,key);〃折半查找if(pos==0)cout«"无此数."《endl;elsecout«key<〈"是数组中第"<<pos<<"个元素的值."<<endl;}2、运彳丁结果输入ー组测试数据结果如下536987221568901452595630输入ー组测试数据结果如下042960258915553536987216 -发货仅仅仅042960258915553536987216 -发货仅仅仅货货1514987653祠人要查找的数:■"E:\Inr»portant\Cprogram\c++S^^\Debug\chazhaopaixu.exe"5是数组中第14个元素的色.Pressanykeytocontinue3、分析(1)、在排序算法中用指针法访问数组元素时,注意指针的对象,同时在比较式注意条件!f(-(P*j-1X*(P*j))(2)、注意折半查找发的实现。4、思考与扩展(1)、因为数组名相当于指向数组的地址的指针,可以通过这个指针来访问。(2)、指针函数和函数指针的区别:指针函数是指返回值是指针的函数,即本质是ー个函数;“函数指针”是指向函数的指针变量,因而“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。3.8实验ハ类和对象(2012-11-23第十二周)题目1图形类设计1X程序源代码#include<iostream>#include<math.h>usingnamespacestd;classShape//抽象类,公共基类(public:virtualdoubleGetArea()const=0;〃计算各对象面积virtualdoubleCir()const=0;//计算各对象周长virtualvoidShow()=0;〃输出各对象面积和周长};classRectangle:publicShape〃矩形类(private:doublelength;〃长doublewidth;〃宽public:Rectangle(doublelength=0,doublewidth=0)//构造函数{this->length=length;this->width=width;}doubleGetArea()const//矩形面积{returnlength*width;)doubleCir()const//矩形周长(return2*(length+width);)voidShow。//输出矩形面积和周长(cout«"Areais:M«GetArea()«endl;cout«"Ciris:n«Cir()«endl;coutv<”长:u«length«endl;cout<<"宽:n«width«endl;}};constdoublePI=3.14159;classCircle:publicShape〃圆类(private:doubleRadius;〃圆的半径doublex,y;〃定义圆心public:Circle(doubleRadius=0,doublex=0,doubley=0)〃构造函数(this->Radius二Radius;this->x=x;this->y=y;)doubleGetArea()const//圆面积(returnPI*Radius*Radius;)doubleCir()const//圆周长(return2*PI*Radius;}voidShow()〃输出圆的面积和周长(cout«"Areais:,,«GetArea()«endl;coutvv”Ciris:"vvCir()«endl;cout<〈“圆心、:“vv"("v<x<v"Jv<yvv")“vvendl;coutv〈"直径:“vv2*Radius«endl;));classTriangle:publicShape〃三角形类{private:doublea,b,c;〃三角形三边public:Triangle(doublea=0,doubleb=0,doublec=0)〃构造函数this->a=a;this->b=b;this->c=c;doubleGetArea()const//三角形面积doublep;p=(a+b+c)/2;returnsqrt(p*(p-a)*(p-b)*(p-c));}doubleCir()const//三角形周长{return(a+b+c);}voidShow()〃输出三角形面积和周长(cout«'*Areais:"«GetArea()«endl;cout«MCiris:”v〈Cir()<vendl;coutvv”止匕三角形的三边为:“vvavv””vvbvv"”<vcvvendl;)};voidmain()(charq;while(l)(coutvv”输入任意数字或字母开始(输入#结束):"vvendl;cin»q;if(qニニ#)exit(O);else(doublelength,width,Radius,a,b,c,x,y;coutvぐRectangle:"vvendl;loopa:cout«H请输入矩形的长和宽(length,width):"vvendl;cin»length»width;if(length<=0||width<=0){cout<<"输入的长宽不能构成一个矩形!请重新输入!”<<endl;gotoloopa;}else(RectangleRect(length,width);〃建立矩形对象Rect.Show();〃调用矩形类的输出函数cout«'*Circle:H«endl;loopb:coutvv”请输入圆形的半径(Radius):"《endl;cin»Radius;cout<<"输入圆心:cin»x»y;if(Radius<=0){cout<<"输入的半径不能构成一个圆!请重新输入!”<<endl;gotoloopb;)else{CircleCir(Radius,x,y);〃建立圆对象Cir.Show();〃调用圆类的输出函数cout«"Triangle:"«endl;}loopc:cout«"请输入三角形的三边(a,b,c)ア<<endl;cin»a»b»c;if(a<=0||b<=0||c<=0||(a+b)<=c||(a+c)<=b||(b+c)<=a)〃判断是否能构成三角形{coutくぐ,输入的三边值不能构成一个三角形!请重新输入!"<<endl;gotoloopc;}else{TriangleTri(a,b,c);〃建立三角形对象Tri.Show();〃调用三角形输出函数2、运行结果c\"F:\cpp实验在,orkgroup(Teacher)上、实验8\Debuハ卖套8.exe崭森矍舞霹母开為?双!暮〉:1Rectangle:请输入矩形的长和宽〈lengthzidth〉:2030Areais:600Cii*is:100长:20宽,30Circle:请输入圆形的半径(Radius):5输入圆心!2030Areais:78.5397Ciris:31.4159圆心:(20,30〉直径:1。Triangle:请输入三角形的三边(a,b,c〉:201050输入的三边值不熊构成一个三角形,请重新输入,请输入二扇形的二边〈"b,c〉:203040Areais:290.474Ciris:90此三角弦的三边为:203040输入任靑数字或字母开始(输入M结束):VPressanykeytocontinue3、程序分析1)、注意在构造一个类后,必须由这个类创建一个对象,然后类的相关函数オ会起作用,オ可以访问里面的私有成例如:classCirclezpublicShape〃圆类(priuate:doubleRadius;〃圆的半径double 〃定义働心public:Circle(doubleRadius=G,doublex=0,doubley=G)〃构造函数<this->Radius=Radius;this->x=x;this->y=y;>doubleGetArea()const/ノ圆面积<returnPI*Radius*Radius;>doubleCir()const〃圆周长<return2»PI»Radius;>voidShow()〃输出圆的面积和周长<cout«"Areais:"«GetArea()«endl;cout<<"Ciris:"*<<Cir()<<endl;coutくく,・圆心:・yぐ,(•,くくxくく。•,,・くくリくく“)•。くくendl;coutくぐ,直径:-«2*Radius«endl;>ヽ:这里创建了一个圆类,那么再主函数里面必须创建一个圆类对象,然后调用show函数才可以把相关参数输出来:CircleCir(Radius,x,y);〃建立圆对象Cir.Sh呼,;/嶼用圆类的输岀函劉 否则输出就会乱码!2)、其他的两个类也要遵循以上的规律。3)、注意私有成员不能在主函数里面直接访问。题目2学生类设计1、程序源代码#include<iostream>#include<string>#defineN100usingnamespacestd;intcount;〃定义学生人数classStudent〃学号、姓名、所属院系,成员函数包括访问和修改这些属性private:stringxuehao;stringname;stringsex;stringbirth;stringGrade;stringClass;stringdepartment;stringmajor;public:Student(stringx,stringn,strings,stringb,stringG,stringC,stringd,stringm){xuehao=x;name=n;sex=s;birth=b;Grade=G;Class=C;department=d;major=m;}stringgetxuehao(){returnxuehao;}stringgetname()(returnname;}stringgetsex()(returnsex;}stringgetbirth()(returnbirth;}stringgetGrade(){returnGrade;}stringgetClass()returnClass;}stringgetdepartment()(returndepartment;}stringgetmajor(){returnmajor;}voidSetinfo(stringx,stringn,strings,stringb,stringG,stringC,stringd,stringm)//修改属性(xuehao=x;name=n;sex=x;birth=b;Grade=G;Class=C;department=d;major=m;)voidShow()(cout«"学号姓名性别生日年级班级院系专业"«endl;for(inti=0;i<count;i++)(cout«xuehao«""«name«""«sex«""«birth«""«Grade«""«Class«""«department«""«major«""«endl;}));intmain()(stringa,b,c,d,e,f,g,h;cout«"请输入学生数(1数00):"<<endl;cin»count;if(count>N)cout«"人数过多装不下,请重新正确输入!”<<endl;elsecout«"输入第"《i+l«"个学生的资料:"<<endl;cout«"输入学号:"«endl;cin»a;cout«n输入姓名:"«endl;cin»b;cout«H输入性别:H«endl;cin»c;coutくぐ输入生日(如1990/01/01):H«endl;cin»d;cout«"输入年级:"«endl;cin»e;cout«”输入班级:"vvendl;cin»f;cout<<”输入院系:"<<endl;cin»g;coutv<"输入专业:“vvendl;cin»h;}coutv〈”运行结果:”vvendl;Students(a,b,c,d,e,f,g,h);s.Show();s.Setinfd(a,b,c,d,e,f,g,h);)system(npause");return0;)2、运行结果输入ー组数据后显示结果如下:蟹个季号:姓名songsongsongsongsong月月月月月—.姓名songsongsongsongsong月月月月月—.0^11111草年年年年5555588888基量级级4-00000年级班级Jy02computerJy02computerjy02computerjy02computerjy02computer院系专业softwaresoftwaresoftwaresoftwaresoftware3、程序分析首先定义了一个学生类,并定义好私有成员和公有成员,通intmain()过各种函数实现;在定义‘〃intcount:时,如果定义为局部变量,那么此变量只对主函数有作用,编译出错,所以要定位全局变量。4、思考与扩展定义多一个循坏变量,在循坏体里面自动按输入顺序生成学号。题目3人员管理1、程序源代码#include<iostream>#include<string>#defineN100usingnamespacestd;classDate(private:intyear;intmonth;intday;public:voidSetYear(intx){year=x;}voidSetMonth(intx){month=x;}voidSetDay(intx){day=x;}intGetYear(){returnyear;}〃获取年intGetMonth(){returnmonth;}〃获取月intGetDayO{returnday;}〃获取日Date():year(2000),month(1),day(1)()Date(intx,inty,intz)(year=x;month=y;day=z;});classemployee(private:intno;charname[16];Datebirth;charpos[32];public:voidSetname(char*n)voidSetpos(char*n)(strcpy(pos,n);}employee():no(0),birth(2000,1,1)strcpy(name,"Andyn);strcpy(pos,Hintemn);}employee&operator=(employee&x)(no=x.no;birth.SetYear(x.birth.GetYear());birth.SetMonth(x.birth.GetMonth());birth.SetDay(x.birth.GetDayO);strcpy(name,);strcpy(pos,x.pos);)employee(intn,char*str,Dateday,char*p)(no=n;strcpy(name,str);birth=day;strcpy(pos,p);)friendstringGetname(employeex)(stringname;inti;for(i=0;[i]!=ヘ〇';i++)name+=[i];returnname;)friendintGetno(employeex)(returnx.no;)friendDateGetbirth(employeex)(returnx.birth;)friendstringGetpos(employeex)inti;for(i=0;x.posfil!-\0,;i++)pos+=x.pos[i];returnpos;)};voidmain()(employee*persons[N];employeetemp;Dateday;intnum=0;inti,choose=1,choose1=0;intn,y,m,d;charstr[16];charp[32];cout«n\n\t\t=======================================n«endl;cout«n\t\tl:录入2:显示3:修改4:查找0:退出”《endl;cout«n\t\t=======================================n«endl;cout«"\n输入您要进行的操作:";cin»choose;while(choose!=0){switch(choose)(if(num==15)(cout«"full!\n";continue;)COUt<<”输入员エ编号:";cin»n;coutvv”输入员エ姓名:”;cin»str;coutv<”输入员エ生日:”;cin»y»m»d;COUtVV”输入员エ职位:";cin»p;persons[num++]=newemployee(n,str,Date(y,m,d),p);break;cout<<”编号、t”vv”姓名'ピ<<”生日ゼ《”职务”《endl;for(i=0;i<num;i++)cout«Getno(*persons[i])«,,\tn«Getname(*persons[i])«',\t,,«Getbirth(*persons[i]).GetYear()«H n«Getbirth(*persons[i]).GetMonth()«n,,«Getbirth(*persons[i]).GetDay()«"\t"«Getpos(*persons[i])«endl;)break;coutvv”输入员エ编号:“;cin»n;for(i=0;i<=num;i-t-+)(if(n==Getno(*persons[i]))(cout«n\n\nl:名字修改2:职位修改"vvendl;cout<v”选择您要进行的修改方式:”<<endl;cin»choosel;switch(choosel)(coutvv”输入员エ姓名:”;cin»str;persons[num-1]=newemployee(n,str,Date(y,m,d),p);break;cout<〈”输入员エ职位:”;cin»p;personsfnum-1l=newemployee(n,str,Date(y,m,d),p);break;}break;)elsecout<v”该员エ不存在”vvendl;)break;case4:cout<〈”输入员エ编号ア;cin»n;for(i=0;i<=num;i++)if(n==Getno(*persons[i]))cout«n编号\tn«n姓名ビ<ぐ性另リピ〈ぐ生日\t\t"«n职务n«endl;cout«Getno(*persons[i])«"\tn«Getname(*persons[i])«,'\t',«,,\tn«Getbirth(*persons[i]).GetYear()«,• "vvGetbirth(*persons[i]).GetMonth()vv”n«Getbirth(*persons[i]).GetDay()«M\tn«Getpos(*persons[i])«endl;break;)elsecout<<”该员エ不存在"vvendl;break;)break;)cout«"\n\t\t=======================================f,«endl;cout«n\t\tl:录入21显示3:修改4:查找0:退出"<<endl;cout«,'\t\t=======================================,'«endl;cout«"\n输入您要进行的操作:";cin»choose;2、运行结果價试数据]1、编号:10001姓名:jack出生日期:80年11月1日 职位:普通2、编号:10002姓名:andv出生日期:75年1月9日职位:经理3、编号:10003姓名:alex出生日期:81年4月3日职仏秘书输入测试数据:4I编号:10005姓名:El!出生日期:82年10月1H 职位:技师。、“E:、-iStVorlccroukb€Teacher)Jt\^^3fe8\Det>ue\exeX.录入2.並示3.優茂4.査找0.iB-ttdSJ入悠暮进行的操作=I»入为エ编号,to001す入w零工・姓:名,Weekテ入Rユニ注曰,る入员エ耳只位:普通±,录入2.我示3t傕改4S去找0.退出孑不智率妻な的操作=エ丁入雪エ绸石,X0002オ入者エ椎茗,and夕禰入员エ生日,751幫人员エ职位,纟至理1»录入2»显示3t修改イ,衽找0,祖田C1。X工耳只位,X«录入2.显示工耳只位,X«录入2.显示3«修・茂4.査找0.退出福!鬻,人员エ生日的揀作"t10005>lili10露入员エ职位技师1,1,录入2«显示3«修改4I査找0X退出10001Jack8010001Jack8011110002andy751910003alex814310005111182101S8毒理书师1S录入2«显示3S修改4S查找0!退出立入您要进行的操作:3マ人员エ编号:10001防您要进行或改方式:福人员エ姓名=IJq1S录入2S显示3:修改4:査找0t退出齢您要鬱的操鬍10001Jack80111

3、程序分析1)、在声明DATE类的时候,如果年月日设成:char型则程序支持文字或者字母输入;2)、本程序创建了两个类,则必须由此引出同一个对象(通过指针实现),否则编译ム报这样的错・errorC2512:*enployee*:noappropriatedefaultconstructorauailable3)、注意友元函数不是成员函数,故不能像成员函数一样去声明!4、思考与拓展每个员エ的信息都看成是ー个链表,存储着相关信息,然后定义ー个表头结点,并把每个员エ的表头指针定义ー个指针数组,最后通过文件来保存!3.9实验九继承与派生(2012-12-1第十三周)题目2教师干部类1、程序源码#include<string>#include<iostream>usingnamespacestd;classTeacher〃声明老师类(public:Teacher(stringnam,inta,strings,stringtit,stringad,stringt);voiddisplayO;protected:stringname;intage;stringsex;stringtitle;stringaddr;stringtel;};Teacher::Teacher(stringnam,inta,strings,stringtit,stringad,stringt):〃老リ帀类成贝函数的定义name(nam),age(a),sex(s),title(tit),addr(ad),tel(t){}voidTeacher::display()(coutvv”姓名:"v<name<〈endl;coutvv“年龄:”<<age«endl;coutvv”性别:“vvsexvvendl;cout«n职称:M«title«endl;coutw”地址:”vvaddrvvendl;coutvv”电话:”<vtelvvendl;)classCadre〃声明干部类public:Cadre(stringnam,inta,strings,stringp,stringad,stringt);voiddisplayO;protected:stringname;intage;stringsex;stringpost;stringaddr;stringtel;);Cadre::Cadre(stringnam,inta,strings,stringp,stringad,stringt):〃干部类成员函数的定义name(nam),age(a),sex(s),post(p),addr(ad),tel(t){}voidCadre::display()(coutvv”姓名:u«name«endl;coutvv“年龄:”<<agevvendl;cout«"性别:n«sex«endl;cout<v”职务:u«post«endl;cout«"地址:"《addrvvendl;cout«n电话:"<<tel«endl;}classTeacher_Cadre:publicTeacher,publicCadre〃声明多重公用派生类・教师兼干部类(public:Teacher_Cadre(stringnam,inta,strings,stringtit,stringp,stringad,stringt,floatw);voidshow();private:floatwage;};Teacher_Cadre::Teacher_Cadre(stringnam,inta,strings,stringt,stringp,stringad,stringtel,floatw):Teacher(nam,a,s,t,ad,tel),Cadre(nam,a,s,p,ad,tel),wage(w){}voidTeacher_Cadre::show()Teacher::display(); 〃指定域cout«n职务:n«Cadre::post«endl;//指定域cout«Hエ资:M«wage«endl;}intmain()(Teacher_Cadrete_cal(nzhang,,,20;,male,,,ntutor,V,普通职エ","Build305-503","6081202",1534.5);Teacher_Cadrete_ca2("chen",38,"male","associateprofessor•","副院长","Build3A-302H,"6088132",7534.5);Teacher_Cadrete_ca3(Mfan",30,"female","lectuerM,"教研室主任H,"Build2A-202n,"6088099",6782);te_cal.show();te_ca2.show();te_ca3.show();system("pause");return0;)2、运行结果3ゝ程序分析派生出来的TeachejCadre类,他继承了原来基类的属性,因此在创建对象时务必类型一致!3.10实验十多态与虚函数题目1图形类1V程序源代码#include<iostream>#include<math.h>usingnamespacestd;classSh叩e〃抽象类,公共基类(public:virtualdoubleGetArea()const=0;〃计算各对象面积virtualdoubleCir()const=0;//计算各对象周长virtualvoidShow()=0;〃输出各对象面积和周长);classRectangle:publicShape〃矩形类(private:doublelength;〃长doublewidth;〃宽public:Rectangle(doublelength=0,doublewidth=0)〃构造函数{this->length=length;this->width=width;}doubleGetArea()const//矩形面积(returnlength*width;)一doubleCir()const//矩形周长(return2*(length+width);}voidShow。//输出矩形面积和周长(cout«"Areais:,,«GetArea()«endl;cout«nCiris:"«Cir()«endl;coutvぐ'长:"«length«endl;cout«"宽:"«width«endl;));constdoublePI=3.14159;classCircle:publicShap

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论