C 期末考试试题及答案

玛丽莲梦兔
683次浏览
2020年08月03日 02:20
最佳经验
本文由作者推荐

关于高考的励志句子-雪地里的小画家教学设计


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=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< return 0。
}
(假定所有的赋值、比较运算符都已定义)

答案:
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 class Stack{
T s[size]。
int iCurrentElem。
public:
Stack()。
bool push(T x)。
T pop()。
void print(){for(int i=0。 i}。

template
Stack::Stack(){
for(int i=0。 i iCurrentElem=-1。
}

template
bool Stack::push(T x){
if(iCurrentElem==(size-1)) {cout<<。 return false。}
else {s[++iCurrentElem]=x。 return true。}
}

template
T Stack::pop(){
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 s1。
(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 [length+i]='0'。
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< virtual void retire(Employee& e)
{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< void retire(Manager& m)
{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=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< cout<<“max=”< return 0。
}
(假定所有的赋值、比较运算符都已定义)

答案:
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 class Stack{
T s[size]。
int iCurrentElem。
public:
Stack()。
bool push(T x)。
T pop()。
void print(){for(int i=0。 i}。

template
Stack::Stack(){
for(int i=0。 i iCurrentElem=-1。
}

template
bool Stack::push(T x){
if(iCurrentElem==(size-1)) {cout<<。 return false。}
else {s[++iCurrentElem]=x。 return true。}
}

template
T Stack::pop(){
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 s1。
(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 [length+i]='0'。
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< virtual void retire(Employee& e)
{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< void retire(Manager& m)
{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

原来我没懂-班会活动记录


赞美老师的成语-狗年对联


大海作文-成都市财政会计网


东莞高考-反对自由主义读后感


生产实习日记-2014二级建造师试题及答案


手抄报版面设计图-8月节日


马耳他语言学校-拜佛礼仪


菟丝子的功效与作用-中国留学生网