《C++上机题目复习及答案2.doc》由会员分享,可在线阅读,更多相关《C++上机题目复习及答案2.doc(131页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-dateC+上机题目复习及答案2C+上机题目复习及答案2第十周上机题目题目:1. 建立一个矩阵类Array,存储一个nn矩阵并能完成矩阵转置运算。要求如下:(1) 私有成员数据int *x:指向存储一个nn矩阵值的内存区域(二维数组作为一维数组存储)int n:存储矩阵行数(2) 公有成员函数构造函数:用参数指定的值或缺省值3初始化n,并用n的值为矩阵动态申请内存空间;析构函
2、数:释放对象存储矩阵时占用的内存空间;viod input(int *a):将一个矩阵赋值给对象中的数组。void print():按行输出矩阵的值。void change():转置矩阵。编写一个程序测试该类。定义对象A,将一个矩阵存入A中,并输出矩阵的值,转置对象A中的矩阵并输出,使用以下测试数据:A A转置后的矩阵#include#define N 3class Arrayint *x; /指向存储一个nn矩阵值的内存区域(二维数组作为一维数组存储)int n; /存储矩阵行数public:Array(int s=3)n=s;x=new intN*N;void input(int *a);
3、/将一个矩阵赋值给对象中的数组。void print();/按行输出矩阵的值。void change();/转置矩阵。Array()if(x) delete x;void main()int aN3;int i,j;cout请输入N*N的矩阵endl;for(i=0;iN;i+)for(j=0;jaij;Array d(N);d.input(a0);cout原始数组为:n;d.print();d.change();cout转置后的数组为:n;d.print();void Array:input(int *a)for(int i=0;iN*N;i+)xi=*a+;void Array:print
4、()for(int i=0;iN*N;i+)(i+1)%3)?coutxit:coutxiendl;void Array:change()int temp;for(int i=0;iN;i+)for(int j=0;ji;j+)temp=xi*N+j;xi*N+j=xj*N+i;xj*N+i=temp;2. 编程题模拟人脑神经网络的神经元结构模型如下图所示:其中,xi表示输入信号,wi表示输入信号的加权系数,y表示神经元的输出,它们的之间的关系为:这里,表示各项的和,exp(z)为求z的自然指数值ex的函数,包含在头文件math.h中,其函数原型为double exp(double z)。试定
5、义一个NN类实现上述模型。具体要求如下:1) 私有成员l float x5,dt:数组x和数组w分别存放输入信号xi及其加权系数wi;dt存放非零参数。l double y:神经元的突出。2) 公有成员:l NN(float t , float d)用数组t初始化加权系统wi,用d初始化dt。l void fun(float t ):用数组t初始化xi,并根据上述公式计算y的值。l void print( ):输出输入信号和输出信号的值在主函数中,用输入信号1.2,3.5 , 2.3 , 3.2 , 2.8 以及加权系数 o.5 , 0.8 , 1.2 , 1.8 , 1.1 对该类进行测试。
6、#include#includeclass NNfloat x5,w5,dt;double y;public:NN(float t,float d);/用数组t初始化加权系统wi,用d初始化dt。void fun(float t); /用数组t初始化xi,并根据上述公式计算y的值。void print( ); /输出输入信号和输出信号的值;void main()float a5=1.2,3.5,2.3,3.2,2.8;float b5=0.5,0.8,1.2,1.8,1.1;NN t(b,0.2);t.fun(a);t.print();NN:NN(float t,float d)for(int
7、 i=0;i5;i+)wi=ti;dt=d;void NN:fun(float t)for(int i=0;i5;i+)xi=ti;double n=0.0;for(i=0;i5;i+)n+=(xi-wi)*(xi-wi);y=exp(-n/(2*dt*dt);void NN:print()coutxi=;for(int i=0;i5;i+)coutxi ;coutendl;couty=yendl;附加题:3. 面向对象编程:几何图形类 【要求】按以下描述和要求建立两个类:基类Rectangle和派生类Cube:Rectangle私有成员:double x1, y1 ; /左下角的坐标doub
8、le x2, y2 ; /右上角的坐标公有成员Rectangle(double a=0, double b=0, double c=0, double d=0); /带缺省值的构造函数double getwidth(); /计算并返回矩形的宽double getlength() ; /计算并返回矩形的长virtual void display() ; /输出矩形的各坐标及长宽注:正立方体Cube的底面矩形从基类继承 Cube:私有成员:string name; /立方体名称(字符串对象)double h; /立方体高度公有成员:Cube (string=, double =0, ); /带缺省
9、值的构造函数void set (string, double) ; /修改立方体标识符和高度值void display(); / 输出立方体全部信息,并计算输出体积Cube add ( Cube &S ); /将参数对象S的高度加到this对象上。以上成员函数的参数名如有未给出的则自已命名。头文件包含语句为:#include #include 主函数要求:(1) 定义Rectangle类对象A坐标:10, 10, 30, 40;定义Cube类对象B坐标:20, 10, 30, 40;名称和高度: Box, 60、C(C数据由B拷贝生成)和D(D数据暂无)。(2) 调用函数set修改对象C的名称
10、和高度值。数据为 Trunk, 95。(3) 调用函数display及相关函数输出对象A、B和C的全部数据,计算输出B和C的体积。每个对象的信息占一行。(4) 调用add函数,计算D=B+C。输出D的全部数据,计算并输出D的体积。#include#includeclass Rectangledouble x1, y1 ; /左下角的坐标double x2, y2 ; /右上角的坐标public:Rectangle(double a=0, double b=0, double c=0, double d=0)x1=a,y1=b;x2=c,y2=d;double getwidth()return
11、(x2-x1); /计算并返回矩形的宽double getlength()return (y2-y1); /计算并返回矩形的长void display() ; /输出矩形的各坐标及长宽;class Cube :public Rectanglechar name10; /立方体名称(字符串对象)double h; /立方体高度public:Cube (double a=0,double b=0,double c=0,double d=0,char *s=0, double h1=0):Rectangle(a,b,c,d)/带缺省值的构造函数if(s) strcpy(name,s);h=h1; v
12、oid set (char *, double);/修改立方体标识符和高度值void display(); / 输出立方体全部信息,并计算输出体积Cube add(Cube &S); /将参数对象S的高度加到this对象上。;void main()Rectangle A(10,10,30,40);Cube B(20,10,30,40,Box,60),C(B),D;B.set(Trunk, 95);A.display();B.display();C.display();D=B.add(C);D.display();void Rectangle:display()cout矩形: ;cout左下角的
13、坐标:x1,y1,右上角的坐标:x2,y2,;cout长:(x2-x1),宽:(y2-y1)endl;void Cube:set (char *s, double h1)h=h1;strcpy(name,s);void Cube:display()double mj=getwidth()*getlength();cout长方体: ;cout底面积为: mj,;cout体积为: mj*hendl;Cube Cube:add(Cube &S)h+=S.h;return *this;第十一周上机题目题目:1. 建立一个类NUM,求指定范围内的所有素数(质数)。具体要求如下:1) 私有数据成员。l i
14、nt data25;依次存放指定范围内的所有素数。l int spanl , span2 ;存放要求计算的素数的范围。l int num ;存放span1与span2之间的素数个数。2) 公有成员函数。l 构造函数NUM (int a ,int b);初始化所要求的素数的范围span1、span2及num (值为0)。l void process( ): 求出指定范围内的所有素数,把它们依次存放在数组data中,并将求出的素数的个数赋给num 。l void print( ):输出求出的所有素数。3) 在主程序中对该类进行测试。使用测试数据span1=100 , span2=200 。即求10
15、0200之间的所有素数。#include#includeclass NUMint data25; /依次存放指定范围内的所有素数。int span1,span2; /存放要求计算的素数的范围。int num; /存放span1与span2之间的素数个数。public:NUM (int a ,int b);void process( );void print( );void main()NUM a(100,200);a.process();a.print();NUM:NUM (int a ,int b)span1=a;span2=b;num=0; void NUM:process( )int i
16、,n,f=0;for(i=span1;i=span2;i+)for(n=2,f=0;n=sqrt(i);n+)if(i%n=0)f=1;break;if(f=1)continue;datanum+=i;void NUM:print( )for(int i=0;inum;)coutdatait;if(+i%6=0)coutendl;coutendl;2. 编程题已知由一个数组派生出另一个数组的派生规则如下:假定原始数组为a10,新数组为b10,则bi的值为数组a中大于ai的元素的个数。例如,对于说明“int a =1,2,3,4,5;int b5;”,其中a1=2,数组a中有3个元素比a1大,则
17、b1=3。试建立一个实现此功能的类ARRAY。具体要求如下:1) 私有数据成员。l int a10,b10;a存放原始数组,b存放派生数组。2) 公有成员函数。l 构造函数ARRAY(int data10);初始化成员数组a 。l void process( );由数组a根据上述派生类规则,用循环语句计算数组b的各元素。l void print( );屏幕显示数组a和b。#includeclass ARRAYint a10,b10;public:ARRAY(int data10);/初始化成员数组a 。 void process( );/由数组a根据上述派生类规则,用循环语句计算数组b的各元素
18、。 void print( );/屏幕显示数组a和b。;void main()int a=7,4,9,23,56,44,18,33,21,17;ARRAY array(a);array.process();array.print();ARRAY:ARRAY(int data10)for(int i=0;i10;i+)ai=datai;bi=0;void ARRAY:process( )for(int i=0;i10;i+)for(int k=0;kai) bi+;void ARRAY:print( )couta10= ;for(int i=0;i10;i+)coutai ;coutendl;c
19、outb10= ;for(i=0;i10;i+)coutbi ;coutendl;附加题:3. 面向对象编程:物品保管箱管理应用程序 【要求】按以下描述和要求建立一个类Boxes,执行主函数对其测试。私有成员:int *box ; /指向保管箱数组,下标为箱号,元素值为0表示空箱;大于0表示该箱中存入的物品数量。char *flag ; /指向客户标识符数组(下标为箱号,与box数组配对使用)static int sum; /累计存入物品数量int xh; /保管箱的个数公有成员:Boxes(int num=10); /构造函数,动态分配box和flag数组空间, 长度为num。Boxes(
20、); /析构函数,释放分配的内存void put(int n, char m); /选择一个空箱存入n件物品,填写客户标识符,并将物品数量累加到sum;若找不到空箱则输出提示信息。void get(char m); /根据客户标识符(元素下标)查找存储的物品,找到后取出并清空保管箱(置0)。若找不到指定则输出提示信息。void display(); /输出保管箱类所有数据,统计占用箱个数和空闲箱个数。最后输出存入物品数量头文件包含语句为:#include 在类定义外面对静态成员做定义性说明并赋初值为零:int Boxes:sum=0;主函数要求:1) 定义Boxes类对象A, B(2)。数组元
21、素初始值为零。2) 调用函数put为对象A和B做存储操作:A.put(5, R); B.put(9,K); A. put(8, P); B. put(15, H); B. put(40, F); 调用函数display输出对象A和B的全部数据。3) 调用函数put和get为对象A和B做存储和取出操作:B. get(H); B. put(40, F); A. get(S) ; A. get(R); A. put(12, M); 4) 调用函数display输出对象A和B的全部数据。#includeclass Boxesint *box ; /指向保管箱数组,下标为箱号,元素值为0表示空箱;大于0
22、表示该箱中存入的物品数量。 char *flag ; /指向客户标识符数组(下标为箱号,与box数组配对使用) static int sum; /累计存入物品数量int xh;public:Boxes(int num=10); /构造函数,动态分配box和flag数组空间, 长度为num。Boxes( ); /析构函数,释放分配的内存void put(int n, char m); /选择一个空箱存入n件物品,填写客户标识符,并将物品数量累加到sum;若找不到空箱则输出提示信息。void get(char m); /根据客户标识符(元素下标)查找存储的物品,找到后取出并清空保管箱(置0)。若找
23、不到指定则输出提示信息。void display(); /输出保管箱类所有数据,统计占用箱个数和空闲箱个数。最后输出存入物品数量;int Boxes:sum=0;void main()Boxes A,B(2);/数组元素初始值为零。A.put(5, R); B.put(9,K); A. put(8, P); B. put(15, H); B. put(40, F); coutA库:n;A.display();coutB库:n;B.display();B. get(H); B. put(40, F); A. get(S) ; A. get(R); A. put(12, M); coutA库:n;
24、A.display();coutB库:n;B.display();Boxes:Boxes(int num)box=new intnum;flag=new charnum;xh=num;for(int i=0;inum;i+)boxi=flagi=0;Boxes:Boxes( )delete box;delete flag;void Boxes:put(int n, char m)int i=0;while(boxi!=0 & i+xh);if(ixh & boxi=0) boxi=n;flagi=m;sum+=n;else cout无空箱存放客户m的物品!nn;void Boxes:get(c
25、har m)int i=0;while(flagi!=m & ixh) i+;if(flagi!=m) cout没有找到客户m物品!nn;elsesum-=boxi;boxi=0;void Boxes:display()int n=0;for(int i=0;i0)cout 客户flagi:存放物品数量:boxi件。n;else n+;cout占用箱个数:xh-n个,空闲箱个数:n个。n存入物品总数量有:sumnn;第十二周上机题目一. 编程题【程序功能】找出给定范围内的和亲数。对于两个正整数,如果其中的一个整数是另一个整数的全部真因子之和,反之亦然,则称这两个数为“和亲数”。例如,220有真
26、因子“1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110”,其和为284,而284有真因子“1, 2, 4, 71, 142”,其和为220,因此220和284就是一对和亲数。【编程要求】1. 试建立一个类NNMl 私有数据成员int n1 , n2 ;/查找数据的范围int a102; /存储mn(mn)之间的所有和亲数对,并存储到a数组中int num; /统计和亲数对的个数l 公有成员函数1) 缺省构造函数:初始化数据成员n1,n2为0。2) 带参构造函数NNM(int m,int n):用参数初始化数据成员n1,n2。3) void find( )函数用于查
27、找n1n2之间的所有和亲数对并存储到数组中4) 打印函数 void print( ),将结果输出到屏幕#includeclass NNMint n1,n2;int a102;int num;public:NNM()n1=0;n2=0;num=0;NNM(int a, int b)n1=a,n2=b,num=0;void find();void print();void main()NNM a(2,500);a.find();a.print();void NNM:find()int sum1=0,sum2=0;int i,n;for(i=n1;i=n2;i+)for(sum1=0,n=1;ni/
28、2+1;n+)if(i%n=0)sum1+=n;for(sum2=0,n=1;nsum1/2+1;n+)if(sum1%n=0)sum2+=n;if(sum2!=i | sum1=i) continue;anum0=i,anum+1=sum1;void NNM:print()for(int i=0;inum;i+)coutai0,ai1endl;2. 编写main函数,接收键盘输入的两个正整数m和n(mn),建立对象,通过调用成员函数完成亲和数的查找及结果输出的任务。【测试数据与运行结果】测试数据:m=2, n=500。运行结果: ( 220 ,284 ) ( 284 , 220)二. 编程题
29、【要求】试建立一个类 Student 用于描述学生信息,具体要求如下: 私有数据成员int id: 学生学号。char yuwen: 语文成绩(五级分制:A、B、C、D和E,其它无效)。float shuxue: 数学成绩(百分制)。 公有成员函数1)缺省构造函数:初始化数据成员为0或NULL值。2)带参构造函数:用参数初始化数据成员。3)void Print( ): 输出本对象的学号、语文成绩和数学成绩。4)修改函数void Change( ):从键盘输入新的学号、语文成绩和数学成绩,修改相应数据成员的值。5)比较函数void Comp(Student &a, Student &b): 比较
30、a学生和b学生的数学成绩,找出数学成绩最高和最低的学生,输出他们的信息。主程序:定义三个以上的对象,并且每个成员函数至少被调用一次。#includeclass Studentint id; /学生学号。 char yuwen; /语文成绩(五级分制:A、B、C、D和E,其它无效)。 float shuxue; / 数学成绩(百分制)。public:Student()id=0, yuwen=NULL;shuxue=0;Student(int,char,float);void Print( );void Change( );void Comp(Student &a, Student &b);voi
31、d main()Student A(78,E,86),B(84,D,82),C;C.Change();A.Comp(B,C);Student:Student(int a,char b, float c)id=a, yuwen=b;shuxue=c;void Student:Print( ) cout 学号: id,语文成绩: yuwen,数学成绩: shuxueendl;void Student:Change( )coutidyuwenshuxue;void Student:Comp(Student &a, Student &b)Student max,min;max= shuxuea.shu
32、xue?(shuxueb.shuxue? *this:b):(a.shuxueb.shuxue?a:b);min= shuxuea.shuxue?(shuxueb.shuxue? *this:b):(a.shuxueb.shuxue?a:b);cout数学成绩最高和最低的学生分别是:n;max.Print();min.Print();附加题:三. 编程题:1. 实现描述超市的的类Suppermacket类,记录系统中现有商品(用指针实现),定义增加商品的函数Append,删除商品的函数Delete,查询商品的函数Query,并显示查询结果; 2. 定义商品类Goods,具有商品名称Name,商
33、品价格Price,商品数量number等属性,操作Sale(销售商品,余额不足时给予提示)、Add(商品上架操作)和ShowMe(显示商品信息)。3. 编写main函数,测试以上所要求的各种功能,完成商品的增加、删除和查询商品,以及商品销售和商品上架的操作。 4. 可以利用对象成员来实现。#include#includeclass Suppermacket;class Goodschar name10;int Price;int number;public:Goods()strcpy(name,);Price=0;number=0;void Sale(int n);void Add();voi
34、d ShowME()cout商品:name,价格:Price,有number件。nn;friend Suppermacket;class SuppermacketGoods *PGoods;int num;public:Suppermacket(int n=10)PGoods=new Goodsn;num=n;void Append();void Delete();void Query();Suppermacket()delete PGoods;void main()Suppermacket A(3);A.Append();A.Append();A.Delete();A.Query();voi
35、d Suppermacket:Append()for(int i=0;inum;i+)if(PGoodsi.number=0)PGoodsi.Add();PGoodsi.ShowME();return;cout没有空货架上货了!n;void Suppermacket:Delete()char name10;int n;coutnamen;for(int i=0;inum;i+)if(strcmp(PGoodsi.name,name)=0)PGoodsi.Sale(n);return;cout查无此商品!n;void Suppermacket:Query()char name10;coutnam
36、e;for(int i=0;inum;i+)if(strcmp(PGoodsi.name,name)=0)PGoodsi.ShowME();return;cout查无此商品!n;void Goods:Sale(int n)if(nnumber)number-=n;ShowME();elsecout商品数量不够,无法销售!n;void Goods:Add()coutnamePricenumber;第十三周上机题目1、 编程题/*编写一个程序,输入N个学生数据,包括学号、姓名、C+成绩,要求输出这些学生的数据、平均分与成绩等级。提示:设计一个学生类Stud,除了包括id(学号)、name(姓名)和
37、C(成绩)数据成员外,还有两个静态成员数据sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和print(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分,并输出平均分。同时设计一个友元函数,输出成绩对应的等级:大于等于90:优;8090:良;7079:中;6069:及格;小于60:不及格在main()函数中定义了一个对象数组用于存储输入的学生数据,设计一个完整的程序。*/#define N 3#include #include class Stud int id; char name20; int deg; static int sum; /静态成员变量 static int num; public: Stud() Stud(); void setdata(); void display(); static void avg(); friend void grade(Stud &);int Stud:num = 0;int Stud:sum = 0;void Stud:setdata() /设置学号、姓名、成绩 coutid; coutname; coutdeg; num +; /学生人数 sum += deg; /总成绩void
限制150内