常见C/C++笔试题目整理(含答案)2

网上流传的一份常见C++笔试题目汇总,供各位有找工作需要的同学参考之用。因为原文较长,遂采用连载形式,预计需要连载4期左右,有耐心的同学就请一直跟下去吧,相信一定会有所收获。提前说明一点,题目来在网络,答案仅供参考,如有同学觉得哪道题目有异议,欢迎讨论!本文系第21至第38题。现在的题目和答案是在之前版本之上整理修正而来,已经剔除了一些(例如操作系统等)非编程问题。

探秘算法世界,求索数据结构之道;汇集经典问题,畅享编程技法之趣;点拨求职热点,敲开业界名企之门。

更多经典算法问题、C++编程技巧和技术笔面试题目请详阅《算法之美——隐匿在数据结构背后的原理》


【题目21~38】


21. static变量和static函数各有什么特点?


22. 下面的函数实现在一个固定的数上加上一个数,有什么错误,请改正。 

int add_n(int n)
{
	static int i=100;
	i+=n;
	return i;
}
 
23.  写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。


24. 写出下面程序的执行结果:

#include 

using namespace std;

class A
{
public:
    virtual void print(void)
    {
        cout<<"A::print()"<print();
    pb->print();
    pc->print();
    
    print(a);
    print(b);
    print(c);
    
    return 0;
}


25. 简述结构与联合有何区别?

26. 分析下面关于“联合”的程序的输出。

union  
{  
    int i;  
    char x[2];  
}a;  
  
int main(int argc, const char * argv[]) {
    
    a.x[0] = 10;  
    a.x[1] = 1;  
    printf("%d",a.i); 
    
    return 0;
}


27. 已知strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc),其中strDest 是目的字符串,strSrc 是源字符串。不调用C++/C 的字符串库函数,请编写函数 strcpy。


28. 分析下面关于“联合”的程序的输出。

int main(int argc, const char * argv[]) {
    
    union{ /*定义一个联合*/  
        int i;  
        struct{ /*在联合中定义一个结构*/  
            char first;  
            char second;  
        }half;  
    }number;  
      
    number.i=0x4241; /*联合成员赋值*/  
    printf("%c%c\n", number.half.first, number.half.second);  
    number.half.first='a'; /*联合中结构成员赋值*/  
    number.half.second='b';  
    printf("%x\n", number.i); 
    
    return 0;
}

29. 写一个函数找出一个整数数组中,第二大的数。  


30. 已知String类定义如下:

class String
{
public:
	String(const char *str = NULL); // 通用构造函数
	String(const String &another); // 拷贝构造函数
	~ String(); // 析构函数
	String & operater =(const String &rhs); // 赋值函数
private:
	char *m_data; // 用于保存字符串
}; 
尝试写出类的成员函数实现。 


31. 文件中有一组整数,要求排序后输出到另一个文件中。


32. 根据下面代码回答问题:

int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;

请问i最后等于多少?


33. 根据下面代码回答问题:

unsigned short array[]={1,2,3,4,5,6,7};
int i = 3;

请问 *(array + i) = ?


34. 根据下面代码回答问题:

class A
{
    virtual void func1();
    void func2();
}

Class B: class A
{
    void func1(){cout << "fun1 in class B" << endl;}
    virtual void func2(){cout << "fun2 in class B" << endl;}
}
以下四种说法中,哪个是正确的?

  • (A) A中的func1和B中的func2都是虚函数.
  • (B) A中的func1和B中的func2都不是虚函数.
  • (C) A中的func2是虚函数.,B中的func1不是虚函数.
  • (D) A中的func2不是虚函数,B中的func1是虚函数.


35. 简述“.h”头文件中的ifndef/define/endif 的作用?


36. #include 与 #include "file.h"的区别?


37. 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)

struct node { char val; node* next;}
bool check(const node* head) {} //return false : 无环;true: 有环


38.  当一个类 A 中没有声明任何成员变量与成员函数,这时sizeof(A)的值是多少,如果不是零,请解释一下编译器为什么没有让它为零。


【参考答案】

--------------------------------------------------------------------------

21. static变量:在程序运行期内一直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;static函数:在编译单元内可见。


--------------------------------------------------------------------------

22. 因为static使得i的值会保留上次的值。去掉static就可了。


--------------------------------------------------------------------------

23. 可以采用KMP算法,时间复杂度是O(n+m)。


--------------------------------------------------------------------------

24. 

A::print()
B::print()
C::print()
A::print()
B::print()
C::print()
A::print()
A::print()
A::print()

--------------------------------------------------------------------------

25. 
1. 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合中只存放了一个被选中的成员(所有成员共用一块地址空间), 而结构的所有成员都存在(不同成员的存放地址不同)。 
2. 对于联合的不同成员赋值, 将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。


--------------------------------------------------------------------------

26. 266 (低位低地址,高位高地址,内存占用情况是Ox010A)


--------------------------------------------------------------------------

27. 

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;
}

--------------------------------------------------------------------------

28. 

AB (0x41对应'A',是低位;Ox42对应'B',是高位)

6261 (number.i和number.half共用一块地址空间)

--------------------------------------------------------------------------

29. 

const int MINNUMBER = -32767 ;

int find_sec_max( int data[] , int count)
{
	int maxnumber = data[0] ;
	int sec_max = MINNUMBER ;
	for ( int i = 1 ; i < count ; i++)
	{
		if ( data[i] > maxnumber )
		{
			sec_max = maxnumber ;
			maxnumber = data[i] ;
		}
		else
		{
			if ( data[i] > sec_max )
				sec_max = data[i] ;
		}
	}
	return sec_max ;
}

--------------------------------------------------------------------------

30. 

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 ;
} 

--------------------------------------------------------------------------

31. 

#include 
#include 
#include 

using namespace std;

void Order(vector& data) //bubble sort
{
	int count = data.size() ;
	int tag = false ; // 设置是否需要继续冒泡的标志位
	for ( int i = 0 ; i < count ; i++)
	{
		for ( int j = 0 ; j < count - i - 1 ; j++)
		{
			if ( data[j] > data[j+1])
			{
				tag = true ;
				int temp = data[j] ;
				data[j] = data[j+1] ;
				data[j+1] = temp ;
			}
		}
		if ( !tag )
			break ;
	}
}

int main(int argc, const char * argv[]) {
    
    vectordata;
	ifstream in("c://data.txt");
	if (!in)
	{
		cout<<"file error!";
		exit(1);
	}
	int temp;
	while (!in.eof())
	{
		in>>temp;
		data.push_back(temp);
	}

	in.close(); //关闭输入文件流
	Order(data);
	ofstream out("c://result.txt");
	if ( !out)
	{
		cout<<"file error!";
		exit(1);
	}

	for ( int i = 0 ; i < data.size() ; i++)
		out<

--------------------------------------------------------------------------

32. i = 5


--------------------------------------------------------------------------

33. 4


--------------------------------------------------------------------------

34. A


--------------------------------------------------------------------------

35. 防止该头文件被重复引用。


--------------------------------------------------------------------------

36. 前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用file.h。


--------------------------------------------------------------------------

37. 一种O(n)的办法就是(使用两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):

bool check(const node* head)
{
	if(head==NULL) return false;
	node *low=head, *fast=head->next;
	while(fast!=NULL && fast->next!=NULL)
	{
		low=low->next;
		fast=fast->next->next;
		if(low==fast) return true;
	}
	return false;
}


--------------------------------------------------------------------------

38. 肯定不是零。如果是零的话,声明一个class A[10]对象数组,而每一个对象占用的空间是零,这时就没办法区分A[0],A[1]…了。



未完,待续。

VIEWER DISCRETION IS ADVISED!!

你可能感兴趣的:(编程语言与程序设计)