江苏科技大学
课程实践报告
设计题目: 程序设计(VC++)实践
设计时间: 2010-10-10 至2010-11-10
学院: 电子信息学院
专业班级: 自动化
学生姓名: 江中炜学号0940301210 指导老师: 邹晓华
2010年09月
实践任务一
一、程序设计基本题
试建立一个类PP,求出下列多项式的前n项的值。
1 n=0
P n(x) = x n=1
((2n-1)xP n-1(x)-(n-1)P n-2 (x)) n>1 具体要求如下:
(1)私有数据成员
●int n:前若干项的项数。
●double x:存放x的值。
●double *p:根据n的大小动态申请存放P n(x)前n项的数组空间。
(2)共有成员函数
●PP(int num,double x1):构造函数,初始化数据成员n和x,使
p指向动态申请的数据空间。
●~PP( ):析构函数,释放p指向的动态内存空间。
●double fun(int n1,double x):递归函数,用于求多项式P n(x)的
第n1项。注意:将递归公式中的n用作函数参数。本函数供
process函数调用。
●void process( ):完成求前n项的工作,并将它们存放发到p指向
的动态数组中。
●void show( ):输出n和x,并将前n项以每行4个数的形式输出
到屏幕上。
(3)在主函数中完成对该类的测试。先输入num和x1,并定义一个PP 类的对象items,用num和x1初始化items的成员n和x,调用items
的成员函数,并输出多项式前num项的值。
二、系统设计
1、概要设计
通过类PP的成员函数process( )来求多项式Pn(x)的前n项的值,其中用fun( )函数来求第n项的值,根据n的大小来给数据成员p分配动态空间,程序结束前释放为items分配的动态空间。
2、详细设计
①类的定义如下:
class PP
{
int n;
double x;
double *p;
public:
PP(int num,double x1){}
void process( ){}
void show( ){}
};
②类的主要成员函数的设计
double fun(int n1,double x) //设计函数来求P n(x)
{
if(n1==0) return 1;
else if(n1==1)return x;
return ((2*n1-1)*x*fun(n1-1,x)-(n1-1)*fun(n1-2,x))/n1;
}
三、系统测试
先输入num和x1,并定义一个PP类的对象items,用num和x1初始化items 的成员n和x,调用items的成员函数,并输出多项式前num项的值。
void main()
{
int num;
double x1;
cin>>num>>x1;
PP items(num,x1);
items.fun(num,x1);
items.process();
items.show();
}
用以测试的数据为:
3 4
预期的输出结果为:
n=3 x=4
1 4 23.5 154
四、实践小结
这道题主要是把题目看懂,其实只是一些简单的函数定义而已。
五、参考文献
[1]潘克勤,华伟,Visual C++程序设计北京:中国铁道出版社2008
[2]张晓如,王芳,Visual C++程序设计解析与实训北京:中国铁道出版社2008
六、源程序清单
#include
class PP
{
int n;
double x;
double *p;
public:
PP(int num,double x1){
n=num;
x=x1;
p=new double[n+1];}
~PP(){if(p)delete[]p;}
double fun(int n1,double x)
{
if(n1==0)return 1;
else if(n1==1)return x;
return ((2*n1-1)*x*fun(n1-1,x)-(n1-1)*fun(n1-2,x))/n1;
}
void process()
{
for(int i=0;i { p[i]=fun(i,x); } } void show() { cout<<"n="< for(int i=0;i { cout< if((i+1)%4==0) cout<<'\n'; } } }; void main() { int num; double x1; cin>>num>>x1; PP items(num,x1); items.fun(num,x1); items.process(); items.show(); } 实践任务二 一、程序设计基本题 试建立一个类SP,求f(n,k)=1k +2k+3k+…+n k ,另有辅助函数power(m, n)用于求m n 。 具体要求如下: (1)私有成员函数。 ●int n,k:存放公式中n和k的值; (2)公有成员函数。 ●SP(int n1,int k1):构造函数,初始化成员数据n和k。 ●int power(int m,int n):求m n 。 ●int fun( ):求公式的累加和。 ●void show( ):输出求得的结果。 (3)在主程序中定义对象s,对该类进行测试。 二、系统设计 1、概要设计 通过类SP的成员函数power()求出m的n次方的值,再通过成员函数fun( )调用power( )函数求出f(n,k)的值。 2、详细设计 ①类的定义如下: class SP { int n,k; public: SP(int n1,int k1){} int power(int m,int n){} int fun ( ){} void show( ) }; ②类的主要成员函数的设计 int power(int m,int n) { int p=1; //用for循环语句来实现求m n的值 for(int i=1;i p=p*m; return p; } int fun(int n,int k) { s=0; //用for循环语句来实现公式的累加和 for(int j=1;j<=n;j++) s+=power(j,k); return s; } 三、系统测试 在主函数中初始化SP的对象s,并调用其成员函数show( )输出测试结果。 主函数定义如下: void main( ) { int n,k; cin>>n>>k; SP s(n,k); s.power(n,k); s.fun(n,k); s.show( ); } 用以测试的数据为: 2 3 预期的输出结果为: 9 四、实践小结 这道题值得注意的是在成员函数fun( )中调用了函数power( ),还有对for循环语句的熟练运用。 五、参考文献 [1]潘克勤,华伟,Visual C++程序设计北京:中国铁道出版社2008 [2]张晓如,王芳,Visual C++程序设计解析与实训北京:中国铁道出版社2008 六、源程序清单 #include class SP { int n,k,s; public: SP(int n1,int k1){ n=n1; k=k1;} int power(int m,int n){ int p=1; for(int i=1;i p=p*m; return p; } int fun(int n,int k){ s=0; for(int j=1;j<=n;j++) s+=power(j,k); return s; } void show() { cout<<"和为"< } }; void main() { int n,k; cin>>n>>k; SP s(n,k); s.power(n,k); s.fun(n,k); s.show(); } 实践任务三 一、程序设计基本题 建立一个类MOVE,将数组中最大元素的值与最小元素的值互换。 具体要求如下: (1)私有成员函数 ●int *array:一维整型数组。 ●int n:数组中元素的个数。 (2)公有成员函数 ●MOVE(int b[ ],int m):构造函数,初始化成员数据。 ●void exchange():输出平均值,并将数组中的元素按要求重新放 置。 ●void print():输出一维数组。 ●~MOVE:析构函数。 (3)在主程序中用数据{21,65,43,87,12,84,44,97,32,55}对该类进行测试。 二、系统设计 1、概要设计 根据数组中元素的个数开辟一个动态数组空间array,通过类MOVE的成员函数exchange()输出一维数组的平均值,并把数组中最大元素和最小元素的位置相互交换,并把新的数组放在开辟的动态数组空间中。程序结束前释放为array 分配的动态空间。 2、详细设计 ①类的定义如下: class MOVE { int *array; int n; public: MOVE(int b[ ],int m){} void exchange( ){} void print( ){} ~MOVE( ){} }; ②类的主要成员函数的设计 void exchange() { float p,s=0; for(int i=0;i s+=array[i]; p=s/n; //求数组中所有元素之和的平均值int a,b,min=array[0],max=array[0]; cout<<"平均值:"< for(i=0;i { if(max { max=array[i]; a=i; } } //求所有元素中的最大值 for(i=0;i { if(min>array[i]) { min=array[i]; b=i; } } //求所有元素中的最小值 array[a]=min; array[b]=max; } 三、系统测试 在主函数中初始化MOVE的对象move,并调用其成员函数exchange( )和print( )输出测试结果。 主函数定义如下: void main( ) { int s[ ]={21,65,43,87,12,84,44,97,32,55}; MOVE move(s,10); move.exchange( ); move.print( ); } 用以测试的数据为: 2165 43 87 12 84 44 97 32 55 预期的输出结果为: 平均值:54 2165 43 87 97 84 44 12 32 55 四、实践小结 这道题主要是求数组中所有元素的平均值以及元素中的最大值和最小值,同时还要注意析构函数的运用。 五、参考文献 [1]潘克勤,华伟,Visual C++程序设计北京:中国铁道出版社2008 [2]张晓如,王芳,Visual C++程序设计解析与实训北京:中国铁道出版社2008 六、源程序清单 #include class MOVE { int *array; int n; public: MOVE(int b[],int m) { n=m; array=new int[n]; for(int i=0;i array[i]=b[i]; } void exchange() { float p,s=0; for(int i=0;i s+=array[i]; p=s/n; int a,b,min=array[0],max=array[0]; cout<<"平均值:"< for(i=0;i { if(max { max=array[i]; a=i; } } for(i=0;i { if(min>array[i]) { min=array[i]; b=i; } } array[a]=min; array[b]=max; } void print() { for(int i=0;i cout< cout<<'\n'; } ~MOVE() { if(array)delete[]array; } }; void main() { int s[]={21,65,43,87,12,84,44,97,32,55}; MOVE move(s,10); move.exchange(); move.print(); } 实践任务四 一、程序设计基本题 定义一个字符串类String,实现判断该字符串是否为回文字符串。所谓回文字符串,是指该字符串左右对称。例如字符串“123321”是回文字符串。 具体要求如下: (1)私有成员函数 ●char*str; ●int y:标记是否为回文字符串。 (2)公有成员函数 ●String(char*s):构造函数,用给定的参数s初始化数据成员str。 Y初始化为0。 ●void huiwen():判断str所指向的字符串是否为回文字符串。 ●void show():在屏幕上显示字符串。 (3)在主程序中定义字符串char s[]=“ababcedbaba”作为原始字符串。定义一个String类对象test,用s初始化test,完成对该类的测试。 二、系统设计 1、概要设计 通过回文函数来进行判断,然后将函数判断结果进行输出。 2、详细设计 ①类的定义如下: class String { char *str; int b; public: String(char *s){} void huiwen( ){} void show( ){} ~String( ){} }; ②类的主要成员函数的设计 void huiwen() { char *p1=str,*p2=str; while(*p2)p2++;p2--; for(;p1 { b=1; break; } } 三、系统测试 在主程序中定义字符串char s[]=“ababcedbaba”作为原始字符串。定义一个String类对象test,用s初始化test,并调用其成员函数huiwen( )和show( )。 void main( ) { char *s="ababcedbaba"; String test(s); test.huiwen( ); test.show( ); } 用以测试的字符串为: ababcedbaba 预期的输出结果为: ababcedbaba不是回文字符串 四、实践小结 这道题困难在于用指针来操作字符串,定义了两个指针,分别指向字符串的首尾,通过比较两个指针所指的字符是否相等来判断是否为回文字符串。相等则前一个指针自增,后一个自减。若不等则不是回文字符串。 五、参考文献 [1]潘克勤,华伟,Visual C++程序设计北京:中国铁道出版社2008 [2]张晓如,王芳,Visual C++程序设计解析与实训北京:中国铁道出版社2008 六、源程序清单 #include #include class String { char *str; int b; public: String(char *s) { str=new char[strlen(s)+1]; strcpy(str,s); b=0; } void huiwen() { char *p1=str,*p2=str; while(*p2)p2++;p2--; for(;p1 if(*p1!=*p2) { b=1; break; } } void show() { if(b) cout< else cout< } ~String() { if(str)delete[]str; } }; void main() { char *s="ababcedbaba"; String test(s); test.huiwen(); test.show(); } 实践任务五 一、程序设计基本题 建立一个类MOVE,实现将数组中大写字母元素放在小写字母元素的左边。 具体要求如下: (1)私有数据成员 ● char*array:一维字符数组。 ● int n:数据中元素的个数。 (2)公有成员函数 ● MOVE(char b[ ],int m) :构造函数,初始化成员数据。 ● void change( ):进行排序换位。 ● void print( ):输出一维数组。 ● ~MOVE( ):析构函数。 (3)在主程序中用数据“fdsUFfsTjfsKFEkWC”对该类进行测试。 二、系统设计 1、概要设计 为array开辟一个动态数组空间,通过类MOVE的成员函数change( )来实现将数组中的大写字母元素放在小写字母元素的左边的功能。程序结束前释放为array分配的动态空间。 2、详细设计 类的定义如下: class MOVE{ char *array; int n; public: MOVE(char ,int ); void change( ); void print( ); ~MOVE( ); }; 三、系统测试 在主函数中初始化类MOVE的对象,并调用其成员函数print()输出测试结果。主函数定义如下: void main( ) { char*arr="fdsUFfsTjfsKFEkWC"; MOVE test(arr,17); test.change( ); test.print( ); } 用以测试的数据为: FdsUFfsTjfsKFEkWC 预期输出结果为: UFTKFEWCfdsfsjfsk 四、实践小结 这道题和之前的一道题有点类似, 五、参考文献 [1]潘克勤,华伟,Visual C++程序设计北京:中国铁道出版社2008 [2]张晓如,王芳,Visual C++程序设计解析与实训北京:中国铁道出版社2008 六、源程序清单 #include class MOVE { char*array; int n; public: MOVE(char b[],int m) { n=m; array=new char[n];