C上机考试题上机练习东南大学C上机实验_第1页
C上机考试题上机练习东南大学C上机实验_第2页
C上机考试题上机练习东南大学C上机实验_第3页
C上机考试题上机练习东南大学C上机实验_第4页
C上机考试题上机练习东南大学C上机实验_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、/*定义一个复数类,通过重载运算符:=、+=、=、+、*、/、= =、!=,直接实现两个复数之间的各种运算。编写一个完整的程序(包括测试各运算符的程序部分)。*/#include "stdio.h"/标准输入输出头文件#include "iostream.h"class Complexfloat Real,Image;public:Complex(float r=0,float i=0)Real=r;Image=i;float GetR()return Real;float GetI()return Image;/后面主函数要直接调用私有成员数据 voi

2、d show()cout<<"Real="<<Real<<'t'<<"Image="<<Image<<endl;Complex operator +(Complex &);/把形参定义为引用,调用时更方便void operator +=(Complex &);/自加运算,返回值为voidComplex operator -(Complex &);void operator -=(Complex &);Complex operator *

3、(Complex &);Complex operator /(Complex &);void operator =(Complex &);int operator !=(Complex &);int operator =(Complex &);/返回真假;Complex Complex:operator +(Complex &c)/此时的函数名变为Complex:operatorComplex t;/在函数体内可以定义新的类,并把这个临时的类返回,同样用打点来访问t.Real=Real+c.Real;t.Image=Image+c.Image;r

4、eturn t;void Complex:operator +=(Complex &c)Real=Real+c.Real;Image=Image+c.Image;Complex Complex:operator -(Complex &c)Complex t;t.Real=Real-c.Real;t.Image=Image-c.Image;return t;void Complex:operator -=(Complex &c)Real=Real-c.Real;Image=Image-c.Image;Complex Complex:operator *(Complex &

5、amp;c)Complex t;t.Real=Real*c.Real-Image*c.Image;t.Image=Real*c.Image+Image*c.Real;return t;Complex Complex:operator /(Complex &c)Complex t;t.Real=Real*c.Real+Image*c.Image;t.Image=-Real*c.Image-Image*c.Real;float val=c.Real*c.Real+c.Image*c.Image;t.Real=t.Real/val;t.Image=t.Image/val;return t;v

6、oid Complex:operator =(Complex &c)Real=c.Real;Image=c.Image;int Complex:operator !=(Complex &c)int res;/函数体内定义临时变量res=(c.Real!=Real)&&(c.Image!=Image);return res;int Complex:operator =(Complex &c)int res;res=(c.Real=Real)&&(c.Image=Image);return res;void main()Complex a(3

7、,4),b(6,8),c,d;c=a;/赋值=c.show();d=a+b;/+d.show();c=b-a;/-c.show();c=b;c+=a;/+=c.show();d=b;d-=a;/-=d.show();/c=a;d=a;cout<<endl<<"输出c和d: n"if(c=d) c.show();d.show();cout<<"c=d"c=b;d=a;cout<<endl<<"输出c和d: n"if(c!=d) c.show();d.show();cout<

8、;<"c!=d"/cout<<endl;cout<<"a*b: "c=a*b;c.show();cout<<"na/b: "d=b/a;d.show();/在函数体内可以定义新的类,并把这个临时的类返回,同样用打点来访问/*四、下标运算符 通常用于取数组中某个元素,可以实现数组下标越界的检测等。本题要求通过下标运算符的重载,实现读取数组中某个元素的作用。它具有如下公有成员函数:1.void Word (char *s ); 动态生成字符数组空间,用形参s来对其进行初始化。2. char &am

9、p; operaror (int n )给下标值为n的数组元素赋值。下标运算符 的重载关键是将下标值做为一个操作数。它的实现非常简单, 就是用字符指针的首地址str加下标值n,然后将相加后的地址返回。3.void disp( ); 实现将字符指针str指向的字符串输出到屏幕上。4.用 Word()析构函数来释放动态申请的堆空间。*/# include<iostream.h># include<string.h>class Word private :char *str;int len;public : Word(char *s) /void Word (char *s

10、)把原题的void去掉,做构造函数 len=strlen(s)+1; str=new charlen; strcpy(str,s); char & operator (int n)/重载,用operator,返回值为引用类型/n是的操作数,即下标if(n>=0&&n<len-1)return strn;else cout<<n<<"越界"return strlen-1;void disp() cout<<str<<endl;Word() delete str;void main( )char

11、 *s="china"Word w(s);/用字符串的指针做形参,做构造函数Word("china")w.disp( );int n=strlen(s);while(n>0) wn-1=wn-1-32;n-;w.disp( );cout<<w7;/ 14-3.cpp/*建立一个双向链表,节点数据包括姓名、地址和工资,按工资从小到大的顺序排序。参见教材P281 例12.7和教材P192页*/#include <iostream.h>#include <string.h>class Objectpublic:Obje

12、ct();/可以定义空的构造函数virtual int IsEqual(Object &)=0;/纯虚函数virtual int IsBigger(Object *)=0;/形参为&,实参直接为变量名/形参为*,实参为指针或地址virtual void Show()=0;virtual Object();class IntObj: public Objectint data;/工资char *name;char *address;public:IntObj(char *s=NULL,char *a=NULL,int x=0)data=x;if(s)name=new charst

13、rlen(s)+1;/strlen的参数是指针strcpy(name,s);else name=NULL;if(a)address=new charstrlen(a)+1;strcpy(address,a);else address=NULL;IntObj()if(name) delete name;/析构前预判,很重要if(address) delete address;void SetData(char *s,char *a,int x)/修改数据data=x;if(s)delete name;/name本来指向另一个字符串,它开辟的空间长度 /需要人为改变,赋新的值之前要删除原有空间,重

14、新开辟name=new charstrlen(s)+1;strcpy(name,s);else name=NULL;if(a)delete address;address=new charstrlen(a)+1;strcpy(address,a);else address=NULL;int IsEqual(Object &obj)IntObj &temp=(IntObj &)obj;/为它起个别名if(strcmp(name,)!=0) return 0;/用strcmp函数比较字符串是否相同if(strcmp(address,temp.address

15、)!=0) return 0;if(data!=temp.data) return 0;return 1;int IsBigger(Object *obj)IntObj *temp=(IntObj *)obj;if(data<=temp->data) return 0;else return 1;void Show()cout<<"姓名: "<<name<<'t'<<"地址: "<<address<<'t'<<"工资=

16、"<<data<<'t'<<endl;class Node/此处Node定义为类,前面都是定义为struct,这个节点当中包含为上面定义 /的类的数据成员private:Object *Info;/定义类object的指针Node *Prev,*Next;/定义节点类型的指针,一前一后public:Node()Info=0;Prev=Next=0; /定义的指针在构造函数中初始化为0Node(Node &node)/定义拷贝的构造函数Info=node.Info;Prev=node.Prev;Next=node.Next;v

17、oid FillInfo(Object *obj)Info=obj;friend class List;class ListNode *Head,*Tail;public:List()Tail=Head=0;List()DeleteList();void AddNode(Node *);Node *DeleteNode(Node *);Node *LookUp(Object &);void ShowList();void DeleteList();void InsertNode(Node *);void List:AddNode(Node *node)if(Head=0)Head=Ta

18、il=node;node->Next=node->Prev=0;elseTail->Next=node;node->Prev=Tail;Tail=node;node->Next=0;Node *List:DeleteNode(Node *node)if(node=Head)if(node=Tail)Head=Tail=0;elseHead=node->Next;Head->Prev=0;elsenode->Prev->Next=node->Next;if(node!=Tail) node->Next->Prev=node-

19、>Prev;else Tail=node->Prev;node->Prev=node->Next=0;return(node);Node *List:LookUp(Object &obj)Node *pn=Head;while(pn)if(pn->Info->IsEqual(obj) return pn;pn=pn->Next;return 0;void List:ShowList()Node *p=Head;while(p)p->Info->Show();p=p->Next;void List:DeleteList()Nod

20、e *p,*q;p=Head;while(p)delete p->Info;q=p;p=p->Next;delete q;void List:InsertNode(Node *p)Node *pn=Head,*p1;if(Head=0)/空表Head=Tail=p;Head->Next=Tail->Prev=0;return ;if(Head->Info->IsBigger(p->Info)/小于头节点p->Next=Head;Head->Prev=p;Head=p;return ;pn=p1=Head;while(pn->Next&

21、amp;&pn->Info->IsBigger(p->Info)=0)/寻找插入位置p1=pn;pn=pn->Next;if(pn->Info->IsBigger(p->Info)=0)/最末尾Tail->Next=p;p->Prev=Tail;Tail=p;p->Next=0;/注意else/一般情况/插入p1和pn之间p->Prev=p1;p1->Next=p;pn->Prev=p;p->Next=pn;void main()IntObj *p;Node *pn,*pt,node;List list

22、;char *name="jack","tom","john","mary","Sun"char *address="sh","bj","nj","sz","gz"for(int i=1;i<6;i+) p=new IntObj(namei-1,addressi-1,6-i+100); pn=new Node; pn->FillInfo(p); list.InsertNode(pn);

23、 list.ShowList(); cout<<"n" IntObj da; da.SetData("tom","bj",104); pn=list.LookUp(da); if(pn) pt=list.DeleteNode(pn); list.ShowList(); cout<<"n" if(pn) list.InsertNode(pt); list.ShowList(); cout<<"n"/*1.name本来指向另一个字符串,它开辟的空间长度需要人为改变

24、,赋新的值之前要删除原有空间,重新开辟.*/*编写一个程序,输入N个学生数据,包括学号、姓名、C+成绩,要求输出这些学生的数据、平均分与成绩等级。提示:设计一个学生类Stud,除了包括id(学号)、name(姓名)和C(成绩)数据成员外,还有两个静态成员数据sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和print(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分,并输出平均分。同时设计一个友元函数,输出成绩对应的等级:大于等于90:优;8090:良;7079:中;6069:及格;小于60:不及格。在main()函数中定

25、义了一个对象数组用于存储输入的学生数据,设计一个完整的程序。*/#include "stdio.h"#include "iostream.h"#include "string.h"class Studint id;char *name;int cpp;public:static float sum,num;/定义两个静态成员数据,数值需要不断累加的sum,可以定义 /为静态,使每次修改的值都可以被保留,相对地,定义它的静态成员函数Stud()name=NULL;num+;Stud()if(name) delete name;num-;

26、void setdata(char *s,int m_id,int m_cpp);void print();static float avg(); friend void printgrade(Stud &stu);/按题目要求,定义友元函数输出,可以 /访问类的任何成员;float Stud:sum=0;/定义静态变量,原型说明和定义型说明float Stud:num=0;void Stud:setdata(char *s,int m_id,int m_cpp)name=new charstrlen(s)+1;strcpy(name,s);id=m_id;cpp=m_cpp;sum+

27、=cpp; float Stud:avg()/静态函数的定义型说明,此时不用加static对函数进行原型说明float res;if(num>0) res=sum/num;else cout<<"没有学生对象!"return res;void Stud:print()cout<<"学号: "<<id<<" 姓名: "<<name<<" C+成绩: "<<cpp<<endl;void printgrade(Stud

28、&stu)/cout<<"学号"<<stu.id<<" 姓名"<<<<"C+成绩等级: "cout<<"C+成绩等级: "if(stu.cpp>=90) cout<<"优"<<endl;else if(stu.cpp>=80) cout<<"良"<<endl;else if(stu.cpp>=70) cout<

29、<"中"<<endl; else if(stu.cpp>=70) cout<<"中"<<endl; else if(stu.cpp>=60) cout<<"及格"<<endl; else cout<<"不及格"<<endl;void main()int i,n;char name100;int id,cpp;cout<<"请输入学生个数: "cin>>n; Stud *p

30、stu=new Studn;for(i=0;i<n;i+)cout<<"请分别输入学号,姓名和C+成绩 "cin>>id>>name>>cpp;pstui.setdata(name,id,cpp);for(i=0;i<n;i+) pstui.print();printgrade(pstui);cout<<Stud:num<<"个学生平均分: "<<Stud:avg()<<endl;/*1.实现描述超市的的类 Suppermacket 类,记录系统中

31、现有商品(用指针实现),定义增加商品的函数 Append ,删除商品的函数 Delete ,查询商品的函数 Query,并显示查询结果; 2.定义商品类 Goods ,具有商品名称Name,商品价格Price,商品数量number等属性,操作 Sale (销售商品,余额不足时给予提示)、Add(商品上架操作) 和ShowMe(显示商品信息)。3.编写main函数,测试以上所要求的各种功能,完成商品的增加、删除和查询商品,以及商品销售和商品上架的操作。 4.可以利用对象成员来实现。*/#include<iostream.h>#include<string.h>class

32、Suppermacket;class Goodsfloat Price;int number;char Name10;public:Goods()Add();void Sale();void Add();void ShowMe();friend Suppermacket;friend void Sale(Suppermacket &);class SuppermacketGoods * PGoods10;public:Suppermacket()for(int i=0;i<10;i+) PGoodsi=0;void Append();void Delete();void Quer

33、y();friend void Sale(Suppermacket &);void Sale(Suppermacket &Goods);void main()Suppermacket Goods;Goods.Append();Goods.Append();Goods.Append();Goods.Delete();Goods.Query();Sale(Goods);void Goods:Sale()int n;ShowMe();cout<<"请输入购买的商品数量:"cin>>n;if(number>n) number-=n;el

34、se cout<<"货物数量不足!"void Goods:Add()cout<<"请输入新上架商品的名称,单价和数量:"cin>>Name>>Price>>number;void Goods:ShowMe()cout<<" 品名:"<<Name<<" 数量:"<<number<<"单价:"<<Price<<endl;void Suppermacket:A

35、ppend()int n=0;while( PGoodsn!=0 && n<10) n+;if(n<10) PGoodsn=new Goods;void Suppermacket:Delete()char name10;cout<<"请输入待删除的商品名称:"cin>>name;for(int i=0;i<10;i+)if(PGoodsi=0) continue; if(strcmp(PGoodsi->Name,name)=0) break;if(i<10) cout<<"删除&qu

36、ot;<<name<<"商品n"delete PGoodsi;PGoodsi=0;else cout<<"没有此类商品!n"void Suppermacket:Query()char name10;cout<<"请输入待查询的商品名称:"cin>>name;for(int i=0;i<10;i+) if(PGoodsi=0)continue;if(strcmp(PGoodsi->Name,name)=0) break;if(i>=10) cout<&l

37、t;"没有此类商品!n"else PGoodsi->ShowMe(); void Sale(Suppermacket &Goods)char name10;int i=0;cout<<"请输入待买的商品名称:"cin>>name;while(i<10) if(Goods.PGoodsi=0) i+;continue;if(strcmp(Goods.PGoodsi->Name,name)=0) break;i+;if(i>=10) cout<<"没有此类商品!n"els

38、e Goods.PGoodsi->Sale();/*【程序功能】找出给定范围内的和亲数。对于两个正整数,如果其中的一个整数是另一个整数的全部真因子之和,反之亦然,则称这两个数为"和亲数"。例如,220有真因子"1, 2, 4, 5, 10, 11, 20, 22, 44, 55, 110",其和为284,而284有真因子"1, 2, 4, 71, 142",其和为220,因此220和284就是一对和亲数。【编程要求】1.试建立一个类NNM 私有数据成员int n1 , n2 ;/查找数据的范围int a102; /存储m n(m

39、<n)之间的所有和亲数对,并存储到a数组中int num; /统计和亲数对的个数 公有成员函数1)缺省构造函数:初始化数据成员n1,n2为0。2)带参构造函数NNM(int m,int n,int a2):用参数初始化数据成员n1,n2。3)void find( )函数用于查找n1 n2之间的所有和亲数对并存储到数组中4)打印函数 void print( ),将结果输出到屏幕*/#include<iostream.h>class NNMint n1,n2;int a102;int num;public:NNM()n1=0;n2=0;num=0;NNM(int a, int b

40、)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;n<i/2+1;n+)if(i%n=0)sum1+=n;for(sum2=0,n=1;n<sum1/2+1;n+)if(sum1%n=0)sum2+=n;if(sum2!=i | sum1=i) continue;anum0=i,anum+1=sum1;void

41、NNM:print()for(int i=0;i<num;i+)cout<<ai0<<','<<ai1<<endl;/*二. 【要求】试建立一个类 Student 用于描述学生信息,具体要求如下: 私有数据成员int id: 学生学号。char yuwen: 语文成绩(五级分制:A、B、C、D和E,其它无效)。float shuxue: 数学成绩(百分制)。 公有成员函数1)缺省构造函数:初始化数据成员为0或NULL值。2)带参构造函数:用参数初始化数据成员(需判断参数是否有效)。3)void Print( ): 输出本对象

42、的学号、语文成绩(优,良,中,及格,不及格)和数学成绩。4)修改函数void Change( ):从键盘输入新的学号、语文成绩和数学成绩,修改相应数据成员的值。接受输入前屏幕上显示提示输入哪些信息。5)比较函数void Comp(Student &a, Student &b): 比较本学生、a学生和b学生的数学成绩,找出数学成绩最高和最低的学生,输出他们的信息。 主程序:定义三个以上的对象,并且每个成员函数至少被调用一次。*/#include<iostream.h>class Studentint id; /学生学号。 char yuwen; /语文成绩(五级分制:

43、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);void main()Student A(78,'E',86),B(84,'D',82),C;C.Change();A.Comp(B,C);Student:Student(int a,char b, floa

44、t c)id=a, yuwen=b;shuxue=c;void Student:Print( ) cout<<" 学号: "<<id<<",语文成绩: "<<yuwen<<",数学成绩: "<<shuxue<<endl;void Student:Change( )cout<<"请输入学生的学号、语文成绩(五级分制:A/B/C/D/E,其它无效)和数学成绩:n"cin>>id>>yuwen>&

45、gt;shuxue;void Student:Comp(Student &a, Student &b)Student max,min;max= shuxue>a.shuxue?(shuxue>b.shuxue? *this:b):(a.shuxue>b.shuxue?a:b);min= shuxue<a.shuxue?(shuxue<b.shuxue? *this:b):(a.shuxue<b.shuxue?a:b);cout<<"数学成绩最高和最低的学生分别是:n"max.Print();min.Print(

46、);/*1.实现描述超市的的类Suppermacket类,记录系统中现有商品(用指针实现),定义增加商品的函数Append,删除商品的函数Delete,查询商品的函数Query,显示查询结果; 2.定义商品类Goods,具有商品名称Name,商品价格 Price ,商品数量 number 等属性,操作Sale(销售商品,余额不足时给予提示)、Add(商品上架操作)和ShowMe(显示商品信息)。3.编写main函数,测试以上所要求的各种功能,完成商品的增加、删除和查询商品,以及商品销售和商品上架的操作。 4.可以利用对象成员来实现。*/#include<iostream.h>#in

47、clude<string.h>class Suppermacket;class Goodschar name10;int Price;int number;public:Goods()strcpy(name,"");Price=0;number=0;void Sale(int n);void Add();void ShowME()cout<<"商品:"<<name<<",价格:"<<Price<<",有"<<number<&l

48、t;"件。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();void Suppermacket:Append()fo

49、r(int i=0;i<num;i+)if(PGoodsi.number=0)PGoodsi.Add();PGoodsi.ShowME();return;cout<<"没有空货架上货了!n"void Suppermacket:Delete()char name10;int n;cout<<"请输入需要销售商品名称和数量: "cin>>name>>n;for(int i=0;i<num;i+)if(strcmp(PG,name)=0)PGoodsi.Sale(n);return

50、;cout<<"查无此商品!n"void Suppermacket:Query()char name10;cout<<"请输入需要查询的商品名称; "cin>>name;for(int i=0;i<num;i+)if(strcmp(PG,name)=0)PGoodsi.ShowME();return;cout<<"查无此商品!n"void Goods:Sale(int n)if(n<number)number-=n;ShowME();elsecout<

51、;<"商品数量不够,无法销售!n"void Goods:Add()cout<<"请输入上架的商品名称、价格及数量: "cin>>name>>Price>>number;/*1.建立一个类NUM,求指定范围内的所有素数(质数)。具体要求如下:1)私有数据成员。int data25;依次存放指定范围内的所有素数。int spanl , span2 ;存放要求计算的素数的范围。int num ;存放span1与span2之间的素数个数。2) 公有成员函数。构造函数NUM (int a ,int b);初始化

52、所要求的素数的范围span1、span2及num (值为0)。void process( ): 求出指定范围内的所有素数,把它们依次存放在数组data中,并将求出的素数的个数赋给num 。void print( ):输出求出的所有素数。3)在主程序中对该类进行测试。使用测试数据span1=100 , span2=200 。即求100200之间的所有素数。*/#include<iostream.h>#include<math.h>class NUMint data25; /依次存放指定范围内的所有素数。int span1,span2; /存放要求计算的素数的范围。int

53、num; /存放span1与span2之间的素数个数。public:NUM (int a ,int b);void process( );void print( );void main()NUM a(100,200);cess();a.print();NUM:NUM (int a ,int b)span1=a;span2=b;num=0; void NUM:process( )int i,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;da

54、tanum+=i;void NUM:print( )for(int i=0;i<num;)cout<<datai<<'t'if(+i%6=0)cout<<endl;cout<<endl;/*已知由一个数组派生出另一个数组的派生规则如下:假定原始数组为a10,新数组为b10,则bi的值为数组a中大于ai的元素的个数。例如,对于说明"int a =1,2,3,4,5;int b5;",其中a1=2,数组a中有3个元素比a1大,则b1=3。试建立一个实现此功能的类ARRAY。具体要求如下:1)私有数据成员。 i

55、nt a10,b10;a存放原始数组,b存放派生数组。2)公有成员函数。 构造函数ARRAY(int data10);初始化成员数组a 。 void process( );由数组a根据上述派生类规则,用循环语句计算数组b的各元素。 void print( );屏幕显示数组a和b。*/#include<iostream.h>class ARRAYint a10,b10;public:ARRAY(int data10);/初始化成员数组a 。 void process( );/由数组a根据上述派生类规则,用循环语句计算数组b的各元素。 void print( );/屏幕显示数组a和b。;void main()int a=7,4,9,23,56,44,18,33,21,17;ARRAY array(a);cess();array.print();ARRAY:ARRAY(int data10)for(int i=0;i<10;i+)ai=datai;bi=0;void ARRAY:process( )for(int i=0;i<10;i+)for(int k=0;k&l

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论