C 期末考试试题及答案
关于高考的励志句子-雪地里的小画家教学设计
2002年春季软件学院C++期末考试试卷及答案
考试时间:120分钟
1. (10)分
现有两种实体:“矩形”(Rectangle)和“旗杆”(Flagp
ole)。其中,“矩形”的属性为长度与
宽度,“旗杆”的属性为高度(指地面以上)和深度(指地面
以下),且均为整数。若有:
struct Rectangle { int length,
width。}。
struct Flagpole { int height,
depth。}。
int rectangleArea (int x, int
y) {return (x>=0 && y>=0)?x*y:0。}
计算矩形的面积
int flagpoleLength (int x, int y) {return
(x>=0 && y>=0)?x+y:0。}
计算旗杆的高度
void
f()
{
struct Rectangle rect。
struct Flagpole flgp。
=20。 =5。 =20。 =5。
int area=rectangleArea(, )。
int
length=flagpoleLength(, )。
}
试续写函数f,以各举一例说
明,对函数rectangleArea和flagpoleLength的调用都可能出现语法上合
法
,但结果与函数的语义不一致的情况,并指出其原因。
答案:
续写的二句如下:
area=rectangleArea(, )。
length=flagpoleLength(, )。
原因:在函数调用时,只需实参和
形参类型相容即可,而不管语义如何?如上例二句语法上是合法
的,但结果与函数的语义不一致。若欲使
该情况不发生,必须将数据及其上的操作绑定在一起,这必须
用类来定义。
2.
(15分)
阅读下面的程序,写出main的输出。
#include
int
f(int i, const int* j, int& k)
{ if(i%3= =0)
if(*j>=6) k*=i。
k+=i。
k-=i。
return *j+k。
}
int main()
{
int i, j=1, k=2, m。
for(i=0。
i<10。 i++, j*=2) {
1 7
m=f(i,
&j, k)。
printf(。
}
return 0。
}
答案:
i=0, j=1, k=2, m=3.
i=1, j=2, k=2, m=4.
i=2, j=4, k=2,
m=6.
i=3, j=8, k=6, m=14.
i=4, j=16,
k=6, m=22.
i=5, j=32, k=6, m=38.
i=6, j=64, k=36, m=100.
i=7, j=128,
k=36, m=164.
i=8, j=256, k=36, m=292.
i=9, j=512, k=324, m=836.
3.(15分)
根据main程序的输出结果,定义并实现max函数。
int
{
cout<<“max=”<
}
(假定所有的赋值、比较运算符都已定义)
答案:
template
T max(T x, T y)
{
return x>=y?x:y。}
template
T
max(T x, T y, T z)
{ T temp。
temp=max(x,y)。
return temp>=z?temp:z。
2
7
main()
}
float max(int
x, float y)
{ return x>=y?x:y。 }
4.(20分)
定义堆栈类模板Stack,栈的大小由使用者确定。要求该类模板对外提供如下二种基本操作:
(1)push
(2)pop
(假定赋值操作已定义)
答案:
#include
template
T s[size]。
int
iCurrentElem。
public:
Stack()。
bool
push(T x)。
T pop()。
void print(){for(int
i=0。 i
template
Stack
for(int i=0。
i
}
template
bool
Stack
if(iCurrentElem==(size-1)) {cout<<。 return false。}
else {s[++iCurrentElem]=x。 return true。}
}
template
T
Stack
T temp。
if(iCurrentElem==-1) {cout<<。 return -1。}
else {temp=s[iCurrentElem]。s[iCurrentElem]=0。
iCurrentElem--。 return temp。}
}
void
main()
{
float t。
3 7
Stack
(10)。
(20)。
(30)。
(40)。
()。
t=()。
()。
cout<
5.(25分)
用C++语言定义MyString(包括成员函数的实现代码),使之能符合下面程序及在注释中
描述的运行
结果的要求:
main()
{
MyString s1
= 。
y()。 此时显示出: <>
y()。
此时显示出(<>之间是五个空格): < >
y()。
此时显示出: <>
y()。 此时显示出: <>
s3
= s1。
y()。 此时显示出: <>
s3 =
3+s3。
y()。 此时显示出: <9>
s2 =
s1[2]。
y()。 此时显示出: <23456789>
y()。 此时显示出: <>
s3 = s2++。
y()。 此时显示出: <3456789>
y()。
此时显示出: <23456789>
}
答案:
#include
#include
#include
class MyString {
char
cpBody[81]。
public:
MyString(const
char* p = NULL)。
MyString(int i)。
MyString(MyString& s)。
MyString&
operator=(const MyString& s)
{
strncpy(cpBody, , 80)。 return *this。 }
MyString& operator[](int i)。
MyString&
operator++(int i)
4 7
{ static
MyString s。 s = *this。
*this =
(cpBody[0] == '0') ? *this : (*this)[1]。 return
s。 }
void display() { printf(。 }
friend MyString& operator+(int i, MyString& s)。
}。
MyString::MyString(const char*
p)
{
if (p == NULL)
cpBody[0]
= '0'。
else
strncpy(cpBody, p, 80)。
}
MyString::MyString(int i)
{ int j。
for (j = 0。 j < i && j < 80。 j++)
cpBody[j] = ' '。
cpBody[j] = '0'。
}
MyString::MyString(MyString& s)
{ *this=s。
* 或者改用如下语句:int length。
length=strlen()。
for(int i=0。 i
MyString& MyString::operator[](int i)
{ static MyString s。
int j。
s = *this。
for (j = i。 cpBody[j] != '0'。
j++)
[j-i] = [j]。
[j-i] = '0'。
return s。
}
MyString& operator+(int N, MyString& s)
{
static MyString st。
int i,length。
length=strlen()。
for(i=0。i
st=s。
5 7
*
return st。
}
6.(15分)
某公司有二类职员Employee和Manager,Ma
nager亦属于Employee。每个Employee对象所具有的基本
信息为:姓名、年令、工
作年限、部门号,Manager对象除具有上述基本信息外,还有级别(level)信
息。公司中的
二类职员都具有二种基本操作:
1). printOn()输出个人信息
2).
retire() 判断是否到了退休年令,是,则从公司中除名。公司规定:
Employee类的退休年令为55岁,Manager类的退休年令为60岁。
要求:
1). 定义并实现类Employee和Manager。
2).
分别输出公司中二类职员的人数(注意:Manager亦属于Employee)。
答案:
#include
#include
class Employee{
char name[21]。
int workYear。
int departmentNum。
protected:
static int ENumber。
int
age。
public:
Employee(char* s, int
age1, int workYear1, int depN)
{
if(strlen(s)<=20 && *s!='0') strcpy(name,s)。
if(age1>=18 && workYear1>=0 && depN>0)
{
age=age1。
workYear=workYear1。
departmentNum=depN。
Employee::ENumber++。
}
}
virtual
void printOn()
{cout<
{if(>=55) {delete
this。 Employee::ENumber--。}
else return。}
static void
countE(){cout<
int Employee::ENumber=0。
6 7
class Manager :public Employee
{
int level。
static int MNumber。
public:
Manager(char* s, int age1, int
workYear1, int depN, int lev)
:Employee(s,age1,workYear1, depN), level(lev)
{ Manager::MNumber++。}
void
printOn(){Employee::printOn()。 cout<
{if(>=60)
{delete this。 Manager::MNumber--。
Employee::ENumber--。}
else return。}
static void
countM(){cout<
int Manager::MNumber=0。
void
main()
{ Employee e1(。
Manager m1(。
n()。
n()。
Employee::countE()。
Manager::countM()。
return。
}
7 7
2002年春季软件学院C++期末考试试卷及答案
考试时间:120分钟
1. (10)分
现有两种实体:“矩形”(Rectangle)和“旗杆”(Flagp
ole)。其中,“矩形”的属性为长度与
宽度,“旗杆”的属性为高度(指地面以上)和深度(指地面
以下),且均为整数。若有:
struct Rectangle { int length,
width。}。
struct Flagpole { int height,
depth。}。
int rectangleArea (int x, int
y) {return (x>=0 && y>=0)?x*y:0。}
计算矩形的面积
int flagpoleLength (int x, int y) {return
(x>=0 && y>=0)?x+y:0。}
计算旗杆的高度
void
f()
{
struct Rectangle rect。
struct Flagpole flgp。
=20。 =5。 =20。 =5。
int area=rectangleArea(, )。
int
length=flagpoleLength(, )。
}
试续写函数f,以各举一例说
明,对函数rectangleArea和flagpoleLength的调用都可能出现语法上合
法
,但结果与函数的语义不一致的情况,并指出其原因。
答案:
续写的二句如下:
area=rectangleArea(, )。
length=flagpoleLength(, )。
原因:在函数调用时,只需实参和
形参类型相容即可,而不管语义如何?如上例二句语法上是合法
的,但结果与函数的语义不一致。若欲使
该情况不发生,必须将数据及其上的操作绑定在一起,这必须
用类来定义。
2.
(15分)
阅读下面的程序,写出main的输出。
#include
int
f(int i, const int* j, int& k)
{ if(i%3= =0)
if(*j>=6) k*=i。
k+=i。
k-=i。
return *j+k。
}
int main()
{
int i, j=1, k=2, m。
for(i=0。
i<10。 i++, j*=2) {
1 7
m=f(i,
&j, k)。
printf(。
}
return 0。
}
答案:
i=0, j=1, k=2, m=3.
i=1, j=2, k=2, m=4.
i=2, j=4, k=2,
m=6.
i=3, j=8, k=6, m=14.
i=4, j=16,
k=6, m=22.
i=5, j=32, k=6, m=38.
i=6, j=64, k=36, m=100.
i=7, j=128,
k=36, m=164.
i=8, j=256, k=36, m=292.
i=9, j=512, k=324, m=836.
3.(15分)
根据main程序的输出结果,定义并实现max函数。
int
{
cout<<“max=”<
}
(假定所有的赋值、比较运算符都已定义)
答案:
template
T max(T x, T y)
{
return x>=y?x:y。}
template
T
max(T x, T y, T z)
{ T temp。
temp=max(x,y)。
return temp>=z?temp:z。
2
7
main()
}
float max(int
x, float y)
{ return x>=y?x:y。 }
4.(20分)
定义堆栈类模板Stack,栈的大小由使用者确定。要求该类模板对外提供如下二种基本操作:
(1)push
(2)pop
(假定赋值操作已定义)
答案:
#include
template
T s[size]。
int
iCurrentElem。
public:
Stack()。
bool
push(T x)。
T pop()。
void print(){for(int
i=0。 i
template
Stack
for(int i=0。
i
}
template
bool
Stack
if(iCurrentElem==(size-1)) {cout<<。 return false。}
else {s[++iCurrentElem]=x。 return true。}
}
template
T
Stack
T temp。
if(iCurrentElem==-1) {cout<<。 return -1。}
else {temp=s[iCurrentElem]。s[iCurrentElem]=0。
iCurrentElem--。 return temp。}
}
void
main()
{
float t。
3 7
Stack
(10)。
(20)。
(30)。
(40)。
()。
t=()。
()。
cout<
5.(25分)
用C++语言定义MyString(包括成员函数的实现代码),使之能符合下面程序及在注释中
描述的运行
结果的要求:
main()
{
MyString s1
= 。
y()。 此时显示出: <>
y()。
此时显示出(<>之间是五个空格): < >
y()。
此时显示出: <>
y()。 此时显示出: <>
s3
= s1。
y()。 此时显示出: <>
s3 =
3+s3。
y()。 此时显示出: <9>
s2 =
s1[2]。
y()。 此时显示出: <23456789>
y()。 此时显示出: <>
s3 = s2++。
y()。 此时显示出: <3456789>
y()。
此时显示出: <23456789>
}
答案:
#include
#include
#include
class MyString {
char
cpBody[81]。
public:
MyString(const
char* p = NULL)。
MyString(int i)。
MyString(MyString& s)。
MyString&
operator=(const MyString& s)
{
strncpy(cpBody, , 80)。 return *this。 }
MyString& operator[](int i)。
MyString&
operator++(int i)
4 7
{ static
MyString s。 s = *this。
*this =
(cpBody[0] == '0') ? *this : (*this)[1]。 return
s。 }
void display() { printf(。 }
friend MyString& operator+(int i, MyString& s)。
}。
MyString::MyString(const char*
p)
{
if (p == NULL)
cpBody[0]
= '0'。
else
strncpy(cpBody, p, 80)。
}
MyString::MyString(int i)
{ int j。
for (j = 0。 j < i && j < 80。 j++)
cpBody[j] = ' '。
cpBody[j] = '0'。
}
MyString::MyString(MyString& s)
{ *this=s。
* 或者改用如下语句:int length。
length=strlen()。
for(int i=0。 i
MyString& MyString::operator[](int i)
{ static MyString s。
int j。
s = *this。
for (j = i。 cpBody[j] != '0'。
j++)
[j-i] = [j]。
[j-i] = '0'。
return s。
}
MyString& operator+(int N, MyString& s)
{
static MyString st。
int i,length。
length=strlen()。
for(i=0。i
st=s。
5 7
*
return st。
}
6.(15分)
某公司有二类职员Employee和Manager,Ma
nager亦属于Employee。每个Employee对象所具有的基本
信息为:姓名、年令、工
作年限、部门号,Manager对象除具有上述基本信息外,还有级别(level)信
息。公司中的
二类职员都具有二种基本操作:
1). printOn()输出个人信息
2).
retire() 判断是否到了退休年令,是,则从公司中除名。公司规定:
Employee类的退休年令为55岁,Manager类的退休年令为60岁。
要求:
1). 定义并实现类Employee和Manager。
2).
分别输出公司中二类职员的人数(注意:Manager亦属于Employee)。
答案:
#include
#include
class Employee{
char name[21]。
int workYear。
int departmentNum。
protected:
static int ENumber。
int
age。
public:
Employee(char* s, int
age1, int workYear1, int depN)
{
if(strlen(s)<=20 && *s!='0') strcpy(name,s)。
if(age1>=18 && workYear1>=0 && depN>0)
{
age=age1。
workYear=workYear1。
departmentNum=depN。
Employee::ENumber++。
}
}
virtual
void printOn()
{cout<
{if(>=55) {delete
this。 Employee::ENumber--。}
else return。}
static void
countE(){cout<
int Employee::ENumber=0。
6 7
class Manager :public Employee
{
int level。
static int MNumber。
public:
Manager(char* s, int age1, int
workYear1, int depN, int lev)
:Employee(s,age1,workYear1, depN), level(lev)
{ Manager::MNumber++。}
void
printOn(){Employee::printOn()。 cout<
{if(>=60)
{delete this。 Manager::MNumber--。
Employee::ENumber--。}
else return。}
static void
countM(){cout<
int Manager::MNumber=0。
void
main()
{ Employee e1(。
Manager m1(。
n()。
n()。
Employee::countE()。
Manager::countM()。
return。
}
7 7