北邮小学期c++文档_北邮小学期c
北邮小学期c++文档由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“北邮小学期c”。
1.++程序设计实验报告
姓名: 班级: 学号: C
要求:
猜价格游戏
编写C++程序完成以下功能:
(1)假定有一件商品,程序用随机数指定该商品的价格(1-1000的整数);
(2)提示用户猜价格,并输入:若用户猜的价格比商品价格高或低,对用户作出相应的提示;(3)直到猜对为止,并给出提示。
算法:
int main(){ int price,input;srand(time(NULL));price=rand()%1000;cout>input;while(input!=price){ if(input>price)cout>input;} cout
使用srand()函数产生随机数,调用time.h的time()函数读取系统时间作为产生随机数的种子。采用循环结构,使函数运行至猜对价格,用cout输出,用cin输入。
2.要求:
矩形
编写C++程序完成以下功能:
(1)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(2)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;
(3)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;
(4)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(5)计算其面积,并输出。
算法:
cla point { private: float x1,y1,x2,y2;public:
};
cla rectangle { private: point a;public: rectangle(){ point(){
} x1=0;y1=0;x2=0;y2-0;float dis(){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));} float getx(){ return x2-x1;} float gety(){ return y1-y2;} void set(float a1,float b1,float a2,float b2){
} x1=a1;y1=b1;x2=a2;y2=b2;
};
} float x1,y1,x2,y2;cout>x1;cout>y1;cout>x2;cout>y2;a.set(x1,y1,x2,y2);float getarea(){ } return abs(a.getx()*a.gety());思路:
本题的关键在于创建point和rectangle两个类,在point中声明四个private成员分别是两个点的横坐标和纵坐标。声明返回private值的函数。Rectangle中将point类作为其private成员,在public中声明构造函数,读入两个点的横坐标和纵坐标,传给point。并声明计算面积的函数,利用point中返回x,y的函数得到长方形的x,y值计算其面积。
3.要求:
友元
编写C++程序完成以下功能:
(1)定义一个Boat和Car两个类,他们都具有私用属性——重量;(2)编写一个函数,计算两者的重量和。
double TotalWeight(Boat& b, Car& c);
算法:
cla boat;cla car { private: double w;public:
car(){
cout
};
cin>>w;} friend double TotalWeight(boat& b,car& c);cla boat { private: double w;public:
boat(){
cout
cin>>w;} friend double TotalWeight(boat& b,car& c);};
double TotalWeight(boat& b,car& c){ return(c.w+b.w);}
void main(){
} car c;boat b;cout
声明car,boat两个类,两者中都包含w这个private成员,用来记录重量,在car和boat的public中都声明友元函数TotalWeight()。这样TotalWeight()就能同时访问到car和boat的private成员了。
4.要求:
矩形
编写C++程序完成以下功能:
(6)定义一个Point类,其属性包括点的坐标,提供计算两点之间距离的方法;(7)定义一个矩形类,其属性包括左上角和右下角两个点,提供计算面积的方法;
(8)创建一个矩形对象,提示用户输入矩形左上角和右下角的坐标;(9)观察矩形对象以及Point类成员的构造函数与析构函数的调用;(10)计算其面积,并输出。
算法:
void init(int a[][5]){
} for(int i=0;i>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3]>>a[i][4];
void print(int a[][5]){
}
void add(int a1[][5],int a2[][5],int a3[][5]){ for(int i=0;i
}
void subtract(int a1[][5],int a2[][5],int a3[][5]){
} for(int i=0;i
} for(int n=0;n
} for(int n=0;n
} for(int n=0;n
void main(){ int a1[4][5],a2[4][5],a3[4][5];cout
init(a1);getchar();cout
声明三个4行5列的数组,读入矩阵的元素存入数组,用二重递归的方式遍历数组,执行加,减,输出操作。
5.要求:
编写C++程序完成以下功能:
(1)假定矩阵大小为4×5(整型);
(2)矩阵空间采用new动态申请,保存在指针中;
(3)定义矩阵初始化函数,可以从cin中输入矩阵元素;(4)定义矩阵输出函数,将矩阵格式化输出到cout;
(5)定义矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵中;(6)定义矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵中;(7)动态申请三个矩阵:A1、A2、A3;(8)初始化A1、A2;
(9)计算并输出A3 = A1加A2,A3 = A1减A2;(10)释放矩阵空间。
算法:
void main(){
int **a1,**a2,**a3;a1=new int*[4];for(int i=0;i
} a1[i]=new int[5];a2=new int*[4];for(int i=0;i
声明a为指向指针的指针,先申请一个四个元素的数组,类型为int**,用来储存每行第一个元素的指针。如此声明之后就可以用a[i][j]来访问某个元素了。
6.要求:
编写C++程序完成以下功能:
(1)用类来实现矩阵,定义一个矩阵的类,属性包括:
矩阵大小,用 lines, rows(行、列来表示);
存贮矩阵的数组指针,根据矩阵大小动态申请(new)。
(2)矩阵类的方法包括:
构造函数,参数是矩阵大小,需要动态申请存贮矩阵的数组; 析构函数,需要释放矩阵的数组指针; 拷贝构造函数,需要申请和复制数组; 输入,可以从cin中输入矩阵元素; 输出,将矩阵格式化输出到cout;
矩阵相加的函数,实现两个矩阵相加的功能,结果保存在另一个矩阵类,但必须矩阵大小相同;
矩阵相减的函数,实现两个矩阵相减的功能,结果保存在另一个矩阵
类,但必须矩阵大小相同。
(3)(4)(5)(6)定义三个矩阵:A1、A2、A3; 初始化A1、A2;
计算并输出A3 = A1加A2,A3=A1减A2;
用new动态创建三个矩阵类的对象:pA1、pA1、pA3;
(7)初始化pA1、pA2;
(8)计算并输出pA3=pA1加pA2,pA3=pA1减pA2;(9)释放pA1、pA1、pA3。
算法:
cla matric{ private: int lines,rows;int **a;public:
void init(){ cin>>lines>>rows;a=new int*[lines];for(int n=0;n
a[n]=new int[rows];
} void input(){
} for(int i=0;i>a[i][n];void output(){
} for(int i=0;i
} for(int n=0;n
int getlines(){ return lines;} void copy(int** &b)
for(int i=0;i
{
} void add(matric A1,matric A2)
{
int**a1,**a2;lines=A1.getlines();rows=A1.getrows();A1.copy(a1);A2.copy(a2);
a=new int*[lines];for(int i=0;i
a[i]=new int[rows];
for(int i=0;i
} for(int n=0;n
{
int**temp=a;
for(int i=0;i
delete a[i];
}
}
void sub(matric A1,matric A2){
int**a1,**a2;lines=A1.getlines();rows=A1.getrows();
};A1.copy(a1);A2.copy(a2);
a=new int*[lines];for(int i=0;i
a[i]=new int[rows];
} for(int i=0;i
} for(int n=0;n
首先需要读入数组的行列,用上题动态申请数组的方法来动态申请。本题的关键在于编写copy函数,从private中传出数组的值,只是将上题4,5这两个常量改成了lines,rows这两个变量。使用copy函数的好处在与只允许单向传出数组的元素,而不允许指令来修改数组的元素从而保护了数据的安全。执行加减法时可以声明两个int**类型元素用来指向数组,用矩阵类中的copy函数,分别从A1,A2中拷贝出数组的元素,拷贝出值之后,加减操作与上题一样,用a[i][j]来访问数组元素即可。
7.要求:
形状
(一)编写C++程序完成以下功能:
(1)声明一个基类Shape(形状),其中包含一个方法来计算面积;(2)从Shape派生两个类矩形和圆形;(3)从矩形派生正方形;
(4)分别实现派生类构造函数、析构函数和其他方法;
(5)创建派生类的对象,观察构造函数、析构函数调用次序;(6)不同对象计算面积。
算法:
cla shape { public: shape()
{ cout
};cout
rectangle(float a,float b){
x=a;y=b;cout
{
} };cla circle:public shape { private: float r;public:
circle(float a){
} r=a;cout
{
};} return 3.1416*r*r;cla square:public rectangle { private: float a;public:
};square(float x):rectangle(x,x){ a=x;cout
长方形类和圆类继承shape类之后,只要重载area()函数即可正确地计算出面积,正方形类继承了长方形类,不需要重载长方形类的area()函数,只要给长方形类的x,y赋相同的值,然后就可以直接调用从长方形类中继承的area()函数,直接计算面积。
8.要求:
形状
(二)——虚函数
(1)将【形状
(一)】中的基类计算面积的方法定义为虚函数,比较与【形状
(一)】程序的差异;(2)将【形状
(一)】中的基类定义抽象类,比较与【形状
(一)】程序的差异。
算法:
算法与上题大致相同,只需要在area()函数前加上virtual即可。
思路:
算法与上题大致相同,只需要在area()函数前加上virtual即可,即将area()函数声明为虚函数。
将shape()类声明抽象类,只要把shape()中的area()函数声明成如下形式: Virtual float area()=0;纯虚函数即可。这样shape类就是一个抽象类,抽象类可以作
为基类被继承,但是不实例化,例如,shape a;这样声明一个a就是错误的。
9.要求:
对Point类重载++和――运算符
编写C++程序完成以下功能:
(1)Point类的属性包括点的坐标(x,y);(2)实现 Point类重载++和――运算符:
++p,--p,p++,p--。
++和――分别表示x,y增加或减少1。
算法:
cla point { private: int x,y;public: point operator++(int)
{
} point a=*this;x++;y++;return a;point operator++(){ x++;y++;return *this;} point operator--(int){
point a=*this;x--;y--;return a;} point operator--(){ x--;y--;
};return *this;} void ini(){ cin>>x;} cin>>y;point(){
} cout>x;cout>y;~point(){ } void print(){ } cout
本题的关键在于表示出a++和++a的不同,a++是先引用a的值然后再执行++,++a是先执行++然后再引用a的值。在对++的重载时可以在()中加入int加以区分a++和++a,如下point operator++(int),point operator++()。要做出a++的效果就需要申请point temp,这个中间变量,temp=this,把当前对象赋给a,然后再对当前对象执行++操作,最后返回temp,因为temp储存的是未执行++之前的值,所以能够做出先引用a的值在执行++的效果。——的过程与++完全相同。要求:
流式IO
(一)编写C++程序完成以下功能:
(1)使用ofstream 向一个文本文件中输出各种类型的数据,并打开文件观察结果:
整数、无符号整型、长整型、浮点型、字符串、„„
(2)用十进制、八进制、十六进制方式向文本文件中输出整数;(3)使用控制符和成员函数来控制输出的格式:
set()precision()...算法:
void main(){
} ofstream outfile(“xx.txt”);int integer;unsigned int uint;long int lint;float f;string s;cout>integer;cout>uint;cout>lint;cout>f;cout>s;outfile
.进行对文件的操作需要声明头文件#include,为了方便对字符串的操作再声明头文件#include,ofstream outfile(“xx.txt”);指令声明了一个文件输出类,打开了一个名叫xx.txt的文件,outfile.unsetf(ios::dec);outfile.setf(ios::dec);指令可以用来控制 文件输出的格式,做到格式化输出。outfile.set()是设置输出格式,outfile.unset()是取消设置。
11.要求:
流式IO
(三)编写C++程序完成以下功能:(1)输入一个文本文件名;
(2)打开文件名,在该文件的每一行前面加上一个行号,保存在另外一个文本文件中。
算法:
void main(){
} string a;cout>a;ifstream in(a);ofstream out(“out.txt”);string s;int i=1;while(getline(in,s)){ out
本实验比较简单。只需要声明一个字符串a用来储存读入的文件名,再用ifstream类来声明一个对象,打开a这个文件。利用getline()函数,geiline函数能够自动从文件中读入一行数据,每读入一行数据就在其前面加上行号,行号可以用变量i来计数,每读一行就加1,并将这个就上行号的一行数据写入out.txt中,知道无法读入,就结束程序。
12.要求:
电话本
编写C++程序完成以下功能:
(1)实现简单电话本功能,用姓名来搜索电话号码;(2)用户输入姓名,程序查找并输出结果;(3)用户可以通过输入,添加姓名和电话号码;(4)用户可以删除姓名和电话号码;(5)电话本可以保存在指定文件中;
(6)电话可被从指定文件中读入到内存。
算法:
#include #include #include using namespace std;
cla record { private: string name[50],number[50];public: record(){ int i=0;
string na,nu;
ifstream file(“phonenumber.txt”);
file>>na>>nu;
while(na.compare(“..”))
{
name[i]=na;
number[i]=nu;
file>>na>>nu;
i++;
}
for(i;i
{
name[i]=“..”;
number[i]=“..”;
} } void search(){
int i=0;
string na;
cout
cin>>na;
while(name[i].compare(“..”))
{
if(!name[i].compare(na))
{
cout
return;} i++;} cout
string na,nu;cout>na;cout>nu;for(int i=0;i
if(!name[i].compare(“..”)){
//cout
return;} } cout
} ofstream file(“phonenumber.txt”);for(int i=0;i
} if(!name[i].compare(“..”))break;if(name[i].compare(“,”))
file
};void del(){
} int i=0;string na;cout>na;while(name[i].compare(“..”)){
if(!name[i].compare(na)){
} i++;name[i]=“,”;number[i]=“,”;cout
for(int i=0;i
“
} for(int i=0;i
} if(name[i].compare(”..“)&&name[i].compare(”,“))cout
number:”
void main(){
int choice;
int i=0;record temp;while(1)
{
cout
cin>>choice;
}
switch(choice){
} case 1: temp.search();break;case 2:
temp.add();break;case 3: temp.del();break;case 4: temp.store();break;case 5: temp.show();break;} system(“pause”);思路:
程序的大体思路是:声明电话本类,private成员是一个50个元素的string型数组,运行程序时就将文件中的电话记录读入到内存中(string数组),方便操作。从内存中读入记录的语句写在电话本类的构造函数中,使得声明类时就可以自动读入记录。文件中最后一行用”....”来标记记录的结束。对于所有操作都写进了电话本类中,本程序可以执行五个基本操作:1.按名字查找记录,查找成功返回该条记录,查找失败输出“无该记录” 2.添加记录,添加记录会要求输入名字与电话,如果记录数小于50条会显示“成功插入”,如果记录已经等于50条会显示“插入失败” 3.按名字删除某条记录,执行删除操作时会先查询该记录,如果存在该记录就将该记录赋为“,,”表示删除,如果不存在该记录返回”不存在该记录”
4.存储命令,可以将内存中的记录再次存入到文件当中 5.输出命令,输出当前内存中的所有记录。命令的选择可以用switch语句实现。
感想:
经过一学期的学习,我已经对c++有了初步的掌握,了解了类这
个全新的概念。类的应用可以方便管理函数,不需要像c那样凌乱得写一大堆函数,要调用时需要向上找到这个这个函数,产看它的功能与传入传出的要求。我认为类更大作用是可以有效地保护数据,不被随意地更改,也方便了他人的二次开发,只需要了解头文件中包含的类,类的方法,就可以方便地实现他人早已实现的功能,方便后人开发。比如试验中用到的就是很好的例子。