江苏科技大学课程实践设计报告VC++.docx
《江苏科技大学课程实践设计报告VC++.docx》由会员分享,可在线阅读,更多相关《江苏科技大学课程实践设计报告VC++.docx(28页珍藏版)》请在冰豆网上搜索。
江苏科技大学课程实践设计报告VC++
江苏科技大学
课程实践报告
设计题目:
计算机程序设计实践(VC++)
设计时间:
2010-03-01至2010-03-07
学院:
专业班级:
学生姓名:
学号
指导老师:
2010年03月
实践一
一、实践任务
1.基础题第2题:
试建立一个类SP,求f(n,k)=1k+2k+3k+……+nk,另有辅助函数power(m,n)用于求mn。
具体要求如下:
(1)私有数据成员
●intn,k;存放公式中n和k的值;共有成员函数
(2)共有成员函数
●SP(intn1,intk1):
构造函数,初始化数据成员数据n和k。
●intpower(intm,intn):
求mn
●intfun():
求公式的累加和
●voidshow():
输出求得的结果
(3)在主程序中定义对象s,对该类进行测试。
二、系统设计
(1)系统功能分析
本系统主要实现函数f(n,k)=1k+2k+3k+……+nk的求值。
(2)类的定义与描述
(3)编写源程序如下:
#include
classSP
{
intn;
intk;
public:
SP(intn1,intk1)
{
n=n1;
k=k1;
}
intpower(intm,intn)
{
ints=1;
for(inti=1;i<=n;i++)
s*=m;
returns;
}
intfun()
{
intf=0;
intj=1;
while(j<=n){
f+=power(j,k);
j++;
}
returnf;
}
voidshow()
{
cout<}
};
voidmain()
{
intn,k;
cin>>n>>k;
SPs(n,k);
s.show();
}
三.系统测试
对类进行测试,测试数据为23;
预期输出结果为9
四.实验小结
此题的关键是fun函数中条件的控制,通过此次实践,熟悉了类的基本构造,学会了用类来求解函数。
五.参考文献:
[1]潘克勤,华伟《VisualC++程序设计》北京:
中国铁道出版社,2008
[2]张晓如,王芳《VisualC++程序设计解析与实训》北京:
中国铁道出版社,2008
实践二
一.实践任务
2.基础题第12题:
建立一个STRING,将一个字符串交叉插入到另一个字符串中(假定两字符串不等长)。
例如将字符串“abcde”交叉插入字符串“ABCDEFG”的结果为“aAbBcCdDeEFG”或“AaBbCcDdEeFG”。
具体要求如下:
(1)私有数据成员
●charstr1[60]:
存放被插入的字符串
●charstr2[40]:
存放待插入的字符串
●charstr3[100]:
存放插入后的字符串
(2)共有成员函数
●STRING(char*s1,char*s2):
构造函数,用s1和s2初始化str1和str2
●voidprocess():
将str2中的字符串插入到str1中,存放到str3中
●voidprint():
输出插入后的字符串
(3)在主程序中定义STRING类的对象test对该类进行测试
二.系统设计
(1)系统功能分析
本系统主要实现将一个字符串交叉插入到另一个字符串中。
(2)类的定义与描述
(3)编写源程序如下:
#include
#include
classSTRING
{
charstr1[60];
charstr2[40];
charstr3[100];
public:
STRING(char*s1,char*s2)
{
strcpy(str1,s1);
strcpy(str2,s2);
}
voidprocess()
{
inti=0,j=0;
while(str2[j])
{
str3[i++]=str2[j];
str3[i++]=str1[j++];
}
while(str1[j])
{
str3[i++]=str1[j++];
}
str3[i]='\0';
}
voidprint()
{
cout<}
};
voidmain()
{
STRINGtest("ABCDEFG","abcde");
test.process();
test.print();
}
三.系统测试
预期输出结果:
aAbBcCdDeEFG
四.实验小结
通过本次实验,进一步了解了拷贝构造函数和while语句的使用。
使用while语句时要控制好循环体执行的条件才能保证程序的正常运行。
五.参考文献:
[1]潘克勤,华伟《VisualC++程序设计》北京:
中国铁道出版社,2008
[2]张晓如,王芳《VisualC++程序设计解析与实训》北京:
中国铁道出版社,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)私有数据成员
●intnum,den:
num为分子,den为分母
(2)共有成员函数
●Fract(inta=0,intb=0):
构造函数,用a和b分别初始化分子num、分母den
●intged(intm,intn):
求m、n的最大公约数。
此函数供成员add()函数调用
●Fractadd(Fractf):
将参数分数f与对象自身相加,返回约简后的分数对象
●voidshow():
按照num/den的形式在屏幕上显示分数
(3)在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add完成f1和f2的相加,将得到的分数赋给对象f3,显示分数对象f3。
二.系统设计
(1)系统功能分析
本系统主要实现两个分数的相加,并将结果化为最简形式后以分数的形式输出。
(2)类的定义与描述
(3)编写源程序如下:
#include
classFract
{
intnum;
intden;
public:
Fract(inta=0,intb=1)
{
num=a;
den=b;
}
intged(intm,intn)
{
if(m>n)
{
intt;
t=m;m=n;n=t;
}
intv;
for(intk=m;k>0;k--)
{
if(n%k==0&&m%k==0){
v=k;
break;
}
}
returnv;
}
Fractadd(Fractf)
{
intfm,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;
FractF(fz,fm);
returnF;
}
voidshow()
{
cout<}
};
voidmain()
{
Fractf1(1,5),f2(7,20),f3;
f3=f1.add(f2);
f3.show();
}
三.系统测试
测试数据1/57/20
预期输出结果11/20
四.实验小结
通过本次实践,我巩固了分数的表示方法及最小公倍数的求法。
本题的难点在于add函数,要注意再函数中定义一个类的对象并通过返回类的对象获得结果。
五.参考文献:
[1]潘克勤,华伟《VisualC++程序设计》北京:
中国铁道出版社,2008
[2]张晓如,王芳《VisualC++程序设计解析与实训》北京:
中国铁道出版社,2008
实践四
一.实践任务
4.基础题第25题:
建立一个类NUM,并统计待定序列中相同的字符的个数。
具体要求如下:
(1)私有数据成员
●chardata[25]:
随机生成25个字符
●intnum[128]:
储存每个字符出现的次数
(2)共有数据成员
●NUM(intdata):
构造函数,同时初始化数组data
●voidprocess():
统计数组data中每个字符出现的个数,并保存到数组num中
●voidprint():
输出每个出现过的字符及其出现的个数,每行输出5个没有出现过的字符不显示
(3)在主程序中定义一个对象,对该类进行测试。
二.系统设计
(1)系统功能分析
本系统主要实现统计待定序列中相同的字符的个数。
(2)类的定义与描述
(3)编写源程序如下:
#include
#include
classNUM
{chardata[25];
intnum[128];
public:
NUM()
{intt;
for(inti=0;i<25;)
{t=rand();
if(t>32&&t<=127)
data[i++]=char(t);}
}
voidprocess()
{for(inti=0;i<128;i++)
num[i]=0;
for(intm=33;m<128;m++)
{for(intj=0;j<25;j++)
{if(char(m)==data[j])
num[m]++;}
}
}
voidprint()
{intcount=0;
for(inti=33;i<128;i++)
{if(num[i]!
=0)
{count++;
cout<if(count%5==0)
cout<}
}
cout<}
};
voidmain()
{NUMtest;
test.process();
test.print();
}
三.系统测试
四.实验小结
本次实践开始忽视了字符和整型的转化,导致调试运行时老报错,而且,由于此题牵扯到随机字符的产生,所以在编写程序时一定不要忘记文件包含。
五.参考文献:
[1]潘克勤,华伟《VisualC++程序设计》北京:
中国铁道出版社,2008
[2]张晓如,王芳《VisualC++程序设计解析与实训》北京:
中国铁道出版社,2008
实践五
一.实践任务
5.基础题第27题:
建立一个类NUM,求指定数据范围内的所有素数。
具体要求如下:
(1)私有数据成员
●intdata[10]:
依次存放原始数据
●intprime[10]:
存放指定数据内所求出的所有素数
●intnum:
存放素数个数
(2)共有数据成员
●NUM(intn[]):
构造函数,用参数n初始化data,同时初始化num为0
●intisprime(intx):
判断x是否为素数。
若是素数返回1,否则返回0
●voidprocess():
求指定data数组中的所有素数,把它们依次存放在数组prime中,并将求出的素数个数赋给num
●voidprint():
输出求出的素数个数及所有素数,每行输出4个素数
(3)在主函数中完成对该类的测试。
定义NUM类的对象test,通过test调用成员函数完成求素数及输出素数的工作。
原始数据为{4,5,9,11,36,29,31,101,56,199}
二.系统设计
(1)系统功能分析
本系统主要实现求指定数据范围内素数的个数,并将这些素数输出。
(2)类的定义与描述
(3)编写源程序如下:
#include
#include
classNUM
{intdata[10];
intprime[10];
intnum;
public:
NUM(intn[])
{num=0;
for(inti=0;i<10;i++)
data[i]=n[i];
}
intisprime(intx)
{intleap;
if(x==0||x==1)
{};
for(inti=2;iif(x%i==0)
leap=0;
if(i>x-1)
leap=1;
returnleap;
}
voidprocess()
{inti=0;
for(intj=0;j<10;j++)
{
if(isprime(data[j]))
{prime[i++]=data[j];
num++;
}
}
}
voidprint()
{
cout<<"素数的个数是:
"<<'\t'<cout<<"素数为:
"<for(inti=0;i{
cout<if((i+1)%4==0)cout<}
cout<}
};
voidmain()
{inta[10]={4,5,9,11,36,29,31,101,56,199};
NUMtest(a);
test.process();
test.print();
}
三.系统测试
测试数据:
4,5,9,11,36,29,31,101,56,199
预期输出结果:
素数的个数是:
6
素数为:
5112931
101199
四.实验小结
本题相对来说很简单,主要就是素数的判断,而素数的判断经过多次的练习已经熟练
掌握。
五.参考文献:
[1]潘克勤,华伟《VisualC++程序设计》北京:
中国铁道出版社,2008
[2]张晓如,王芳《VisualC++程序设计解析与实训》北京:
中国铁道出版社,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)类的层次图:
2.详细设计
(1)类的描述与定义
●基类DataRec有2个保护成员,定义如下:
classDataRec{//基类
protected:
char*name;//姓名
char*address;}//地址
●学生类有2个私有成员,定义如下:
classStudent:
DataRec{//学生类
private:
char*major;//专业
intnumber;}//学号
●员工类有2个保护成员,定义如下:
classStaff:
DataRec{//员工类
protected:
char*department;//.部门
doublet_salary;}//计时工资
●Professor类有一个私有成员,定义如下:
classProfessor:
Staff{//professor类
private:
doublesalary;}//工资
(4)主要成员函数设计
●基类的构造函数定义如下:
DataRec(char*nam,char*addr)
{name=strsave(nam);
address=strsave(addr);}
●基类的析构函数定义如下:
~DataRec(){
delete[]name;
delete[]address;}
●基类中strsave函数定义如下:
char*strsave(char*s){
char*r=newchar[strlen(s)+1];
strcpy(r,s);
returnr;}
●基类中输出函数的功能没有必要先定义,将其说明为纯虚函数,其具体实现在派生类中定义:
virtualvoidOutput()=0;
●Student类的构造函数定义如下:
Student(char*nam,char*addr,char*majo,intnum):
DataRec(nam,addr)
{major=strsave(majo);
number=num;}
●Student类的析构函数定义如下:
~Student()
{delete[]major;}
●Student类的输出函数定义如下:
voidOutput()
{cout<cout<
cout<<"Major:
"<cout<<"Idnumber:
"<●Staff类的构造函数定义如下:
Staff(char*nam,char*addr,char*depar,doublet_sala):
DataRec(nam,addr){
department=strsave(depar);
t_salary=t_sala;}
●Staff类的析构函数定义如下:
~Staff(){
delete[]department;}
●Staff类的输出函数定义如下:
voidOutput(){
cout<cout<
cout<<"Department:
"<cout<<"hourlywage:
"<●Professor类的构造函数定义如下:
Professor(char*name,char*addr,char*depar,intt_sala,doublesalar):
Staff(nam,addr,depar,t_sala)
{salary=salar;}
●Professor类的输出函数定义如下:
voidOutput(){
Staff:
:
Output();
cout<<"Salary:
"<●StudentStaff类构造函数定义如下:
StudentStaff(char*nam,char*addr,char*majo,intnum,intsalar,char*depar,doublet_sala):
Student(nam,addr,majo,num),Staff(nam,addr,depar,t_sala)
{};
●StudentStaff类的输出函数定义如下:
voidOutput(){
Student:
:
Output();
cout<<"Department:
"<cout<<"hourlywage:
"<三.系统测试
系统测试主要通过在主函数中定义对象来完成,主函数定义如下:
voidmain(void)
{
Studentastu("WangVi","运河路","Computerscience",8401031);
Staffastaf("LiXin","北京路","ElectricalEngineer",16.5);
Professoraprofes("ZhangXi","南京路","ComputerScience",0,3000);
StudentStaffastustaf("WangXi","乌鲁木齐路","ComputerScience",8401032,0,"ElectricalEngineer",5.8);
astu.Output();
cout<<"\n";
astaf.Output();
cout<<"\n";
aprofes.Output();
cout<<"\n";
astustaf.Output();
cout<<"\n";
}
预期输出结果为:
WangVi
运河路
Major:
Computerscience
Idnumber:
8401