课程实践报告
设计题目: 程序设计(VC++)实践
设计时间 至
学院(系):
专业班级:
学生姓名: 学号
指导老师:
2013年12月
任务一
一、实践任务
2.试建立一个类SP,求,另有辅助函数power(m,n)用于求。
二、详细设计
1、类的描述与定义
(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( ):输出求得的结果。
2、主要函数设计
在主程序中定义对象s,对该类进行测试。
三、源程序清单
#include class SP { int n,k; public: SP(int n1,int k1) { n=n1;k=k1; } int power(int m,int n) { int p=1; for (int i=1;i return p; } int fun() { int s=0; for (int i=1;i return s; } void A() { cout<<"n="< }; void main() { SP a(3,3); a.power(3,3); a.fun(); a.A(); }四、实践小结 掌握用循环语句求m^n,和m!,熟练掌握函数的调用。 五、运行结果 任务三 一、实践任务 3.建立一个类MOVE,不进行排序,将数组中小于平均值的元素放到数组的左边,大于平均值的元素放到数组的右边。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●float array[20]:一维整型数组。 ●int n:数组中元素的个数。 (2)公有成员函数 ●MOVE(float b[],int m):构造函数,初始化成员数据。 ●void average():输出平均值,并将数组中的元素按要求重新放置。 ●void print():输出一维数组。 2、主要函数设计 在主程序中用数据{1.3,6.2,3,9.1,4.8,7.4,5.6,9.2,2.3}对该类进行测试。 三、源程序清单 四、实践小结 应熟练掌握数组与指针的应用。 五、运行结果 任务四 一、实践任务 4.建立一个类MOVE,将数组中最大元素的值与最小元素的值互换。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int *array:一维整型数组。 ●int n:数组中元素的个数。 (2)公有成员函数 ●MOVE(int b[],int m):构造函数,初始化成员数据。 ●void exchange():输出平均值,并将数组中的元素按要求重新放置。 ●void print():输出一维数组。 ●~MOVE():析构函数。 2、主要函数设计 在主程序中用数据{21,65,43,87,12,84,44,97,32,55}对该类进行测试。 三、源程序清单 四、实践小结 学会求数组中最大元素与最小元素方法,并实现交换。 五、运行结果 任务六 一、实践任务 6.定义一个字符串类String,实现判断该字符串是否为回文字符串。所谓回文字符串,是指该字符串左右对称。例如字符串“123321”是回文字符串。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●char *str; ●int y:标记是否为回文字符串。 (2)公有成员函数 ●String (char *s) :构造函数,用给定的参数s初始化数据成员str。y初始化为0。 ●void huiwen () :判断str所指向的字符串是否为回文字符串。 ●void show( ) :在屏幕上显示字符串。 2、主要函数设计 在主程序中定义字符串char s[]=”ababcedbaba”作为原始字符串。定义一个String类对象test,用s初始化test,完成对该类的测试。 三、源程序清单 四、实践小结 掌握判断回文字符串的一般形式。 五、运行结果 任务十一 一、实践任务 11.建立一个STRING,将一个字符串交叉插入到另一个字符串中(假定两字符串等长)。例如将字符串“abcde” 交叉插入字符串“ABCDE”的结果为“aAbBcCdDeE”或“AaBbCcDdEe”。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●char str1[80] :存放被插入的字符串。 ●char str2[40] :存放待插入的字符串。 (2)公有成员函数 ●STRING (char *s1, char *s2 ):构造函数,用s1和s2初始化str1和str2。 ●void process():将str2中的字符串插入到str1中。 ●void print():输出插入后的字符串。 2、主要函数设计 在主程序中定义STRING类的对象test对该类进行测试。 三、源程序清单 #include #include class STRING{ private: char str1[80];//存放被插入的字符串; char str2[40];//存放待插入的字符串; public: STRING(char*s1,char*s2) { strcpy(str1,s1); strcpy(str2,s2); } void process(); void print(); }; void STRING::process() { int i,j; int n=strlen(str1); if(strlen(str2)>strlen(str1)) {//当待插入的字符串ABCDEFG比被插入的字符串abcde长或相等时,逻辑算法:abcde->a b c d e->空格处依次插入ABCDEFG->aAbBcCdDeEFG; for(i=n-1;i>0;i--) { str1[i+i]=str1[i];//被插入的字符串由最后一位开始各位向后移动i位; } for(i=1,j=0;i<2*n;i+=2,j++) { str1[i]=str2[j];//在空出的位置处依次插入字符串; } i--; for(;j<=strlen(str2);j++,i++) { str1[i]=str2[j];//将过长额字符串放入被插入的字符串尾部,完成插入; } } else//当待插入的字符串abcde比被插入的字符串ABCDEFG短时,逻辑算法:ABCDEFG->A B C D E FG->空格处插入abcde->AaBbCcDdEeFG; { for(i=n;i>strlen(str2)-1;i--) { str1[i+strlen(str2)]=str1[i];//比待插入的字符串长的部分均向后移strlen(str2)位; } for(i=strlen(str2)-1;i>0;i--) { str1[i+i]=str1[i];//之前的部分均向后移i位; } for(i=1,j=0;i<2*strlen(str2);i+=2,j++) { str1[i]=str2[j];//将待插入的字符串插入空格处,完成插入; } } } void STRING::print()//输出插入后的字符串 { cout<<"插入后的字符串为:"< void main()//测试 { STRING test("ABCDE test.process(); test.print(); } 四、实践小结 发现字符插入的规律,再依次放入相应字符位置。 五、运行结果 任务十二 一、实践任务 12.建立一个STRING,将一个字符串交叉插入到另一个字符串中(假定两字符串不等长)。例如将字符串“abcde” 交叉插入字符串“ABCDEFG”的结果为“aAbBcCdDeEFG”或“AaBbCcDdEeFG”。 二、详细设计 1、类的描述与定义 (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():输出插入后的字符串。 2、主要函数设计 在主程序中定义STRING类的对象test对该类进行测试。 三、源程序清单 #include #include class STRING{ private: char str1[60]; char str2[40]; char str3[100]; public: STRING(char*s1,char*s2) { strcpy(str1,s1); strcpy(str2,s2); } void process(); void print(); }; void STRING::process() { int i,j; int n=strlen(str1); if(strlen(str2)>strlen(str1)) {//当待插入的字符串ABCDEFG比被插入的字符串abcde长或相等时,逻辑算法:abcde->a b c d e->空格处依次插入ABCDEFG->aAbBcCdDeEFG; for(i=n-1;i>0;i--) { str1[i+i]=str1[i];//被插入的字符串由最后一位开始各位向后移动i位; } for(i=1,j=0;i<2*n;i+=2,j++) { str1[i]=str2[j];//在空出的位置处依次插入字符串; } i--; for(;j<=strlen(str2);j++,i++) { str1[i]=str2[j];//将过长额字符串放入被插入的字符串尾部,完成插入; } } else//当待插入的字符串abcde比被插入的字符串ABCDEFG短时,逻辑算法:ABCDEFG->A B C D E FG->空格处插入abcde->AaBbCcDdEeFG; { for(i=n;i>strlen(str2)-1;i--) { str1[i+strlen(str2)]=str1[i];//比待插入的字符串长的部分均向后移strlen(str2)位; } for(i=strlen(str2)-1;i>0;i--) { str1[i+i]=str1[i];//之前的部分均向后移i位; } for(i=1,j=0;i<2*strlen(str2);i+=2,j++) { str1[i]=str2[j];//将待插入的字符串插入空格处,完成插入; } } strcpy(str3,str1);//将str2中的字符串插入到str1中,存放到str3中; } void STRING::print()//输出插入后的字符串 { cout<<"插入后的字符串为:"< void main() { STRING test("abcde test.process(); test.print(); } 四、实践小结 发现字符插入的规律,再依次放入相应字符位置。 五、运行结果 任务十三 一、实践任务 13.建立一个类MOVE,对数组中元素进行循环换位,即每个元素后移三位,最后三个元素移到最前面。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int array[20]:一维整型数组。 ●int n:数组中元素的个数。 (2)公有成员函数 ●MOVE(int b[],int m):构造函数,初始化成员数据。 ●void change():进行循环换位。 ●void print():输出一维数组。 2、主要函数设计 在主程序中用数据{21,65,43,87,12,84,44,97,32,55}对该类进行测试。 三、源程序清单 #include class MOVE{ private: int array[20];//一维整型数组; int n; //数组中的元素个数; public: MOVE(int b[],int m) { for(int i=0;i n=m; } void change(); void print(); }; void MOVE::change()//进行循环换位,即每个元素后移3位,最后3个元素移到最前面; { int tem[3];//建立临时数组,用于存放最后3个元素; int i=0; while(i<3) { tem[2-i]=array[n-1-i];//将最后3个元素依次放入临时数组中; i++; } for(i=0;i array[n-1-i]=array[n-1-3-i]; } for(i=0;i<3;i++)//将临时数组中存放的最后3个元素依次放入后移后的原数组中,完成循环换位; { array[i]=tem[i]; } } void MOVE::print()//输出一维数组; { for(int i=0;i void main() { int s[]={21,65,43,87,12,84,44,97,32,55}; int n=sizeof(s)/sizeof(int); MOVE test(s,n); test.print(); test.change(); test.print(); } 四、实践小结 利用临时数组先保存后3位,再依次把数放入对应位。 五、运行结果 任务十四 一、实践任务 14.建立一个类MOVE,实现将数组中大字字母元素放在小写字母元素的左边。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●char *array:一维字符数组。 ●int n:数组中元素的个数。 (2)公有成员函数 ●MOVE(char b[],int m):构造函数,初始化成员数据。 ●void change():进行排序换位。 ●void print():输出一维数组。 ●~MOVE():析构函数。 2、主要函数设计 在主程序中用数据"fdsUFfsTjfsKFEkWC"对该类进行测试。 三、源程序清单 #include #include class MOVE{ char *array; int n; public: MOVE(char b[],int m) { n=m; array=new char[n+1]; strcpy(array,b); } void change() { char*p1=new char[strlen(array)+1];//用于存大写; char*p2=new char[strlen(array)+1];//存小写; int i,j=0,k=0; for(i=0;i if(array[i]>='A'&&array[i]<='Z') { p1[j]=array[i]; j++; } else {p2[k]=array[i];k++;} } p1[j]=p2[k]='\\0'; strcat(p1,p2);//存放大写组与小写组拼接; strcpy(array,p1);//拷贝至array; delete []p1; delete []p2; } void print() { cout< ~MOVE() { if (array) delete []array; } }; void main() { char b[]="fdsUFfsTjfsKFEkWC"; int n; n=(sizeof(b)-1)/sizeof(char); MOVE test(b,n); test.change(); test.print(); } 四、实践小结 利用临时数组,分别保存大写与小写字母,再实现功能。 五、运行结果 任务十五 一、实践任务 16.定义一个方阵类CMatrix,并根据给定算法实现方阵的线性变换。方阵的变换形式为: F=W*fT f为原始矩阵,fT为原始矩阵的转置,w为变换矩阵,这里设定为 1 0 0 1 0 1 1 0 0 1 1 0 1 0 0 1 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int (*a)[4]:a指向方阵数组。 ●int w[4][4]:w为变换矩阵。 ●int m:m表示方阵的行和列数。 (2)公有成员函数 ●CMatrix (int a[][4],int m) :用给定的参数a和m 初始化数据成员a和m;对变换矩阵w进行初始化,要求必须用循环实现。 ●void Transform () :根据上述变换算法,求出变换后的数组形式,存放在原始数组内。 ●void show( ) :在屏幕上显示数组元素。 ●~ CMatrix () :释放动态分配的空间。 2、主要函数设计 在主程序中定义数组int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}作为原始数组。定义一个CMatrix类对象test,用arr初始化test,完成对该类的测试。 三、源程序清单 #include class CMatrix{ private: int(*a)[4]; int w[4][4];//变换矩阵 int m;//表示方阵的行和列数; public: CMatrix(int a[][4],int m) { int i,j; this->a=new int[m][4]; this->m=m; for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(i==j||i+j==4-1) w[i][j]=1; else w[i][j]=0; } } for(i=0;i for(j=0;j<4;j++) { this->a[i][j]=a[i][j]; } } } void Transform(); void show(); ~CMatrix() {if(a) delete []a;} }; void CMatrix::Transform()//根据变换算法,求出变换后的数组形式,存放在原始数组内; { int i,j,k; for(i=0;i for(j=i;j<4;j++) { k=a[i][j],a[i][j]=a[j][i],a[j][i]=k; } } int sum;//用来存放矩阵乘法中,行列中元素依次相乘的累加和; int turn[4][4];//临时数组,用来存放矩阵乘法所求得的值; for(i=0;i<4;i++)//实现矩阵的乘法; { for(j=0;j<4;j++) { sum=0; for(k=0;k<4;k++) { sum+=w[i][k]*a[k][j]; } turn[i][j]=sum; } } for(i=0;i<4;i++)//将临时数组的值存放入原始数组中; { for(j=0;j<4;j++) { a[i][j]=turn[i][j]; } } } void CMatrix::show()//在屏幕上显示数组元素; { for(int i=0;i for(int j=0;j<4;j++) { cout< } cout< } void main() { int arr[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; CMatrix test(arr,4); cout<<"原矩阵为:"< test.Transform(); cout<<"经线性变换后的矩阵为:"< } 四、实践小结 应熟练掌握矩阵的乘法方式。 五、运行结果 任务十六 一、实践任务 17.定义一个类SIN,求 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●float x:输入公式中x的值,求sin(x)。 ●int n:输入公式中n的值。 (2)公有成员函数 ●SIN(float x, int n ):构造函数,用于初始化x和n的值。 ●int power( int q):求q!的值。 ●float mi(float m,int n):求的值。 ●float fun( ):用于求SIN(X)的值。 ●void show( ):输出求得的结果。 2、主要函数设计 在主程序中定义对象test,对该类进行测试(x是弧度,弧度不可能大于1)。 三、源程序清单 #include #include class SIN{ private: double x; int n; public: SIN(double x,int n) { this->x=x; this->n=n; } double power(int q); double mi(double m,int n); double fun(); void show(); }; double SIN::power(int q)//求q的阶乘; { double s=1; while(q!=1) { s*=q; q--; } return s; } double SIN::mi(double m,int n)//求m^n的值; { while(n!=1) { m*=m; n--; } return m; } double SIN::fun()//用于求sin(x)的值;//注:当n较大时,阶乘和幂的运算可能超出变量的类型的字节大小!改用double类型可提高运算的范围! { double s=0;//记录每项相加的和 for(int i=1;i<=n;i++) { s+=mi(x,2*i-1)*mi(-1,i+1)/power(2*i-1);//通项为(-1)^(i+1)*x^(2*i-1)/(2*i-1)!,其中n为由1开始的奇数; } return s; } void SIN::show()//输出求得结果; { cout<<"sin("< void main() { int degree,n; double hudu; cout<<"请输入度数和公式中的n值:"; cin>>degree>>n; hudu=degree%360*(3.1415926)/180.0;//度数转换为弧度; SIN test(hudu,n); test.show(); } 四、实践小结 找到公式中的相关关系,再进行相应函数的组合。 五、运行结果 任务十七 一、实践任务 18.试建立一个类VAR,用于求n()个数的均方差。均方差的计算公式为,其中平均值为。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●double a[100]:用于存放输入的n个数。 ●int n:实际输入数的个数n。 (2)公有成员函数 ●VAR(double x[], int n1):构造函数,初始化成员数据a和个数n。 ●double average(double x[], int n):求平均值,数组x具有n个元素。 ●void variance(double x[],int n):求均方差,数组x具有n个元素。 ●void show():输出求得的均方差。 2、主要函数设计 在主程序中定义一个对象test,对该类进行测试。 三、源程序清单 #include class VAR{ private: double a[100];//用于存放输入的n个数; int n;//实际输入数的个数n; public: VAR(double x[],int n1) { for(int i=0;i a[i]=x[i]; } n=n1; } double average(double x[],int n); double variance(double x[],int n); void show(); }; double VAR::average(double x[],int n)//求平均值,数组x具有n个元素; { double ave=0; for(int i=0;i ave+=x[i]; } return ave/n; } double VAR::variance(double x[],int n)//求均方差,数组x具有n个元素; { double d=0; for(int i=0;i d+=(x[i]-average(x,n))*(x[i]-average(x,n)); } d/=n; return d; } void VAR::show()//输出求得的均方差; { cout<<"均方差为:"< void main()//测试; { double s[]={1,2,3,4,5,6,7,8,9,10}; int n=sizeof(s)/sizeof(double); VAR test(s,n); cout< } 四、实践小结 理解算数公式,根据题目线索,完成。 五、运行结果 任务十八 一、实践任务 19.定义一个方阵类Array,实现对方阵进行顺时针90度旋转。如图所示。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int a[4][4]:用于存放方阵。 (2)公有成员函数 ●Array (int a1[][4],int n) :构造函数,用给定的参数a1初始化数据成员a。 ●void xuanzhuan () :实现对方阵a进行顺时针90度的旋转。 ●void show( ) :在屏幕上显示数组元素。 2、主要函数设计 在主程序中定义数组int b[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}作为原始数组。定义一个Array类对象test,用b初始化test,完成对该类的测试。 三、源程序清单 #include class Array{ private: int a[4][4]; public: Array(int a1[][4],int n) { for(int i=0;i for(int j=0;j<4;j++) a[i][j]=a1[i][j]; } } void xuanzhuan(); void show(); }; void Array::xuanzhuan()//实现对方阵a进行顺时针90度的旋转; { int t[4][4];//定义临时数组,用于保存旋转后,对应下标上的数值; int i,j; for(i=0;i<4;i++) { for(j=0;j<4;j++) { t[j][i]=a[3-i][j];//对方阵a进行顺时针90度旋转对应位所得值,赋予该对应临时位上; } } for(i=0;i<4;i++) { for(j=0;j<4;j++) { a[i][j]=t[i][j];//将临时数组中的对应值保存到原数组中; } } } void Array::show()//输出数组元素; { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) cout< cout< } void main()//测试; { int b[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; Array test(b,4); cout<<"原始方阵为:"< test.xuanzhuan(); cout<<"顺时针90度旋转后的方阵为:"< } 四、实践小结 理解方阵旋转的本质,利用临时数组,存放对应位上的数。 五、运行结果 任务十九 一、实践任务 20.定义一个方阵类Array,实现对方阵进行逆时针90度旋转。如图所示。 1 2 3 4 4 8 12 16 5 6 7 8 3 7 11 15 9 10 11 12 2 6 10 14 13 14 15 16 1 5 9 13 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int a[4][4]:用于存放方阵。 (2)公有成员函数 ●Array (int a1[][4],int n) :构造函数,用给定的参数a1初始化数据成员a。 ●void xuanzhuan () :实现对方阵a进行逆时针90度的旋转。 ●void show( ) :在屏幕上显示数组元素。 2、主要函数设计 在主程序中定义数组int b[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}作为原始数组。定义一个Array类对象test,用b初始化test,完成对该类的测试。 三、源程序清单 #include class Array{ private: int a[4][4]; public: Array(int a1[][4],int n) { for(int i=0;i for(int j=0;j<4;j++) a[i][j]=a1[i][j]; } } void xuanzhuan(); void show(); }; void Array::xuanzhuan()//实现对方阵a进行逆时针90度的旋转; { int i,j; int t[4][4];//定义临时数组,用于保存原始方阵经逆时针90度旋转后对应下标上的值; for(i=0;i<4;i++) { for(j=0;j<4;j++) t[3-j][i]=a[i][j];//将旋转后对应下标上的值赋给临时数组上的对应位置; } for(i=0;i<4;i++) { for(j=0;j<4;j++) a[i][j]=t[i][j];//将保存在临时数组的值,赋给原始数组,从而原始数组完成旋转; } } void Array::show()//输出; { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) cout< cout< } void main()//测试; { int b[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; Array test(b,4); cout<<"原始方阵为:"< test.xuanzhuan(); cout<<"进行逆时针90度旋转后的方阵为:"< } 四、实践小结 理解方阵旋转的本质,利用临时数组,存放对应位上的数。 五、运行结果 任务二十 一、实践任务 21.建立一个类NUM,求指定数据范围内的所有合数(非质数)。提示:合数定义是“一个数,除了1和它本身,还有其它约数,这样的数叫合数”。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int *data:动态存放在指定范围内求出的所有合数。 ●int span1,span2:存放指定范围的下限和上限。 ●int num:存放span1与span2之间的合数个数。 (2)公有成员函数 ●NUM(int n1, int n2) :构造函数,用参数n1和n2初始化span1和span2,同时初始化num。 ●int isComposite (int x ):判断x是否为合数。若是合数,返回1,否则,返回0。 ●void process( ) :求指定范围内的所有合数,把它们依次存放在数组data中,并将求出的合数个数赋给num。 ●void print( ):输出求出的素数个数及所有合数,每行输出8个合数。 ●~NUM( ):释放动态分配的存储空间。 2、主要函数设计 在主函数中完成对该类的测试。定义一个NUM类对象test,指定查找范围为100~200,即求100至200之间的所有合数。通过test调用成员函数完成求合数及输出合数的工作。 三、源程序清单 #include #include class NUM{ private: int*data;//动态存放在指定范围内求出的所有合数; int span1,span2;//存放指定范围的下限和上限; int num;//存放span1与span2之间的合数个数; public: NUM(int n1,int n2) { data=new int[n2-n1+1]; span1=n1; span2=n2; num=0; } int isComposite(int x); void process(); void print(); ~NUM() {if(data)delete data;} }; int NUM::isComposite(int x)//判断x是否为合数。若是合数,返回1,否则,返回0; { if(x>1)//比1大,但不是素数的数,称为合数; { if(x==2||x==3) return 0; for(int i=2;i<=sqrt(x);i++) { if(x%i==0)return 1; } if(i>sqrt(x)) return 0; } else return 0; } void NUM::process()//求指定范围内的所有合数,把它们依次存放在数组data中,并将求出的合数个数赋给num; { for(int i=span1,j=0;i<=span2;i++) { if(isComposite(i)) { data[j]=i; j++; num++; } } } void NUM::print()//输出; { cout<<"素数个数:"< cout< if((i+1)%8==0) cout< cout< void main()//测试; { NUM test(100,200); test.process(); test.print(); } 四、实践小结 理解素数的含义,熟练掌握判断素数的方法。 五、运行结果 任务二十一 一、实践任务 22.建立一个类Saddle_point,求一个数组中的所有鞍点。提示:鞍点是这样的数组元素,其值在它所在行中为最大,在它所在列中为最小。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int a[4][4]:存放二维数组元素。 ●int b[4][4]:存放二维数组中的鞍点值。 ●int num:存放鞍点个数。 (2)公有成员函数 ●Saddle_point(int data[][4]):构造函数,用参数int data[][4]初始化数组a,,同时初始化数组b与num 的值均为0。 ●void process( ):求数组a所有鞍点(如果有鞍点),把它们行、列、及值相应存放在数组b中,并将求出的鞍点个数赋给num。 ●void print( ):输出数组a、鞍点个数,与鞍点坐标及相应值。 2、主要函数设计 在主程序中定义数组int b[ ][4]={2,6,3,4,5,6,5,5,5,7,6,7,1,9,2,7}作为原始数组。定义一个Saddle_point类对象fun。通过fun调用成员函数完成求鞍点及输出工作。 三、源程序清单 #include class Saddle_point{ private: int a[4][4]; int b[4][4];//存放二维数组中的鞍点值; int num;//存放鞍点个数; public: Saddle_point(int data[][4]) { for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { a[i][j]=data[i][j]; b[i][j]=0; } } num=0; } void process(); void print(); }; void Saddle_point::process()//求数组a所有鞍点,把它们行,列,及值相应存放在数组b中,并将求出的鞍点个数赋给num; { int i,j,k; int m=0,n=0;//作为是否为鞍点的判断条件; for(i=0;i<4;i++)//算法:依次判断数组中的每个元素是否为所在该行为最大,所在该列为最小; { for(j=0;j<4;j++) { m=n=0; for(k=0;k<4;k++) { if(a[i][j]>=a[i][k]) m++;//判断该元素是否为所在行最大; else break; if(a[i][j]<=a[k][j]) n++;//判断该元素是否为所在列最大; else break; } if(m==4&&n==4)//满足条件即为鞍点; { num++; b[i][j]=a[i][j]; } } } } void Saddle_point::print()//输出数组a,鞍点个数,与鞍点坐标及相应值; { int i,j; cout<<"数组a为:"< { for(j=0;j<4;j++) cout< cout< cout<<"鞍点个数:"< { for(i=0;i<4;i++) { for(j=0;j<4;j++) { if(b[i][j])//当b[i][j]不为0时,即其中此时对应下标保存有原数组a中对应下标的鞍点值; { cout<<"鞍点坐标:"<<"["< } } } } else cout<<"无鞍点"< void main() { int b[][4]={2,6,3,4,5,6,5,5,5,7,6,7,1,9,2,7}; Saddle_point fun(b); fun.process(); fun.print(); } 四、实践小结 应理解鞍点的含义,再利用循环判断语句依次遍历寻找鞍点。 五、运行结果 任务二十二 一、实践任务 23.分数相加,两个分数分别是1/5和7/20,它们相加后得11/20。方法是先求出两个分数分母的最小公倍数,通分后,再求两个分子的和,最后约简结果分数的分子和分母(如果两个分数相加的结果是4/8,则必须将其约简成最简分数的形式1/2),即用分子分母的最大公约数分别除分子和分母。求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、类的描述与定义 (1)私有数据成员 ●int num,den :num为分子,den为分母。 (2)公有成员函数 ●Fract(int a=0,int b=1):构造函数,用a和b分别初始化分子num、分母den。 ●int ged(int m,int n):求m、n的最大公约数。此函数供成员add()函数调用。 ●Fract add(Fract f):将参数分数f与对象自身相加,返回约简后的分数对象。 ●void show():按照num/den的形式在屏幕上显示分数。 2、主要函数设计 在主程序中定义两个分数对象f1和f2,其初值分别是1/5和7/20,通过f1调用成员函数add完成f1和f2的相加,将得到的分数赋给对象f3,显示分数对象f3。 三、源程序清单 #include class Fract{ private: int num,den; public: Fract(int a=0,int b=1) { num=a; den=b; } int ged(int m,int n)//求m,n的最大公约数; { int k; k=m { if(m%k==0&&n%k==0) return k; else k--; } } Fract add(Fract f); void show(); }; Fract Fract::add(Fract f)//将参数分数f与对象自身相加,返回约简后的分数对象; { Fract s; s.den=this->den*f.den/ged(this->den,f.den); s.num=(this->num*f.den+this->den*f.num)/ged(this->den,f.den); s.den=s.den/ged(s.den,s.num); s.num=s.num/ged(s.den,s.num); return s; } void Fract::show() { cout< void main() { Fract f1(1,5),f2(7,20),f3; f3=f1.add(f2); f3.show(); } 四、实践小结 理解函数中分数运算的实现方式,再依次完成。 五、运行结果 任务二十三 一、实践任务 24.建立一个类NUM,并统计特定序列中相同的数字的个数。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int data[25]:随机生成25个在0-9之间的数字。 ●int num[10]:储存每个数字出现的个数。 (2)公有成员函数 ●NUM(int data):构造函数,初始化数组data。 ●void process( ):统计数组data中每个数字出现的个数,并保存到数组num中。 ●void print( ):输出每个数字出现的个数,每行输出5个 2、主要函数设计 在主程序中定义一个对象,对该类进行测试。 三、源程序清单 #include #include class NUM{ private: int data[25]; int num[10]; public: NUM(int data) { for(int i=0;i<25;i++) { this->data[i]=rand()%data;//随机生成25个在0-9之间的数字; } } void process(); void print(); }; void NUM::process() { for(int i=0;i<10;i++) { int k=0; for(int j=0;j<25;j++) { if(i==data[j]) k++;//记录值为i的数字出现的次数; } num[i]=k;//储存每个数字出现的个数; } } void NUM::print()//输出每个数字出现的个数,每行输出5个; { for(int i=0;i<10;i++) { cout< if((i+1)%5==0) cout< } void main()//测试; { NUM test(10); test.process(); test.print(); } 四、实践小结 掌握数组,利用循环判断实现计数。 五、运行结果 任务二十四 一、实践任务 25.建立一个类NUM,并统计特定序列中相同的字符的个数。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●char data[25]:随机生成25个字符。 ●int num[128]:储存每个字符出现的个数。 (2)公有成员函数 ●NUM(int data):构造函数,同时初始化数组data。 ●void process( ):统计数组data中每个字符出现的个数,并保存到数组num中。 ●void print( ):输出每个出现过的字符及其出现的个数,每行输出5个,没有出现过的字符不显示。 2、主要函数设计 在主程序中定义一个对象,对该类进行测试。 三、源程序清单 #include #include class NUM{ private: char data[25]; int num[128]; public: NUM(int data) { for(int i=0;i<25;i++) this->data[i]=rand()%data;//随机生成25个字符; } void process(); void print(); }; void NUM::process()//统计data中每个字符出现的个数,并保存到数组num中; { for(int i=0;i<128;i++) { int k=0; for(int j=0;j<25;j++) { if(data[j]==i) k++; } num[i]=k;//存储每个字符出现的个数; } } void NUM::print()//输出每个出现过的字符及其出现的个数,每行输出5个,没有出现过的字符不显示; { for(int i=0;i<128;i++) { int k=0; if(num[i]) { cout< } if((k+1)%5==0) cout< cout< void main() { NUM test(128); test.process(); test.print(); } 四、实践小结 掌握数组,利用循环判断实现计数。 五、运行结果 任务二十五 一、实践任务 26.建立一个类NUM,随机生成25个字符序列,并为特定序列进行排序。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int data[25]:随机生成25个字符。 (2)公有成员函数 ●NUM(int data[]):构造函数,初始化数组data。 ●void process( ):为数组data进行排序,要求按照ASCII码进行升序排列。 ●void print( ):输出数组data,每行输出5个字符。 2、主要函数设计 在主程序中定义一个对象,对该类进行测试。 三、源程序清单 #include #include class NUM{ private: int data[25]; public: NUM(int data) { for(int i=0;i<25;i++) { this->data[i]=rand()%data; } } void process(); void print(); }; void NUM::process()//为数组data进行排序,按ASCII码升序排列; { for(int k,i=0;i<25-1;i++) { k=i; for(int j=i+1;j<25;j++) { if(data[k]>data[j]) { k=j; } } if(k!=i)//优化程序的执行过程; { j=data[k]; data[k]=data[i]; data[i]=j; } } } void NUM::print()//输出数组data,每行输出5个字符; { for(int i=0;i<25;i++) { cout< } void main()//主函数中定义一个对象,对该类进行测试; { NUM test(128); test.process(); test.print(); } 四、实践小结 掌握产生随机数的函数rand()及其所在头文件stdlib.h,再根据题目信息完成。 五、运行结果 任务二十六 一、实践任务 27.建立一个类NUM,求指定数据范围内的所有素数(质数)。提示:素数定义是“只能被1和它本身整除的整数”,即质数。 二、详细设计 1、类的描述与定义 (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个素数。 2、主要函数设计 在主函数中完成对该类的测试。定义NUM类对象test,通过test调用成员函数完成求素数及输出素数的工作。原始数据为{4,5,9,11,36,29,31,101,56,199}。 三、源程序清单 #include #include class NUM{ private: int data[10]; int prime[10]; int num; public: NUM(int n[]) { for(int i=0;i<10;i++) data[i]=n[i];//依次存放原始数据; num=0; } int isprime(int x); void process(); void print(); }; int NUM::isprime(int x)//判断x是否为素数。若是素数,返回1,否则,返回0; { if(x>1) { if(x==2||x==3) return 1; else { for(int i=2;i<=sqrt(x);i++) { if(x%2==0) return 0; } if(i>sqrt(x)) return 1; } } else return 0; } void NUM::process()//求指定data数组中的所有素数,把它们依次存放在数组prime中,并将求出的素数个数赋给num; { for(int i=0,j=0;i<10;i++) { if(isprime(data[i])) { prime[j]=data[i];//存放指定数据内所求出的所有素数; j++; num++;//存放素数个数; } } } void NUM::print()//输出求出的素数个数及所有素数,把它们依次存放在数组prime中,并将求出的素数个数赋给num; { cout<<"素数个数为:"< cout< cout< void main() { int n[]={4,5,9,11,36,29,31,101,56,199}; NUM test(n); test.process(); test.print(); } 四、实践小结 应熟练掌握质数的判断方法。 五、运行结果 任务二十七 一、实践任务 28.编程实现对大于1的整数进行质因数分解,并求出其和。所谓整数的质因子分解是指将整数分解为其所有质数(素数)因数的积,例如,60=2*2*3*5,则整数60的质因数之和为12。定义一个类Decompose实现上述功能。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int *a:指向存放对应整数的质因数之和的动态存储空间。 ●int *num:指向待分解质因数整数的动态存储空间。 ●int n:整数的个数。 (2)公有成员函数 ●Decompose(int m,int b[ ]): 用m初始化n,并用n初始化为动态申请空间的指针a与num。用参数b给数组a赋值。 ●void print( ):输出数组a以及num所指向的存储空间中的内容。 ●void primenum( ):求整数a[i]的所有质因数(保留重复部分,例如60的质因数为 2,2,3,5,之和为12),并将这些质因数之和存放到指针num所指向的存储空间中。 ●~Decompose( ):释放动态分配的存储空间。 2、主要函数设计 在主函数中完成对该类的测试。从键盘输入一组大于1的整数,存放在number数组中,定义类Decompose的对象d ,并用 number初始化d ,调用函数primenum( ) 求number 的所有质因数,最后输出测试结果。 三、源程序清单 #include #include #include class Decompose{ private: int*a;//指向待分解质因数整数的动态存储空间; int*num;//指向存放对应整数的质因数之和的动态存储空间; int n;//整数的个数; public: Decompose(int m,int b[]) { n=m; a=new int[n]; num=new int[n]; for(int i=0;i for(i=0;i } void print(); void primenum(); ~Decompose() { if(a) delete []a; if(num) delete []num; } }; void Decompose::print()//输出数组a以及num所指向的存储空间中的内容; { cout<<"待分解整数及对应整数的质因数之和:"< cout< if((i+1)%4==0)cout< cout< void Decompose::primenum()//求整数a[i]的所有质因数,并将这些质因数之和存放到指针num所指向的存储空间中; { int i,j,k,turn; for(i=0;i turn=a[i]; if(turn==2||turn==3) num[i]=turn; else { for(j=2;j<=turn;j++)//依次在小于或等于turn(即a[i])的整数中寻找其质因数; { if(turn%j==0) { if(j==2||j==3) { num[i]+=j; turn/=j; j--; } else { for(k=2;k<=sqrt(j);k++)//判断该整数是否为质数; { if(j%k==0) break; } if(k>sqrt(j)) { num[i]+=j; turn/=j; j--;//自减,从而继续判断该质因数是否仍能被整除; } } } } } } } void main() { int number[]={60,5,6,8,9,50,100,124,156,78,65,98}; int n=sizeof(number)/sizeof(int); Decompose d(n,number); d.primenum(); d.print(); } 四、实践小结 熟练掌握质数的判断方法。 五、运行结果 任务二十八 一、实践任务 29.建立一个类SUM,输入5×5的二维数组,编写程序实现:求出两对角线上各元素的和,求出对角线上行、列下标均为偶数的各元素的积,找出对角线上其值最大的元素以及它在数组中的位置。 二、详细设计 1、类的描述与定义 (1)私有数据成员 ●int array[5][5]:二维整型数组。 ●int s:数组array两对角线元素的和。 ●int a:数组array对角线上行、列下标均为偶数的各元素的积 ●int b,m,n:数组array对角线上其值最大的元素以及它在数组中的位置。 (2)公有成员函数 ●SUM(int d[5][5]):构造函数,初始化成员数据。 ●void process1():求二维数组两对角线元素的和。 ●void process2():求二维数组两对角线上行、列下标均为偶数的各元素的积。 ●void process3():求二维数组两对角线上其值最大的元素和它在数组中的位置。 ●void print():输出二维数组(每行输出5个元素)及其它所求的值。 2、主要函数设计 在主程序中对该类进行测试。 三、源程序清单 #include class SUM{ private: int array[5][5]; int s;//数组array两对角线元素的和; int a;//数组array对角线上行,列下标均为偶数的各元素的积; int b,m,n;//数组array对角线上其值最大的元素以及它在数组中的位置; public: SUM(int d[5][5]) { for(int i=0;i<5;i++) { for(int j=0;j<5;j++) array[i][j]=d[i][j]; } } void process1(); void process2(); void process3(); void print(); }; void SUM::process1()//求二维数组两对角线元素的和; { int i,j; s=0; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(i==j||i+j==4) s+=array[i][j]; } } } void SUM::process2()//求二维数组两对角线上行,列下标均为偶数的各元素的积; { int i,j; a=1; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(i==j||i+j==4) { if(i%2==0&&j%2==0) a*=array[i][j]; } } } } void SUM::process3()//求二维数组两对角线上其值最大的元素和它在数组中的位置; { int i,j; b=array[0][0]; m=n=0; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(i==j||i+j==4) {