资源描述
《面向对象程序设计(C++)》课程实验指导书
安阳工学院计算机科学与信息工程学院
软件工程教研室
2023.9
编 号:
课程总学时: 64 实验学时: 32
课程总学分: 3.5 实验学分:
先修课程:C语言程序设计
合用专业:计算机科学与技术,网络工程,软件工程
一、 本课程实验的重要目的与任务
《面向对象程序设计(C++)》是计算机专业学生的一门专业基础课。C++是一种高效而又实用的程序设计语言,它既可以进行过程化程序设计,也可以进行面向对象程序设计,因此成为了编程人员最广泛使用的工具。重要任务是介绍C++语言中的数据类型,运算,语句结构及其程序设计的基本方法。使学生掌握一门高级程序设计语言,了解面向对象程序设计的基本概念与方法,进而学会运用C++语言学会解决一般应用问题,从而掌握面向对象程序设计的基本知识和基本技能。并为后续的专业课程奠定程序设计基础。
实验1 C++基础
一、实验目的
1.加强学生掌握C++的基本知识点;
2.加强学生掌握I/O流;
3 加强学生进一步理解函数的用法;
4 理解引用的概念及应用。
三、实验内容
1.用函数返回值实现记录A类学生和B类学生个数,平均分大于等于80的为A类,其余为B类。
四. 实验指导
1.参考程序:
#include<iostream.h>
int main()
{
cout<<”My name is Jone\n”;
cout<<”the ID is”;
cout<<2;
cout<<endl;
}
2.参考程序:
#include <iostream.h>
#include <iomanip.h> //要用到格式控制符
void main()
{
double amount = 22.0/7;
cout <<amount <<endl;
cout <<setprecision(0) <<amount <<endl
<<setprecision(1) <<amount <<endl
<<setprecision(2) <<amount <<endl
<<setprecision(3) <<amount <<endl
<<setprecision(4) <<amount <<endl;
cout <<setiosflags(ios::fixed);
cout <<setprecision(8) <<amount <<endl;
cout <<setiosflags(ios::scientific) <<amount <<endl;
cout <<setprecision(6); //重新设立成原默认设立
}
3.参考程序:
#include <iostream.h>
#include <iomanip.h>
int main()
{
int number=1001;
cout <<"Decimal:" <<dec <<number <<endl
<<"Hexadecimal:" <<hex <<number <<endl
<<"Octal:" <<oct <<number <<endl;
return 0;
}
4.参考程序:
#include <iostream.h>
#include <iomanip.h>
int main()
{
cout <<setfill('*')
<<setw(2) <<21 <<endl
<<setw(3) <<21 <<endl
<<setw(4) <<21 <<endl;
cout <<setfill(' '); // 恢复默认设立
return 0;
}
5.参考程序:
#include <iostream.h>
#include <iomanip.h>
void main()
{
cout <<setiosflags(ios::right)
<<setw(5) <<1
<<setw(5) <<2
<<setw(5) <<3 <<endl;
cout <<setiosflags(ios::left)
<<setw(5) <<1
<<setw(5) <<2
<<setw(5) <<3 <<endl;
}
6.参考程序:
#include <iostream.h>
void main()
{
const float PI=3.1415926f;
float r;
float z,s;
cout<<"请输入圆的半径r=";
cin>>r;
z=2*PI*r;
s=PI*r*r;
cout<<"圆的周长为: "<<z<<endl;
cout<<"圆的面积为: "<<s<<endl;
}
7.参考程序:
#include <iostream>
using namespace std;
int array[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& level(int grade[], int size, int& tA, int& tB);
int main()
{
int typeA=0,typeB=0;
int student=6;
int gradesize=4;
for(int i=0; i<student; i++) //解决所有的学生
level(array[i], gradesize, typeA, typeB)++; //函数调用作为左值
cout <<"number of type A is " <<typeA <<endl;
cout <<"number of type B is " <<typeB <<endl;
//system("PAUSE");
return 0;
}
int& level(int grade[], int size,int& tA, int& tB)
{
int sum=0;
for(int i=0; i<size; i++) //成绩总分
sum+=grade[i];
sum/=size; //平均分
if(sum>=80)
return tA; //type A student
else
return tB; //type B student
}
运营结果:
实验2 类和对象
1、实验目的:
掌握类的定义,根据具体需求设计类;
进一步理解C++中类的封装性;
会根据类创建各种对象;
掌握对象的各种成员的使用方法。
2、实验内容
定义一个满足如下规定的Date类。
(1)用下面的格式输出日期:日/月/年;
(2)可运营在日前上加一天操作;
(3)设立日期。
参考代码:
#include <iostream.h>
class Date
{
public:
void Display();
void AddOneDay();
void SetDay(int y,int m,int d);
protected:
bool Legal(int y, int m, int d);
bool IsLeapYear(int y);
int year;
int month;
int day;
};
void Date::Display()
{
cout <<day <<"/" <<month <<"/" <<year <<endl;
}
void Date::AddOneDay()
{
if(Legal(year,month,day+1))
day++;
else if(Legal(year,month+1,1))
month++,day=1;
else if(Legal(year+1,1,1))
day=1,month=1,year++;
}
void Date::SetDay(int y, int m, int d)
{
if(Legal(y,m,d))
day=d, month=m, year=y;
}
bool Date::Legal(int y, int m, int d)
{
if(y>9999||y<1||d<1||m<1||m>12)
return false;
int dayLimit=31;
switch(m) case 4: case 6: case 9: case 11: dayLimit--;
if(m==2) dayLimit = IsLeapYear(y) ? 29 : 28;
return (d>dayLimit)? false : true;
}
bool Date::IsLeapYear(int y)
{
return !(y%4)&&(y%100)||!(y%400);
}
int main()
{
Date d;
d.SetDay(2023,2,28);
d.Display();
d.AddOneDay();
d.Display();
system("PAUSE");
}
运营结果:
实验3 继承与派生
1、实验目的:
理解继承的概念,学习如何使用基类成员,了解基类成员在派生类中的访问控制;
理解类的派生对代码复用的作用。
2、实验内容:
设计一个人员类person和一个日期类date,由人员类派生出学生类Student和教师类professor,学生类和教师类的数据成员birthday为日期类。
参考代码:
#include <string>
#include <iostream>
using namespace std;
class date
{
public:
date()
{
cout<<"Birthday:";
cin>>year>>month>>day;
}
void display()
{
cout<<year<<"-"<<month<<"-"<<day;
}
private:
int year;
int month;
int day;
};
class person
{
protected:
char *name;
public:
person();
};
person::person()
{
char namestr[50];
cout<<"Name:";
cin>>namestr;
name = new char[strlen(namestr)+1];
strcpy(name,namestr);
}
class student:public person
{
private:
int ID;
int score;
date birthday;
public:
student()
{
cout<<"student ID:";
cin>>ID;
cout<<"student score:";
cin>>score;
}
void display()
{
cout<<"The basic information:"<<endl;
cout<<ID<<"\t"<<name<<"\t"<<score<<"\t";
birthday.display();
cout<<endl;
}
};
class professor:public person
{
public:
professor()
{
cout<<"Teacher ID:";
cin>>No;
cout<<"schoolteaching major:";
cin>>major;
}
void display()
{
cout<<"The basic information:"<<endl;
cout<<"\t"<<No<<"\t"<<name<<"\t"<<major<<"\t";
birthday.display();
cout<<endl;
}
private:
int No;
char major[10];
date birthday;
};
int main()
{
student stu;
stu.display();
professor prof;
prof.display();
system("PAUSE");
return 0;
}
运营结果:
实验4多态
1、实验目的:
掌握函数的概念及应用方法;
理解多态性的运用和作用。
2、实验内容:
新建一个基类shape类是一个表达形状的抽象类,area( )为求图形面积的函数。请从shape类派出矩形类(rectangle)、三角形类(triangle)、圆类(circles)、并给出具体的求面积函数。
参考代码:
#include<iostream>
#include<math.h>
using namespace std;
class shape
{
public:
virtual double area()=0;
virtual void display() = 0;
shape(){}
};
class rectangle:public shape
{
public:
rectangle(double a =1,double b=1)
{
x = a;
y = b;
}
double area()
{
return x*y;
}
void display()
{
cout<<area()<<endl;;
}
private:
double x;
double y;
};
class triangle:public shape
{
public:
triangle(double a =1,double b =1,double c=1)
{
x = a;
y = b;
z= c;
}
double area()
{
double l = (x+y+z)/2;
return (sqrt((l-x)*(l-y)*(l-z)*l));
}
void display()
{
cout<<area()<<endl;;
}
private:
double x;
double y;
double z;
};
class circles:public shape
{
public:
circles(double R =1)
{
r =R;
}
double area()
{
return 3.14*r*r;
}
void display()
{
cout<<area()<<endl;;
}
private:
double r;
} ;
int main()
{
shape *p ;
p = new rectangle(2,3);
p->display();
p = new triangle(3,4,5);
p->display();
p = new circles(2);
p->display();
system("PAUSE");
return 0;
}
运营结果:
实验5 运算符重载
1、实验目的:
掌握运算符重载的概念及使用方法,掌握特殊运算符的重载规定和方法。
2、实验内容:
定义整数集合类intSet,实现如下功能:
定义类的构造函数,并根据需要可以定义多个构造函数。
(1)Clear函数:清空整数集合
(2)IsEmpty():整数集合是否空集;
(3)IsMemberOf():判断某个整数是否在整数集合内
(4)Operator+:增长一个整数到整数集合中
(5)Operator-:从整数集合中删除一个整数元素;
(6)Operator==:判断两个整数集合是否相等;
(7)Operator*:求两个整数结合的交集;
(8)Operator+:求两个整数集合的交集;
(9)Operator=:整数集合的对象之间的赋值;
(10)Operator<<:输出整数集合中的元素。
提醒:类intSet可以用数组的方式定义整数集合。例如:
int element[200]:保存整数集合数据;
int ElementNum: 指示整数集合的最后一个元素位置
注意:一个整数集合中不允许有相同元素存在,二是集合中的元素没有顺序。
参考代码:
#include<iostream>
using namespace std;
class intSet
{
public:
intSet();
intSet(int a[],int size);
void Clear();
bool IsEmpty();
bool IsMemberOf(int a);
bool operator+(int a);
bool operator-(int a);
bool operator==(intSet & set);
intSet operator+(intSet &set);
intSet operator *(intSet &set);
void operator = (intSet &set);
friend ostream &operator<<(ostream &,intSet&);
protected:
int element[100];
int ElementNum;
};
//初始化整数集合元素
intSet::intSet()
{
for(int i = 0; i< 100; i++)
element[i] = 0;
ElementNum = -1;
}
intSet::intSet(int a[],int size)
{
if(size>=100)
ElementNum = 99;
else
ElementNum = size -1;
for(int i = 0;i<=ElementNum; i++)
element[i] = a[i];
for(int i =size; i<100;i++)
element[i ] = 0;
}
//清空整数集合元素
void intSet::Clear()
{
for(int i = 0;i<100;i++)
{
element[i] = 0;
}
ElementNum = -1;
}
//判断整数集合是否为空
bool intSet::IsEmpty()
{
if(ElementNum == -1)
return false;
else
return true;
}
//判断元素是否在整数集合中
bool intSet::IsMemberOf(int a)
{
for(int i= 0;i<ElementNum ; i++)
if(element[i] == a)
return true;
return false;
}
//往集合中增长一个元素
bool intSet::operator +(int a)
{
if(IsMemberOf(a))
return true;
else
{
if(ElementNum == 99)
return false;
else
{
ElementNum++;
element[ElementNum] = a;
return true;
}
}
}
//从集合中删除一个元素
bool intSet::operator -(int a)
{
int pos;
if(!IsMemberOf(a))
return false;
for(int i = 0;i<=ElementNum;i++)
{
if(element[i]==a)
{
pos= i;
break;
}
}
for(int i = pos; i<ElementNum;i++)
element[i] = element[i+1];
ElementNum--;
return true;
}
//判断两个整数集合是否相等
bool intSet::operator ==(intSet & set)
{
bool Equal;
if(ElementNum!=set.ElementNum)
return false;
for(int i = 0;i<=ElementNum;i++)
{
Equal = false;
for(int j = 0;j<set.ElementNum;j++)
{
if(element[i]==set.element[i])
{
Equal = true;
break;
}
}
if(!Equal)
return false;
}
return true;
}
//求两个集合的交集
intSet intSet::operator +(intSet&set)
{
int a[100],size = 0;
for(int i = 0;i<=ElementNum;i++)
for(int j = 0;j<=set.ElementNum;j++)
{
if(element[i]==set.element[j])
{
a[size] = element[i];
size++;
break;
}
}
return intSet(a,size);
}
//求两个集合的并集
intSet intSet::operator *(intSet &set)
{
int a[100],size;
for(int i = 0;i<=ElementNum;i++)
a[i] = element[i];
size = ElementNum +1;
for(int i= 0;i<=set.ElementNum;i++)
if(IsMemberOf(set.element[i]))
continue;
else
{
if(size == 99)
break;
a[size] = set.element[i];
size++;
}
return intSet(a,size);
}
//整数集合对象间赋值
void intSet::operator =(intSet & set)
{
for(int i=0;i<=set.ElementNum;i++)
element[i] = set.element[i];
ElementNum = set.ElementNum;
}
//输出整数集合中的元素
ostream & operator<<(ostream &os,intSet &s)
{
for(int i=0;i<=s.ElementNum;i++)
os<<"element["<<i<<"]"<<s.element[i]<<endl;
return os;
}
int main()
{
int a[7] = {1,2,3,4,5,6,7};
int b[6] ={5,6,7,8,9,0};
intSet S1(a,7),S2(b,6),S3;
S3 = S1+S2;
cout<<S3;
system("PAUSE");
return 0;
}
运营结果:
实验6 输入输出流
1、实验目的:
掌握流的概念;
掌握文献的打开与关闭;
掌握文献的读写操作;
2、实验内容:
定义一个学生类,包含学生的学号、姓名和成绩等基本信息,将学生信息写入二进制文献student.dat中,实现对学生信息的显示、查询和删除等基本功能。
参考代码:
#include<iostream>
#include<fstream>
using namespace std;
class Student
{
private:
long No;
char *Name;
int Score;
public:
Student(long stu_no=0,char*stu_name=NULL,int stu_score=0);
long GetNo();
char *GetName();
int GetScore();
void ShowStudent();
};
Student::Student(long stu_no,char *stu_name,int stu_score)
{
No= stu_no;
Name = stu_name;
Score = stu_score;
}
void Student::ShowStudent()
{
cout<<No<<"\t"<<Name<<"\t"<<Score<<endl;
}
long Student::GetNo()
{
return No;
}
char *Student::GetName()
{
return Name;
}
int Student::GetScore()
{
return Score;
}
int main()
{
Student stu[3]={Student(,"Li ming",70),
Student(,"Hu jun",80),
Student(,"Wang tian",90)};
int i,k,pos;
fstream infile,outfile;
outfile.open("Students.dat",ios::out|ios::binary|ios::trunc);
if(!outfile)
{
cerr<<"File open error!"<<endl;
exit(1);
}
for(i=0;i<3;i++)
{
outfile.write((char *)&stu[i],sizeof(stu[i]));
}
outfile.close();
cout<<"Students.dat:"<<endl;
infile.open("Students.dat",ios::in|ios::binary);
for(i = 0;i<3;i++)
{
infile.read((char*)&stu[i],sizeof(Student));
cout<<stu[i].GetNo()<<"\t"<<stu[i].GetName()<<"\t"<<stu[i].GetScore()<<endl;
}
infile.close();
infile.open("Students.dat",ios::in|ios::binary);
cout<<"please input the number of record:";
cin>>k;
pos = (k-1)*sizeof(Student);
infile.seekg(pos);
infile.read((char*)&stu[i],sizeof(Student));
cout<<stu[i].GetNo()<<"\t"<<stu[i].GetName()<<"\t"<<stu[i].GetScore()<<endl;
infile.close();
cout<<"Delete the Second record!"<<endl;
infile.open("Students.dat",ios::in|ios::binary|ios::trunc);
for(i=0;i<3;i++)
{
if(i!=1)
outfile.write((char*)&stu[i],sizeof(stu[i]));
}
outfile.close();
infile.open("Students.dat",ios::in|ios::binary);
for(i=0;i<2;i++)
{
infile.read((char*)&stu[i],sizeof(Student));
cout<<stu[i].GetNo()<<"\t"<<stu[i].GetName()<<"\t"<<stu[i].GetScore()<<endl;
}
infile.close();
system("PAUSE");
return 0;
}
运营结果:
实验7 模板—求和类模板
1、实验目的:
掌握C++中类模板的使用方法;
2、实验内容:
设计一个类模板template<class T>,用于对T类型的数组停止求一切元素的和、查找指定的元素能否存在,假如存在,则返回其所在数组元素的下标值,否则返回-1
参考代码:
#include <iostream>
#include <assert.h>
using namespace std;
template <typename T>
class CArray
{
private:
T *m_pArray;//成员变量为动态数组的起始指针
int m_nArraySize;
public:
CArray(int siz
展开阅读全文