版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《面向对象程序设计(C++)》课程实验指导书
安阳工学院计算机科学与信息工程学院
软件工程教研室
2023.9
编号:
课程总学时:64实验学时:32
课程总学分:3.5实验学分:
先修课程:C语言程序设计
合用专业:计算机科学与技术,网络工程,软件工程
一、本课程实验的重要目的与任务
《面向对象程序设计(C++)》是计算机专业学生的一门专业基础课。C++是一种高效
而又实用的程序设计语言,它既可以进行过程化程序设计,也可以进行面向对象程序设计,因
此成为了编程人员最广泛使用的工具。重要任务是介绍C++语言中的数据类型,运算,语句
结构及其程序设计的基本方法。使学生掌握一门高级程序设计语言,了解面向对象程序设计
的基本概念与方法,进而学会运用C++语言学会解决一般应用问题,从而掌握面向对象程
序设计的基本知识和基本技能。并为后续的专业课程奠定程序设计基础。
实验1C++基础
一、实验目的
1.加强学生掌握C++的基本知识点;
2.加强学生掌握I/0流;
3加强学生进一步理解函数的用法;
4理解引用的概念及应用。
三、实验内容
1.用函数返回值实现记录A类学生和B类学生个数,平均分大于等于80的为A类,其余为
B类。
四.实验指导
1.参考程序:
#include<iostream.h>
intmain()
(
coutvv”MynameisJone\n";
cout«,,theIDis”;
cout«2;
cout<<end1;
)
2.参考程序:
#include<iostream.h>
#include<iomanip.h>//要用到格式控制符
voidmain()
(
doubleamount=22.0/7;
cout<<amount<<end1;
cout<<setprecision(0)«amount<<endl
«setprecision(1)«amount«endl
<<setprecision(2)<<amount<<end1
«setprecision(3)«amount«end1
«setprecision(4)«amount«endl;
cout«setiosf1ags(ios::fixed);
cout<<setprecision(8)<<amount«endl;
cout«setiosflags(ios::scientific)<<amount«endl;
cout«setprecision(6);〃重新设立成原默认设立
)
3.参考程序:
#include<iostream.h>
#include<iomanip.h>
intmain()
(
intnumber=1001;
cout<<HDecimal:"«dec«number<<end1
<<"Hexadecimal:n«hex«number<<end1
«,'Octal:M«oct«number«endl;
return0;
)
4.参考程序:
#include<iostream.h>
#include<iomanip.h>
intmain()
(
cout«setfill(f*')
<<setw(2)«21«endl
<<setw(3)«21<<endl
<<setw(4)<<21<<end1;
cout«setfil1C•);//恢复默认设立
return0;
)
5.参考程序:
#inc1ude<iostream.h>
#include<iomanip.h>
voidmain()
(
cout«setiosflags(ios::right)
<<setw(5)«1
«setw(5)<<2
<<setw(5)<<3<<end1;
cout«setiosflags(ios::left)
«setw(5)«1
«setw(5)<<2
<<setw(5)«3<<endl;
)
6.参考程序:
#include<iostream.h>
voidmain()
(
constfloatPI=3.1415926f;
afloatr;
floatz,s;
«cout«"请输入圆的半径r=";
ocin»r;
BZ=2*PI*r;
s=PI*r*r;
®coutv<”圆的周长为:n<<z«end1;
cout«”圆的面积为:“<<s«endl;
)
7.参考程序:
#include<iostream>
usingnamespacestd;
intarray[6][4]={{60,80,90,75},
{75,85,65,77},
{80,88,90,98},
{89,100,78,81),
{62,68,69,75},
{85,85,77,91});
int&leve1(intgrade[],intsize,int&tA,int&tB);
intmain()
(
inttypeA=0,typeB=0;
intstudent=6;
intgradesize=4;
for(inti=0;i<student;i++)//解决所有的学生
level(array[ij,gradesize,typeA,typeB)++;〃函数调用作为左
值
cout〈〈"numberoftypeAis"«typeA<<end1;
cout«HnumberoftypeBis"«typeB<<endl;
//systemC'PAUSE");
return0;
)
int&level(intgrade[],intsize,int&tA,int&tB)
intsum=O;
for(inti=0;i<size;i++)〃成绩总分
sum+=grade[i];
sum/=size;//平均分
if(sum>=80)
returntA;//typeAstudent
else
returntB;//typeBstudent
}
运营结果:
实验2类和对象
1、实验目的:
掌握类的定义,根据具体需求设计类;
进一步理解C++中类的封装性;
会根据类创建各种对象;
掌握对象的各种成员的使用方法。
2、实验内容
定义一个满足如下规定的Date类。
(1)用下面的格式输出日期:日/月/年;
(2)可运营在日前上加一天操作;
⑶设立日期。
参考代码:
#inc1ude<iostream.h>
classDate
{
public:
voidDisp1ay();
voidAddOneDay();
voidSetDay(inty,intm,intd);
protected:
boolLegal(inty,intm,intd);
boolIsLeapYear(inty);
intyear;
intmonth;
intday;
);
voidDate::Disp1ay()
(
cout«day<<V,'<<month<<**/"<<year<<endl;
voidDate::AddOneDay()
if(Legal(year,month,day+1))
day++;
elseif(Legal(year,month+1,1))
month++,day=1;
elseif(Legal(year+1,1,1))
day=l,month=l,year++;
)
voidDate::SetDay(inty,intm,intd)
(
if(Lega1(y,m,d))
day=d,month=m,year=y;
)
boolDate::Legal(inty,intm,intd)
(
if(y>9999IIy<l||d<1||m<l||m>12)
retumfalse;
intdayLimit=31;
switch(m)case4:case6:case9:case11:dayLimit-
if(m==2)dayLimit=IsLeapYear(y)?29:28;
return(d>dayLimit)?falsetrue;
boolDate::IsLeapYear(inty)
return!(y%4)&&(y%100)I|!(y%400);
)
intmain()
(
Dated;
d.SetDay(2023,2,28);
d.Display();
d.AddOneDay();
d.Display();
system(nPAUSEu);
运营结果:
实验3继承与派生
1、实验目的:
理解继承的概念,学习如何使用基类成员,了解基类成员在派生类中的访问控制;
理解类的派生对代码复用的作用。
2、实验内容:
设计一个人员类person和一个日期类date,由人员类派生出学生类Student和教师类pro
fessor,学生类和教师类的数据成员birthday为日期类。
参考代码:
#include<string>
#inc1ude<iostream>
usingnamespacestd;
classdate
(
public:
date()
(
cout«*'Birthday:";
cin»year>>month>>day;
}
voiddisp1ay()
(
cout<<year<<,'-,'<<month«,'-,'«day;
)
private:
intyear;
intmonth;
intday;
);
classperson
(
protected:
char*name;
publie:
person();
};
person::person()
(
charnamestr[5O];
cout<<"Name:";
cin»namestr;
name=newchar[strlen(namestr)+1];
strcpy(name,namestr);
)
c1assstudent:publicperson
(
private:
intID;
intscore;
datebirthday;
publie:
student()
(
cout«"studentID:";
cin>>ID;
cout<<Mstudentscore:";
cin»score;
)
voiddisplay()
cout«°Thebasicinformation:"<<end1;
cout«ID<<H\tu«name«M\t"«score<<"\t";
birthday.display();
cout«endl;
)
};
classprofessor:publicperson
(
public:
professor()
(
cout<<nTeacherID:";
cin>>No;
cout<<"schooIteachingmajor:n;
cin>>major;
)
voiddisplay()
(
cout<<*'Thebasicinformation:"<<end1;
cout«n\tH«No«n\t,,«name«',\t"«major<<”\t
birthday.disp1ay();
cout«endl;
)
private:
intNo;
charmajor[l0];
datebirthday;
};
intmain()
(
studentstu;
stu.disp1ay();
professorprof;
prof.disp1ay();
system(uPAUSE");
return0;
运营结果:
实验4多态
1、实验目的:
掌握函数的概念及应用方法;
理解多态性的运用和作用。
2、实验内容:
新建一个基类shape类是一个表达形状的抽象类,area()为求图形面积的函数。请从sh
ape类派出矩形类(rectangle)、三角形类(triang1e)、圆类(circles)并给出具
体的求面积函数。
参考代码:
#include<iostream>
#include<math.h>
usingnamespacestd;
classshape
(
public:
virtualdoublearea()=0;
virtualvoiddisplay()=0;
shape(){}
);
c1assrectang1e:publicshape
(
publie:
rectangle(doublea=l,doub1eb=l)
{
x=a;
y=b;
)
doub1earea()
returnx*y;
voiddisp1ay()
cout<<area()«end1;;
)
private:
doublex;
doubley;
);
classtriang1e:publieshape
(
publie:
triang1e(doublea=1,doubleb=1,doublec=1)
(
x=a;
y=b;
z=c;
)
doublearea()
(
double1=(x+y+z)/2;
return(sqrt((l-x)*(1—y)*(l-z)*l));
voiddisplay()
cout«area()«endl;;
)
private:
doublex;
doubley;
doublez;
);
c1asscircles:publicshape
(
public:
circles(doub1eR=1)
{
r=R;
)
doub1earea()
return3.14*r*r;
voiddisplay()
cout<<area()«end1;;
private:
doubler;
};
intmain()
(
shape*p;
p=newrectangle(2,3);
p->disp1ay();
p=newtriangle(3,4,5);
p->display();
p=newcircles(2);
p—>display();
systemfPAUSEM);
return0;
)
运营结果:
实验5运算符重载
1、实验目的:
掌握运算符重载的概念及使用方法,掌握特殊运算符的重载规定和方法。
2、实验内容:
定义整数集合类intSet,实现如下功能:
定义类的构造函数,并根据需要可以定义多个构造函数。
(l)Clear函数:清空整数集合
(2)IsEmply():整数集合是否空集;
(3)IsMemberOf():判断某个整数是否在整数集合内
(4)0perator+:增长一个整数到整数集合中
(5)Operator-:从整数集合中删除一个整数元素;
(6)0perator==:判断两个整数集合是否相等;
(7)Operator*:求两个整数结合的交集;
(8)0perator+:求两个整数集合的交集;
(9)0perator=:整数集合的对象之间的赋值;
(10)OperatorVv:输出整数集合中的元素。
提醒:类intSet可以用数组的方式定义整数集合。例如:
intelement[200]:保存整数集合数据;
intE1ementNum:指示整数集合的最后一个元素位置
注意:一个整数集合中不允许有相同元素存在,二是集合中的元素没有顺序。
参考代码:
#inc1ude<iostream>
usingnamespacestd;
classintSet
(
public:
intSet();
intSet(inta[],intsize);
voidCiear();
boolIsEmpty();
boolIsMemberOf(inta);
booloperator+(inta);
booloperator-(inta);
booloperator==(intSet&set);
intSetoperator+(intSet&set);
intSetoperator*(intSet&set);
voidoperator=(intSet&set);
friendostream&operator<<(ostream&,intSet&);
protected:
。intelement[100];
intElementNum;
};
//初始化整数集合元素
intSet::intSet()
(
for(inti=0;i<100;i++)
。elementfi]=0;
E1ementNum=-1;
)
intSet::intSet(inta[],intsize)
(
“f(size>=100)
。ElementNum=99;
eIse
。E1ementNum=size-1;
fbr(inti=0;i<=ElementNum;i++)
element[i]=a[i];
for(inti=size;i<100;i++)
e1ement[i]=0;
)
〃清空整数集合元素
voidintSet::Clear()
(
for(inti=0;i<100;i++)
(
。element[i]=0;
»)
oElementNum=-1;
)
//判断整数集合是否为空
boo1intSet::IsEmpty()
(
if(ElementNum==—1)
eturnfalse;
eIse
阿eturntrue;
)
〃判断元素是否在整数集合中
boolintSet::IsMemberOf(inta)
(
®for(inti=0;i<ElementNum;i++)
。if(element[i]==a)
returntrue;
returnfalse;
〃往集合中增长一个元素
boolintSet::operator+(inta)
(
if(IsMemberOf(a))
。returntrue;
else
。(
if(E1ementNum==99)
returnfalse;
oeIse
00|
3ElementNum++;
eelement[E1ementNum]=a;
。returntrue;
)
}
)
〃从集合中删除一个元素
boo1intSet::operator-(inta)
(
intpos;
if(!IsMemberOf(a))
。returnfalse;
for(inti=0;i<=E1ementNum;i++)
if(element[i]==a)
p0s=1;
。break;
3}
°}
fbr(inti=pos;i<ElementNum;i++)
e1ement[i]=element[i+l];
ElementNum—;
eturntrue;
)
〃判断两个整数集合是否相等
boolintSet::operator==(intSet&set)
(
boolEqua1;
if(ElementNum!=set.ElementNum)
。returnfalse;
for(inti=0;i<=ElementNum;i++)
(
®®Equa1=false;
for(intj=O;j<set.E1ementNum;j++)
0{
“f(element。]==set.element[i])
°{
匕Equa1=true;
break;
°|
00J
oif(!Equal)
。returnfa1se;
。}
returntrue;
I
//求两个集合的交集
intSetintSet::operator+(intSet&set)
(
inta[100],size=0;
◎for(inti=0;i<=ElementNum;i++)
fbr(intj=0;j<=set.ElementNum;j++)
0(
时f(element[i]==set.e1ement[jj)
0{
。。。a[size]=element[i];
<>size++;
8break;
)
0)
returnintSet(a,size);
)
//求两个集合的并集
intSetintSet::operator*(intSet&set)
®inta[l0O],size;
fbr(inti=0;i<=E1ementNum;i++)
aLi]=element[i];
«>size=E1ementNum+1;
for(inti=0;i<=set.ElementNum;i++)
if(IsMemberOf(set.element[i]))
。continue;
。else
(
。if(size==99)
®break;
。a[size]=set.e1ement[i];
。size++;
0}
returnintSet(a,size);
}
//整数集合对象间赋值
voidintSet::operator=(intSet&set)
(
for(inti=0;i<=set.E1ementNum;i++)
。e1ement[i]=set.element[i];
E1ementNum=set.ElementNum;
)
〃输出整数集合中的元素
ostream&operator<<(ostream&os,intSet&s)
®for(inti=O;i<=s.ElementNum;i++)
os«*'element["<<i«'*]n«s.e1ement[i]«endl;
。returnos;
intmain()
ointa[7]={1,2,3,4,5,6,7};
intb[6]={5,6,7,8,9,0};
ointSetS1(a,7),S2(b,6),S3;
S3=S1+S2;
cout«S3;
system。,PAUSE");
©return0;
运营结果:
element[015
element[1]6
element[2J7
请按任意键继续...
nr
实验6输入输出流
1、实验目的:
掌握流的概念;
掌握文献的打开与关闭;
掌握文献的读写操作;
2、实验内容:
定义一个学生类,包含学生的学号、姓名和成绩等基本信息,将学生信息写入二进制文献st
udent.dat中,实现对学生信息的显示、查询和删除等基本功能。
参考代码:
#inelude<iostream>
#include<fstream>
usingnamespacestd;
classStudent
(
private:
1ongNo;
char*Name;
intScore;
public:
Student(longstu_no=0,char*stu_name=NULL,intstu_score=0);
IongGetNo();
char*GetName();
intGetScore();
voidShowStudent();
);
Student::Student(1ongstu_no,char*stu_name,intstu_score)
(
No=stu_no;
Name=stu_name;
Score=stu_score;
)
voidStudent::ShowStudent()
(
cout<<No«"\t"<<Name<<M\t"«Score<<endl;
)
1ongStudent::GetNo()
(
returnNo;
)
char*Student::GetName()
(
returnName;
)
intStudent::GetScore()
(
returnScore;
)
intmain()
StudentstuE3]={Student(,"Liming",70),
Student(,nHujun",80),
Student(,HWangtiann,90)};
inti,k,pos;
fstrearninfile,outfile;
outfile.open(MStudents.dat",ios::outIios::binary|ios::trunc);
if(!outfile)
(
cerr«nFileopenerror!n<<endl;
exit(1);
)
for(i=0;i<3;i++)
(
outfi1e.write((char*)&stu[i],sizeof(stu[i]));
)
outfile.c1ose();
cout«"Students.dat:H<<end1;
infi1e.open(*'Students.dat'\ios::in|ios::binary);
for(i=0;i<3;i++)
(
infi1e.read((char*)&stu[i],sizeof(Student));
cout<<stu[i].GetNo()«,'\tu<<stu[iJ.GetName()«',\t,'«stu[i].Ge
tScore()«end1;
)
infile.close();
infile.open(HStudents.dat*',ios::in|ios::binary);
cout«"pleaseinputthenumberofrecord:H;
cin»k;
pos=(k-l)*sizeof(Student);
infi1e.seekg(pos);
infile,read((char*)&stu[i],sizeof(Student));
cout«stu[i].GetNo()«n\tU«stu[i].GetName()«n\tn«stu[i].GetS
core()<<end1;
infile.close();
cout«"DeletetheSecondrecord!"«endl;
infile.open(nStudents.datn,ios::in|ios::binary|ios::trune);
for(i=0;i<3;i++)
(
if(i!=1)
outfile.write((char*)&stu[i],sizeof(stu[i]));
)
outfile.close();
infi1e.open("Students.dat",ios::in|ios::binary);
for(i=0;i<2;i++)
{
infi1e.read((char*)&stu[i],sizeof(Student));
cout«stu[i].GetNo()«H\tn«stu[i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年家禽订购合同
- 房屋改建合同范例
- 2024电子教学设备采购合同
- 2024上海出租合同范本
- 工行委托贷款合同
- 2024红砖购销合同(墙地砖类)范本
- 2024【内外粉刷合同协议书】内墙粉刷合同范本
- 短期临时工作合同协议
- 2024保险代理协议书
- 广东省东莞市七年级上学期语文期中考试试卷3套【附答案】
- 模板支架及脚手架安全使用培训课件
- 企业财产保险投保单
- CT报告单模板精编版
- 柿子品种介绍PPT课件
- 内镜清洁消毒登记表格模板
- 天然气脱硫(课堂运用)
- 幼儿园教师师德师风考核表(共2页)
- 城镇职工医疗保险运行中的问题分析及措施
- 阿拉丁神灯介绍ppt[共27页]
- 学校食堂五常法管理制度
- 毕业设计500kv变电站设计
评论
0/150
提交评论