- 一、选择填空题(20分,每题2分)
1. 下列关于指针的操作中,错误的是
A. 两个同类型的指针可以进行比较运算 B. 可以用一个空指针赋给某个指针
C. 一个指针可以加上两个整数之差 D. 两个同类型的指针可以相加
2. 构造函数不具备的特征的是
A. 构造函数的函数名与类名相同 B. 构造函数可以重载
C. 构造函数必须指定类型说明 D. 构造函数可以设置默认参数
3. 已知类 A 是类 B 的友元,类 B 是类 C 的友元,则
A. 类 A 一定是类 C 的友元
B. 类 C 一定是类 A 的友元
C. 类 C 的成员函数可以访问类 B 的对象的任何成员
D. 类 A 的成员函数可以访问类 B 的对象的任何成员
4. 如果class类中的所有成员在定义时都没有使用关键字public、private或protected,则所有成员缺省定义为
A.public B.private C.protected D.static
5. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是
A. 类 B. 对象 C. 函数体 D. 数据块
6. 若x是整型变量,pb是基类型为整型的指针变量,则正确的赋值表达式
是
A) pb=&x B) pb=x; C) *pb=&x; D) *pb=*x
7.有关类和对象的说法下列不正确的有 。
A、对象是类的一个实例
B、任何一个对象只能属于一个具体的类
C、一个类只能有一个对象
D、类与对象的关系和数据类型和变量的关系相似
8.对于int *pa[5];的描述, 是正确的。
A.pa是一个指向数组的指针,所指向的数组是 5个 int 型元素
B.pa 是一个指向某数组中第5个元素的指针,该元素是 int型变量
C.pa[5]表示某个数组的第5个元素的值
D.pa 是一个具有5个元素的指针数组,每个元素是 int 一个型指针
9. 面向对象的程序设计语言必须具备的关键要素是
A. 抽象和封装 B. 抽象和多态性
C. 抽象、封装、继承和多态性 D. 抽象、封装和继承性
10.派生类的对象只能对它的 是可访问的。
A.公有继承的公有成员 B.公有继承的私有成员
C.公有继承的保护成员 D.私有继承的保护成员
二、阅读以下程序并给出执行结果(15分)
1.
# include <iostream.h>
# include <string.h>
class visiter
{
public:
static int glob;
void set_mes (char *a);
void display();
private:
int number;
char *name;
} ;
void visiter :: set_mes (char *a)
{
name = new char[strlen(a) + 1] ;
strcpy (name, a) ;
number=++glob;
}
void visiter ::display()
{
cout << " 编号:"<<number << " 姓名:"<<name<<endl;
}
int visiter :: glob= 0 ;
void main ()
{
visiter person[5];
int i ;
char str[8] ;
cout << " 输入姓名:";
for ( i=0; i<5; i++)
{
cin >> str ;
person[i].set_mes ( str ) ;
}
cout<<endl;
for ( i=0; i<5; i++)
{
person[i].display();
}
}
输入姓名:A B C D E
输出:?
2.
#include<iostream.h>
class Point
{
private:
int X,Y;
public:
Point(int a=0,int b=0){
X=a;Y=b;
cout<<"initializing X="<<X<<",Y="<<Y<<endl;
}
Point(Point &p);
int GetX(){return X;}
int GetY(){return Y;}
void Show(){
cout<<"X="<<X<<",Y="<<Y<<endl;
}
~Point(){
cout<<"delete… "<<X<<","<<Y<<endl;
}
};
Point::Point(Point &p){
cout<<"Copy Initializing "<<p.X<<","<<p.Y<<endl;
X=p.X;
Y=p.Y;
}
void display(Point p){
p.Show();
}
void main(void)
{
Point A(24,116);
cout<<"called display(A)"<<endl;
display(A);
cout<<"out…"<<endl;
}
3.
#include <iostream.h>
class Base
{
private:
int x;
public:
Base(int a)
{
cout<<"constructing Base..."<<endl;
x=a;
}
~Base()
{
cout<<"destructing Base..."<<endl;
}
};
class Myclass
{
private:
int n;
public:
Myclass(int num)
{
n=num;
cout<<"constructing Myclass..."<<endl;
}
~Myclass()
{
cout<<"destructing Myclass..."<<endl;
}
};
class Derive:public Base
{
private:
int y;
Myclass bobj;
public:
Derive(int a,int b,int c):bobj(c),Base(a)
{
cout<<"constructing Derive..."<<endl;
y=b;
}
~Derive()
{
cout<<"destructing Derive..."<<endl;
}
};
void main()
{
Derive dobj(1,2,3);
}
三、阅读以下程序并简要叙述其功能(15分,每小题5分)
1.
#include <iostream.h>
void cal(const char *p,int &num);
void main()
{
char str[100];
int m;
cin.getline(str,100);
cal(str,m);
cout<<m<<endl;
}
void cal(const char *p,int &num)
{
num=0;
for(; *p; p++, num++);
}
输入:This is funning
试写出运行结果并说明函数cal( )的功能。
2.试写出下列程序的运行结果及其功能。
#include <iostream.h>
struct student
{
int num;
char name[20];
char sex;
int age;
};
student fun(student *,int);
student stu[3]={{1,"lilin",'M',18},{2,"sunny",'M',24},{3,"zhao",'M',20}};
void main(void)
{
student stud;
stud=fun(stu,3);
cout<<stud.num<<'\t'<<stud.name<<'\t'<<stud.age<<endl;
}
student fun(student *s,int n)
{
int m=0,i=1;
while (i<n)
{
if (s[m].age<s[i].age)
m=i;
i++;
}
return s[m];
}
3. 简述String类中Setc、Getc和Append三个函数的功能。
#include<iostream.h>
#include<string.h>
class String
{
public:
String(){Length=0;Buffer=0;}
String(const char* str);
void Setc(int index,char newchar);
char Getc(int index) ;
int GetLength() {return Length;}
void Print()
{
if(Buffer==0)
cout<<"empty.\n";
else
cout<<Buffer<<endl;
}
void Append(const char* Tail);
~String(){delete[] Buffer;}
private:
int Length;
char* Buffer;
};
String::String(const char*str)
{
Length=strlen(str);
Buffer=new char[Length+1];
strcpy(Buffer,str);
}
void String::Setc(int index,char newchar)
{
if(index>0&&index<=Length)
Buffer[index-1]=newchar;
}
char String::Getc(int index)
{
if(index>0&&index<=Length)
return Buffer[index-1];
else
return 0;
}
void String::Append(const char* Tail)
{
char* temp;
Length+=strlen(Tail);
temp=new char[Length+1];
strcpy(temp,Buffer);
strcat(temp,Tail);
delete[] Buffer;
Buffer=temp;
}
四、阅读以下程序并填空(填上正确的语法成分),使其成为完整的程序(10分,每空2分)
假设原链表的结点是按学号(number)由小到大排列的。在已建立的学生链表中插入一新结点,使插入新结点后的链表仍然保持有序。
struct Student
{
long number;
float score;
Student * next;
};
Student * Insert(Student * head, Student * stud) //插入链表结点
{
if( (1) ) //原链表为空链表
{
head=stud;
stud->next=NULL;
return(head);
}
if( (2) ) //结点的插入位置在链首
{
stud->next=head;
head=stud;
return(head);
}
//查找插入位置
Student * pGuard=head;
while( (3) )
pGuard=pGuard->next;
//插入结点
(4)
(5)
return(head);
}
五、编程题(40%)
1、假设有一个文本文件data.txt中存放了一篇文章,其中有英文字母、数字、汉字及标点符号,请编程统计并输出英文字母的个数及文本的总行数。
2、设计并测试一个反映产品销售情况的类Product。
该类含有三个私有数据成员:产品名称、产品单价、产品剩余量;
四个公有成员函数:构造函数、购买产品(要求对购买数量进行合法性检查,并显示应付款)、显示剩余产品数量、析构函数。
- 选择填空题(20分,每题2分)
(1) D (2) C (3) D (4) B (5) B
(6) A (7) C (8) D (9) C (10) A
二、阅读以下程序,写出其运行结果(15分,每小题5分)
1、
编号:1 姓名:A
编号:2 姓名:B
编号:3 姓名:C
编号:4 姓名:D
编号:5 姓名:E
2、
initializing X=24,Y=116
called display(A)
Copy Initializing 24,116
X=24,Y=116
delete… 24,116
out…
delete… 24,116
3、
constructing Base...
constructing Myclass...
constructing Derive...
destructing Derive...
destructing Myclass...
destructing Base...
三、阅读以下程序并简要叙述其功能(15分,每小题5分)
1、
输出:15
函数cal( )的功能:求指定字符串的长度并通过参数num返回给主调函数。
2、
输出:2 sunny 24
功能:求所有同学中年龄最大的同学。
3、
Setc( ): 将Buffer中第 index 个元素的值用newchar替换
Getc( ): 返回Buffer中第 index个元素的值。
Append( ): 将字符串Tail连接到 Buffer的末尾。
四、阅读以下程序并填空(填上正确的语法成分),使其成为完整的程序(10分,每空2分)
(1) head==NULL
(2) head->number > stud->number
(3) pGuard->next && pGuard->next->number < stud->number
(4) stud->next=pGuard->next;
(5) pGuard->next=stud;
五、编程题(40分,每题20分)
1.
#include <iostream.h>
#include <fstream.h>
#include <string.h>
void main()
{
char str[128];
int countLine=0,countChar=0;
unsigned int i;
ifstream fin("data.txt",ios::nocreate);
if (fin.fail())
{
cerr<<"失败!!!"<<endl;
}
else
{
while(!fin.eof()){
countLine++;
fin.getline(str,sizeof(str));
cout<<"length:"<<strlen(str)<<endl;
for(i=0;i<=strlen(str);i++)
if((str[i]>='a' && str[i]<='z')||(str[i]>='A' && str[i]<='Z'))
countChar++;
}
cout <<"the amount of characters in data.txt is " <<countChar <<endl;
cout <<"the amount of lines in data.txt is " <<countLine <<endl;
}
}
2.
//product.h
class Product
{
private:
char * name;
int price;
int quantity;
public:
Product(char *a,int b,int c);
bool purchase(int amount);
void remain();
~Product();
};
//product.cpp
#include <iostream.h>
#include "Product.h"
Product::Product(char *a,int b,int c)
{
cout<<"Constructing Product..."<<endl;
name=a;
price=b;
quantity=c;
cout<<name<<","<<price<<","<<quantity<<endl;
}
bool Product::purchase(int amount)
{
if(quantity<amount)
{
cout<<"no enough quantity!"<<endl;
return false;
}
else
{
quantity-=amount;
cout<<"payment :"<<amount*price<<endl;
return true;
}
}
void Product::remain()
{
cout<<"The quantity of the remain products is: "<<quantity<<endl;
}
Product::~Product()
{
cout<<"Destructing Product object!"<<endl;
}
//productApp.cpp
#include<iostream.h>
#include"Product.h"
void main()
{
Product p("radio",80,100);
int amount;
cout<<"Please input the quantity :";
cin>>amount;
p.purchase(amount);
p.remain();
}