笔试题总结

1. 中断向量的概念

答:中断服务程序的入口地址.

2. 判断系统是16位还是32位

 2.1  cout << (sizeof(int *)==4 ? "32 bit" : "16 bit") << endl;
2.2
  unsigned int a = ~0;
  cout << (a>65535 ? "32 bit" : "16 bit") << endl;

3. 下列代码的输出结果是:

struct Node
{
	union
	{
	    double b;
	    char c;
	};
	int i;
	char j;
	char str[6];

};

int main()
{
	struct Node node;
	int size = sizeof(node);
	printf("%d\n",size);
	system("pause");
}
输出结果:24

4. 猜生日(金山网络)

小明和小强都是张老师的学生,张老师的生日是M月N日,2人都不知道张老师的生日是下列10组中的一天,张老师把M值告诉了小明,把N值告诉了小强,张老师问他们知道他的生日是那一天吗? 
  3月4日  3月5日 3月8日 
  6月4日  6月7日 
  9月1日  9月5日 
  12月1日  12月2日 12月8日 
  小明说:如果我不知道的话,小强肯定也不知道 
  小强说:本来我也不知道,但是现在我知道了 
  小明说:哦,那我也知道了 
  请根据以上对话推断出张老师的生日是哪一天?

第一句:小明说:如果我不知道的话,小强肯定也不知道. 分析:如题所知,小明掌握了生日的月份而小强掌握了日子,在什么情况下小强不用知道月份就可以得知老师的生日呢,先来看10组候选的日子部分,有两个1日,两个4日,两个5日,两个8日,只有2日和7日落单,也就说只要是它们俩之一小强可以立刻推测出生日,而小明根据掌握的月份立刻得出如果自己推算不出来生日小强也不行说明了小明掌握的月份不会是6月和12月两大组,因为如果生日在它们两大组之中,小明就无法推测出生日而小强有可能立刻推测出生日. 

第二句:小强说:本来我也不知道,但是现在我知道了. 分析:根据小明第一句话,小强立刻按照和我一样的推理排除了6月和12月两大组,根据自己掌握的日子在剩余的3月和9月组中立刻推理出真正的生日.由于我没有小强掌握到的日子的情报,在这一步我无法推测出生日,只能按照小强的推理思路继续排除,剩余5组中有1个1日,一个4日,两个5日,1个8日,如果小强掌握到的情报是5日,也不可能得出结论,因为小强不知道具体月数,所以两个5日排除.可能性只剩3月中的两组和5月中的1组. 

第三句:小明说:哦,那我也知道了. 分析:小明掌握了月份,所以能立刻推测出剩余3组的真正生日组,我同样不知道月份,这次按照小明的思路排除,如果月份在3月组,由于3月组还剩余两组,小明没有掌握到日子还是不能从中得出正确答案,所以月份只能是9月组小明才有把握知道正确答案,9月还剩的最后一组就是此题真正的答案了。
因此,9月1日为张老师的生日.
( 解答未推敲,仅供参考)

5, 虚函数

#include<iostream>
#include<stdlib.h>

using namespace std;

class Base
{
public:
	virtual void fun()
	{
		cout<<"In base"<<endl;
	}

	virtual void fun(int )
	{
		cout<<"In base with para"<<endl;
	}
};

class Dri:Base
{
public:
	Dri()
	{
		cout<<"Constrcut"<<endl;
	}
	virtual void fun()
	{
		cout<<"In Driv"<<endl;
	}

	virtual void fun(int)
	{
		cout<<"In Driv with para"<<endl;
	}
};

void main()
{
	Base base;
	Dri driv ;
	Base *pb=(Base*)&driv;
	pb->fun();
	pb->fun(1);
	system("pause");
}
输出:Constrcut
In Driv
In Driv with para
请按任意键继续. . .

如果去掉基类中的virtual,输出结果为base
6. 单链表逆转

将一个单链表逆转,链表无环的情况.

解法详见:http://blog.csdn.net/feliciafay/article/details/6841115 或者 http://blog.csdn.net/zhongjishao/article/details/12705559

7. printf 的运算顺序是从右向左。

#include<stdio.h>
int main()
{
    int b=3;
    int arr[]={6,7,8,9,10};
    int *ptr=arr;
    *(ptr++) +=123;
    printf("%d,%d\n",*ptr,*(++ptr));
}

输出结果为8,8. 因为printf的运算顺序是从右到左,所以先计算了*(++ptr),再计算*ptr;因此这两个值均为8

8.在计算机中,int型和float的存储方式是不一样的,例如下例中

#include<iostream>

using namespace std;

int main(void)
{
    float a=1.0f;
    cout<<(int)a<<endl;
    cout<<&a<<endl;
    cout<<(int &)a<<endl;
    cout<<boolalpha<<( (int)a == (int&)a)<<endl;
    cout<<"******************************"<<endl;

    int b=1;
    cout<<(int)b<<endl; 
    cout<<&b<<endl;
    cout<<(int &)b<<endl;
    cout<<boolalpha<<( (int)b==(int &)b) <<endl;
}
其中,&a表示取a的地址,(int &)a,表示取a所在地址的值。

上式中一个结果为false,一个为true,因为float在内存中表示的方式不一样,取前四位地址表示的值结果并不是1.


你可能感兴趣的:(笔试题总结)