C++上机考试题上机练习东南大学C++上机实验Word文档下载推荐.docx
《C++上机考试题上机练习东南大学C++上机实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++上机考试题上机练习东南大学C++上机实验Word文档下载推荐.docx(51页珍藏版)》请在冰豆网上搜索。
ComplexComplex:
:
operator+(Complex&
c)//此时的函数名变为Complex:
operator
Complext;
//在函数体内可以定义新的类,并把这个临时的类返回,同样用打点来访问
t.Real=Real+c.Real;
t.Image=Image+c.Image;
returnt;
voidComplex:
operator+=(Complex&
c)
Real=Real+c.Real;
Image=Image+c.Image;
operator-(Complex&
t.Real=Real-c.Real;
t.Image=Image-c.Image;
operator-=(Complex&
Real=Real-c.Real;
Image=Image-c.Image;
operator*(Complex&
t.Real=Real*c.Real-Image*c.Image;
t.Image=Real*c.Image+Image*c.Real;
operator/(Complex&
t.Real=Real*c.Real+Image*c.Image;
t.Image=-Real*c.Image-Image*c.Real;
floatval=c.Real*c.Real+c.Image*c.Image;
t.Real=t.Real/val;
t.Image=t.Image/val;
operator=(Complex&
Real=c.Real;
Image=c.Image;
intComplex:
operator!
intres;
//函数体内定义临时变量
res=(c.Real!
=Real)&
&
(c.Image!
=Image);
returnres;
operator==(Complex&
res=(c.Real==Real)&
(c.Image==Image);
voidmain()
Complexa(3,4),b(6,8),c,d;
c=a;
//赋值=
c.show();
d=a+b;
//+
d.show();
c=b-a;
//-
c=b;
c+=a;
//+=
d=b;
d-=a;
//-=
//
d=a;
cout<
endl<
输出c和d:
\n"
;
if(c==d){c.show();
d.show();
cout<
c==d"
if(c!
=d){c.show();
c!
=d"
a*b:
"
c=a*b;
c.show();
\na/b:
d=b/a;
四、下标运算符[]通常用于取数组中某个元素,可以实现数组下标越界的检测等。
本题要求通过下标运算符的重载,实现读取数组中某个元素的作用。
它具有如下公有成员函数:
1.voidWord(char*s);
动态生成字符数组空间,用形参s来对其进行初始化。
2.char&
operaror[](intn)给下标值为n的数组元素赋值。
下标运算符[]的重载关键是将下标值做为一个操作数。
它的实现非常简单,
就是用字符指针的首地址str加下标值n,然后将相加后的地址返回。
3.voiddisp();
实现将字符指针str指向的字符串输出到屏幕上。
4.用~Word()析构函数来释放动态申请的堆空间。
#include<
iostream.h>
string.h>
classWord{
private:
char*str;
intlen;
public:
Word(char*s)//voidWord(char*s)把原题的void去掉,做构造函数
len=strlen(s)+1;
str=newchar[len];
strcpy(str,s);
}
char&
operator[](intn)//重载[],用operator,返回值为引用类型
{//n是[]的操作数,即下标
if(n>
=0&
n<
len-1)
returnstr[n];
else{
cout<
越界"
returnstr[len-1];
}
voiddisp(){
cout<
str<
~Word()
delete[]str;
voidmain()
char*s="
china"
Wordw(s);
//用字符串的指针做形参,做构造函数Word("
)
w.disp();
intn=strlen(s);
while(n>
0)
w[n-1]=w[n-1]-32;
n--;
w[7];
//14-3.cpp
/*建立一个双向链表,节点数据包括姓名、地址和工资,按工资从小到大的顺序排序。
参见教材P281例12.7和教材P192页
#include<
classObject
Object(){};
//可以定义空的构造函数
virtualintIsEqual(Object&
)=0;
//纯虚函数
virtualintIsBigger(Object*)=0;
//形参为&
,实参直接为变量名
//形参为*,实参为指针或地址
virtualvoidShow()=0;
virtual~Object(){};
classIntObj:
publicObject
intdata;
//工资
char*name;
char*address;
IntObj(char*s=NULL,char*a=NULL,intx=0)
data=x;
if(s)
{
name=newchar[strlen(s)+1];
//strlen的参数是指针
strcpy(name,s);
elsename=NULL;
if(a)
address=newchar[strlen(a)+1];
strcpy(address,a);
elseaddress=NULL;
~IntObj()
if(name)delete[]name;
//析构前预判,很重要
if(address)delete[]address;
voidSetData(char*s,char*a,intx)//修改数据
delete[]name;
//name本来指向另一个字符串,它开辟的空间长度
//需要人为改变,赋新的值之前要删除原有空间,重新开辟
delete[]address;
intIsEqual(Object&
obj)
IntObj&
temp=(IntObj&
)obj;
//为它起个别名
if(strcmp(name,temp.name)!
=0)return0;
//用strcmp函数比较字符串是否相同
if(strcmp(address,temp.address)!
if(data!
=temp.data)return0;
return1;
intIsBigger(Object*obj)
IntObj*temp=(IntObj*)obj;
if(data<
=temp->
data)return0;
elsereturn1;
voidShow()
姓名:
name<
地址:
address<
工资="
data<
classNode//此处Node定义为类,前面都是定义为struct,这个节点当中包含为上面定义
//的类的数据成员
private:
Object*Info;
//定义类object的指针
Node*Prev,*Next;
//定义节点类型的指针,一前一后
Node(){Info=0;
Prev=Next=0;
}//定义的指针在构造函数中初始化为0
Node(Node&
node)//定义拷贝的构造函数
Info=node.Info;
Prev=node.Prev;
Next=node.Next;
voidFillInfo(Object*obj){Info=obj;
friendclassList;
classList
Node*Head,*Tail;
List(){Tail=Head=0;
~List(){DeleteList();
voidAddNode(Node*);
Node*DeleteNode(Node*);
Node*LookUp(Object&
voidShowList();
voidDeleteList();
voidInsertNode(Node*);
voidList:
AddNode(Node*node)
if(Head==0){
Head=Tail=node;
node->
Next=node->
Prev=0;
else{
Tail->
Next=node;
Prev=Tail;
Tail=node;
Next=0;
Node*List:
DeleteNode(Node*node)
if(node==Head)
if(node==Tail)
Head=Tail=0;
else{
Head=node->
Next;
Head->
Prev->
if(node!
=Tail)node->
Next->
Prev=node->
Prev;
elseTail=node->
node->
return(node);
LookUp(Object&
Node*pn=Head;
while(pn)
if(pn->
Info->
IsEqual(obj))returnpn;
pn=pn->
return0;
ShowList()
Node*p=Head;
while(p)
p->
Show();
p=p->
DeleteList()
Node*p,*q;
p=Head;
deletep->
Info;
q=p;
deleteq;
InsertNode(Node*p)
Node*pn=Head,*p1;
if(Head==0)//空表
Head=Tail=p;
Head->
Next=Tail->
return;
if(Head->
IsBigger(p->
Info))//小于头节点
Next=Head;
Prev=p;
Head=p;
pn=p1=Head;
while(pn->
Next&
pn->
Info)==0)//寻找插入位置
p1=pn;
pn=pn->
if(pn->
Info)==0)//最末尾
Next=p;
Tail=p;
//注意
else//一般情况//插入p1和pn之间
Prev=p1;
p1->
pn->
Next=pn;
IntObj*p;
Node*pn,*pt,node;
Listlist;
char*name[]={"
jack"
"
tom"
john"
mary"
Sun"
char*address[]={"
sh"
bj"
nj"
sz"
gz"
for(inti=1;
i<
6;
i++)
p=newIntObj(name[i-1],address[i-1],6-i+100);
pn=newNode;
FillInfo(p);
list.InsertNode(pn);
list.ShowList();
\n"
IntObjda;
da.SetData("
104);
pn=list.LookUp(da);
if(pn)pt=list.DeleteNode(pn);
if(pn)list.InsertNode(pt);
/*1.name本来指向另一个字符串,它开辟的空间长度需要人为改变,赋新的值之前要删除原
有空间,重新开辟.
编写一个程序,输入N个学生数据,包括学号、姓名、C++成绩,
要求输出这些学生的数据、平均分与成绩等级。
提示:
设计一个学生类Stud,除了包括id(学号)、name(姓名)和C(成绩)数据成员外,
还有两个静态成员数据sum和num,分别存放总分和人数,
另有两个普通成员函数setdata()和print(),分别用于给数据成员赋值和输出数据成员的值,
另有一个静态成员函数avg(),它用于计算平均分,并输出平均分。
同时设计一个友元函数,输出成绩对应的等级:
大于等于90:
优;
80~90:
良;
70~79:
中;
60~69:
及格;
小于60:
不及格。
在main()函数中定义了一个对象数组用于存储输入的学生数据,设计一个完整的程序。
string.h"
classStud
intid;
intcpp;
staticfloatsum,num;
//定义两个静态成员数据,数值需要不断累加的sum,可以定义
//为静态,使每次修改的值都可以被保留,相对地,定义它的静态成员函数
Stud()
name=NULL;
num++;
~Stud()
num--;
voidsetdata(char*s,intm_id,intm_cpp);
voidprint();
staticfloatavg();
friendvoidprintgrade(Stud&
stu);
//按题目要求,定义友元函数输出,可以
//访问类的任何成员
floatStud:
sum=0;
//定义静态变量,原型说明和定义型说明
num=0;
voidStud:
setdata(char*s,intm_id,intm_cpp)
name=newchar[strlen(s)+1];
strcpy(name,s);
id=m_id;
cpp=m_cpp;
sum+=cpp;
floatStud:
avg()//静态函数的定义型说明,此时不用加static对函数进行原型说明
floatres;
if(num>
0)res=sum/num;
elsecout<
没有学生对象!
print()
学号:
id<
姓名:
C++成绩:
cpp<
voidprintgrade(Stud&
stu)
//cout<
学号"
stu.id<
姓名"
stu.name<
C++成绩等级:
if(stu.cpp>
=90)cout<
优"
elseif(stu.cpp>
=80)cout<
良"
=70)cout<
中"
=60)cout<
及格"
不及格"
inti,n;
charname[100];
intid,cpp;
请输入学生个数:
cin>
>
n;
Stud*pstu=newStud[n];
for(i=0;
请分别输入学号,姓名和C++成绩"
cin>
id>
name>
cpp;
pstu[i].setdata(name,id,cpp);
i++){pstu[i].print();
printgrade(pstu[i]);
Stud:
num<
个学生平均分:
avg()<
1.实现描述超市的的类Suppermacket类,记录系统中现有商品(用指针实现),定义增加商品的函数Append,删除商品的函数Delete,查询商品的函数Query,
并显示查询结果;
2.定义商品类Goods,具有商品名称Name,商品价格Price,商品数量number等属性,操作Sale(销售商品,余额不足时给予提示)、Add(商品上架操作)
和ShowMe(显示商品信息)。
3.编写main函数,测试以上所要求的各种功能,完成商品的增加、删除和查询商品,以及商品销售和商品上架的操作。
4.可以利用对象成员来实现。
#include<
classSuppermacket;
classGoods{
floatPrice;
intnumber;
charName[10];
Goods(){Add();
vo