当前位置:文档之家› 《面向对象程序设计》C++实验报告_

《面向对象程序设计》C++实验报告_

《面向对象程序设计》

实验报告

实验一 C++基础练习

院(系):课程名称:面向对象程序设计教师签名:

实验目的和要求

1.掌握C++程序的基本格式与规范,学会编写简单的C++程序。

2.理解C++程序结构的特点。

3.熟悉C++程序基本的输入和输出操作。

4.掌握C++数据类型常量和变量以及修饰符的使用方法。

5.掌握函数定义、函数调用和函数说明的方法。

6.熟悉作用域运算符的功能和基本使用方法。

7.掌握C++内存的动态分配与释放方法。

8.理解引用的概念,掌握引用的使用方法。

实验内容和步骤

1. 调试如下的代码并回答问题。

#include

void main()

{

//First c++ program

char name[10];

cout<<"please input your name:";

cin>>name;

cout<<"welcome "<

}

(1)C++的注释和C有何不同?

答:C语言的注释有一种,用/*……….*/作为注释分界符号

C++除保留了这种注释方式之外,还提供了一种更有效的注释方式,该注释以“//”

开始,到行尾结束。

(2)C++的输入和输出所使用的函数及其相应头文件与C有何不同?

答:在C中进行输入输出操作时,常使用函数scanf和printf。C++除了可以照常使用这两个函数进行输入输出外,还增加了标准输入流对象cin和标准输出流对象cout来进行输入和输出。Iostream是C++系统定义的一个头文件,在这个文件中声明了程序所需要的输入和输出操作的有关信息。在C语言中头文件中用“.h”作为后缀,如stdio.h、math.h等。

2. 单步调试如下的代码并回答问题。

#include

inline int f(int x)

{ return 2*x*x+4*x+5; }

inline double f(double x)

{ return 2*x*x+4*x+5; }

void main()

{ int x=5;

double y=5.2;

cout<

cout<

}

(1)inline的含义和作用是什么?

答:含义:在函数说明前冠以关键字“inline”,该函数就被声明为内联函数,每当程序中出现对该函数的调用时C++编译器使用函数体中的代码插入到调用该函数的语句处,同时用实参取代形参。作用:主要是为了消除函数调用时的系统开销,以提高运行速度。

(2)C允许两个函数同名(函数重载)么,函数重载的作用是什么?

答:不允许,作用:方便使用函数,只要函数参数的类型不同,或者参数的个数不同,或者二者兼而有之,两个或者两个以上的函数可以使用相同的函数名。实现函数编译的多态性。(3)单步调试(F10、F11),记录f(x)和f(y)会分别调用哪段代码,为什么?

答:f(x)会调用int f(int 5) f(y)会调用double f(double 5.2)

因为虽然两个函数名是一样的,形参类型和返回值类型不同,根据所给的实参类型如int型就调用int f(int 5)。

3. 单步调试如下程序并回答问题。

#include

int a[]={1,2,3,4,5,6,7,8,9,10};

int sum;

void main()

{

int i;

int sum=0;

for(i=0;i<10;i++)

{

if(a[i]%2!=0) sum=sum+a[i];

::sum=::sum+a[i];

}

cout<<" sum of all is : "<<::sum;

cout<<" sum of odd is: "<

}

(1)什么是局部变量和全局变量,其作用域如何界定?

答:全局变量:在函数外定义的变量,可以为本源文件的其他函数所公用,有效范围为从定义变量的位置开始到本源文件结束。局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。

(2)在局部变量和全局变量作用域重叠区域,默认哪个变量起作用;如果一定要访问全局变量,怎么实现。

答:默认局部变量起作用。如果一定要访问全局变量,可以用::对所屏蔽的同名全局变量进行访问。

(3)单步调试,查看并记录程序中循环体的两条语句的sum的变化情况,并说明它们是局部变量和全局变量。

答:第一个sum为全局变量,第二个::sum为局部变量。

4.调试如下程序并回答问题。

#include

void main()

{

double *r; r = new double;

cin>>*r;

cout<<"Area is:"<<3.14*(*r)*(*r);

delete r;

}

(1)C语言的内存申请和释放使用哪个函数

答:内存申请:malloc释放:free

(2)C++的内存申请和释放使用哪个函数?简单比较。

答:内存申请:new 释放:delete

使用malloc函数时必须使用sizeof函数来计算所需要的字节数,而new可以根据数据类型自动计算所要分配内存的大小,这就减小了发生错误的可能性。new能够自动返回正确的指针类型,而不必像malloc函数那样,必须在程序中进行强制类型转换,才能使其返回正确的指针类型。

实验二 C++简单程序设计练习

院(系):课程名称:面向对象程序设计教师签名:

实验目的和要求

1.掌握if语句的用法。

2.掌握switch语句的用法。

3.掌握循环和多重循环的用法。

4.掌握函数的定义和调用。

5.掌握数组的定义和基本操作。

实验内容和步骤

1. 根据输入的百分制按五分制的成绩输出,记录和分析实验结果(后续每个实验都有此要求,不再一一注明)。百分制与五分制之间的关系见下表。分别使用if分支结构和switch结

#include

int main ()

{

int a;

cout<<"从键盘输入百分制:"<

cin>>a;

if(a>0&&a<60) cout<<"五分制为:1"<

if(a<70) cout<<"五分制为:2"<

else

if(a<80) cout<<"五分制为:3"<

else

if(a<90) cout<<"五分制为:4"<

else

if(a<=100) cout<<"五分制为:5"<

}

使用if嵌套语句实现某一范围内的输出

具体看注释

#include

void main()

{

int a,b;

cout<<"从键盘输入百分制:"<

cin>>a;

b=a/10; //对a求商并赋值给b

switch(b) //确定b的值为什么值

{

case 10 :

case 9: cout<<"五分制为:5"<

case 8: cout<<"五分制为:4"<

case 7: cout<<"五分制为:3"<

case 6: cout<<"五分制为:2"<

default : cout<<"五分制为:1"<

}

}

用switch语句实现

分析如上的注释

2. 编程求3~100之间的所有素数,要求编写一个素数判断的函数,然后在主程序中调用。

#include

#include

int main()

{ int i; //定义变量i

int fun(int); //函数的声明

for(i=3;i<=100;i++)

if(fun(i)) cout<

}

int fun(int n) //函数的定义

{

int i,t; //定义两个整型变量

t=sqrt(n);

for(i=2;i<=t;i++) //当有能被整除的数则返回0,后则返回1

if(n%i==0)

return 0;

return 1;

}

3. 编写程序列出斐波那契(Fibonacci)数列的前20项。(Fibonacci数列是指前两项为1,后面的每一项都为前两项之和。要求用数组存储数列)。

#include

void main()

{

int a[20]={1,1}; //初始化数组a,a[0]=a[1]=1

int i;

for(i=2;i<20;i++)

{

a[i]=a[i-1]+a[i-2]; //后面每一项都为前两项之和

}

for(i=0;i<20;i++) //输出前20个斐波那契数列

{

cout<

}

}

4. 编程实现输入10个整数,从小到大排列输出。

#include

int main()

{

int a[10]; //定义一个整型数组

int i,j,t; //定义三个整型变量i,j,t

cout<<"从键盘输入十个整数:"<

for(i=0;i<10;i++)

{

cin>>a[i]; //输入数据

}

for(i=0;i<10;i++) //采用冒泡排序法外部循环

{

for(j=0;j<10;j++) //内部循环

{

if(a[j]>a[j+1]) //如果不是从小到大排列则交换位置关系

{

t=a[j];

a[j]=a[j+1];

a[j+1]=t;

}

}

}

for(i=0;i<10;i++) //输出整理好后的数组{

cout<

}

}

实验三类与对象(一)

院(系):课程名称:面向对象程序设计教师签名:

实验目的和要求

1.掌握类、类的数据成员、类的成员函数的定义方式。

2.理解类成员的访问控制方式。

3.掌握对象的定义和操作对象的方法。

4.理解构造函数和析构函数的定义与执行过程。

5.掌握重载构造函数的方式。

6.了解拷贝构造函数的方法。

实验内容

1.声明一个时间类,时间类中有3个私有数据成员(Hour,Minute,Second)和两个公有成员函数(SetTime和PrintTime)。SetTime根据传递的3个参数为对象设置时间;PrintTime 负责将对象表示的时间显示输出。

在主函数中,建立一个时间类的对象,设置时间为9点20分30秒并显示时间。

#include

class time{ //声明的一个时间类time

public: //公共函数成员

void SetTime(int i,int j,int k)

{

Hour=i;

Minute=j;

Second=k;

}

void PrintTime()

{

cout<

cout<

cout<

}

private: //三个私有成员

int Hour;

int Minute;

int Second;

};

int main()

{

time s; //定义一个对象s

s.SetTime(9,20,30); //调用对象s的成员函数SetTime,给s的数据成员赋值

s.PrintTime(); //输出显示出来

}

2.使用构造函数代替上面的SetTime成员函数,并在主函数中使用构造函数设置时间为10点40分50秒,并显示该时间。说明构造函数和SetTime成员函数在使用时的区别。

#include

class time{

public:

time(int i,int j,int k) //定义构造函数,其名与类名相同

{

Hour=i; //在构造函数中,对私有数据赋值

Minute=j;

Second=k;

}

void PrintTime()

{

cout<

cout<

cout<

private:

int Hour;

int Minute;

int Second;

};

int main()

{

time s(10,40,50); //定义类的对象时调用构造函数time

//分别给数据成员Hour、Minute和Second赋初值10、40和50

s.PrintTime();

}

说明:构造函数的作用主要是用来对对象进行初始化,定义对象时被系统自动调用。

而SetTime成员函数赋初值既不方便也容易忘记,甚至可能出错。

3.重载时间类的构造函数(不带参数)使小时、分、秒均为0。

#include

class time{

public:

time();

void PrintTime();

private:

int Hour;

int Minute;

int Second;

};

time::time()

{

Hour=0;

Minute=0;

Second=0;

}

inline void time::PrintTime() {

cout<

cout<

cout<

}

int main()

{

time s1;

cout<<"s1 output:"<

s1.PrintTime();

}

4.在时间类的析构函数中输出“Good bye!”。说明析构函数的特点和调用时机。#include

class time{

public:

time(int i,int j,int k); //构造函数的声明

~time(); //析构函数的声明

void PrintTime();

private:

int Hour;

int Minute;

int Second;

};

time::time(int i,int j,int k) //构造函数的定义

{

Hour=i;

Minute=j;

Second=k;

cout<<"构造函数被调用"<

}

time::~time() //定义析构函数

{

cout<<"goodbye"<

}

void time::PrintTime()

{

cout<

cout<

cout<

}

int main()

{

time s(10,40,50);

s.PrintTime();

}

析构函数的特点:析构函数名与类名相同,但它前面必须加一个波浪号(~),不返回任何值是不能说明它的类型的,析构函数没有参数,撤销对象时,编译系统会自动地调用析构函数。主函数中的语句执行完后,对象的生命周期结束,在撤销时就要调用析构函数,释放分配给对象的存储空间对显示信息goodbye

5.定义拷贝构造函数并调用。说明拷贝构造函数的作用特点。

#include

class time{

public:

time(int i,int j,int k)

{

Hour=i;

Minute=j;

Second=k;

}

time(const time &p) //拷贝构造函数

{

Hour=p.Hour+1;

Minute=p.Minute-20;

Second=p.Second-40;

}

void PrintTime()

{

cout<

cout<

cout<

}

private:

int Hour;

int Minute;

int Second;

};

int main()

{

time s1(10,40,50); //定义对象s1,调用了普通的构造函数

time s2(s1); //调用拷贝构造函数,用对象s1初始化对象s2

s1.PrintTime();

s2.PrintTime();

}

拷贝构造函数的作用特点:用于按照需要初始化新对象。在建立一个新对象时,使用一个已经存在的对象去初始化这个新对象。

实验四类与对象(二)

院(系):课程名称:面向对象程序设计教师签名:

实验目的和要求

1.掌握对象数组的定义与使用方法。

2.理解对象指针的概念,学会用指针引用对象。

3.了解this指针的工作方式。

4.掌握静态数据成员和静态成员函数的基本使用方法。

5.理解友元与友元函数的作用,掌握其使用方法。

实验内容

1定义一个学生(student)类,包含数据成员:学号(sno)、姓名(name)、年龄(age)、分数(score),以及成员函数:输入(input)和显示(print)。然后定义一个具有10个学生的数组,实现对这些学生信息的输入和显示。

#include

using namespace std;

class MyArray

{public:

MyArray(int leng)

{

length=leng;

alist=new int[length];

}

~MyArray()

{delete alist;

}

void input()

{

int i;

for(i=0;i

cin>>alist[i];

}

void display()

{

int j;

for(j=0;j

cout<

}

protected:

int *alist;

int length;

};

int main()

{int leng;

cin>>leng;

MyArray A(leng);

A.input();

A.display();

return(0);

}

2.修改上一个程序中的main函数:定义一个student类的指针p,使其指向上述数组的第0个元素,并通过该指针实现对10个学生信息的输入和显示。最后简要说明对象数组、对象指针和普通数组和指针有何区别和联系。

#include

#include

using namespace std;

class student

{private:

int sno;

string name;

int age;

int score;

public:

void input()

{

cin>>sno>>name>>age>>score;

}

void print()

{

cout<<"学号"<

cout<<"姓名"<

cout<<"年龄"<

cout<<"分数"<

}

};

int main()

{

student k[10];

student *p;

int i;

for(i=0;i<=9;i++)

{ p=&k[i];

p->input();

p->print();

}

}

对象数组的元素是对象,不仅具有数据成员,而且还有函数成员,对象指针就是用于存放对象地址的变量,对象指针不仅能引用单个对象,也能访问对象数组。普通数组是存放类型一样的数据,指针可以通过访问首地址一一访问存放的数值。

3.通过单步调试第一个程序,查看并记录每个元素的地址及其this指针的值,通过对比说明this指针的作用。

#include

#include

using namespace std;

class student

{

private:

int sno;

string name;

int age;

int score;

public:

void input()

{

cin>>sno>>name>>age>>score;

}

void print()

{

cout<<"this="<

cout<<"姓名"<

cout<<"年龄"<

相关主题
文本预览
相关文档 最新文档