一、选择题 3. 有如下程序:
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
cout.fill('*');
cout<<left<<setw(4)<<123<<"OK"<<endl;
return 0;
}
执行这个程序的输出结果是______。
A.123*OK B.123*OK** C.*123OK D.*123**OK
A B C D
A
[解析] 此题考查了输出流的格式控制。cout的fill()是设置填充字符;left和endl分别是使输出数据左对齐和换行;setw()函数的作用是设置输入输出的宽度,此设置效果只对以此输入或输出有效。此题中,输出整数123时宽度为4且左对齐,得到“123*”;输出字符串“OK”时宽度没有定义实际大小输出,结果得到OK;故最后得到的输出结果是123*OK。
4. 有如下程序:
#include < iostream >
using namespaee std;
int main()
{
void function( double val) ;
double val;
function(val) ;
cout < < val ;
return 0 ;
}
void function( double val)
val =3;
}
编译运行这个程序将出现的情况是
。
A.编译出错,无法运行 B.输出:3 C.输出:3.0 D.输出一个不确定的数
A B C D
D
[解析] 本题考查函数调用及传值方式传递参数,执行函数function时,并没有将3的值传回来,而val又没有初始化,所以会输出一个不确定的值,D选项正确。
6. 有如下程序:
#include<iostream>
using namespace std;
class Instrument{
public:
virtual void Display()=0;
};
class Piano:public Instrument{
public:
void Display(){/*函数体略*/}
};
int main(){
Instrument s;
Instrument*p=0;
//…;
return 0;
}
下列叙述中正确的是______。
A.语句“Insturment*p=0;”编译时出错 B.语句“Instrument s;”编译时出错 C.类Piano中的Display函数不是虚函数 D.类Instrument是一个虚基类
A B C D
B
[解析] 本题考查纯虚函数和抽象类,纯虚函数是在声明虚函数时被“初始化”为0的函数,包含纯虚函数的类为抽象类,抽象类不能被实例化,所以语句“Instrument s;”在编译时出错。
10. 语句ofstream outf("TEST.DAT",ios_base::app);的功能是建立流对象outf,并试图打开文件TEST.DAT与outf关联,而且
。
A.如果文件存在,打开失败:如果文件不存在,建立一个新文件 B.如果文件存在,将文件指针定位于文件首;如果文件不存在,打开失败 C.如果文件存在,将文件指针定位于文件尾:如果文件不存在,建立一个新文件 D.如果文件存在,将其置为空文件;如果文件不存在,打开失败
A B C D
C
[解析] ofstream outf("TEST.DAT",ios_base::app);是以ios_base::app疗式打开文件,若文件存在,将文件指针定位于文件尾。若文件不存在,建立一个新文件。
14. 有如下程序
#include<iostream>
using namespace std;
int i=1;
class Fun{
public:
static int i;
int value(){return i-1;}
int value()const{return i+1;)
};
int Fun::i=2;
int main(){
int i=3;
Fun fun1;
const Fun fun2;
______
return 0;
}
若程序的输出结果是:
123
则程序中下划线处遗漏的语句是______。
A.cout<<fun1.value()<<Fun::i<<fun2.value(); B.cout<<Fun::i<<fun1.value()<<fun2.value(); C.cout<<fun1.value()<<fun2.value()<<Fun::i; D.cout<<fun2.value()<<Fun::i<<fun1.value();
A B C D
A
[解析] 此题考查的是常成员函数。Const关键字可以用于参与重载函数的区分,此时常对象调用常成员函数,一般对象调用一般成员函数,当类中只有一个常成员函数时,一般对象也可以调用该常成员函数。本题中,通过fun1调用value()函数时,是调用前一个,而通过fun2调用value()函数是调用后一个;另外,value()函数中访问的i是类中定义的数据成员i,全局变量i在类中被“屏蔽”。fun1.value()输出i-1=2-1=1;fun2.value()调用后一个value()函数输出i+1=2+1=3;Fun::i是通过类名直接访问类的静态数据成员i的值,即2;所以正确的输出顺序是A选项。
25. 下面程序的运行结果是______
#include<iostream,h>
void fun(int*a,int*b)
{
int X= *a;
* a= *b; *b=X;
cout<< *a<< *b<<" ";
void main()
int x=1, y=2;
fun(&x,&y);
cout<<X<<y<<end1;
}
A.12 12 B.12 21 C.21 12 D.21 11
A B C D
D
[解析] 本题考查的是指针和引用,函数 fun完成把x和y互换的操作。
27. 有如下程序:
#include<iostream>
using namespace std;
class VAC{
public:
int f()const{return 3;}
int f(){return 5;}
};
int main()
{
VAC v1;
const VAC v2;
cout<<v1.f()<<v2.f();
return 0;
}
执行这个程序的输出结果是______。
A B C D
A
[解析] 本题考查常对象及常成员函数及构造函数,常对象只能调用常成员函数,所以本题中,对象v1为普通对象,执行v1.f()后,会执行默认构造函数,输出5,对象v2为常对象,执行v2.f()后,会执行常构造函数,输出3。
28. 有如下程序:
#include<iostream>
using namespace std;
class Point{
int x,y;
public:
Point(int x1=0,int y1=0):x(x1),y(y1){}
int get(){return x+y;)
};
class Circle{
Point cente;
int radius;
public:
Circle(int cx,int cy,int r):center(cx,cy),radius(r){}
int get(){return center.get()+radius;}
};
int main(){
Circle c(3,4,5);
cout<<c.get()<<endl;
return 0;
}
运行时的输出结果是______。
A B C D
D
[解析] 根据类Point和类Circle的定义可知,类Circle的实例c(3,4,5)的成员函数c.get()返回值为3+4+5=12。
38. 有如下程序段:
int i=1;int j=4;
int main(){
int i=8,j=1;
cout<<i<<j<<endl;
}
运行时的输出结果是______。
A B C D
C
[解析] 全局变量也称为外部变量,是在函数的外部定义的,它的作用域为从变量定义处开始,到本程序文件的末尾。局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内部。在函数中使用全局变量,一般应作全局变量说明,本题中定义了两个全局变量i,j,但main函数中又对i、j进行了定义,所以输出为88,所以答案为C。
二、基本操作题 1. 请使用VC6或使用[答题]菜单打开考生文件夹proj1下的工程proj1,此工程包含一个源程序文件proj1.cpp。文件中将表示数组元素个数的常量Size定义为4,并用int类型对类模板进行了实例化。文件中位于每个注释“//ERROR****found****”之后的一行语句存在错误。请改正这些错误,使程序的输出结果为:
1 2 3 4
注意:模板参数名用T。只修改注释“//ERROR ********found********”的下一行语句,不要改动程序中的其他内容。
//proj1.cpp
#include <iostream>
using namespace std;
//将数组元素个数 Size定义为4
//ERROR ********found********
const int Size;
template <typename T>
class MyClass
{
public:
MyClass(T*p)
{
for(int i=0;i<Size;i++)
array[i]=p[i];
}
void Print();
private:
T array[Size];
};
template <typename T>
void MyClass::Print()
{
for (int i=0;i<Size;i++)
cout<<array[i]<<'\t';
}
int main()
{
int intArray[Size]={1,2,3,4};
//ERROR ********found********
MyClass <double> obj(intArray);
obj.Print();
cout<<endl;
return 0;
}
(1)const int Size=4; (2)void MyClass<T>::Print() (3)MyClass<int>obj(intArray);
[解析] 主要考查的是模板类MyClass,其中涉及构造函数、成员函数和const变量。const变量必须进行初始化,因为const确定了该变量Size不能改变。模板类的成员在定义时要加上模板符号“<T>”,调用时也要注意添加相应的类型。 (1)主要考查考生对const变量的掌握,因为const变量不能修改,所以在定义的同时必须初始化。 (2)主要考查考生对模板类的成员函数定义的掌握,因为MyClass类是模板类,所以在定义该函数时要加上模板标识符“<T>”,即语句void MyClass<T>::Print()。 (3)主要考查考生对模板类构造函数的调用的理解,从上一条语句int intArray[Size]={1,2,3,4};中可以知道intArray为int型,因此定义obj时要使用<int>,即MyClass<int>obj(intArray);。 对于模板类,不论是其成员函数还是构造函数,调用时都要使用标识符“<T>”。
三、简单应用题 1.
考生文件夹 使用VC++2010打开考生文件夹下“proj2”文件夹中的工程proj2.sln。此程序的功能是将out1.txt文件中的内容输出到屏幕与文件中。输出如下:
李一 1.78m 21
王一 1.65m 23
out2.txt文件的内容如下:
李一 1.78m 21
王一 1.65m 23
其中定义的类并不完整,按要求完成下列操作,将类的定义补充完整。
(1)以输入方式打开文件out1.txt,请在注释//********1********后添加适当的语句。
(2)以输出方式打开文件out2.txt,请在注释//********2********后添加适当的语句。
(3)从文件中获得一个字符,判断是否结束,如果结束则退出输出。请在注释//********3********后添加适当的语句。
(4)把获得的字符输出到文件中,请在注释//********4********后添加适当的语句。
注意:仅在函数指定位置添加语句,请勿改动主函数main与其他函数中的任何内容。
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
void main()
{
char ch;
fstream infile, outfile;
//********1********
infile.open ("out1.txt");
if(!infile)
{
cout << "out1.txt文件不能打开"<<endl;
abort();
}
//********2********
outfile.open("out2.txt");
if(!outfile)
{
cout <<"out2.txt文件不能打开" <<endl;
abort();
}
//********3********
while()
{
cout<<ch;
//********4********
}
cout <<endl;
infile.close();
outfile.close();
}
(1)将“infile.open("out1.txt");”补充完整为:infile.open("out1.txt",ios::in); (2)将“outfile.open("out2.txt");”补充完整为: outfile.open("out2.txt",ios::out); (3)将“while()”补充完整为:while (in file. get (ch)) (4)添加语句:outfile<<ch;
[解析] 本题的功能是将out1.txt文件中的内容输出到屏幕与文件中。解题思路为在VC环境下打开程序,根据题干给出的几条功能要求,对程序中给出注释下的内容逐个补全或修改。从已给定源程序的main主函数开始入手,可以看出程序是对文件的操作。 (1)题目1要求“以输入方式打开文件out1.txt”。在C++中调用文件流的成员函数open的格式为,文件流类.open("文件名",ios::in),所以第1个标识下语句就该为“infile.open("out1.txt",ios::in);”。 (2)题目2要求“以输出方式打开文件out2.txt”。同理第2个标识下修改为“outfile.open ("out2.txt",ios::out);”。 (3)题目3要求“从文件中获得一个字符,判断是否结束”。程序中的“while()”循环判断语句中缺少从文件中获得的字符,所以这里补全while循环判断条件,即“while(infile.get(ch))”。 (4)题目4要求“把获得的字符输出到文件中”。在C++中,用流插入运算符为“<<”,所以根据题干中的要求在第四个标识下补全写入文件的流操作语句,即“outfile<<ch;”。
四、综合应用题 1.
考生文件夹 使用VC++2010打开考生文件夹下“proj3”文件夹中的工程proj3.sln。请完成函数fun(char*s),该函数完成以下功能:
(1)把s中的大写字母转换成小写字母,把其中的小写字母转换成大写字母。并且在函数中调用写函数WriteFile()将结果输出到modi2.txt文件中。
例如:s="helloTEST",则结果为:s="HELLOtest"
(2)完成函数WriteFile(char*s),把字符串输入文件中。
提示:打开文件使用的第二参数为ios_base::binary|ios_base::app。
注意:不要改动main()函数,不得增行或删行,也不得更改程序的结构。
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
void WriteFile(char*s)
{
}
void fun(char*s)
{
}
void ClearFile()
{
ofstream out1;
out1.open("modi2.txt");
out1.close();
}
int main()
{
ClearFile();
char s[1024];
cout<<"please input a string:"<<endl;
cin.getline(s,1024);
fun(s);
return 0;
}
(1)void WriteFile(char*s)中的命令语句: ofstream out1; out1.open("modi2.txt",ios_base::binary|ios_base::app); //打开文件modi2 out1<<s; //写入字符串s out1.close(); (2)void fun(char *s)中的命令语句: for(int i=0;s[i]!=0;i++) //循环判断每一个字符 { if(s[i]>='A'&&s[i]<='Z') //如果是大写字符,转换为小写字符 { s[i]=s[i]-'A'+'a'; //'s[i]-'A'+'a'等于字符s[i]+32' } Else if(s[i]>='a'&&s[i]<='z') //如果是小写字符,转换为大写字符 { s[i]=s[i]-'a'+'A'; //'s[i]-'a'+'A''等于字符s[i]-32 } } WriteFile(s);
[解析] (1)本题要求实现两个函数的功能,其中WriteFile(char*s)实现把字符串输入到文件中;fun(char*s)函数实现大写字母转换成小写字母,把其中的小写字母转换成大写字母。其中大小写字母之间的ASCII码差为32。 (2)从已给部分源程序的main主函数开始入手,首先实现WriteFile函数,然后再实现fun函数,并在其中调用WrileFile函数。 (3)在WriteFile(char*s)函数中,利用标准流ofstream实现字符串写入文件modi2.txt。 (4)在fun函数中,利用for循环逐个判断字符是大写还是小写。 (5)如果是大写,那么加上32实现大写转换为小写。否则,就减去32,实现小写到大写的转换。最后调用前面实现的WliteFile函数,将字符串写入文件。