江苏科技大学课程实践设计报告VC++

更新时间:2023-03-08 05:34:10 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

江苏科技大学

课程实践报告

设计题目: 计算机程序设计实践(VC++) 设计时间: 2010 - 03-01 至 2010- 03-07 学 院: 专业班级: 学生姓名: 学号 指导老师:

2010年03月

实践一

一、 实践任务

1.基础题 第2题:

试建立一个类SP,求f(n,k)=1k + 2k + 3k + …… + nk ,另有辅助函数power(m,n)用于求mn 。 具体要求如下:

(1) 私有数据成员

● int n,k;存放公式中n和k的值;共有成员函数

(2) 共有成员函数

● SP(int n1,int k1):构造函数,初始化数据成员数据n和k。 ● int power(int m,int n):求mn ● int fun():求公式的累加和 ● void show():输出求得的结果

(3) 在主程序中定义对象s,对该类进行测试。 二、 系统设计

(1) 系统功能分析

本系统主要实现函数f(n,k)=1k + 2k + 3k + …… + nk的求值。 (2) 类的定义与描述 (3) 编写源程序如下: #include int j=1; class SP while (j<=n){ { f+=power(j,k); int n; j++; int k; } public: return f; SP (int n1,int k1) } { void show() n=n1; { k=k1; cout<>n>>k; } SP s(n,k); int fun ( ) s.show(); { } int f=0;

三.系统测试 对类进行测试,测试数据为 2 3;

预期输出结果为 9

四.实验小结 此题的关键是fun函数中条件的控制,通过此次实践,熟悉了类的基本构造,学会了用类来求解函数。 五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008

实践二

一.实践任务

2.基础题 第12题:

建立一个STRING,将一个字符串交叉插入到另一个字符串中(假定两字符串不等长)。例如将字符串“abcde”交叉插入字符串“ABCDEFG”的结果为“aAbBcCdDeEFG”或“AaBbCcDdEeFG”。 具体要求如下:

(1) 私有数据成员

● char str1[60]:存放被插入的字符串 ● char str2[40]:存放待插入的字符串 ● char str3[100]:存放插入后的字符串

(2) 共有成员函数

● STRING(char *s1,char*s2):构造函数,用s1和s2初始化str1和str2 ● void process():将str2中的字符串插入到str1中,存放到str3中 ● void print():输出插入后的字符串

(3) 在主程序中定义STRING类的对象test对该类进行测试 二.系统设计 (1)系统功能分析 本系统主要实现将一个字符串交叉插入到另一个字符串中。

(2) 类的定义与描述 (3) 编写源程序如下:#include void process() #include { class STRING int i=0,j=0; { while (str2[j]) char str1[60]; { char str2[40]; str3[i++]=str2[j]; char str3[100]; str3[i++]=str1[j++]; public: } STRING (char *s1,char *s2) while (str1[j]) { { strcpy(str1,s1); str3[i++]=str1[j++]; strcpy(str2,s2); } str3[i]='\\0'; }

}

void print () { cout<

三.系统测试

预期输出结果:aAbBcCdDeEFG

void main () {

STRING test(\ test.process(); test.print(); }

四.实验小结 通过本次实验,进一步了解了拷贝构造函数和while语句的使用。使用while语句时要控制好循环体执行的条件才能保证程序的正常运行。 五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008

实践三

一.实践任务 3.基础题 第23题:

分数相加,两个分数分别是1/5和7/20,他们相加后得11/20,方法是先求出两个分数分母的最小公倍数,通分后,再求两个分子的和,最后约减结果分数的分子和分母,即用分子分母的最大公约数分别除分子和分母。求m、n最大公约数的一种方法是:将m、n较小的一个数赋值给变量k,然后分别用{k,k-1,k-2,……,1}中的数去除m和n,第一个能把m和n同时除尽的数就是m和n的最大公约数。假定m、n的最大公约数是v,则它们的最小公倍数就是m*n/v。试建立一个分数类Fract,完成两个分数相加的功能。 具体要求如下:

(1) 私有数据成员

● int num,den:num为分子,den为分母

(2) 共有成员函数

● Fract (int a=0,int b=0):构造函数,用a和b分别初始化分子num、分母den ● int ged (int m,int n):求m、n的最大公约数。此函数供成员add()函数调用 ● Fract add (Fract f):将参数分数f与对象自身相加,返回约简后的分数对象 ● void show ():按照num/den的形式在屏幕上显示分数

(3) 在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add

完成f1和f2的相加,将得到的分数赋给对象f3,显示分数对象f3。

二. 系统设计

(1) 系统功能分析

本系统主要实现两个分数的相加,并将结果化为最简形式后以分数的形式输出。 (2) 类的定义与描述 (3) 编写源程序如下:

#include class Fract { int num; int den; public: Fract(int a=0,int b=1) { num=a; den=b; } int ged(int m,int n) { if (m>n) { int t; t=m;m=n;n=t; } int v; for (int k=m;k>0;k--) { if (n%k==0&&m%k==0){ v=k; break; } } return v;

三. 系统测试

测试数据 1/5 7/20 预期输出结果 11/20

} Fract add (Fract f) { int fm,fz,v; fm=den*f.den/ged(den,f.den); num=fm/den*num; f.num=fm/f.den*f.num; fz=num+f.num; v=ged(fz,fm); fm=fm/v; fz=fz/v; Fract F(fz,fm); return F; } void show() { cout<

void main () { Fract f1(1,5),f2(7,20),f3; f3=f1.add (f2); f3.show(); }

四.实验小结 通过本次实践,我巩固了分数的表示方法及最小公倍数的求法。本题的难点在于add函数,要注意再函数中定义一个类的对象并通过返回类的对象获得结果。 五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008

实践四

一.实践任务

4.基础题 第25题:

建立一个类NUM,并统计待定序列中相同的字符的个数。 具体要求如下:

(1) 私有数据成员

● char data[25]:随机生成25个字符

● int num[128]:储存每个字符出现的次数

(2) 共有数据成员

● NUM(int data):构造函数,同时初始化数组data ● void process():统计数组data中每个字符出现的个数,并保存到数组num中 ● void print():输出每个出现过的字符及其出现的个数,每行输出5个没有出现过的字符

不显示

(3) 在主程序中定义一个对象,对该类进行测试。 二.系统设计 (1) 系统功能分析 本系统主要实现统计待定序列中相同的字符的个数。

(2) 类的定义与描述 (3) 编写源程序如下:#include } #include void print() class NUM { int count=0; { char data[25]; for (int i=33;i<128;i++) int num[128]; { if (num[i]!=0) public: { count++; NUM() cout<32&&t<=127) } data[i++]=char (t);} } } cout<

三.系统测试

四. 实验小结

本次实践开始忽视了字符和整型的转化,导致调试运行时老报错,而且,由于此题牵扯到随机字符的产生,所以在编写程序时一定不要忘记文件包含< stdlib.h>。 五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008

实践五

一.实践任务

5.基础题 第27题:

建立一个类NUM,求指定数据范围内的所有素数。 具体要求如下:

(1) 私有数据成员

● int data[10]:依次存放原始数据

● int prime[10]:存放指定数据内所求出的所有素数 ● int num:存放素数个数

(2) 共有数据成员

● NUM(int n[ ]):构造函数,用参数n初始化data,同时初始化num为0 ● int isprime(int x):判断x是否为素数。若是素数返回1,否则返回0 ● void process():求指定data数组中的所有素数,把它们依次存放在数组prime中,并将

求出的素数个数赋给num ● void print():输出求出的素数个数及所有素数,每行输出4个素数

(3) 在主函数中完成对该类的测试。定义NUM类的对象test,通过test调用成员函数完成求素数

及输出素数的工作。原始数据为{4,5,9,11,36,29,31,101,56,199}

二.系统设计 (1) 系统功能分析

本系统主要实现求指定数据范围内素数的个数,并将这些素数输出。 (2) 类的定义与描述 (3) 编写源程序如下:#include leap=0; #include if (i>x-1) class NUM leap=1; { int data[10]; return leap; int prime[10]; } int num; void process () public: { int i=0; NUM (int n[]) for( int j=0;j<10;j++) { num=0; { for(int i=0;i<10;i++) if (isprime (data[j])) data [i]=n[i]; { prime[i++]=data[j]; } num++; int isprime (int x) } { int leap; } if (x==0||x==1) } {}; void print() for (int i=2;i

} 是:\

}; cout<<\素数为:\

for (int i=0;i

三.系统测试

测试数据:4,5,9,11,36,29,31,101,56,199 预期输出结果:素数的个数是:6 素数为: 5 11 29 31

101 199

四.实验小结

本题相对来说很简单,主要就是素数的判断,而素数的判断经过多次的练习已经熟练 掌握。

五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008

实践六

一.实践任务

6.提高题 第6题:

设计一个大学师生类,包括学生类(Student),教师类(Professor),职员类(Staff),教师类是职员类的派生类。另有一类既作为学生又兼做助教的,可作为学生类和职员类的派生类(StudentStaff)。另外定义一个所有类的父类(DataRec)。 具体要求如下:

(1) DataRec类中数据成员又姓名,家庭住址,定义为指针变量。成员函数有构造函数,析构函

数,输出函数,strsave函数。输出函数定义为虚函数。Strsave函数用来动态申请内存空间,拷贝参数中的字符串,返回内存空间的首地址。因为所有的派生类都要用到,设置为保护权限

(2) Student类数据成员有专业、学号,专业定义为指针变量。Staff类数据成员有部门、计时薪酬,

部门定义为指针变量。Professor类数据成员有工资,这三个类都有输出函数,用来输出自己的数据成员

(3) StudentStaff类多重继承学生类和职员类。成员函数有输出函数 (4) DataRec类可以定义为虚基类 (5) 每个类中数据成员定义为私有的

(6) 编写main函数,测试上述所要求的各种功能。 二.系统设计 1.概要设计 (1)系统功能分析 本系统的功能是存储大学师生的基本信息,如:姓名,家庭住址,专业,部门等。 (2)类的层次图:

DataRec Student Staff StudentStaff Professor

2.详细设计

(1)类的描述与定义

? 基类DataRec有2个保护成员,定义如下:

class DataRec{ //基类 protected: char *name; //姓名 char *address; } //地址

? 学生类有2个私有成员,定义如下:

class Student:DataRec{ //学生类

private: char* major; //专业 int number;} //学号

? 员工类有2个保护成员,定义如下: class Staff:DataRec { //员工类 protected: char* department; //.部门 double t_salary;} //计时工资

? Professor类有一个私有成员,定义如下: class Professor:Staff { //professor 类 private: double salary;} //工资 (4) 主要成员函数设计

? 基类的构造函数定义如下:

DataRec(char *nam,char *addr) { name=strsave(nam);

address=strsave(addr);}

? 基类的析构函数定义如下:

~DataRec(){

delete [ ]name; delete [ ]address;}

? 基类中strsave函数定义如下:

?

?

?

?

?

?

?

?

?

?

?

char* strsave(char *s){

char* r=new char[strlen(s)+1]; strcpy(r,s); return r;}

基类中输出函数的功能没有必要先定义,将其说明为纯虚函数,其具体实现在派生类中定义:

virtual void Output()=0;

Student类的构造函数定义如下:

Student(char *nam,char *addr,char* majo,int num):DataRec(nam,addr) { major=strsave(majo);

number=num;}

Student类的析构函数定义如下: ~Student() { delete []major;}

Student 类的输出函数定义如下: void Output() { cout<

cout<

cout<<\Staff类的构造函数定义如下:

Staff(char *nam,char *addr,char* depar,double t_sala):DataRec(nam,addr){

department=strsave(depar); t_salary=t_sala;}

Staff类的析构函数定义如下: ~Staff(){

delete [] department;}

Staff类的输出函数定义如下: void Output(){

cout<Professor(char *name, char *addr, char* depar, int t_sala, double salar):Staff (nam,addr,depar,t_sala)

{ salary=salar;}

Professor类的输出函数定义如下: void Output(){

Staff::Output();

cout<<\StudentStaff类构造函数定义如下:

StudentStaff(char *nam,char *addr,char* majo,int num,int salar,char* depar,double t_sala):Student(nam,addr, majo, num),Staff(nam,addr, depar, t_sala)

{};

StudentStaff 类的输出函数定义如下: void Output(){

Student::Output();

cout<<\ cout<<\三.系统测试

系统测试主要通过在主函数中定义对象来完成,主函数定义如下:

void main(void) {

Student astu(\运河路\ Staff astaf(\北京路\

Professor aprofes(\南京路\

StudentStaff astustaf(\Xi\乌鲁木齐路\Science\Engineer\

astu.Output(); cout<<\ astaf.Output(); cout<<\

aprofes.Output(); cout<<\

astustaf.Output(); cout<<\}

预期输出结果为:

Wang Vi 运河路

Major: Computer science Idnumber: 8401031

Li Xin 北京路

Department: Electrical Engineer hourly wage: 16.5

Zhang Xi 南京路

Department: Computer science hourly wage: 0 Salary: 3000

Wang Xi 乌鲁木齐路

Major: Computer science

Department: Electrical Engineer hourly wage: 5.8

四. 实验小结

刚开始接触这道题目,感觉毫无头绪,读了好几遍题目依旧一头雾水,于是去请教了同学,他引导着我把题目又分析了一遍,把题目中的类一一列出来,分析他们之间的关系,分析各个成员的关系。由于对虚函数还不是很了解,我又参考课本把虚函数这节复习了一遍。编写好源程序之后就是上机调试,通过不断地发现错误改正错误,最后总算是解决了这道题目! 五.参考文献:

[1] 潘克勤,华伟 《Visual C++程序设计》 北京:中国铁道出版社,2008

[2] 张晓如,王芳 《Visual C++程序设计解析与实训》 北京:中国铁道出版社,2008 六.源程序清单 #include #include class DataRec {protected: char *name; char *address; char* strsave(char *s) { char* r=new char[strlen(s)+1]; strcpy(r,s); return r; } public: DataRec(char *nam,char *addr) { name=strsave(nam); address=strsave(addr); } ~DataRec() { delete [] name;

delete []address; } virtual void Output()=0; };

class Student:DataRec {private: char* major; int number; public: Student(char *nam,char *addr,char* majo,int num):DataRec(nam,addr) { major=strsave(majo); number=num; } ~Student() { delete []major;} void Output() { cout<class Staff:DataRec {protected: char* department; double t_salary; public: Staff(char *nam,char *addr,char* depar,double t_sala):DataRec(nam,addr) { department=strsave(depar); t_salary=t_sala; } ~Staff() { delete [] department;} void Output() { cout<class Professor:Staff { private: double salary; public: Professor(char *nam,char *addr,char* depar,int t_sala,double salar):Staff(nam,addr,depar,t_sala) { salary=salar;} void Output() { Staff::Output();

cout<<\ } };

class StudentStaff:Student,Staff {public: StudentStaff(char *nam,char *addr,char* majo,int num,int salar,char* depar,double t_sala):Student(nam,addr, majo, num),Staff(nam,addr, depar, t_sala) {}; void Output() { Student::Output(); cout<<\ cout<<\ } };

void main(void) { Student astu(\运河路\ Staff astaf(\北京路\ Professor aprofes(\南京路\ StudentStaff astustaf(\乌鲁木齐路\ astu.Output(); cout<<\ astaf.Output(); cout<<\ aprofes.Output(); cout<<\ astustaf.Output(); cout<<\}

本文来源:https://www.bwwdw.com/article/if5.html

Top