C++应聘教师笔试题及答案

匿名网友 匿名网友 发布于: 2015-08-30 00:00:00
阅读 145 收藏 0 点赞 0 评论 0

 

  1. 简答题 (30)

1. Windows程序的入口是哪里?写出Windows消息循环机制的流程。

 

 

 

2. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?

 

 

3.内联函数在编译时是否做参数类型检查

 

4. 头文件中的 ifndef/define/endif 干什么用?

 

5.C++中为什么用模板类。

 

6. 函数模板与类模板有什么区别?

 

7. C++中什么数据分配在栈或堆中,new分配的数据是在堆还是栈中?

 

8. 一般数据库若出现日志满了,会出现什么情况,是否还能使用?

 

9. winsock建立连接的主要实现步骤是什么?

 

 

 

10.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?

 

 

 

  1. 写出程序运行结果(24)

1.
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I<5;I++)
{
printf(“%d,”, sum(a));
}
}

2、若int占4个字节,char占1个字节,float占4个字节,则定义如下:
struct stu
{ union{
        char bj[5];
        int bh[2];
        }class;
char xm[8];
float cj;
}xc;
则sizeof(xc)的值为?

3.

int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则a[q-p]=?

4. 定义 int **a[3][5], 则变量占有的内存空间为:_____

 

5.写出下面程序的输出结果
#include <stdio.h>
class A{
public:
void FuncA(){
printf(“FuncA calledn”);
}
virtual void FuncB(){
printf(“FuncB calledn”);
}
};
class B: public A{
public:
void FuncA(){
A::FuncA();
printf(“FuncAB calledn”);
}
virtual void FuncB(){
printf(“FuncBB calledn”);
}
};
void main(void){
B b;
A *pa;
pa=&b;
A *pa2=new A;
b.FuncA();
b.FuncB();
pa->FuncA();
pa->FuncB();
pa2->FuncA();
pa2->FuncB();
delete pa2;
}


6. 下面程序的输出结果是什么?

#define f1(n) (n)*(n)
int i=5;
int k=0;
k=f1(i++);
printf(“%d %d”,i,k);

7.

int i;
int x=0x12345678;
unsigned char *p=(unsigned char *)&x;
for(i=0;i<SIZEOF(X);I++)
printf(“%2x”,*(p+i));
在x86 pc机器上运行结果?
8.

void fun(char *a,char *b)

{    a=b;
(*a)++;

}

void main(){
char s1=’A’,s2=’a’;
char *p1=&s1;
char *p2=&s2;
fun(p1,p2);
printf(“%c%c”,s1,s2);
}
输出结果是:

 

  1. 改错(16)
  2.  

#include <stdio.h>

#include <string.h>

class Cbuffer{

char * m_pBuffer;
int m_size;

public:
CBuffer()
{
m_pBuffer=NULL;
}
~CBuffer()
{
Free();
}
void Allocte(int size) {
m_size=size;
m_pBuffer= new char[size];
}
private:
void Free()
{
if(m_pBuffer!=NULL)
{
delete m_pBuffer;
m_pBuffer=NULL;
}
}
public:
void SaveString(const char* pText) const
{
strcpy(m_pBuffer, pText);
}
char* GetBuffer() const
{
return m_pBuffer;
}
};
void main (int argc, char* argv[])
{
CBuffer buffer1;
buffer1.SaveString(“Microsoft”);
printf(buffer1.GetBuffer());
}

2) 下面程序想打印”Welcome MSR Asia”,改正错误
#include <stdio.h>

#include <string.h>

char * GetName (void){
//To return “MSR Asia” String
char name[]=”MSR Asia”;
return name;
}
void main(int argc, char* argv[])
{
char name[32];
//Fill in zeros into name
for(int i=0;i<=32;i++)
{
name[i]=’’;
}
//copy “Welcome” to name
name=”Welcome”;
//Append a blank char
name[8]=” “;
//Append string to name
strcat(name,GetName());
//print out
printf(name);
}

四.编程(30)
1.将整数转换成字符串:char* itoa(int,char*);
例如itoa(-123,s[])则s=”-123″;

 

 

 

 

 

2.完成下列程序
*
*.*.
*..*..*..
*…*…*…*…
*….*….*….*….*….
*…..*…..*…..*…..*…..*…..
*……*……*……*……*……*……*……
*…….*…….*…….*…….*…….*…….*…….*…….
#include
#define N 8
int main()
{
int i;
int j;
int k;
———————————————————

 

 

———————————————————
return 0;
}


3.完成程序,实现对数组的降序排序
#include
void sort( );
int main(){
int array[]={45,56,76,234,1,34,23,2,3}; //数字任意给出
sort( );
return 0;
}
void sort( )
{
———————————————————

 

 

———————————————————
}

4.费波那其数列,1,1,2,3,5……编写程序求第十项。可以用递归,也可以用其他方法,但要说明你选择的理由。
#include
int Pheponatch(int);
int main()
{
printf(“The 10th is %d”,Pheponatch(10));
return 0;
}
int Pheponatch(int N)
{
——————————–

 

 

 

——————————–
}

5.请用标准C语言实现一个双向循环链表的查找与删除过程findKey。
typedef struct doublecyclelink{
int key;
struct doublecyclelink *prev;
struct doublecyclelink *next;
}DoubleCycleLinkT;
DoubleCycleLinkT *findKey(DoubleCycleLinkT *link,int key);
遍历整个双向循环链表,将第一个与key值相同的结点移出链表,并返回。
若没有找到则返回NULL。

C++应聘教师笔试题答案

 

 

  1. 简答题(30)

1. Windows程序的入口是哪里?写出Windows消息机制的流程。

Windows程序的入口是WinMain函数
消息机制:系统将会维护一个或多个消息队列,所有产生的消息都会被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。

 

2. 在C++ 程序中调用被 C 编译器编译后的函数,为什么要加 extern “C”声明?
答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern “C”修饰的变量和函数是按照C语言方式编译和连接的。由于编译后的名字不同,C++程序不能直接调用C 函数。C++提供了一个C 连接交换指定符号extern”C”来解决这个问题。

 

3.内联函数在编译时是否做参数类型检查
答:做类型检查,因为内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来代替。

 

4. 头文件中的 ifndef/define/endif 干什么用?预处理
答:防止头文件被重复引用

 

5.C++中为什么用模板类。
答:(1)可用来创建动态增长和减小的数据结构
(2)它是类型无关的,因此具有很高的可复用性。
(3)它在编译时而不是运行时检查数据类型,保证了类型安全
(4)它是平台无关的,可移植性
(5)可用于基本数据类型

6. 函数模板与类模板有什么区别?
答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。

7. C++中什么数据分配在栈或堆中,new分配的数据是在堆还是栈中?
答:栈: 存放局部变量,函数调用参数,函数返回值,函数返回地址。由系统管理
堆: 程序运行时动态申请,new 和 malloc申请的内存就在堆上

8. 一般数据库若出现日志满了,会出现什么情况,是否还能使用?
答:只能执行查询等读操作,不能执行更改,备份等写操作,原因是任何写操作都要记录日志。也就是说基本上处于不能使用的状态。

9. winsock建立连接的主要实现步骤是什么?

答:服务器端:socker()建立套接字,绑定(bind)并监听(listen),用accept()等待客户端连接。
客户端:socker()建立套接字,连接(connect)服务器,连接上后使用send()和recv(),在套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。
服务器端:accept()发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv()写读数据,直至数据交换完毕,closesocket()关闭套接字。

10.请问交换机和路由器各自的实现原理是什么?分别在哪个层次上面实现的?
答:交换机属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。交换机最大的好处是快速,路由器最大的好处是控制能力强。

 

  1. 写出程序运行结果

1. 答:8,10,12,14,16
该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。

2、 20,一道边界对齐的题目,很多地方有讲,此处注意下联合的内存大小取决于其中字节数最多的成员就可。

3.答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点
4. 答:此处定义的是指向指针的指针数组,对于32位系统,指针占内存空间4字节,因此总空间为3×5×4=60。

5.答:
1.b.FuncA(); 输出
FuncA called
FuncAB called
2.b.FuncB();输出
FuncBB called
上两者好理解,直接调用类B的相应成员函数
3.pa->FuncA();输出
FuncA called 调用类A的FuncA()
4.pa->FuncB();输出
FuncBB called调用类B的FuncB(),原因是C++的动态决议机制,当基类函数声明为virtual时,指向派生类对象的基类指针来调用该函数会选择派生类的实现,除非派生类没有才调用基类的虚函数。还有一点注意的是:指向基类类型的指针可以指向基类对象也可以指向派生类对象,如pa=&b;
5. pa2->FuncA();
pa2->FuncB();输出
FuncA called
FuncB called
这也好理解,直接调用类A的相应成员函数

6.答:7 25
7.答:x在PC机上的内存存放顺序为78 56 34 12,高字节在前,低字节在后,因此输出78563412
8. 答:输出结果为:Ab,因为在fun函数里,指针a指向s2存储区(a=b),接着让s2存储区的值加1得’b’ ((*a)++),所以s2等于’b’,s1不变。

  1. 改错

1.主要改正SaveString函数
void SaveString(const char* pText) (1)
{
Allocte(strlen(pText)+1); (2)
strcpy(m_pBuffer, pText);
}
原因:
(1) const成员函数表示不会修改数据成员,而SaveString做不到,去掉const声明
(2) m_pBuffer指向NULL,必须用Allocte分配空间才能赋值。
(3) 另外需要将Allocte成员函数声明为私有成员函数更符合实际

2) 答:改正后为
#include
#include
char * GetName (void)
{
//To return “MSR Asia” String
//char name[]=”MSR Asia”; (1)

char *name=(char *)malloc(strlen(“MSR Asia”)+1);
strcpy(name,”MSR Asia”);
return name;
}
void main(int argc, char* argv[])
{
char name[32];
//Fill in zeros into name
for(int i=0;i<=32;i++)
{
name[i]=’’;
}
//copy “Welcome” to name
//name=”Welcome”; (2)
strcat(name,”Welcome “);
//Append a blank char
// name[8]=’ ‘; (3)
//Append string to name
char *p=GetName(); (4)
strcat(name,p);
free (p);
//print out
printf(name);
}
原因:(1)在函数内部定义的变量在函数结束时就清空了,必须动态分配内存
(2)字符串赋值语句错误,应该用strcat
(3)该语句无效,可去掉
(4)定义一个指针指向动态分配的内存,用完后需用free语句释放

 

四.编程
1.将整数转换成字符串:void itoa(int,char);
例如itoa(-123,s[])则s=”-123″;
答:
char* itoa(int value, char* string)
{
char tmp[33];
char* tp = tmp;
int i;
unsigned v;
char* sp;
// 将值转为正值
if (value < 0)
v = -value;
else
v = (unsigned)value;
// 将数转换为字符放在数组tmp中
while (v)
{
i = v % 10;
v = v / 10;
*tp++ = i+’0′;
}
// 将tmp里的字符填入string指针里,并加上负号(如果有)
sp = string;
if (value < 0)
*sp++ = ‘-‘;
while (tp > tmp)
*sp++ = *–tp;
*sp = 0;
return string;
}

 

 

2. 答:#define N 8
int main()
{
int i;
int j;
int k;

for(i=0;i<N;I++)
{
for(j=0;j<I+1;J++)
{
printf(“*”);
for(k=0;k<I;K++)
printf(“.”);
}
printf(“n”);
}
return 0;
}

3. 答:使用选择排序法,我为sort函数多加了两个形参,至少第一个是必须的,否则无法传入待排序数组。不知道这样做是否符合题意。
void sort(int *array,int num)
{
int temp;
for(int i=0;i<NUM-1;I++)
for(int j=i+1;j<NUM;J++)
if (array[i]<ARRAY[J])
{temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}

4. 答:
使用递归,理由是递归编程简单,代码容易理解,但缺点是效率不高,而且有深度限制,如果深度太深,则堆栈会溢出。
int Pheponatch(int N)
{
if (N==3)
return 2;
else if (N==2||N==1)
return 1;
else
return Pheponatch(N-1)+Pheponatch(N-2);
}

 

5.请用标准C语言实现一个双向循环链表的查找与删除。
typedef struct doublecyclelink{
int key;
struct doublecyclelink *prev;
struct doublecyclelink *next;
}DoubleCycleLinkT;
DoubleCycleLinkT *findKey(DoubleCycleLinkT *link,int key);
遍历整个双向循环链表,将第一个与key值相同的结点移出链表,并返回。
若没有找到则返回NULL。

答:
函数为
DoubleCycleLinkT *findKey(DoubleCycleLinkT *link,int key)
{
DoubleCycleLinkT *p;
p=link->next;
while (p->next!=link) // 链表结尾
{
if (p->key==key) // 查找到key值相同,删除该节点,并返回
{
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
return link;
}
else
p=p->next; // 否则查找下一节点
}
if (p->next == link) return NULL; //没找到,返回NULL

}

评论列表
文章目录