C面向对象程序设计习题集.docx
《C面向对象程序设计习题集.docx》由会员分享,可在线阅读,更多相关《C面向对象程序设计习题集.docx(144页珍藏版)》请在冰豆网上搜索。
C面向对象程序设计习题集
C++面向对象程序设计习题集
编程题:
用面向对象的程序设计方法编制如下程序。
1.
设计一个Bank类,实现银行某账号的资金往来账管理,包括建账号、存入、取出等。
Bank类包括私有数据成员top(当前指针)、date(日期)、money(金额)、rest(余额)和sum(累计余额)。
另有一个构造函数和3个成员函数bankinO(处理存入账)、bankout()(处理取出账)和disp()(出明细账)。
【知识点】:
2.22.3
【参考分】:
25分
【难易度】:
B
【答案】:
#include
#include
#include
constintMax=100;
classBank
{
inttop;
chardate[Max][10];//日期
intmoney[Max];//金额
intrest[Max];//余额
staticintsum;//累计余额
public:
Bank(){top=0;}
voidbankin(chard[],intm)
{
strcpy(date[top],d);
money[top]=m;
sum=sum+m;
rest[top]=sum;
top++;
}
voidbankout(chard[],intm)
{
strcpy(date[top],d);
money[top]=-m;//取出数用负数表示
sum=sum-m;
rest[top]=sum;
top++;
}
voiddisp()
{
inti;
cout<<"日期存入取出余额"<for(i=0;i{
cout<if(money[i]<0)
cout<<""<else
cout<cout<};
intBank:
:
sum=0;
voidmain()
{
Bankobj;
obj.bankin("2005.2.5".1000);
obj.bankin("2006.3.2",2000);
obj.bankout("2007.4.1",500);
obj.bankout("2007.10.5",800);
obj.disp();
}
2.
编写一个程序,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。
【知识点】:
2.22.3
【参考分】:
20分
【难易度】:
B
【答案】:
#include
#include
#include
classStud
{
intno;
charname[10];
intdeg;
staticintsum;
staticintnum;
public:
Stud(intn,charna[],intd)
{
no=n;deg=d;
strcpy(name,na);
sum+=d;
num++;
}
staticdoubleavg()
{
returnsum/num;
}
voiddisp()
{
cout<}
};
intStud:
:
sum=0j
intStud:
:
num=O;
voidmain()
{
Studs1(1,"Li",89),s2(2,"Chert",78),s3(3,"zheng",94);
cout:
<<"学号姓名成绩"<s1.disp();
s2.disp();
s3.disp();
cout<<"平均分="<:
avg()<}
3.
有10个单词存放在一维指针数组words中,编写一个程序,根据用户的输入找出所有及之从前向后匹配的单词和个数。
【知识点】:
2.2
【参考分】:
25分
【难易度】:
B
【答案】:
设计一个Word类,包含一个私有数据成员words、一个构造函数和一个公有成员函数lookup(),构造函数用于给words赋初值,lookup()用于找出所有及之从前向后匹配的单词和个数。
程序如下:
#include
#include
C1assWord
{
charwords[10][12];
public:
Word()//构造函数给words赋初值
{
strcpy(words[0],"elapse");
strcpy(words[1],"elucidate");
strcpy(words[2],"elude");
strcpy(words[3],"embody");
strcpy(words[4],"embrace");
strcpy(words[5],"embroider");
strcpy(words[6],"emrtge");
strcpy(words[7],"emphasize");
strcpy(words[8],"empower");
strcpy(words[9],"emulate");
}
voidlookup(chars[]);
};
voidWord:
:
lookup(chars[])
{
char*w;
inti,j,n=0;//n记录相匹配的单词个数
cout<<"匹配的单词:
"<for(i=0;i<10;i++)//一个单词一个单词地匹配
{
for(w=words[i],j=0;s[j]!
='\0'&&*w!
='\0'&&*w==s[j];j++,w++);
if(s[j]=='\0')//匹配成功
{
n++;
cout<<"\t"<}
}
cout<<"相匹配的单词个数:
"<}
voidmain()
{
Wordobj;
charstr[20];
cout<<"输入单词:
";
cin>>str;
obj.lookup(str);
}
4.
创建一个Employee类,该类中有字符数组,表示姓名、街道地址、市、省和邮政编码。
把表示构造函数、changenameO、display()的函数原型放在类定义中,构造函数初始化每个成员,display()~数把完整的对象数据打印出来。
其中的数据成员是保护的,函数是公共的。
【知识点】:
2.22.33.1
【参考分】:
20分
【难易度】:
B
【答案】:
#include
#include
classEmployee
{
protected:
charname[10];//姓名
charstreet[20];//街道地址
charcity[10];//市
charprov[10];//省
charpost[7];//邮政编码
intno;//记录序号
public:
Employee(char[],char[],char[],char[],char[],int);
voidchangename(charstr[]);
voiddisplay();
};
Employee:
:
Employee(charn[],chars[],charc[],charpl[],charp2[],intnum)
{
strcpy(name,n);
strcpy(Street,s);
strcpy(city,c);
Strcpy(prov,p1);
strcpy(post,p2);
no=num;
}
voidEmployee:
:
changename(charn[])
{
strcpy(name,n);
}
voidEmployee:
:
display()
{
cout<<"输出记录"<cout<<"姓名:
"<cout<<"街道地址:
"<cout<<"市:
"<tout<<"省:
"<cout<<"邮政编码:
"<}
voidmain()
{
Employeeobj1("王华","中华路15号","武汉市","湖北省","430070",1);
Employeeobj2("杨丽","天津路30号","南京市","江苏省","210020",2);
obj1.display();
obj2.display();
}
5.
编写一个程序,已有若干个学生数据,这些数据包括学号、姓名、语文成绩、数学成绩和英语成绩,求各门课程的平均分。
要求设计不同的成员函数求各门课程的平均分,并使用成员函数指针调用它们。
【知识点】:
2.22.33.1
【参考分】:
20分
【难易度】:
C
【答案】:
设计一个学生类student,包括no(学号)、name(姓名)、degl(语文成绩)、deg2(数学成绩)、deg3(英语成绩)数据成员和3个静态数据成员suml(累计语文总分)、sum2(累计数学总分)、sum3(累计英语总分);另外有一个构造函数、3个求三门课程平均分的成员函数和一个disp()成员函数。
程序如下:
#include
#include
#include
constintN=4;
classstudent
{
intno;//学号
charname[10];//姓名
intdegl;//语文成绩
intdeg2;//数学成绩
intdeg3;//英语成绩
staticintsuml;//语文总分
statacintsum2;//数学总分
staticintsum3;//英语总分
public:
student(intn,charna[],intdl,intd2,intd3)
{
no=n;
strcpy(name,na);
degl=dl;deg2=d2;deg3=d3;
suml+=degl;sum2+=deg2;sum3+=deg3;
}
doubleavgl(){return(suml*1.0)/N;}
doubleavg2(){return(sum2*1.0)/N;}
doubleavg3(){return(sum3*1.0)/N;}}
voiddisp()
{
cout<<}
};
intstudent:
:
suml=0;
intstudent:
:
sum2=0;
intstudent:
:
sum3=0;
voidmain()
{
double(student:
:
*fp)();//定义成员函数指针
students1(1,"Li",67,89,90);
students2(2,"Na",67,89,90);
students3(3,"Zheng",67,89,90);
students4(4,"Chert",67,89,90);
cout<<"输出结果"<cout<<"学号姓名语文数学英语"<s1.disp();
S2.disp();
S3.disp();
S4.disp();
fp=student:
:
avgl;
cout<<"语文平均分:
"<<(S1.*fP)()<fp=student:
:
avg2;
cout<<"数学平均分:
"<<(S1.*fp)()<fp=student:
:
avg3;
cout<<"英语平均分:
"<<(S1.*fP)()<}
6.
编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求只输出成绩在80~89分数段的学生数据。
【知识点】:
2.22.3
【参考分】:
20分
【难易度】:
B
【答案】:
设计一个学生类Stud,包括no(学号)、name(姓名)和deg(成绩)数据成员,另有两个普通成员函数setdata()和disp(),前者用于设置对象数据,后者用于只输出成绩在80~89分数段的学生数据。
在main()函数中定义了一个对象数组用于存储输入的学生数据。
程序如下:
#include
#include
#include
constintN=3;
classStud
{
intno;
charname[10];
intdeg;
publiC:
voidsetdata(intn,charna[],intd)
{
no=n;deg=d;
strcpy(name,na);
}
voiddisp()
{
if(deg>=80&°<=89)
cout<}
};
voidmain()
{
Studst[N];
inti,n,d;
charna[10];
cout<<"输入学号姓名成绩"<for(i=0;i{
cout<<"第"<
";
cin>>n>>na>>d;
St[i].Setdata(n,na,d);
cout<<"输出数据"<cout<<"学号姓名成绩"<for(i=0;ist[i].disp();
}
7.
编写一个程序统计学生成绩,其功能包括输入学生的姓名和成绩,按成绩从高到低排列打印输出,对前70%的学生定为合格(PASS),而后30%的学生定为不及格(FAIL)。
【知识点】:
2.22.33.1
【参考分】:
40分
【难易度】:
A
【答案】:
设计一个类student,包含学生的姓名和成绩等数据,以及setname()、setdeg()、getname()和getdeg()等4个成员函数。
设计一个类compute,包含两个私有数据成员,即学生人数ns和student类的对象数组na[],另有3个公共成员函数getdata()、sort()、disp(),它们的功能分别用于数据获取、按成绩排序和输出数据。
程序如下:
#include
#include
#include
constintMax=10;
classstudent
{
charname[10];
intdeg;
public:
voidsetname(charna[]){strcpy(name,na);}
char*getname(){returnname;}
voidsetdeg(intd){deg=d;}
intgetdeg(){returndeg;}
};
classcompute
{
intns;
studentna[Max];
public:
voidgetdata();
voidsort();
voiddisp();
};
voidcompute:
:
getdata()
{
inti,tdeg;
chartname[10];
cout<<"输入学生人数:
";
cin>>ns;
cout<<"输入学生姓名和成绩:
"<for(i=O;i{
cout<<"第"<
";
cin>>tname>>tdeg;
na[i].setname(tname);
me[i].setdeg(tdeg);
}
}
voidcompute:
:
sort()
{
inti,j,pick;
studenttemp;
for(i=0;i{
pick=i;
for(j=i+1;j{
if(na[J].getdeg()>na[pick].getdeg())
pick=j;
}
temp=na[i];
na[i]=na[pick];
na[pick]=temp;
}
}
voidcompute:
:
disp()
{
intcutoff,i;
cout<<"输出结果"<cout<<"姓名成绩合格否"<cout<<”-----------------”<cutoff=ns*7/10-1;
for(i=0;i{
cout<if(i<=cutoff)
cout<<"PASS"<else
cout<<"FAIL"<}
}
voidmain()
{
computeobj;
obj.getdata();
obj.sort();
obj.disp()
}
8.
编写一个程序,输入用户的姓名和电话号码,按姓名的词典顺序排列后,输出用户的姓名和电话号码。
【知识点】:
2.22.33.1
【参考分】:
40分
【难易度】:
B
【答案】:
设计一个类person,包含学生的姓名和电话号码等数据,以及semame()、setnum()、gemame()和gemum()等4个成员函数。
设计一个类compute,包含一个私有数据成员,即person类的对象数组pn[],另有3个公共成员函数getdata()、sort()、disp(),它们的功能分别用于数据获取、按姓名的词典顺序排序和输出数据。
程序如下:
#include
#include
#include
constintN=5;
classperson
{
charname[10];
charnum[10];
public:
voidsetname(charna[]){strcpy(name,na);}
voidsetnum(charnu[]){strcpy(num,nu);)
char*getname(){returnname;}
char*getnum(){returnnum;)
};
classcompute
{
personpn[N];
public:
voidgetdata();
voidgetsort();
voidoutdata();
};
voidcompute:
:
getdata()
{
inti;
charna[10],nu[10];
cout<<"输入姓名和电话号码"<for(i=0;i{
cout<<"第"<
";
cin>>na>>nu;
pn[i].setname(na);
pn[i].setnum(nu);
}
voidcompute:
:
getsort()
inti,j,k;
persontemp;
for(i=0;i{
k=i;
for(j=i+1;jif(strcmp(pn[k].getname(),pn[j].getname())>0)
k=j;
temp=pn[k];
pn[k]=pn[i];
pn[i]=temp;
}
}
voidcompute:
:
outdata()
{
inti;
cout<<"输出结果:
"<cout<<"姓名电话号码"<cout<<"----------------"<for(i=0;icout<<}
voidmain()
{
computeobj;
obj.getdata();
obj.getsort();
obj.outdata();
}
9.
编写一个程序,输入n个学生的姓名和出生日期,并按年龄从大到小输出。
【知识点】:
2.22.33.1
【参考分】:
40分
【难易度】:
A
【答案】:
设计一个结构体person,包含学生的姓名和出生日期等数据:
设计一个类compute,包含私有数据成员,即person结构体数组st[],另有3个私有成员函数daynum()、countday()、leap()和3个公共成员函数getdam()、sort()、disp(),它们的功能分别用于数据获取、按出生日期排序和输出数据,在实现过程中调用前面的3个私有成员函数。
sort()成员函数按结构体数组元素的d成员排序,d存放的是该学生从1900年1月l日到出生日期的天数。
程序如下:
#include
#include
constintN=4;
intcountday(int,int,int,int);
intleap(int);
structperson
{
charname[10];
structdates
intyear;
intmonth;
intday;
}date;
intd;//从1900.1.1到出生日的天数
};
classcompute
{
structpersonst[N];
intdaynum(int,int,int,int,int,int);
intcount_day(int,int,int,int);
boolleap(int);
public:
voidgetdata();
voidsort();
voiddisp();
};
intcompute:
:
daynum(ints_year,ints_month,int