视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
江苏科技大学 C++课程实践报告答案
2025-09-29 17:08:29 责编:小OO
文档
江苏科技大学

 

 

课程实践报告

 

 

 

 

设计题目:      程序设计(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            p*=m;

        return p;

    }

    int fun()

    {

        int s=0;

     for (int i=1;i            s+=power(i,k);

        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            array[i]=b[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     cout< cout<}

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.show();

    test.Transform();

cout<<"经线性变换后的矩阵为:"<    test.show();

}

四、实践小结

应熟练掌握矩阵的乘法方式。

五、运行结果

任务十六

一、实践任务

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<    test.show();

}

四、实践小结

理解算数公式,根据题目线索,完成。

五、运行结果

任务十八

一、实践任务

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.show();

    test.xuanzhuan();

cout<<"顺时针90度旋转后的方阵为:"<    test.show();

}

四、实践小结

理解方阵旋转的本质,利用临时数组,存放对应位上的数。

五、运行结果

任务十九

一、实践任务

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.show();

    test.xuanzhuan();

cout<<"进行逆时针90度旋转后的方阵为:"<    test.show();

}

四、实践小结

理解方阵旋转的本质,利用临时数组,存放对应位上的数。

五、运行结果

任务二十

一、实践任务

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<<"所有合数:"< for(int i=0;i    {

     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(i=0;i<4;i++)//输出数组a;

    {

     for(j=0;j<4;j++)

         cout<     cout<    }

cout<<"鞍点个数:"<    if(num)

    {

     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        while(1)//用k递减去除m和n,第一个能把m和n同时除尽的数就是m和n的最大公约数;

        {

            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<            k++;

        }

     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<     if((i+1)%5==0)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<<"素数个数为:"< for(int i=0;i    {

     cout<     if((i+1)%4==0) 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            a[i]=b[i];

     for(i=0;i            num[i]=0;

    }

    void print();

    void primenum();

    ~Decompose()

    {

        if(a) delete []a;

        if(num) delete []num;

    }

};

void Decompose::print()//输出数组a以及num所指向的存储空间中的内容;

{

cout<<"待分解整数及对应整数的质因数之和:"< for(int i=0;i    {

     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)

            {

             if(b                {

                    b=array[i][j];

                    m=i;

                    n=j;

                }

            }

        }

    }

}

void SUM::print()//输出;

{

for(int i=0;i<5;i++)

    {

     for(int j=0;j<5;j++)

         cout<     cout<    }

cout<<"两对角线元素的和:"< cout<<"两对角线上行,列下标均为偶数的各元素的积:"< cout<<"两对角线上其值最大的元素"<}

void main()//测试;

{

    int d[5][5]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25};

    SUM test(d);

    test.process1();

    test.process2();

    test.process3();

    test.print();

}

四、实践小结

掌握数组中,对角线元素所在位置规律及如何寻找数组中相关条件的数。

五、运行结果

任务二十九

一、实践任务

30.建立一个矩阵类Array,对二维数组中左下三角的全部元素(包括对角线上的元素)作如下变换:(1)若该数不是素数则保持不变;(2)若该数是素数,则用大于它的最小素数替换该数。并统计二维数组中左下三角的全部元素(包括对角线上的元素)中的素数个数。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int x[4][4]:存储需要处理的二维数组的各元素值。

●int count:存储左下三角元素中素数的个数。

(2)公有成员函数

●构造函数:进行初始化x数组和count的值。

●int fun(int);判断一个数是否为素数的函数。

●int encode( ):对x数组中左下三角的全部元素(包括对角线上的元素)逐一进行判断,若该数不是素数则保持不变,若该数是素数,则用大于它的最小素数替换该数。

●void print():按行输出矩阵的值。

2、主要函数设计

编写一个程序测试该类,说明(声明)Array对象A,将一个矩阵存入对象A中,并输出矩阵的值,使用以下测试数据:

3   6   4   17                       5   6   4   17

8   5   9   10    变换后的矩阵为     8   7   9   10

12  19  7   20                       12  23  11  20

4   14  21  23                       4   14  21  29    

                                       

三、源程序清单

#include

#include

class Array{

private:

    int x[4][4];

    int count;//存储左下三角元素中素数的个数;

public:

    Array(int x[4][4])//初始化x数组和count的值;

    {

        int i,j;

     for(i=0;i<4;i++)

        {

         for(j=0;j<4;j++)

             this->x[i][j]=x[i][j];

        }

        count=0;

     for(i=0;i<4;i++)

        {

         for(j=0;j<=i;j++)

            {

             if(fun(this->x[i][j]))

                {

                    count++;

                }

            }

        }

    }

    int fun(int);

    int encode();

    void print();

};

int Array::fun(int x)//判断一个数是否为素数,是返回1,不是返回0;

{

if(x>1)

    {

        if(x==2||x==3) return 1;

        else

        {

         for(int i=2;i<=sqrt(x);i++)

            {

                if(x%i==0) break;

            }

         if(i>sqrt(x)) return 1;

        }

    }

    return 0;

}

int Array::encode()//对x数组中左下三角的全部元素逐一进行判断,若该数不是素数则保持不变,若是则用大于它的最小素数替代;

{

    int i,j;

for(i=0;i<4;i++)

    {

     for(j=0;j<=i;j++)

        {

            if(fun(x[i][j]))

            {

                while(1)

                {

                    if(fun(++x[i][j]))//当概数是素数时,寻找大于它的最小素数替代;

                        break;

                }

            }

        }

    }

    return 0;

}

void Array::print()//按行输出矩阵的值;

{

for(int i=0;i<4;i++)

    {

     for(int j=0;j<4;j++)

        {

         cout<        }

     cout<    }

cout<<"素数个数:"<}

void main()

{

    int x[4][4]={3,6,4,17,8,5,9,10,12,19,7,20,4,14,21,23};

    Array A(x);

cout<<"原二维数组为:"<    A.print();

    A.encode();

cout<<"替换后的二维数组为:"<    A.print();

}

四、实践小结

熟练掌握判断素数的方法。

五、运行结果

任务三十

一、实践任务

31.建立一个类SUM,实现m行k列矩阵与k行n列矩阵的乘积。设A为m行k列的矩阵,B为k行n列的矩阵,则C=A×B。

具体要求如下:

const int m=3;

const int k=4;

const int n=3;

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int A[m][k]:存放m行k列矩阵。

●int B[k][n]:存放k行n列矩阵

●int (*C)[n]:指向乘积矩阵

(2)公有成员函数

●构造函数:初始化成员数据。

●析构函数:收回行指针。

●void process():求矩阵的乘积。

●void print():输出各二维数组(按行列形式)。

2、主要函数设计

在主程序中对该类进行测试。

三、源程序清单

#include

const int m=3;

const int k=4;

const int n=3;

class SUM{

private:

    int A[m][k];

    int B[k][n];

    int(*C)[n];//指向乘积矩阵;

public:

    SUM(int a[m][k],int b[k][n])

    {

        int i,j;

     for(i=0;i        {

         for(j=0;j                A[i][j]=a[i][j];

        }

     for(i=0;i        {

         for(j=0;j                B[i][j]=b[i][j];

        }

        C=new int[m][n];

     for(i=0;i        {

         for(j=0;j                C[i][j]=0;

        }

    }

    ~SUM()

    {if(C)delete []C;}

    void process();

    void print();

};

void SUM::process()//求矩阵的乘积;

{

    int i,j,l;

for(i=0;i    {

     for(j=0;j        {

         for(l=0;l                C[i][j]+=A[i][l]*B[l][j];//算法:根据矩阵的乘法方式;

        }

    }

}

void SUM::print()//输出;

{

    int i,j;

cout<<"C=A*B中"< cout<<"矩阵A为:"< for(i=0;i    {

     for(j=0;j         cout<     cout<    }

cout<<"矩阵B为:"< for(i=0;i    {

     for(j=0;j         cout<     cout<    }

cout<<"乘积矩阵C为:"< for(i=0;i    {

     for(j=0;j         cout<     cout<    }

}

void main()//测试;

{

    int a[m][k]={1,2,3,4,5,6,7,8,9,10,11,12},b[k][n]={1,0,1,0,1,0,1,0,1,0,1,0};

    SUM test(a,b);

    test.process();

    test.print();

}

四、实践小结

熟练掌握矩阵的乘法,利用3重循环实现。

五、运行结果

任务三十一

一、实践任务

32.建立一个类SUM,使用二维数组输入“Follow me”,“BASIC”,“Great wall”,“Fortran”,“Pascal”,将它们按从小到大的顺序排列后输出。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int *p[5]:存放二维数组每行的字符串的地址。

(2)公有成员函数

●SUM(int d[5][5]):构造函数,初始化成员数据。

●void process1():对二维数组中存放的字符串进行排序。

●void print():输出二维数组中排好序的字符串。

2、主要函数设计

在主程序中对该类进行测试。

三、源程序清单

#include

#include

class SUM{

private:

    int*p[5];//存放二维数组每行的字符串的地址;

public:

    SUM(int d[5][5])

    {

     for(int i=0;i<5;i++)

            p[i]=(int*)d[i][0];//整型数组每行第0列保存字符串的地址(为int类型),故在赋值时需要转换为int*类型;

    }

    void process1();

    void print();

};

void SUM::process1()//对二维数组中存放的字符串进行排序;

{

    int*t;

for(int i=0;i<5;i++)

    {

     for(int j=i+1;j<5;j++)

        {

         if(strcmp((char*)p[i],(char*)p[j])>0)//将int*类型数据转换为char*类型,才可利用strcmp()函数对该地址值上的字符串比较,排序;

            {

                t=p[i];

                p[i]=p[j];

                p[j]=t;

            }

        }

    }

}

void SUM::print()

{

for(int i=0;i<5;i++)

    {

     cout<<(char*)p[i]<    }

cout<}

void main()

{    //每个字符串的值为该字符串的首元素地址,故将每个地址值转换为整型数值保存在整型数组中;

    Int d[5][5]={{int("Follow me")},{int("BASIC")},{int("Great wall")},{int("Fortran")},{int("Pascal")}};

    SUM test(d);

cout<<"原字符串为:"<    test.print();

    test.process1();

cout<<"排好序的字符串为:"<    test.print();

}

四、实践小结

掌握各数据类型之间的转化。

五、运行结果

任务三十二

一、实践任务

33.建立一个类Integer_String,把一个正整数转换为字符串。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int num:要转换的正整数。

●char *s:用动态空间存储转换得到的字符串。

(2)公有成员函数

●Integer_String(int n):用参数n初始化数据成员num。

●int f():求数据成员num的位数。

●void fun():把正整数num转换为字符串s。

●void show():输出数据成员num和s;

●~Integer_String():释放动态空间。

2、主要函数设计

在主函数中对定义的类进行测试。用正整数12345初始化类Integer_String的对象test,调用相关成员函数后输出转换结果。

三、源程序清单

#include

class Integer_String{

private:

    int num;//要转换的正整数;

    char*s;//用动态空间存储转换得到的字符串;

public:

    Integer_String(int n)

    {

        num=n;

    }

    int f();

    void fun();

    void show();

    ~Integer_String()

    {if(s)delete[]s;}

};

int Integer_String::f()//求数据成员num的位数;

{

    int n=num;

    int count=0;

    while(n)

    {

        count++;

        n/=10;

    }

    return count;

}

void Integer_String::fun()//把正整数num转换为字符串s;

{

    int n=num;

    s=new char[f()+1];

for(int i=0;i    {

        s[f()-1-i]=n%10+48;

        n/=10;

    }

    s[f()]=0;

}

void Integer_String::show()

{

cout<<"要转换的正整数为:"< cout<<"转换得的字符串为:"<}

void main()

{

    Integer_String test(12345);

    test.fun();

    test.show();

}

四、实践小结

掌握字符的ASCII码值与整型值之间的转化。

五、运行结果

任务三十三

一、实践任务

34.建立一个类String_Integer,把一个字符串中的数字字符转换为正整数。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●char *s:用动态空间存放字符串。

(2)公有成员函数

●String_Integer(char *str):用参数str初始化数据成员s。

●operator int():转换函数,数据成员s转换整数并返回该数。

●void show():输出数据成员s。

●~String_Integer():释放动态空间。

2、主要函数设计

在主函数中对定义的类进行测试。定义字符数组,把由键盘输入的字符串“ab12  3c00d45ef”存入数组,并用该数组初始化类String_Integer的对象test,调用show函数输出test的数据成员s,然后把对象test赋值给整型变量n并输出,转换结果如下所示(下划线部分是从键盘输入的内容):

        请输入字符串ab12  3c00d45ef :ab12  3c00d45ef

        字符串为:ab12  3c00d45ef

        转换得到的整数为:1230045

三、源程序清单

#include

#include

class String_Integer{

private:

    char*s;

public:

    String_Integer(char*str)

    {

        s=new char[strlen(str)+1];

        strcpy(s,str);

    }

    operator int()//转换函数,数据成员s转换整数并返回该数;

    {

        int num=0;

     for(int i=0;i        {

         if(s[i]>='0'&&s[i]<='9')//判断该字符是否为数字字符;

            {

                num=num*10+s[i]-48;

            }

        }

        return num;

    }

    void show()

    {

     cout<<"字符串为:"<    }

    ~String_Integer()

    {if(s)delete s;}

};

void main()

{

    char s[30];

cout<<"请输入字符串ab12 3c00d45ef:";

    cin.getline(s,30);

    String_Integer test(s);

    test.show();

    int n;

    n=test;

cout<<"转换得到的整数为:"<}

四、实践小结

掌握字符的ASCII码值与整型值之间的转化。

五、运行结果

任务三十四

一、实践任务

35.建立一个类Union求两个整数集合的并集。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int *set1,len1:用动态空间set1存储集合1,len1表示其元素的个数。

●int *set2,len2:用动态空间set2存储集合2,len2表示其元素的个数。

●int set[20],len:用数组空间set存储并集,len表示其元素的个数

(2)公有成员函数

●Union(int *s1,int l1,int *s2,int l2):用变量s1和l1初始化集合1及其长度,用变量s2和l2初始化集合2及其长度,并把并集的长度置为0;

●int f(int num):判断整数num是否属于集合1,是返回1,否则返回0;

●void fun():求集合1和集合2的并集,方法是先把集合1中的所有元素复制给并集,然后调用f函数把集合2中不属于集合1的元素复制给并集;

●void show():输出集合1、集合2和并集;

●~Union():释放动态空间。

2、主要函数设计

在主函数中对定义的类进行测试。定义数组s1:{1,2,3,4,5,6,7,8}、s2:{1,3,5,7,9,11},并用它们初始化类Union的对象obj,然后调用相关的成员函数,求并集,输出集合1、集合2和并集。

三、源程序清单

#include

class Union{

private:

    int*set1,len1;

    int*set2,len2;

    int set[20],len;

public:

    Union(int*s1,int l1,int*s2,int l2)

    {

        set1=new int[l1];

        int i;

     for(i=0;i            set1[i]=s1[i];

        len1=l1;

        set2=new int[l2];

     for(i=0;i            set2[i]=s2[i];

        len2=l2;

        len=0;

    }

    int f(int num)//判断整数num是否属于集合1,是返回1,否则返回0;

    {

     for(int i=0;i        {

            if(set1[i]==num) return 1;

        }

        return 0;

    }

    void fun();

    void show();

};

void Union::fun()//求集合1和集合2的并集;

{

for(int i=0;i        set[len++]=set1[i];//先把集合1中的所有元素复制给并集;

for(i=0;i    {

        if(f(set2[i])==0)//然后调用f函数把集合2中不属于集合1的元素复制给并集;

            set[len++]=set2[i];

    }

}

void Union::show()

{

cout<<"集合1:"< for(int i=0;i     cout< cout< cout<<"集合2"< for(i=0;i     cout< cout< cout<<"并集"< for(i=0;i     cout< cout<}

void main()

{

    int s1[]={1,2,3,4,5,6,7,8},s2[]={1,3,5,7,9,11};

    Union obj(s1,8,s2,6);

    obj.fun();

    obj.show();

}

四、实践小结

应理解并集含义,并利用循环判断语句实现。

五、运行结果

任务三十五

一、实践任务

36.建立一个类Intersection求两个整数集合的交集。

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int set[20]:用数组空间set存储集合。

●int len:表示该集合中元素的个数

(2)公有成员函数

●Intersection(int *s,int l):用s初始化集合,用变量l初始化其长度。

●Intersection( ):把set中各元素和长度初始化为0。

●int f(int num):判断整数num是否属于集合,是返回1,否则返回0;

●Intersection operator&&(Intersection t):重载&&,求当前对象的集合和参数对象t的集合的交集,方法是用对象t的集合中的每个元素作为参数调用f函数,若该元素属于当前对象的集合,则把它复制给交集。

●void show():输出集合。

2、主要函数设计

在主函数中对定义的类进行测试。定义数组s1:{1,3,4,5,7,8}、s2:{1,2,3,5,7,9,11},并用它们初始化类Intersection的对象obj1和obj2,然后调用相关的成员函数输出集合;定义对象obj3,并用obj1和obj2的与运算符结果(交集)初始化该对象,并输出交集。

三、源程序清单

#include

class Intersection{

private:

    int set[20];

    int len;

public:

    Intersection(int*s,int l)

    {

     for(int i=0;i            set[i]=s[i];

        len=l;

    }

    Intersection()

    {

     for(int i=0;i<20;i++)

            set[i]=0;

        len=0;

    }

    int f(int num)

    {

     for(int i=0;i        {

            if(num==set[i])return 1;

        }

        return 0;

    }

    Intersection operator&&(Intersection t)

    {

        Intersection turn;

        int i;

     for(i=0;i        {

            if(f(t.set[i]))turn.set[turn.len++]=t.set[i];

        }

        return turn;

    }

    void show()

    {

     for(int i=0;i         cout<     cout<    }

};

void main()

{

    int s1[]={1,3,4,5,7,8},s2[]={1,2,3,5,7,9,11};

    Intersection obj1(s1,6),obj2(s2,7);

cout<<"集合1:"<    obj1.show();

cout<<"集合2:"<    obj2.show();

    Intersection obj3;

    obj3=obj1&&obj2;

cout<<"交集:"<    obj3.show();

}

四、实践小结

理解交集含义,并利用循环判断语句实现,并需掌握运算符重载的方式。

五、运行结果

任务三十六

一、实践任务

38.建立一个类Sample,对数组中元素用选择法进行升序排序。排序函数定义到Sample类的友元类Process中。

具体要求如下:

类Sample

#define Max 100;

二、详细设计

1、类的描述与定义

(1)私有数据成员

●int A [MAX]:一维整型数组,存放需要排序的数。

●int n:需要排序的数的个数。

(2)公有成员函数

●Sample ():构造函数,初始化成员数据n,初始值为0。

友元类Process

公有成员函数

●void getdata(Sample &s):从键盘输入数据,对数组A进行赋值。

●void selectsort(Sample &s):对数组A中的元素进行升序排序。

●void disp(Sample &s):输出数组中的元素。

2、主要函数设计

在主程序中定义对象对该类进行测试。

三、源程序清单

#include

#define MAX 100

class Sample{

private:

    int A[MAX];

    int n;

public:

    Sample()

    {n=0;}

    friend class Process;//友元类的声明;

};

class Process{

public:

    void getdata(Sample &s)//从键盘输入数据,对数组A进行赋值;

    {

     cout<<"请输入需要排序的数的个数:"<     cin>>s.n;

     cout<<"请依次输入"<     for(int i=0;i         cin>>s.A[i];

    }

    void selectsort(Sample &s)//对数组A中的元素进行升序排序;

    {

        int t;

     for(int i=0;i        {

            t=i;

         for(int j=i+1;j            {

             if(s.A[t]>s.A[j]) t=j;

            }

            if(t!=i)

            {

                j=s.A[t];

                s.A[t]=s.A[i];

                s.A[i]=j;

            }

        }

    }

    void disp(Sample &s)//输出数组中的元素;

    {

     cout<<"数组中的元素为:"<     for(int i=0;i         cout<     cout<    }

};

void main()

{

    Sample test1;

    Process test2;

    test2.getdata(test1);

    test2.disp(test1);

    test2.selectsort(test1);

    test2.disp(test1);

}

四、实践小结

掌握宏定义,及数组中元素排序的方式。

五、运行结果下载本文

显示全文
专题