文章目录
赠予燕大学弟学妹:
下面这些只是一种参考方法,并不是一定要这样写的。方法思想万卷不离其宗,只要掌握了知识点就都没问题的,下午答辩时候按照自己的理解回答老师的问题就可以了,不用紧张,只要知识点会无论怎样能表达出来就可以了。
PS:大一代码写的很烂,不喜勿喷 Thanks♪(・ω・)ノ
资源:实验报告.doc
给大家设置 0积分下载了,直接载下来参考就行啦:
https://download.csdn.net/download/weixin_45525272/18736257
另外:其他带积分资源 没积分不知道咋下的 可以参考这一篇文章:
https://yangyongli.blog.csdn.net/article/details/116832457
文章目录
C++面向对象程序设计实验报告
实验1 编程环境的熟悉及简单程序的编制
1.1 实验目的和要求
1.熟悉 VC++2010 编程环境,编制简单 C++程序并运行,熟悉 C++的编辑、 编译、 连接、运行、断点调试等过程。
2.掌握 C++数据类型,熟悉如何定义和使用常量和变量,以及对它们赋值的方法。
3.学会使用 C++的有关算术运算符及表达式,特别是自加(++)和自减(–)运算符 的使用。
4.分支和循环结构的使用
1.2 所占学时数
本实验安排 2 个实验课时。
1.3 实验任务
1.3.1 任务一
(1)题目名称
功能需求:运行时显示"Menu: A(dd) D(elete) S(ort) Q(uit), Select one:“提示
用户输入,A 表示增加,D 表示删除,S 表示排序,Q 表示退出,输入为 A、 D、S 时分别提示”
数据已经增加、删除、排序。"输入为 Q 时程序结束。
按照上述功能需求写两个程序,分别使用if分支语句和switch分支语句实现:
程序1要求:使用 if … else 语句进行判断,用 break、continue 控制程序流程。
程序2要求:使用 Switch 语句实现。
(2)构思过程(可用文字、流程图、UML图等方式表达)
在一个大的循环中可以无限次地输入、输出,将输入的内容去初始化一个新的字符,再对该字符进行对应操作:
程序1.用if进行分类,逐步套用
程序2.用case进行分类,逐步套用
(3)程序源码
程序1:
#include <iostream>
using namespace std;
int main()
{
cout<<"提示用户输入,A 表示增加,D 表示删除,S 表示排序,Q 表示退出"<<endl;
char C;
for( ; ; )
{
cin>>C;
if(C=='A')
{
cout<<"数据已经增加"<<endl;
continue;
}
else if(C=='D')
{
cout<<"数据已经删除"<<endl;
continue;
}
else if(C=='S')
{
cout<<"数据已经排序"<<endl;
continue;
}
else if(C=='Q')
break;
else
cout<<"请按提示输入!"<<endl;
}
return 0;
}
程序2:
#include<iostream>
using namespace std;
int main()
{
cout<<"提示用户输入,A 表示增加,D 表示删除,S 表示排序,Q 表示退出"<<endl;
char C=' ';
for(;;)
{
cin>>C;
switch(C)
{
case 'A':
cout<<"数据已经增加"<<endl;
break;
case 'D':
cout<<"数据已经删除"<<endl;
break;
case 'S':
cout<<"数据已经排序"<<endl;
break;
case 'Q':
break;
default:
cout<<"请按恪提示输入"<<endl;
}
}
return 0;
}
(4)运行结果(截图)
程序1:
(5)心得体会
在循环语句中,break和continue的作用不同:break表示是终止整个循环体,而continue表示是终止这一次循环,进入下一个循环。
1.3.1 任务二
(1)题目名称
找出2~10000之内的所有完全数。所谓完全数,即其各因子之和正好等于本身的数。如
6=1+2+3,28=1+2+4+7+14,所以6,28都是完全数。
(2)构思过程(可用文字、流程图、UML图等方式表达)
使函数在规定范围内判断该数是否是完全数:在循环中使该数对从2开始到它自身进行取余运算,将整除的因子相加(除自身外)求和。If语句进行判断,若是和与自身相同,则返回值为1;反之,返回值为0.主函数中,输出返回值为1的完全数。
(3)程序源码
#include <iostream>
#include<cmath>
using namespace std;
int yinzi(int x)
{
int sum = 1;
if (x >= 2)
{
for (int i = 2; i < x; i++)
{
if (x%i == 0)
{
sum += i;
}
else
continue;
}
if (sum == x)
return 1;
else
return 0;
}
}
int main()
{
for (int i = 2; i <= 10000; i++)
{
int s = yinzi(i);
if (s == 1)
{
cout << i << ends;
}
else
continue;
}
}
(4)运行结果(截图)
(5)心得体会
函数返回值可以借助计算机语言0和1简化操作
实验2 函数的应用
2.1 实验目的和要求
1.掌握函数声明、定义和调用的方法;
2.掌握函数递归调用的方法;
3.掌握重载函数的声明、定义和使用方法;
4.理解函数参数传递中传值与引用的区别
2.2 所占学时数
本实验安排 2 个实验课时。
2.3 实验任务
2.3.1 任务一
(1)题目名称
用递归方法编写函数 Fibonnacci(斐波那契)级数:
Fn=Fn-1 + Fn-2; F1=F2=1;
并求出第 26 项的值。
(2)构思过程(可用文字、流程图、UML图等方式表达)
利用递归思想构建一个函数表示斐波那契数列,在主程序里引用函数体直接得出数列第16项并输出。
(3)程序源码
#include<iostream>
#include<cmath>
using namespace std;
int fbnq(int n)
{
if (n == 1 || n == 2)
return 1;
else
return fbnq(n - 1) + fbnq(n - 2);
}
int main()
{
cout << fbnq(26);
}
(4)运行结果(截图)
(5)心得体会
函数的构建需要确定函数类型及形参的数据类型,引用时同样也注意实参的数据类型是否与形参相同,以及返回值类型。
2.3.2 任务二
(1)题目名称
设计一函数,判断一整数是否为素数。并完成下列程序设计:
①编写求素数的函数,并用这个函数求 3-200 之间的所有素数
②在 4-200 之间,验证歌德巴赫猜想:任何一个充分大的偶数都可以表示为两个素数之和。输出 4=2+2 6=3+3 …… 200=3+197
注:素数又称质数,指在一个大于 1 的自然数中,除了 1 和此整数自身外,不能被其他自然数(不包括 0)整除的数
(2)构思过程(可用文字、流程图、UML图等方式表达)
先构造出一个判断素数的函数,在大循环中让该数依次去除以比它小的数,直至循环可以循环到该数前一个,输出。
验证哥德巴赫猜想时,任意偶数可以分成两素数的和,简化验证过程,我们可以直接验证每个偶数都可以分为3和另一个素数和(除4外)。
(3)程序源码
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int sushu(int x)
{
if (x > 1)
{
for (int i = 2; i <= x; i++)
{
int r = x % i;
if (r == 0)
{
break;
}
else
{
continue;
}
if (i = x - 1)
{
return 1;
}
}
}
else
return 0;
}
string gdbh(int y)
{
int i = 3;
if (y == 4)
{
return "2+2";
}
else
{
int j = y - 3;
int J = sushu(j);;
stringstream j0;
j0 << j;
string j1 = j0.str();
if (J = 1)
{
return j1 + "+3";
}
else
return "错误";
}
}
int main()
{
for (int i = 3; i <= 200; i++)
{
int a = sushu(i);
if (a == 1)
cout << i << ends;
}
cout << endl;
for (int i = 4; i <= 200; i = i + 2)
{
cout << i << "=" << gdbh(i) << ends;
}
}
(4)运行结果(截图)
(5)心得体会
判断素数时可以借用break和continue来简化函数循环语句
预处理文件#include 中的stringstream和str()可以将int型转化为string型
2.3.3 任务三
(1)题目名称
①比较值传递和引用传递的相同点和不同点。
②调用被重载的函数时,通过什么来区分被调用的是哪一个函数?
(2)答:
① 1、相同点:都是用来初始化对象的
2、不同点:
传值是单向的,形参的改变不会影响到实参;
传址是双向的,形参可以改变实参,数据不安全。
② 重载函数名是相同的,但是函数的参数类型或者个数会不同,可以通过观察参数的类型和个数进行判断调用的函数。
实验3 类与对象、构造与析构函数
3.1 实验目的和要求
1.掌握类的定义和使用。
2.掌握类的定义和对象的声明。
3.掌握具有不同访问属性的成员的访问方式。
4.深入体会构造函数、复制构造函数、析构函数的执行机制。
5.使用的 VC++的 debug 调试功能观察程序流程,跟踪观察类的构造函数、析构函数、 成员函数的执行顺序。
3.2 所占学时数
本实验安排 4 个实验课时。
3.3 实验任务
3.3.1 任务一
(1)题目名称
设计一个用于人事管理的 People(人员)类。考虑到通用性,这里只抽象出所有类型人员都具有的属性:number(编号)、sex(性别)、birthday(出生日期)、id(身份 证号)等。
其中"出生日期"定义为一个"日期"类内嵌子对象。
用成员函数实现对人员信息 的录入和显示。
要求包括:构造函数和析构函数、拷贝构造函数、内联成员函数、带缺省形参值的成员函数 、聚集。
(2)构思过程(可用文字、流程图、UML图等方式表达)
定义Date类,利用类的构造函数声明输入和输出的两个操作函数对内嵌子对象birthday进行操作。
定义People类,初始化基础成员函数,利用公有成员函数进行People对象的输入。
在主函数中声明People类的对象进行输入,利用People类的复制构造函数进行输出。
(3)程序源码
#include<