实验报告
课程名称: C++程序设计
院 别: 数学与计算机学院
班 级: 16数字媒体技术
指导教师: 叶增炉
姓 名:
目 录
实验项目一: Visual C++ 2010的基本用法
实验项目二: 数据类型、运算符和表达式
实验项目三: 三种基本结构的实现
实验项目四: 函数
实验项目五: 指针
实验项目六: 结构体
实验项目七: 类与对象
实验项目八: 运算符重载
实验项目九: 派生与继承
综合性实验: 某公司人员信息管理系统
实验项目名称(一) |
Visual C++ 2010的基本用法 |
实验学时 |
2 |
|||
一、实验目的 1.熟悉Visual C++2010集成开发环境的基本命令和功能键 2.学习完整的C++程序开发过程 3. 理解简单的C++程序结构 二、实验主要内容 1. Visual Studio 2010 安装步骤 2. 使用VC++创建一个C++文件 3. 编写一个简单的C++程序,对其进行调试和生成可执行文件 要求:输入圆的半径,计算圆的周长和面积。 (1)创建一个项目,名字为“Circle”。 (2)在项目中增加一个文件,命名为“Circle.cpp”。 (3)编写程序代码,并进行调试和运行。 三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(二) |
数据类型、运算符和表达式 |
实验学时 |
2 |
|||
一、实验目的 1.掌握Visual C++基本数据类型的字节宽度和范围表示,熟悉如何定义一个整型、字符型和浮点型变量,以及对它们赋值的方法。 2.掌握不同类型数据之间赋值的规律。 3.学会使用C++的有关算术运算符,以及包含这些运算符的表达式,特别是自增(++)和自减(――)运算符的使用。 4.进一步熟悉C++程序的编辑、编译、连接和运行的过程。 一、实验主要内容 1.基本数据类型的长度 编写一个程序,输出基本数据类型char、short、int、long、float、double和指针类型void*、char*、short*、int*、long*、float*、double*的数据类型的长度。 要求: 弄清所使用的系统上运行的C++编译器中每个基本数据类型的长度。 提示:利用运算符sizeof(数据类型名)来得到各个数据类型的长度。 2.整型、字符型数据变量的定义与赋值 (1)输入并调试运行下面的程序 #include<iostream> #include<iomanip> using namespace std; int main( ) { char c1, c2; c1=’a’; c2=’b’; cout<<c1<<setw(5)<<c2<<endl; return 0; } ①运行此程序,写出执行结果。 ②在此基础上增加一个语句:cout<<(int)c1<<setw(5)<<(int)c2<<endl; 再运行,并观察结果。 ③将第1行改为: int c1, c2;再运行,并观察结果。
(2)输入并调试运行下面的程序 #include<iostream> #include<iomanip> using namespace std; int main( ) { char c1=’a’, c2=’b’, c3=’c’, c4=’\101’, c5= ’\116’; cout <<c1<<c2<<”\t”<<c3<<”\t”<<c1<<c2<<c3<<endl; cout<<”\t\b”<<c4<<c5<<endl; return 0; } 要求:在实验前先分析程序,写出应得结果,实验时将二者对照。
(3)输入并调试运行下面的程序 #include<iostream> #include<iomanip> using namespace std; int main( ) { int x, y, m, n; x = 8; y = 10; m = ++x; n = y++; cout<<x<<setw(5)<<y<<setw(5)<<m<<setw(5)<<n<<endl; return 0; } ② 运行程序,注意x、y、m、n各变量的值。 ② 将第4、5行改为: m = x++; n = ++y;再运行。 ③ 将程序改为: void main( ) { int x,y; x = 8; y = 10; cout<<x++<<setw(5)<<++y<<endl; } ④ 在③的基础上,将cout语句改为:cout<<++x<<setw(5)<<++y<<endl; ⑤ 再将cout语句改为:cout<<x<<setw(5)<<y<<setw(5)<<x++<<setw<<y++<<endl;
三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(三) |
三种基本结构的实现 |
实验学时 |
2 |
|||
一、 实验目的 1.学会正确使用逻辑运算符和逻辑表达式。 2.熟练掌握if语句和switch语句。 3.学习调试程序。 二、实验主要内容 1.已知三个数a、b、c,找出最大值放于max中。 (1) 输入并调试运行下面的程序: #include<iostream> using namespace std; int main() { int a,b,c,max; //定义四个整型变量 cin>>a>>b>>c; if(a>= b) max = a; //a>=b else max = b; //a<b if(c>max) max = c; //c是最大值 cout<<"max="<<max<<endl; return 0; } (2) 若输入下列数据,分析程序的执行顺序并写出运行结果。 ① 1 2 3 ② 2 1 3 ③ 3 2 1 ④ 3 1 2 ⑤ 3 3 2 ⑥ 2 1 2
2.输入某学生的成绩,经处理后给出学生的等级,等级分类如下: 90分以上(包括90):A 80至90(包括80):B 70至80(包括70):C 60至70(包括60)D 60分以下:E 输入以下程序并调试运行。 #include<iostream> using namespace std; int main() { float score; char grade; cout<<"input a student score:"; cin>> score; if ( score <0 || score >100 ) cout<<"input error!"<<endl; else { switch ( int(score)/10 ) { case 10: case 9: grade = 'A';break; case 8: grade = 'B';break; case 7: grade = 'C';break; case 6: grade = 'D';break; default: grade = 'E'; } cout<<"the student scort:"<< grade <<endl; } return 0; } 输入测试数据,调试程序并写出结果。测试数据要覆盖所有路径,注意临界值,例如此题中的100分、60分、0分以及小于0和大于100的数据。
3.有一函数: x ( x<1 ) y = 2x-1 ( 1≤x<10 ) 3x-11 ( x≥10 ) 用cin语句输入x的值,求y值。 运行程序,输入x的值(分别为x<1、1≤x<10、x≥10三种情况),检查输出的y值是否正确。
三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(四) |
函数 |
实验学时 |
2 |
|||
一、 实验目的 1. 掌握函数的定义和调用方法。 2.掌握函数实参与形参的对应关系以及C++的三种函数参数传递机制。 3.掌握函数嵌套调用和递归调用的方法。 4.掌握全局变量和局部变量、动态变量和静态变量的概念和使用方法。 二、实验主要内容 1.写一个判断素数的函数,在主函数中输入一个整数,输出是否是素数的信息。 输入以下程序并调试运行。 #include<iostream> #include<math> #include<string> using namespace std; int prime(int number) { int flag=1, n; for ( n=2; n<= int(sqrt(number)) && flag == 1; n++) if (number%n ==0) flag = 0; return flag; } int main ( ) { int number; cout<<"请输入一个正整数:"; cin>>number; if (prime(number)) cout<<number<<"是素数."<<endl; else cout<<number<<"不是素数."<<endl; return 0; } 注意:函数的定义声明的方法和格式。
2.分析程序的运行结果 输入下列程序,运行它,分析得到的结果。 #include<iostream> using namespace std; int n=0; int func( int x=10 ); int main() { int a, b; a=5; b=func(a); cout<<”\nlocal a=”<<a<<endl<<”local b=”<<b<<endl <<”global n=”<<n<<endl; a++; b=func(a); cout<<”\nlocal a=”<<a<<endl<<”local b=”<<b<<endl <<”global n=”<<n<<endl; func(); return 0; }
int func( int x ) { int a=1; static int b=10; a++; b++; x++; n++; cout<<”\nlocal a=”<<a<<endl<<”local b=”<<b<<endl <<”parameter x=”<<x<<endl; return a+b; }
运行该程序,得到执行结果。分析得到的结果,说明为什么得到这样的结果。
3.递归函数与非递归函数。 编写一个函数,求从n个不同的数中取r个数的所有选择的个数。其个数值为: n! C rn= r!*(n-r)! 其中:n!=n*(n-1)*(n-2)*……..*1。 要求: (1) 分别用递归和非递归两种方式完成程序设计; (2) 主程序中设计一个循环,不断从输入接收n和r的值,计算结果并输出,当用户输入0 0时,程序结束; (3) 能检查输入数据的合法性,要求n>=1并且n>=r; (4) 注意整数能存放的数据范围有限,如何解决? 提示: (1) 可以用double数据类型来存放函数的计算结果。 (2) 递归结束条件: 如果r=0,则C(n,r)=1; 如果r=1, 则C(n,r)=n。 测试数据: 输入:5 3 输出:10 输入:10 20 输出:Iput Invalid1 输入:50 3 输出:1.#IND 输入:0 0 Iput Invalid1 程序结束 思考问题: (1) 对各种数据类型的字长是否有了新的认识? (2) 递归函数的书写要点是什么? (3) 递归和非递归函数各有哪些好处?
三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(五) |
指针 |
实验学时 |
2 |
|||
一、实验目的 1.掌握指针的概念,会定义和使用指针变量。 2.能正确使用数组的指针和指向数组的指针变量。 3.能正确使用字符串的指针和指向字符串的指针变量。 4.了解二级指针的概念及其使用方法。 二、实验主要内容 1.输入两个整数,按由大到小的顺序输出。 输入以下程序并调试运行。 #include<iostream> #include<iomanip> using namespace std; int main() { int a, b; int * p=&a, *q=&b, *t; cout<<"请输入a和b:"; cin>>a>>b; if ( a<b ) { t=p; p=q; q=t; } cout<<a<<setw(5)<<b<<endl; cout<<*p<<setw(5)<<*q<<endl; return 0; } 输入测试数据,分析运行结果。 2.将若干字符串按英文字典由小到大排序。 提示:利用字符指针数组存放若干字符串,字符串的比较和交换。 3.有n个人围成一圈,从第一个人开始报数(从1到3),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 4.编写程序,当输入整数1—12(月份号)时,输出该月的英文名称,输入其他整数时结束程序。 例如,输入“4”,则应输出“April”。输入“0”,则退出程序,要求使用指针数组处理。 三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(六) |
结构体 |
实验学时 |
2 |
|||
一、实验目的 1.掌握结构体类型变量的定义和使用。 2.掌握结构数组的概念和使用。 3.掌握链表的概念,初步学会对链表进行操作。 4.掌握联合体的概念与应用。 二、实验主要内容 1.输入和运行以下程序。 #include<iostream> using namespace std; union data { short int s[2]; float a; int b; char c[4]; }u; int main() { cin>>u.s[0]>>u.s[1]; cout<<"s[0]="<<u.s[0]<<" s[1]="<<u.s[1]<<endl <<"a="<<u.a<<" b="<<u.b<<endl <<"c[0]="<<u.c[0]<<" c[1]="<<u.c[1]<<endl <<"c[2]="<<u.c[2]<<" c[3]="<<u.c[3]<<endl; return 0; } 输入两个整数10000、20000给u.s[0]和u.s[1],分析运行结果。 然后将cin语句改为: cin>>u.b;输入60000给b,分析运行结果。
2.打印学生成绩单,内容包括学号、姓名、三门课(数学MT、英语EN、计算机COMPU)的成绩。计算每个学生三门课程的总分SUM和平均分AVER。若三门课成绩都在90分以上者,输出“Y”;否则输出“N”,并打印学生成绩单,格式如下: NUM NAME MT EN COMP SUM AVER >=90 9501 Liufan 95 98 96.5 289.5 96.5 Y 9502 Zhanghua 95 82 86.5 263.5 87.8333 N 9503 Liming 68 89 85 242 80.6667 N 输入以下程序并调试运行。 #include <iomanip> using namespace std; struct student { int num; char name[15]; float score[3]; float sum; float aver; char ch; }; int main() { student stu[3]; int i,j; for ( i=0; i<3; i++ ) { cin>> stu[i].num; cin>> stu[i].name; for ( j=0; j<3; j++ ) cin>> stu[i].score[j]; } for ( i=0; i<3; i++ ) { stu[i].sum=0; stu[i].ch='Y'; for ( j=0; j<3; j++ ) { stu[i].sum +=stu[i].score[j]; if (stu[i].score[j]<90) stu[i].ch='N'; } stu[i].aver=stu[i].sum/3; } cout<<"NUM NAME MT EN COMP SUM AVER >=90"<<endl; for (i=0;i<3;i++) { cout<<stu[i].num<<setw(8)<<stu[i].name<< setw(8)<<stu[i].score[0] <<setw(8)<<stu[i].score[1]<<setw(8)<<stu[i].score[2] <<setw(8)<<stu[i].sum<<setw(8)<<stu[i].aver << setw(5)<<stu[i].ch<<endl; } return 0; }
3、设计一个单向链表。从标准输入读取若干整数,建立链表,每次读入的数放入链表结尾。当用户输入0时,结束链表的建立工作。然后从前往后依次输出链表结点中的内容。 提示: (1) 链表结点空间动态申请。 (2) 因为每次新结点插入在表尾,所以应设一个指针总是指向当前的表尾。 (3) 处理申请不到空间的情况。 测试数据: 程序输出:请输入若干整数建立链表(输入0结束): 用户输入:1 2 3 4 5 6 7 0 程序输出:1 2 3 4 5 6 7 思考问题: 如果是双向链表,程序要做哪些改动?
三、实验步骤
|
||||||
四、实验结果及分析
|
||||||
成绩 |
教师签名 |
实验项目名称(七) |
类与对象 |
实验学时 |
2 |
一、实验目的 1.类的定义 2.类对象的使用 3.类成员变量的定义和使用 4.类成员函数的定义和使用 5.理解类的作用域 6.理解类的声明 7.理解类中private和public权限的声明依据。 二、实验主要内容 1.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; class CDate { void Set(int m, int d, int y ) { month = m day = d year = y } int IsLeapYear() { return (year%4 == 0 && year%100 != 0)||(year%400 == 0); } public: void Print() { cout<<month<<"/"<<day<<"/"<<year<<endl; } private: int month; int day; int year; }; void main() { CDate a; ————————————————– (1) a.Set(10,15,2007) a.Print(); } 问题一:以上程序编译能通过吗,为什么,应该如何改正? 问题二:类CDate中分别有哪些成员函数和成员变量,它们分别属于哪种访问权限? 问题三:(1)处语句的意思是什么?
2.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; int month;//全局变量 int day; int year; void Set(int m,int d,int y) { ::month=m; ————————————————-(1) ::day=d; ::year=y; }
class CDate { public: void Set(int m,int d,int y) { ::Set(m,d,y); ————————————————-(2)} void Print() { cout<<month<<"/"<<day<<"/"<<year<<endl; } private: int month; //成员变量 int day; int year; }; void main() { CDate a; a.Set(10,15,2007) a.Print(); } 问题一:(1)处是在给成员变量赋值,还是在给全局变量赋值,如果去掉域作用符::,程序是否还能正确运行? 问题二:(2)处调用的哪个函数,如果去掉域作用符::,程序是否还能正确运行? 问题三:该程序的输出结果是什么,试解释该输出结果。
3.设计实现一个CPoint类,满足以下要求: a.该类包含两个整型成员变量x(横坐标)和y(纵坐标),以及一个输出函数Print()用来输出横坐标和纵坐标,要求不可以在类的外部直接访问成员变量; b.可以采用没有参数的构造函数初始化对象,此时的成员变量采用默认值0; c.可以采用直接输入参数的方式来初始化该类的成员变量; d.可以采用其它的CPoint对象来初始化该类的成员变量; e.设计一个主函数来测试以上功能。 三、实验步骤
|
|||
四、实验结果及分析
|
|||
成绩 |
教师签名 |
实验项目名称(八) |
运算符重载 |
实验学时 |
2 |
一、实验目的 1.进一步了解运算符重载的概念和使用方法。 2.掌握几种常用的运算符重载的方法。 3.了解转换构造函数的使用方法。 二、实验主要内容 1.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; class CComplex { public: CComplex() { real = 0; imag = 0; }
CComplex(int x,int y) { real = x; imag = y; } int real; int imag; CComplex operator + (CComplex obj1)——————————-(1) { CComplex obj2(real + obj1.real, imag + obj1.imag); return obj2; } }; int main() {
CComplex obj1(100,30); CComplex obj2(20, 30); CComplex obj; obj = obj1+obj2; ——————————–(2) cout << obj.real <<endl; cout << obj.imag << endl; return 0; } 问题一:(1)处的运算符重载,为什么该函数的返回值要设计成CComplex类型? 问题二:(2)处的运算符重载函数调用就相当于“obj=operator+(obj1,obj2);”,但是为什么CComplex类中的运算符重载函数只设计了一个参数?
2.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; class CComplex { public: CComplex() { real = 0.0; imag = 0.0; }
CComplex(float x, float y) { real = x; imag = y; }
CComplex operator + (CComplex &obj1, CComplex &obj2) { CComplex obj3(obj1.real + obj2.real, obj1.imag + obj2.imag); return obj3; }
CComplex &operator++(CComplex &obj) { obj.real += 1; obj.imag +=1; return obj; } void print() { cout<<real<<"+"<<imag<<"i"<<endl; } private: float real; float imag; }; CComplex &operator–(CComplex &x) { x.real -= 1; x.imag -= 1; return x; } int main() { CComplex obj1(2.1,3.2); CComplex obj2(3.6,2.5); cout<<"obj1="; obj1.print(); cout<<"obj2="; obj2.print(); CComplex obj3 = obj1 + obj2; cout<<"befor++, obj3="; obj3.print(); ++obj3; cout<<"after++, obj3="; obj3.print(); –obj3; cout<<"after–, obj3="; obj3.print(); CComplex obj4 = ++obj3; cout<<"obj4="; obj4.print(); } 问题:以上程序中的三个运算符重载都有错误,试改正过来,并分析该程序的输出结果。 三、实验步骤
|
|||
四、实验结果及分析
|
|||
成绩 |
教师签名 |
实验项目名称(九) |
派生与继承 |
实验学时 |
2 |
一、实验目的 1.理解继承的含义以及声明 2.掌握共有派生、私有派生和保护派生的含义以及使用 3.掌握单派生类中构造函数和析构函数的调用顺序 4.理解多重派生的定义 5.掌握多重派生中构造函数与析构函数的调用顺序 6.理解多重派生中虚拟基类的作用 二、实验主要内容 1.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; class CBase { public: CBase(int a) :a(a) { } protected: void print() { cout<<"a="<<a<<endl; } private: int a; }; class CDerive : public CBase { public: void print() { CBase::print(); cout<<"b="<<b<<endl; } private: int b; };
int main() { CDerive d; d.print(); CBase b; b.print(); return 0; } 问题:以上程序有两大错误,试指出来,并改正之?
2.理解下面的程序并运行查看结果,回答程序后面的问题。 #include <iostream> using namespace std; class CBase1 { public: CBase1(int a) :a(a) { cout<<"base1 structure…"<<endl; } ~CBase1() { cout<<"base1 destructure…"<<endl; } void print() { cout<<"a="<<a<<endl; } protected: int a; };
class CBase2 { public: CBase2(int b) :b(b) { cout<<"base2 structure…"<<endl;} ~CBase2() { cout<<"base2 destructure…"<<endl; } void print() { cout<<"b="<<b<<endl; } protected: int b; };
class CDerive : public CBase1, public CBase2 { public: CDerive() { cout<<"derive structure…"<<endl; } ~CDerive() { cout<<"derive destructure…"<<endl; } void print() { CBase1::print(); CBase2::print(); b1.print(); b2.print(); cout<<"c="<<c<<endl; } private:
CBase1 b1; CBase2 b2; int c; }; int main() { CDerive d; d.print(); return 0; } 问题:改正以上程序中存在的错误,并分析该程序的输出结果
3.定义点CPoint类作为基类,在此基础上派生出直线CLine类和圆CCircle类,并要求基类和各派生类具有以下特点: a.CLine类含有计算直线长度和斜率的成员函数; b.CCircle类含有计算圆面积的成员函数。 三、实验步骤
|
|||
四、实验结果及分析
|
|||
成绩 |
教师签名 |
实验项目名称(十) |
某公司人员信息管理系统 |
实验学时 |
2 |
一、 实验目的 综合运用前面所学的各种知识,编写较复杂的程序。 二、实验主要内容 利用面向对象编程方法为某公司设计一个人员信息管理系统。 要求: (1)首先定义一个公司职员类,用来描述公司所有人员的共同信息(姓名、个人编号、级别、月薪总额); (2)然后通过继承定义兼职技术人员类、兼职推销员类、经理类和销售经理类,分别为每个类定义计算月薪函数和显示人员信息函数。月薪计算方法为: 兼职技术人员类:月薪=每小时酬金*本月的工作时数 兼职推销员类:月薪=销售提成 经理类:月薪=固定月薪 销售经理类:月薪=固定月薪+销售提成 提示: 将公司职员类定义为抽象基类,将计算月薪函数和显示人员信息函数定义为虚函数。 三、实验步骤
|
|||
四、实验结果及分析
|
|||
成绩 |
教师签名 |