下面是小编收集整理的C++类型笔试题目,本文共11篇,供大家参考借鉴,欢迎大家分享。
篇1:c笔试题目
1.求下面函数的返回值(微软)
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
2. 什么是“引用”?申明和使用“引用”要注意哪些问题?
答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明一个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。不能建立数组的引用。
3. 将“引用”作为函数参数有哪些特点?
(1)传递引用给函数与传递指针的效果是一样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标对象(在主调函数中)的操作。
(2)使用引用传递函数的参数,在内存中并没有产生实参的副本,它是直接对实参操作;而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。
(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。
4. 在什么时候需要使用“常引用”?
如果既要利用引用提高程序的效率,又要保护传递给函数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const 类型标识符 &引用名=目标变量名;
例1
int a ;
const int &ra=a;
ra=1; //错误
a=1; //正确
例2
string foo( );
void bar(string & s);
那么下面的表达式将是非法的:
bar(foo( ));
bar(“hello world”);
原因在于foo( )和“hello world”串都会产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此上面的表达式就是试图将一个const类型的对象转换为非const类型,这是非法的。
引用型参数应该在能被定义为const的情况下,尽量定义为const 。
篇2:c笔试题目
1. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc)其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。
答案:
char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) != ‘/0’)
return tempptr ;
}
2. 已知String类定义如下:
class String
{
public:
String(const char *str = NULL); // 通用构造函数
String(const String &another); // 拷贝构造函数
~ String; // 析构函数
String & operater =(const String &rhs); // 赋值函数
private:
char *m_data; // 用于保存字符串
};
尝试写出类的成员函数实现。
答案:
String::String(const char *str)
{
if ( str == NULL ) //strlen在参数为NULL时会抛异常才会有这步判断
{
m_data = new char[1] ;
m_data[0] = '/0' ;
}
else
{
m_data = new char[strlen(str) + 1];
strcpy(m_data,str);
}
}
String::String(const String &another)
{
m_data = new char[strlen(another.m_data) + 1];
strcpy(m_data,other.m_data);
}
String& String::operator =(const String &rhs)
{
if ( this == &rhs)
return *this ;
delete m_data; //删除原来的数据,新开一块内存
m_data = new char[strlen(rhs.m_data) + 1];
strcpy(m_data,rhs.m_data);
return *this ;
}
String::~String
{
delete m_data ;
}
3. .h头文件中的ifndef/define/endif 的作用?
答:防止该头文件被重复引用。
4. #i nclude 与 #i nclude “file.h”的区别?
答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。
5.在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
通常,在模块的头文件中对本模块提供给其它模块引用的函数和全局变量以关键字extern声明。例如,如果模块B欲引用该模块A中定义的全局变量和函数时只需包含模块A的头文件即可。这样,模块B中调用模块A中的函数时,在编译阶段,模块B虽然找不到该函数,但是并不会报错;它会在连接阶段中从模块A编译生成的目标代码中找到此函数
extern “C”是连接申明(linkage declaration),被extern “C”修饰的变量和函数是按照C语言方式编译和连接的,来看看C++中对类似C的函数是怎样编译的:
作为一种面向对象的语言,C++支持函数重载,而过程式语言C则不支持。函数被C++编译后在符号库中的名字与C语言的不同。例如,假设某个函数的原型为:
void foo( int x, int y );
该函数被C编译器编译后在符号库中的名字为_foo,而C++编译器则会产生像_foo_int_int之类的名字(不同的编译器可能生成的名字不同,但是都采用了相同的机制,生成的新名字称为“mangled name”)。
_foo_int_int 这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的。例如,在C++中,函数void foo( int x, int y )与void foo( int x, float y )编译生成的符号是不相同的,后者为_foo_int_float。
同样地,C++中的变量除支持局部变量外,还支持类成员变量和全局变量。用户所编写程序的类成员变量可能与全局变量同名,我们以“.”来区分。而本质上,编译器在进行编译时,与函数的处理相似,也为类中的变量取了一个独一无二的名字,这个名字与用户程序中同名的全局变量名字不同。
未加extern “C”声明时的连接方式
假设在C++中,模块A的头文件如下:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
int foo( int x, int y );
#endif
在模块B中引用该函数:
// 模块B实现文件 moduleB.cpp
#i nclude “moduleA.h”
foo(2,3);
实际上,在连接阶段,连接器会从模块A生成的目标文件moduleA.obj中寻找_foo_int_int这样的符号!
加extern “C”声明后的编译和连接方式
加extern “C”声明后,模块A的头文件变为:
// 模块A头文件 moduleA.h
#ifndef MODULE_A_H
#define MODULE_A_H
extern “C” int foo( int x, int y );
#endif
在模块B的实现文件中仍然调用foo( 2,3 ),其结果是:
(1)模块A编译生成foo的目标代码时,没有对其名字进行特殊处理,采用了C语言的方式;
(2)连接器在为模块B的目标代码寻找foo(2,3)调用时,寻找的是未经修改的符号名_foo。
如果在模块A中函数声明了foo为extern “C”类型,而模块B中包含的是extern int foo( int x, int y ) ,则模块B找不到模块A中的函数;反之亦然。
所以,可以用一句话概括extern “C”这个声明的真实目的(任何语言中的任何语法特性的诞生都不是随意而为的,来源于真实世界的需求驱动。我们在思考问题时,不能只停留在这个语言是怎么做的,还要问一问它为什么要这么做,动机是什么,这样我们可以更深入地理解许多问题):实现C++与C及其它语言的混合编程。
明白了C++中extern “C”的设立动机,我们下面来具体分析extern “C”通常的使用技巧:
extern “C”的惯用法
(1)在C++中引用C语言中的函数和变量,在包含C语言头文件(假设为cExample.h)时,需进行下列处理:
extern “C”
{
#i nclude “cExample.h”
}
而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern “C”声明,在.c文件中包含了extern “C”时会出现编译语法错误。
C++引用C函数例子工程中包含的三个文件的源代码如下:
/* c语言头文件:cExample.h */
#ifndef C_EXAMPLE_H
#define C_EXAMPLE_H
extern int add(int x,int y);
#endif
/* c语言实现文件:cExample.c */
#i nclude “cExample.h”
int add( int x, int y )
{
return x + y;
}
// c++实现文件,调用add:cppFile.cpp
extern “C”
{
#i nclude “cExample.h”
}
int main(int argc, char* argv)
{
add(2,3);
return 0;
}
如果C++调用一个C语言编写的.DLL时,当包括.DLL的头文件或声明接口函数时,应加extern “C” { }。
(2)在C中引用C++语言中的函数和变量时,C++的头文件需添加extern “C”,但是在C语言中不能直接引用声明了extern “C”的该头文件,应该仅将C文件中将C++中定义的extern “C”函数声明为extern类型。
C引用C++函数例子工程中包含的三个文件的源代码如下:
//C++头文件 cppExample.h
#ifndef CPP_EXAMPLE_H
#define CPP_EXAMPLE_H
extern “C” int add( int x, int y );
#endif
//C++实现文件 cppExample.cpp
#i nclude “cppExample.h”
int add( int x, int y )
{
return x + y;
}
/* C实现文件 cFile.c
/* 这样会编译出错:#i nclude “cExample.h” */
extern int add( int x, int y );
int main( int argc, char* argv )
{
add( 2, 3 );
return 0;
}
篇3:c笔试题目
1. 将“引用”作为函数返回值类型的格式、好处和需要遵守的规则?
格式:类型标识符 &函数名(形参列表及类型说明){ //函数体 }
好处:在内存中不产生被返回值的副本;(注意:正是因为这点原因,所以返回一个局部变量的引用是不可取的。因为随着该局部变量生存期的结束,相应的引用也会失效,产生runtime error!
注意事项:
(1)不能返回局部变量的引用。这条可以参照Effective C++[1]的Item 31。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了“无所指”的引用,程序会进入未知状态。
(2)不能返回函数内部new分配的内存的引用。这条可以参照Effective C++[1]的Item 31。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。
(3)可以返回类成员的引用,但最好是const。这条原则可以参照Effective C++[1]的Item 30。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
(4)流操作符重载返回值申明为“引用”的作用:
流操作符<<和>>,这两个操作符常常希望被连续使用,例如:cout << “hello” << endl; 因此这两个操作符的返回值应该是一个仍然支持这两个操作符的流引用。可选的其它方案包括:返回一个流对象和返回一个流对象指针。但是对于返回一个流对象,程序必须重新(拷贝)构造一个新的流对象,也就是说,连续的两个<<操作符实际上是针对不同对象的!这无法让人接受。对于返回一个流指针则不能连续使用<<操作符。因此,返回一个流对象引用是惟一选择。这个唯一选择很关键,它说明了引用的重要性以及无可替代性,也许这就是C++语言中引入引用这个概念的原因吧。赋值操作符=。这个操作符象流操作符一样,是可以连续使用的,例如:x = j = 10;或者(x=10)=100;赋值操作符的返回值必须是一个左值,以便可以被继续赋值。因此引用成了这个操作符的惟一返回值选择。
例3
#i nclude
int &put(int n);
int vals[10];
int error=-1;
void main
{
put(0)=10; //以put(0)函数值作为左值,等价于vals[0]=10;
put(9)=20; //以put(9)函数值作为左值,等价于vals[9]=20;
cout<
cout<
}
int &put(int n)
{
if (n>=0 && n<=9 ) return vals[n];
else { cout<<“subscript error”; return error; }
}
(5)在另外的一些操作符中,却千万不能返回引用:+-*/ 四则运算符。它们不能返回引用,Effective C++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有side effect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b) == (c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。
2. “引用”与多态的关系?
引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。
例4
Class A; Class B : Class A{...}; B b; A& ref = b;
3. “引用”与指针的区别是什么?
指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。此外,就是上面提到的对函数传ref和pointer的区别。
4. 什么时候需要“引用”?
流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。
以上 2-8 参考:
5. 结构与联合有和区别?
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。
2. 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。
6. 下面关于“联合”的题目的输出?
a)
#i nclude
union
{
int i;
char x[2];
}a;
void main
{
a.x[0] = 10;
a.x[1] = 1;
printf(“%d”,a.i);
}
答案:266 (低位低地址,高位高地址,内存占用情况是Ox010A)
b)
main
{
union{ /*定义一个联合*/
int i;
struct{ /*在联合中定义一个结构*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*联合成员赋值*/
printf(“%c%c/n”, number.half.first, mumber.half.second);
number.half.first='a'; /*联合中结构成员赋值*/
number.half.second='b';
printf(“%x/n”, number.i);
getch;
}
答案: AB (0x41对应'A',是低位;Ox42对应'B',是高位)
6261 (number.i和number.half共用一块地址空间)
篇4:c软件开发笔试题目
1、(4分)用变量a给出下面的定义
a) 一个整型数;
b)一个指向整型数的指针;
c)一个指向指针的指针,它指向的指针是指向一个整型数;
d)一个有10个整型的数组;
e)一个有10个指针的数组,该指针是指向一个整型数;
f)一个指向有10个整型数数组的指针;
g)一个指向函数的指针,该函数有一个整型参数并返回一个整型数;
h)一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
答案:
a)int a
b)int *a;
c)int a;
d)int a[10];
e)int *a [10];
f) int (*a)[10]
g)int (*a)(int)
h) int( *a[10])(int)
2、(4分)请写出以下语句的输出结果:
Int i=43;
Int j=5;
Double f=25.45181;
a) printf(“i=%d,j=%d,f=%3.2f”,i,j,f);
b) printf(“i=%x,j=%06d,i/j=%d”,i,j,i/j);
答案:
A)i=43,j=5,f=25.45
(说明:本来应该输出最小3位有效数字,25.5,但是由于限定了2位小数,所以强制有2位小数,有效数字的个数就起不到强制作用了。如果是%3.1,则输出为25.5)
B)i=2B ,j=000005,i/j=8
(%x显示的是一个无符号的0x 16进制的整数,%06d输出的是6位数,不够6位数,前面补0,i/j两个整数相除,只取商的整数值)
3、(2分)请完成以下宏定义:
a)用预处理指令#define 声明一个常数,用以表明1年中有多少个秒(忽略闰年问题) b)写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个
答案:
a)#define SECONDS (365*24*60*60)UL
b) #define MIN(a,b) ((A)<(B)?(A):(B))
扩展:MAX宏 #define MAX ((A)>(B)?(A):(B))
ABS宏 #define ABS (((X)>0)?(X):(-(X)))
4、(6分)以下为32为windows下的c++程序,请计算:
a)
char str=”hello”;
char *p=str;
请计算:
sizeof(str)=6
sizeof(p)=4
strlen(p)=5
答案:6,字符串数组以\\0(空格为结尾,所以str数组空间大小为5+1)
4,计算的是指针的长度。
5,strlen函数区的字符指针str的长度,不包括空字符。
b)
void func(char str[100])
{
Void *p=malloc(100);
}
请计算:
sizeof(str)=100,:表示在内存中预分配的内存大小。
sizeof (p)=4
c)
int a[3]={1,2,3};
int b=sizeof(a)/sizeof(a[0]); sizeof(a)求的是数组的大小。
请计算:
b=3,对的。
5、(2分) 设有定义:int n=0,*p=&n,q=&p; 则以下选项中,正确的赋值语句是(d) a)p=1; b)*q=2; c)q=p; d)*p=5;
(c)改成q=&p; 才对。
6、(2分)const关键字的用途?(至少说明两种)
答案:
(1)可以定义 const 常量
(2)const 可以修饰函数的参数、返回值,甚至函数的定义体。被const 修饰的东 西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
(3)const可以用来修饰指针变量,控制指针变量的存取规则。
篇5:c软件开发笔试题目
1、(2分)typedef的c语言中频繁用以声明一个已经存在的数据类型的同义词。也可以用以预处理器做类似的事情。例如:
#define dps struct s*
Typedef struct s * tps;
以上两种情况的意图都是要定义dps和tps作为一个指向结构s指针。哪种方法更好一些呢?(如果有的话)为什么? 考虑安全性还是用typedef好,宏定义在编译时是不检查的,只是简单替换,而typedef编译时要检查的 typedef,而且typedef,define并非等价,如#define string1 char *
typedef char *string2;第二种才能达到预想效果, string1 a,b;
得到的b是char
define是做替换的,typedef 则是重新定义一种数据类型的。可以向int型一样使用的。
#define FIND(struct,e) (size_t) &(((struct*)0)->e)
typedef是语句( 以';'结尾)
Typedef。它在自己的作用域内给一个已经存在的类型一个别名
2、(8分) 以下是一组有关内存知识的问题,请仔细看题,回答:
Void GetMemory(char *p)
{
P=(char *)malloc(100);
}
Void Test(void)
{
Char *str=Null;
GetMemory(str);
Strcpy(str,”hello world”);
Printf(str);
}
请问运行Test函数会有什么样的结果?
a)__________程序崩溃,运行时错误___________________________
char *GetMemory(void)
{
Char p=”hello world”);
Return p;
}
Void Test(void)
{
Char *str=NULL;
Str=GetMemory;
Printf(str);
}
请问运行Test函数会有什么结果?
b)_______________ hello world ________________________________
void GetMemory2(char p,int num)
{
*p=(char *)malloc(num);
}
Void Test(void)
{
Char *str=NULL;
GetMemory(&str,100);
Strcpy(str,”hello”);
Printf(str);
}
请问运行Test函数会有什么结果?
c)_______ hello __________________________________________
void Test(void)
{
Char *str=(char *)malloc(100);
Strcpy(str,”hello”);
Free(str);
If(str!=NULL)
{
Strcpy(str,”world”);
Printf(str);
}
}、
请问运行test函数会有什么样的结果?
d)_______程序崩溃:因为释放str指针后,没有将指针置为null,所以指针变为野指针了。再执行cpy时会因为找不到指针的指向而导致程序崩溃,请编程时,注意这一点。 __________________________________________
3、(6分)请写出以下程序的输出结果:
Class A
{
Public:
A
{ Printf(“A constructed.\\n”);}
Virtual ~A
{printf(“A deconstructed.\\n”);}
Virtual void Fn
{printf(“A fn called.\\n”);} };
Class B:public A
{
Public:
B
{printf(“B constructed.\\n”);} Virtual ~B
{printf(“B deconstructed.\\n”);} Virtual void Fn
{printf(“B fn called.\\n”);} };
Class C:public B
{
Public:
C
{printf(“C constructed.\\n”);} Virtual ~C
{printf(“C deconstructed.\\n”);} Virtual void Fn
{printf(“C fn called.\\n”);} };
Void main(int argc,char* grgv) {
A *pA=new B;
If(pA!=NULL)
pA->fn;
B *pB=static_cast(pA);
If(pB!=NULL)
pB->fn;
C * pC=static_cast(pA); If(pC!=NULL)
pC->fn;
delete pA;
}
Answer:
A constructed
B constructed
B fn called
B fn called
B fn called
B deconstructed
A deconstructed
篇6:c软件开发笔试题目
1.(2分)以下说法错误的是:
A)指针和引用作为函数参数都可以改变实参
B)指针和引用都可以在定义后任意的改变指向,引用是不可以改变的。
C)引用必须在创建的时候初始化,而指针则不需要
D)不能空引用,但是可以有空指针
2、(2分) 运算符的重载形式有两种,重载为_重载为类的内部成员函数____________和_重载为类的友元函数______________________
3、(2分) main主函数执行完毕后,是否可能会再执行一段代码?请说明理由? 可以使用注册函数让程序在推出main之后,程序终止之前执行自定义的一些代码!
全局对象的构造函数会在main 函数之前执行
利用atexit函数可以在程序终止前完成一些“清理”工作——如果将指向一组函数的指针传递给atexit函数,那么在程序退出main函数后(此时程序还未终止)就能自动调用这组函数。在使用atexit函数时你要注意这样两点:
main 之前:预编译 全局变量的初始化等
main 之后:全局变量的释放
main函数执行之前,主要就是初始化系统相关资源
mainCRTStartup中被调用的
在main之前会调用一系列初始化函数来初始化这个进程
而在main之后会调用exit(int)来进行进程的清理工作。可以用_onexit 注册一个函数
,可以用_onexit 注册一个函数,它会在main 之后执行int fn1(void), fn2(void), fn3(void), fn4 (void);
可能会执行一些注册过的Hook
注意,atexit以栈的方式注册函数,后注册的函数会先执行。
_onexit和atexit一样是以占的方式注册函数的,后注册的函数会被先执行。
void main( void )
篇7:C++类型笔试题目
C++类型笔试题目
普天C++笔试题
1.实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数,
2.写一个函数,将其中的 都转换成4个空格。
3.Windows程序的入口是哪里?写出Windows消息机制的流程。
4.如何定义和实现一个类的成员函数为回调函数?
5.C++里面是不是所有的动作都是main引起的`?如果不是,请举例。
6.C++里面如何声明const void f(void)函数为C程序中的库函数?
7.下列哪两个是等同的
int b;
A const int* a = &b;
B const* int a = &b;
C const int* const a = &b;
D int const* const a = &b;
8.内联函数在编译时是否做参数类型检查?
void g(base & b){
b.play;
}
void main(){
son s;
g(s);
return;
}
篇8:c语言笔试题目及答案
C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。下面是c语言笔试题目及答案,请参考。
c语言笔试题目及答案
一、选择题((1)~(10)每小题2分,(11)~(50)每小题1分,共60分)
下列各题A)、B)、C)、D)四个选项中,只有一个选项是正确的,请将正确的选
项涂写在答题卡相应位置上,答在试卷上不得分。
(1)数据的存储结构是指________。
A)存储在外存中的数据 B)数据所占的存储空间量
C)数据在计算机中的顺序存储方式 D)数据的逻辑结构在计算机中的表示
答案:D
评析:数据的逻辑结构在计算机存储空间中的存放形式形式称为数据的存储结构(也称数据的物理结构)。
(2)下列关于栈的描述中错误的是________。
A)栈是先进后出的线性表
B)栈只能顺序存储
C)栈具有记忆作用
D)对栈的插入与删除操作中,不需要改变栈底指针
答案:B
评析:栈是一种特殊的线性表,又称先进后出表(FILO―First In Last Out)。
(3)对于长度为n的线性表,在最坏情况下,下列各排序法所对应的比较次数中正确的是
________。
A)冒泡排序为n2 B)冒泡排序为n
C)快速排序为n D)快速排序为n(n一1)/2
答案:D
评析:假设线性表的长度为n,则在最坏情况下,冒泡排序需要经过n/2遍的从前往后扫描和n/2遍的从后往前扫描,需要比较次数为n(n-1)/2。快速排序法的最坏情况比较次数也是n(n-1)/2。
(4)对长度为n的线性表进行顺序查找,在最坏情况下所需要的比较次数为________。
A)log2n B)n/2 C)n D)n+l
答案:C
评析:顺序查找过程中,如果被查找的元素是线性表中的最后一个元素,或者元素不在线性表中,则需要与线性表中所有的元素进行比较。对长度为n的线性表进行顺序查找,在最坏情况下需要比较n次。
(5)下列对于线性链表的描述中正确的是________。
A)存储空间不一定是连续,且各元素的存储顺序是任意的
B)存储空间不一定是连续,且前件元素一定存储在后件元素的前面
C)存储空间必须连续,且前件元素一定存储在后件元素的前面
D)存储空间必须连续,且各元素的存储顺序是任意的
答案:A
评析:在链式存储结构中,存储数据结构的存储空间可以不连续,各数据结点的存储顺序与数据元素之间的逻辑关系可以不一致,而数据元素之间的逻辑关系是由指针域来确定的。
(6)下列对于软件测试的描述中正确的是________。
A)软件测试的目的是证明程序是否正确
B)软件测试的目的是使程序运行结果正确
C)软件测试的目的是尽可能多地发现程序中的错误
D)软件测试的目的是使程序符合结构化原则
答案:C
评析:关于软件测试的目的,Grenford J.Myers再《The Art of Software Testing》一书中给出了深刻的阐述,整体来说,软件测试的目的就是尽可能多地发现程序中的错误。
(7)为了使模块尽可能独立,要求________。
A)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量强
B)模块的内聚程度要尽量高,且各模块间的耦合程度要尽量弱
C)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量弱
D)模块的内聚程度要尽量低,且各模块间的耦合程度要尽量强
答案:B
评析:模块独立性是指每个模块只完成系统要求的独立的子功能,并且与其他模块的联系最少且接口简单。软件设计,应尽量做到高内聚,低耦合,有利于提高模块的独立性。
(8)下列描述中正确的是________。
A)程序就是软件
B)软件开发不受计算机系统的限制
C)软件既是逻辑实体,又是物理实体
D)软件是程序、数据与相关文档的集合
答案:D
评析:计算机软件是计算机系统中与硬件相互依存的另一部分,是包括程序、数据及相关文档的完整集合。
(9)数据独立性是数据库技术的重要特点之一,所谓数据独立性是指________。
A)数据与程序独立存放
B)不同的数据被存放在不同的文件中
C)不同的数据只能被对应的应用程序所使用
D)以上三种说法都不对
答案:D
评析:数据独立性是数据与程序间的互不依赖性,即数据库中数据独立于应用程序而不依赖于应用程序。也就是说,数据的逻辑结构、存储结构与存取方式的改变不会影响应用程序。选项A、B、C三种说法都是错误的。
(10)用树形结构表示实体之间联系的模型是________。
A)关系模型 B)网状模型 C)层次模型 D)以上三个都是
答案:C
评析:层次模型是最早发展起来的数据库模型,它的基本结构是树形结构。
(11)算法具有五个特性,以下选项中不属于算法特性的是________。
A)有穷性 B)简洁性 C)可行性 D)确定性
答案:B
评析:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性是算法的基本特性。
(12)以下选项中可作为C语言合法常量的是________。
A)-80. B)-080 C)-8e1.0 D)-80.0e
答案:A
评析:c语言的常量分为整型常量、实型常量和字符型常量。选项A属于实型常量中的十进制小数形式的表示法,是合法的。
(13)以下叙述中正确的是________。
A)用C程序实现的算法必须要有输入和输出操作
B)用C程序实现的算法可以没有输出但必须要输入
C)用C程序实现的算法可以没有输入但必须要有输出
D)用C程序实现的算法可以既没有输入也没有输出
答案:C
评析:算法的特性中包括“有零个或多个输入”及“有一个或多个输出”这两个特性。一个算法得到的结果就是算法的输出,没有输出的算法是没有意义的,所以一个算法必须至少有一个输出。
(14)以下不能定义为用户标识符的是________。
A)Main B)_0 C)_int D)sizeof
答案:D
评析:C语言规定标识符只能由字母、数字和下划线三种符号组成,而且第一个字符必须是字母或下划线。注意:大写字母和小写字母被认为是两个不同的字符。A中Main与主i函数名main不同。
(15)以下选项中不能作为合法常量的是________。
A)1.234e04 B)1.234e0.4 C)1.234e+4 D)1.234e0
答案:B
评析:指数形式的实型常量要求字每e(或E)之前必需有数字,且e后面的指数必须为整数,所以本题中选项B非法。
(16)数字字符0的ASCII值为48,若有以下程序
main()
{char a=”1″,b=”2″;
printf(“%c,”,b++);
printf(“%d ”,b-a);
)
程序运行后的输出结果是________。
A) 3,2 B)50,2 C)2,2 D)2,50
答案:C
评析l执行语句“printf(“%c,ll,b++);”后,b的值变成字符3,执行“printf(“%d ”,b-a);”,即‘3’-‘1’。
(17)有以下程序
main( )
{
int m=12, n=34;
printf(“%d%d”,m++,++n);
printf(“%d%d ”,n++,++m);
}
程序运行后的输出结果是________。
A)12353514 B)12353513 C)12343514 D)12343513
答案:A
评析:执行“printf(“%d%d”m++,++n);”后,输出的是m和n+l的值1235,接着执行
“printf(“%d%d\n”,n++,++m);”输出n和m+l的值3514。
(18)有定义语句:int b;char c[10】;,则正确的输入语句是________。
A) scanf(“%d%s”,&b,&C); B) scanf(“%d%s”,&b,C);
C) scanf(“%d%s”,b,C); D) scanf(“%d%s”,b,&C);
答案:B
评析:scanf函数中的“格式控制”后面应当是地址,而不是变量名。对于变量,通过地址运算符“&”求出内存中的地址;对于数组c[10],数组名c即为数组在内存中的地址。
(19)有以下程序
main()
{int m,n,p;
scanf(“m=%dn=%dp=%d”,&m,&n,&p);
printf(“%d%d%d\n”,m,n,p);
}
若想从键盘上输入数据,使变量m中的值为123,n中的值为456,p中的值为789,
则正确的输入是________。
A) m。123n=456p=789 B) m=123 n=456 p=789
C) m=123,n=456,p=789 D) 123 456 789
答案:A
评析:根据本题的数据输入形式“scanf(“m=%dn=%dp=%d”&m,&n,&p);”说明在输入数据时,必须输入“m=”、“n=”、“p=”字符,且中间不能含有空格。
(20)有以下程序
main()
{ int a,b,d=25;
a=d/10%9;
b=a&&(-1);
printf(”%d,%d\n”,a,b);
}
程序运行后的输出结果是________。
A)6,l B)2,l C)6,0 D)2,0
答案:B
评析:本题中“a=d/10%9;”的值为25/10%9=2; “b=a&&(-1);”为2&&(-1)=1(注意:-1表示真,只有O才表示假),所以a,b的值分别为2,1。
(21)有以下程序
main()
{
int i=1 j=2,k=3;
if(i++==1&&(++j==3||k++==3))
printf(“%d%d%d\n”,i,j,k);
}
程序运行后的输出结果是________。
A)l 2 3 B)2 34 C) 2 2 3. D)2 3 3
答案:D
评析:执行“i++==1&&(++j==3‖k++==3)”时,表达式“i++==1”嗨值为真,其值为1,表达式“++j=3”的值为真,根据短路原理,右边的表达式“k++==3”不再进行运算。括号中表达的值为l,作与运算后整个表达式的值也为l,输出i.j,k时,由于未执行过k,所以它们的值分别为2,3,3。
(22)若整型变量a、b、c、d中的值依次为:1、4、3、2。则条件表达式a
A)l B)2 C)3 D)4
答案:A
评析:条件表达式的一般形式为:表达式17表达式2:表达式3
本题先求的是a
(23)有以下程序
main( )
{
int p[8]={11,12,13,14,15,16,17,18},i=O,j=0;
while(i++<7)if p[i]%2)j+-=p[i];
printf(“%d\n”,j);
}
程序运行后的输出结果是________。
A)42 B)45 C)56 D)60
答案:B
评析:本程序的作用是求除p[O]外的其它奇数的和。
(24)有以下程序
main()
{
char a[7]= “a0\OaO\0”; int i,j;
i=sizeof(a);j=strlen(a);
printf(“%d%d\n”,i,j);
)
程序运行后的输出结果是________。
A)2 2 B)76 C)7 2 D)6 2
答案:C
评析:c语言中以‘\0’作为字符串的结束符,且strlen()函数计算的是‘\0’字符前的所有字符的个数。数组定义以后系统就为其分配相应大小的内存空间,而不论其中有没有内容。
(25)以下能正确定义一维数组的选项是________。
A)int a[5]={0,1,2,3,4,5; B)char a[]={0,1,2,3,4,5};
C)char a={’A’,’B’,’C’}; D)int a[5]=”0123″;
答案:B
评析:选项A中定义的是5个数组元素,但赋值的时候赋的是6个元素,所以出错;选项c不符合数组定义形式,数组名后应加上“[]”;选项D的类型说明符错误,如果用char定义就对了;选项B中的0,1,2,3,4,5分别表示对应字符的ASCII码,所以选项B是正确的。
(26)有以下程序
int fl(int x,int y){return x>y?x:y;}
int f2(int x,int y){return x>y?y:x;}
main()
{
int a=4,b=3,c=5,d=2,e,f,g;
e=f2(f1(a,b),f1(c,d));f=fl(f2(a,b),f2(c,d));
g=a+b+c+d-e-f;
printf(“%d,%d,%d\n”,e,f,g);
)
程序运行后的输出结果是________。
A)4,3,7 B)3,4,7 C)5,2,7 D)2,5,7
答案:A
评析:函数n的功能是返回两个数中比较大的值,f2的功能是返回两个数中比较小的值。
(27)已有定义:char a[]=”xyz”,b[]={’x’,’y’,’z};,以下叙述中正确的是________。
A)数组a和b的长度相同 B)a数组长度小于b数组长度
C)a数组长度大于b数组长度 D)上述说法都不对
答案:C
评析:c语言规定‘\0’为字符串结束标志。所以“char a[]=“xyz””的数组长度为4,而“b[]={‘x’,‘y’,‘z’};”的数组长度为3,数组长度与strlen函数所求的长度不同,本题是指数组占内存空间的大小。
(28)有以下程序
Void f(int *x, int *y)
{
int t;
t= *x; *x=*y;’*y=t;
)
main( )
{
int a[8]={1,2,3,4,5,6,7,8},i,*p,*q;
p=a;q=&a[7];
while(p {f(p,q); p++; qC;} 。 for(i=0;i<3;i++) printf(“%d”,a[1][i]); } 程序运行后的输出结果是________。 A)8,2,3,4,5,6,7,1, B)5,6,7,8,1,2,3,4. C)1,2,3,4,5,6,7,8, D)8,7,6,5,4,3,2,l, 答案:D 评析;本程序中函数f的作用是交换指针变量x和y所指向的存储单元的值。 (29)有以下程序 main() { im a[3][3],*p,i; p=&a[0][o]; for(i=0;j<9;i++) p[i]=I; for(i=0;j<3;i++)printf(“%d”,a[1][i]); ) 程序运行后的输出结果是________。 A)012 B)123 C)234 D)345 答案:D 评析:本题赋值后,a的数组元素的值分别为a[01[0]=0,a[0][1]=1,a[0][2]=2,a[1][0]=3,a[1][1]=4,a[1][2]=5,a[2][0]=6,a[2][1]=7,a[2][2]=8,故本题输出的值为345。 (30)以下叙述中错误的是________。 A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B)数组名代表的是数组所占存储区的首地址,其值不可改变 C)当程序执行中,数组元素的下标超出所定义的下标范围时,系统将给出“下标越 界”的出错信息 D)可以通过赋初值的方式确定数组元素的个数 答案:C 评析:在c语言中,如果出现下标越界的情况,系统不管在编译还是执行时都不会给出“下标越界”的错误提示。 (31)有以下程序 #define N20 fun(int a[],int n,int m) { int i,j; for(i=m;i>=n;iC)a[i+1]=a[i]; } main() { int i,a[N]={1,2,3,4,5,6,7,8,9,10}; fun(a,2,9); for(i=O;i<5;i++) printf(“%d”,a[i]); } 程序运行后的输出结果是________。 A)10234 B)12344 C)12334 D)12234 答案:C 评析:本题函数fun的作用是将指定的数组元素(从下标n到下标m)向后移一位。由函数调用“fun(a,2,9);”可知,函数fun用于将a[2]到a[9]的各元素依次向后移一位,移完后,a数组中各元素的值分别为1,2,3,3,4,5,6,7,8,9,10,故输出的前5个数组元素为12334。 (32)有以下程序 main() { int a[3][2]={0},(*ptr)[2],i,j; for(i=0;i<2;i++) {ptr=a+i; scanf(“%d”,ptr); ptr++;} for(i=0;i<3;i++) { for(i=0;j<2;j++) printf(“%2d”,a[i][j]); printf(“\n”); } } 若运行时输入:1 2 3<回车>,则输出结果是________。 A)产生错误信息 B)l0 C)l 2 D)l 0 2 O 3 0 2 0 0 0 0 O 3 0 答案:B 评析:二维数组a,通过a[3][2]={0}将数组中的各个元素初始化为0,指针变量ptr,指向包含2个元素的一维数组。a[0][0]:l,a[1][0]=2,故本题的输出选B。 (33)有以下程序 prt(int *m, int n) { int i; for(i=O;i ) main() { int a[]={ 1,2,3,4,5 },i; prt(a,5); for(i=O;i<5;i++) printf(“%d,”,a[i]); 程序运行后的输出结果是________。 A)l,2,3,4,5, B)2,3,4,5,6, C)3,4,5,6,7, D)2,3,4,5,1, 答案:B 评析:用数组名作函数实参时,不是把数组的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共同占用同一段内存单元。 (34)有以下程序 main() { int a[]={1,2,3,4,5,6,7,8,9,0},*p; for(p=a;p } 程序运行后的输出结果是________。 A)l,2,3,4,5,6,7,8,9,0, B)2,3,4,5,6,7,8,9,10,1, C)0,1,2,3,4,5,6,7,8,9, D)l,l,1,l,l,l,l,l,l,l, 答案:A 评析:c语言规定数组变量名代表数组的首地址,即第0号元素的地址。本题将a数组中的值全部输出,即为l,2,3,4,5,6,7,8,9,0,。 (35)有以下程序 #define P 3 void F(int x){return(P*x*x);} main() {printf(“%d\n”,F(3+5));} 程序运行后的输出结果是________。 A)192 B)29 C)25 D)编译出错 答案:D 评析:return语句用于从被调函数带回一个函数值。void关键字表示“无类型”,即不需要从被调函数中带回函数值,所以不需要return语句,故编译时出错。 (36)有以下程序 main() {int c=35;printf(“%d\n”,c&C);} 程序运行后的输出结果是________。 A)0 B)70 C)35 D)1 答案:C 评析:按位“与”时,1&1=1,其他都等O。因为本题中相与的两个值相等,即对应位上的二进制值相等,所以“与”的结果也即为其值本身。 (37)以下叙述中正确的是________。 A)预处理命令行必须位于源文件的开头 B)在源文件的一行上可以有多条预处理命令 C)宏名必须用大写字母表示 D)宏替换不占用程序的运行时间 答案:D 评析:通常,预处理命令位于源文件的开头,也可以写在函数与函数之间;不能在一行上写多条预处理命令:宏名一般习惯用大写字母表示,以便与变量名相区别,但这并非规定,也可用小写字母。 (38)若有以下说明和定义 union dt {int a;har b;ouble c;}data; 以下叙述中错误的是________。 A)data的每个成员起始地址都相同 B)变量data所占的内存字节数与成员c所占字节数相等 C)程序段:data.a=5;pintf(“%f ”,data.C);输出结果为5.000000 D)data可以作为函数的实参 答案:C 评析:union是表示共用体的关键字,成员a,b,c共占用同一个内存空间,data的每个成员起始地址都相同;共用体变量所占的内存长度等于最长的成员的长度,故变量’data所占的内存字节数与成员c所占字节数相等;执行“data.a=5;printf(“%f ”,data.C);”printf函数只是将内存中的数据以不同的类型输出,而不能将内存中的整型数据自动转换为等值的浮点数,故C是错误的。 (39)以下语句或语句组中,能正确进行字符串赋值的是________。 A)char*sp;*sp=”right!”; B)char s[lO];s=”right! “; C)char s[10];*s=”right! “; D)char*sp=”right! “; 答案:D 评析:选项A定义了字符型的指针变量sp,则*sp存储的是第一个字符,而给它赋的是字符串,故错; 选项B表示代表数组的首地址,而题中给它赋的是字符串,所以错误; 选项c定义了一个字符型的数组s[10],再通过+s给数组元素赋初值,这时是与选项A相同的错误。 (40)设有如下说明 typedef struct ST {long a; int b; char c[2];}NEW; 则下面叙述中正确的是________。 A)以上的说明形式非法 B)ST是一个结构体类型 C)NEW是一个结构体类型 D)NEW是一个结构体变量 答案:C 评析:typedef关键字用于声明一个新的类型名代替已有的类型名。 本题中如果没有用typedef进行定义的话,则struct ST为结构体类型,现在用typedef定义后,相当于用NEW代表了struct ST这一结构体类型,故NEW为结构体类型。 (41)有以下程序 main() { int a=1,b; for(b=l;b<10;b++) { if(a>=8)break; if(a%2==1){a+=5;continue;} a-=3; ) printf(“%d\n”,b); } 程序运行后的输出结果是________。 A) 3 B)4 C) 5 D) 6 答案:B 评析:break和continue的区别是:continue语句只结束本次循环,而不是终止整个循环的执行;而break语句则是结束整个循环过程,.不再判断执行的条件是否成立。 (42)有以下程序 main() { char s[]=”l 59″,*p; p=s; printf(“%c”,*p++);printf(“%c”,*p++); } 程序运行后的输出结果是________。 A)15 B)16 C)12 D)59 答案:A 评析:本题通过“p=s”将指针变量p指向字符数组s,在第一次输出时,由于++和*为同一优先级,“*p++”相于“+(p++)”。p指向s[1],输出为s[1]的值。 [c语言笔试题目及答案] 复用:FDMA,TDMA,SDMA,CDMA PCM原理 采样,量化,编码(见通原书) 电路交换,分组交换 TST,T,S单元的2种控制方式 备用方式,同步方式 爱而兰定义 信令网组成,信令分类,一个电话的'基本呼叫流程 比特与波特 光纤通信特点,主要参数(PMD,MFD,NA,截止波长) 1310,1550nm PDH的概论 SDH全面了解,最好看一本50页以上的书!!!! DWDM NGN 概念 TCP/IP ISO 模型 城域网模型 LAN ADSL PPPOE原理 异,同步传输 虚电路 DDN 原理 ATM 原理,模型,基本帧结构 笔试题目考察的类型 第一,分析问题的能力,像上文谈到的港龙航空的两个笔试题,都对应试者的分析问题的能力有着重的考察。这里面又主要的包括两个方面的能力,第一个是结构化思维的能力,你分析问题的过程是不是有逻辑性,能不能够按照提出问题——分析问题——解决问题的结构来布局你的写作,各个环节之间的逻辑关系是不是清晰,哪些是第一个层面的内容,哪些是第二个层面的内容。有的时候我们还可以借用一些现成的分析工具来帮助我们结构化我们的表达。以港龙航空的第二个笔试题来说,如果你能够想到利用SWOT模型或者波特的五力分析工具来作为你的总纲对港龙航空的战略能力做一个分析的话,其结构会更加的完整和有条理。第二个是多角度分析问题的能力,这主要考察的是思维的发散性和拓展性。你能不能够从不同的角度来分析问题,而不是仅仅局限于现有的框架。一个事件本身,其影响可能是多方面的,你能不能够把这些彼此相关的、具有内在的联系的前因后果联系起来,这是你做好这一类英文写作笔试的第二个关键。多角度分析问题的能力还涉及到思维的完整性,当你考虑一个问题的时候,你是不是仅仅想到一点写一点,还是能够把这个问题的方方面面都考虑得比较完善和透彻。 zd.54yjs.cn 第二,英文的书面表达能力。如果说分析能力是你的方法和路径,那么表达能力就是你的手段和工具, 若你只是能够分析问题,缺乏系统和有效的表达能力和技巧,你同样不能够把你的想法和思路传达给阅卷人,因为最终他是要通过你的书面记录下来的文字来判断你的分析和解决问题的.能力的。书面表达能力还需要有很多东西来支撑,比如词汇量、英文写作的思维方式和驾驭文字的能力。这些是需要通过长期的积累和实践才能够获得的能力,在后面的笔试准备环节,还会具体的谈到。 zd.54yjs.cn 上述两类笔试内容都是最常见的笔试类型,出现的几率也最到。在现实的招聘中,大部分的外企都是采用这样的笔试题型的。除此以外,还有一些笔试的类型,出现的频率不高,但是也具备一定的代表性,在这里做一个归纳介绍。 zd.54yjs.cn 第一种是考察简单的数理分析能力,典型的题型包括数列的规律,速算,平面几何和立体几何的一些简单应用。一般来说,这类题型不提供也不允许携带计算器。在2004年万科企业集团的笔试,强生(中国)1的笔试以及瑞安集团的笔试中都出现了类似的题目。 第二种是对于知识域的考察,所谓知识域,主要包括一些常识性的问题和时事方面的内容。我们来看一份比较有代表性的考题,这是强生(中国)2004年笔试题的第一部分知识域的部分考题。 ★笔试题目 文档为doc格式篇9:电信公司笔试题目类型
篇10:电信公司笔试题目类型
篇11:笔试题目考察的类型