浙江大华2011.10.10校园招聘会笔试题

请写出下面程序的输出结果:(答案在下面)

1、

int count = 3;
int main(void)
{
	int i, sum, count = 2;
	for(i=0,sum=0; i<count; i+=2,count++)
	{
		static int count = 4;
		count++;
		if(i%2 == 0)
		{
			extern int count;
			count++;
			sum += count;
		}
		sum += count;
	}
	printf("%d %d\n",count, sum);
	return 0;
}

2、

void func(char str[50])
{
	printf("A %d B %d ",sizeof(str), strlen(str));
}
int main(void)
{
	char stra[] = "HelloWorld";
	char *strb = stra;
	printf("C %d D %d ",sizeof(stra), sizeof(strb++));
	func(++strb);
	printf("E %d F %d\n",strlen(stra), strlen(strb++));
	return 0;
}

printf("C %d D %d ",sizeof(stra),sizeof(strb++)); 中的sizeof(strb++)并不对sizeof函数中strb进行自增运算,只是简单的求这个指针的大小,此时的strb指针还是指向stra。

3、

#include <vector>
int func(std::vector<int>vec)
{
	static int k = 2;
	std::vector<int>::reverse_iterator it;
	for(it = vec.rbegin(); it!=vec.rend(); ++it)
	{
		k += *it%2==0? ++*it: (*it)++;
	}
	return k;
}
int main(void)
{
	std::vector<int>vec;
	for(int i = 0; i<4; i++)
	{
		vec.push_back(i);
		printf("%d ",func(vec));
	}
	return 0;
}

4、

{
public:
	int m_a;
	Base(int a=2):m_a(a)
	{
		printf("A %d ",m_a);
	}
	virtual ~Base()
	{
		printf("B %d ",m_a);
	}
};
class Derived:public Base
{
public:
	Derived(int a=4):Base(a)
	{
		printf("C %d ",m_a);
	}
	~Derived()
	{
		printf("D %d ",m_a);
	}
};
int main(void)
{
	Base *aa,bb;
	aa = new Derived;
	delete aa;
	return 0;
}

5、

class Base
{
public:
	int m_a,m_b;
	Base(int a = 2,int b = 5):m_a(a),m_b(b)  {  }
	int func_a()
	{
		return m_a - m_b;
	}
	virtual int func_b()
	{
		return m_a + m_b;
	}
};
class Derived:public Base
{
public:
	Derived(int a = 4, int b = 7):Base(a, b)  {  }
	virtual int func_a()
	{
		return m_b + m_a;
	}
	int func_b()
	{
		return m_b - m_a;
	}
};
int main(void)
{
	Base *aa, *bb;
	aa = new Base(4, 7);
	bb = new Derived(3, 5);
	printf("%d %d %d %d\n",aa->func_a(), aa->func_b(), bb->func_a(), bb->func_b());
	delete aa;
	delete bb;
	return 0;
}

6、

struct SC
{
	int a;
	int b;
	int c;
};
struct SD
{
	int a;
	int b;
	int c;
	int d;
};
int main(void)
{
	struct SC c1[] = {{3},{4},{5},{6}};
	struct SD *c2 = (struct SD*)c1 + 1;
	printf("%d %d %d %d\n",c2->a,c2->b,c2->c,c2->d);
	return 0;
}

7、

  1. int func(int n)
  2. {
  3. int k = 1;
  4. if(n > 0)
  5. {
  6. k += func(--n);
  7. printf("%d ", n);
  8. k += func(--n);
  9. }
  10. return k;
  11. }
  12. int main(void)
  13. {
  14. int a = 3;
  15. printf("%d\n",func(a));
  16. return 0;
  17. }

编程题:
1、函数checkstr判断一字符串是不是对称的。其中msg为输入的字符串,对称返回0,不对称返回-1,实现该函数。
int checkstr(const char *msg);

2、给出一个单向链表的头指针,输出该链表中倒数第K个节点的指针,链表的倒数第0个节点为链表的尾节点(尾节点的next成员为NULL)
typedef struct Node
{
struct Node *next;
}NODE;

NODE* findnode(NODE *head,unsigned int k);



简答题:
1、简述动态链接库DLL和静态链接库lib的差别。
2、请简述MFC中的窗口收到WM_PAINT消息是如何处理的,什么情况下会产生WM_PAINT消息。
3、请简述Critical Section 、Mutex、Semaphore的功能和差别
4、简述多线程程序对比单线程程序的优点和缺点。

参考答案(欢迎讨论)

  1. 4 20 主要考查各个count的作用范围,for循环判断条件的count是main下第一行的count,for循环里面的count是static的count,if语句里面的count是main外部的count,sum+=count中的count是static的count。
  2. C 11 D 4 A 4 B 9 E 10 F9 注意函数形参里的数组形式,其实本质上都是指针,另外sizeof是在编译阶段就处理的运算符,所以会忽略里面的各种算术运算。
  3. 3 5 10 18 考查运算符的优先级,带等号的运算符=、+=等等,优先级都是很低的,所以先做的是那个三目运算符,还要注意形参的变化不影响实参。
  4. A 2 A 4 C 4 D 4 B 4 B 2 构造时,先构造基类再构造派生类,释放时先释放派生类再释放基类。
  5. -3 11 -2 2 构成多态的条件是基类的virtual(注意是基类一定要有,派生类自动也会是virtual,但派生类的virtual不会传给基类),派生类对基类的覆盖(函数名、形参和返回值类型必须完全一样),基类指向派生类对象或引用。
  6. 0 0 5 0 注意地址转换后的+1,并不是地址值只偏移一个,而是偏移了一整个struct SD的空间,所以c1内容300400500600会一下子偏移掉4个int,指向了4后面的0。
  7. 递归,花些耐心推就行了。

编程题

1. 如下(引用自http://blog.csdn.net/Hackbuteer1):

View Code 
 int checkstr(const char *msg) 
 { 
     int len = strlen(msg); 
     int i, j; 
     for(i = 0,j = len-1; i <= j; i++,j--) 
     { 
         if(msg[i] != msg[j]) 
             break; 
     } 
     if(i>j) 
          return 0; 
     else 
         return -1; 
  }

2. 如下:

View Code 
 typedef struct Node
 
 {
 
 struct Node *next;
 
 }NODE;
 
  
 
 NODE* findnode(NODE *head, unsigned int k)
 
 {
 
 unsigned int count = 0;
 
 NODE* pre = head;
 
 NODE* p = pre;
 
 while(true)
 
 {
 
      count = 0;
 
      p = pre;
 
      while(count < k && p != NULL)
 
      {
 
          p = p->next;
 
          ++ count;
 
      }
 
      if(p == NULL)
 
      {
 
          cout << "不存在倒数第 " << k << " 个结点" << endl;
 
          return NULL;
 
      }
 
      else if(p->next == NULL)
 
      {
 
          //找到了
 
          return pre;
 
      }
 
      else
 
      {
 
          //没找到
 
          pre = pre->next;
 
      }
 
 }  
 
 }


简答题

  1. 差别:静态lib将各个调用函数都封装在生成的可执行文件中(.exe),而动态DLL则在需要时才动态地装载和所载DLL文件,动态DLL还可以利用到操作系统中既存的库文件。
  2. 处理:BeginPaint开始画,就是用白刷去掉原窗口,GetClientPaint获得窗口显示区域和尺寸等信息并绘制,EndPaint释放绘图句柄。
  3. 功能:都是用来解决共享变量或区域的访问问题,防止读写冲突。区别:Critical Section是在用户方式下实现同步,其他两个是系统内核对象。Mutex是只有获得锁的进程才能释放,而semaphore可由其他进程释放,一般mutex用于保护关键代码区域,而semaphore用于保护变量。
  4. 优点:多线程程序可以分时处理,用户因此可以同时高效地执行多个任务,用户体验好;缺点:线程切换有额外的代价,所以花费的总时间要长于单线程程序。

 转载自:http://www.cnblogs.com/jerry19880126/archive/2012/08/05/2623982.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值