C/C++笔试题(7)

 

1  #include “filename.h”#include <filename.h>的区别?

答:#include “filename.h”表明该文件是用户提供的头文件,查找该文件时从当前文件

目录开始;#include <filename.h>表明这个文件是一个工程或标准头文件,查找过程会检

查预定义的目录。

 

2  头文件的作用是什么?

答:一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只

要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功

能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。

二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的

声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担

3  C ++函数中值的传递方式有哪几种?

答:C++函数的三种传递方式为:值传递、指针传递和引用传递。

 

4  内存的分配方式的分配方式有几种?

答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的

整个运行期间都存在。例如全局变量。

二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执

行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高

,但是分配的内存容量有限。

三、从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

 

交换两个数,不用第三块儿内存!请问怎么实现?

 

现有12个小球,其中只有1个球与其它的球重量不同(即有11个球重量全相同),并且不知道这

个跟其它球重量不同的球是重还是轻(跟其他11个重量相同的球相比而言),那么从这12个球

中找出这个跟其它球重量不同的球.

 

北电

昨天笔试共5道题目:
1.
英译汉 ,关于ITUCCITT
2.
汉译英,关于VMware
3.
两个有序数组的合并,写一个完整的程序
4.
填空题,排序二叉树节点的删除,5个空
5.
调试题,多线程文件的读写,编译没有错误,请找出至少三个bug.

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

1,程序设计(可以用自然语言来描述,不编程):C/C++源代码中,检查花括弧(是""
"
""{""}")是否匹配,若不匹配,则输出不匹配花括弧所在的行与列。


2
,巧排数字,将1,2,...,19,2020个数字排成一排,使得相邻的两个数字之和为一个素数,且
首尾两数字之和也为一个素数。编程打印出所有的排法。


3
,打印一个N*N的方阵,N为每边字符的个数( 3N20 ),要求最外层为"X",第二层为"Y",从第三层起每层依次打印数字0123...
例子:当N =5,打印出下面的图形:

 X X X X X
 X Y Y Y X
 X Y 0 Y X
 X Y Y Y X
 X X X X X 

 

普天C++笔试题

c++最后几个大题目是
1
,实现双向链表删除一个节点P,在节点P后插入一个节点,这两个函数。(北电 重复)
2
,写一个函数将其中的/t都转换成4个空格。
3
windows程序的入口是哪里?写出windows消息机制的流程。
4
,如何定义和实现一个类的成员函数为回调函数

虚函数也考了一题,不过不难。
class base{
public:
virtual void play(){
cout<<"base";
}
}
class son: public base{
public:
void play(){cout<<"son";}
}
void g(base & b){
b.play;
}

void main(){
son s;
g(s);
return;
}

我所收集的intel比试题&面试题:

(熟悉大公司的题目,并不仅仅是为了进这些公司,而是很多国内公司考察内容都很接近而已
.)
2005笔试

1
。高效的内存管理
2
8皇后问题


面试q
2 编译中的问题:全局变量如int i=5; int*(pf)()=foo; 分别在何时被初始化?设计时候如何具体的实现。
3 OS相关的问题,内存访问,cache等(包括cache在整个系统中的位置,画出来,并解释)
4 解释例如mov ax,100H 这样一条指令的cpu, os, memory等都完成了什么样的工作
5 Strlen()的C语言实现,不能使用任何变量。
6 编译中display的一些问题

7 一个hash函数,输入随机,现发生冲突,如数据集中在某几条中,问怎样处理hash函数保证高效的访问,怎样实现?
8 Switch()case…语句翻译成三元组。
9 一个byte(用C语言实现计数其中1的个数),给出最高效的实现方法。(位域)或者查表最快的;
10 上海有多少个加油站?你是怎样解决这一问题?
11 C语言参数的入栈顺序?为什么这么实现?
12 你的最大的优点和缺点分别是什么?
13 C语言中字符串的翻转,最高效率(时间和空间)的实现?

2004
1.
三个float:a,b,c 问值
(a+b)+c==(b+a)+c
(a+b)+c==(a+c)+b


2.
把一个链表反向填空  (重复)

4. y1(n)=x(2n), y2(n)=x(n/2),
问:
如果y1为周期函数,那么x是否为周期函数
如果x为周期函数,那么y1是否为周期函数
如果y2为周期函数,那么x是否为周期函数
如果x为周期函数,那么y2是否为周期函数

4.
某个程序在一个嵌入式系统( 200M CPU, 50M SDRAM)中已经最化了,换到另一个系统
( 300M
CPU, 50M SDRAM)中运行,还需要优化吗?

5. x^4+a*x^3+x^2+c*x+d
最少需要作几次乘法

2.
填程序
把一个计算m^n的程序填充完整
大概的意思是:
有一个全局数组char s[BUFSIZE]
利用这个数组计算,就是每个单元存放计算结果的一位,index小的存放低位,index

的存放高位
3
。有两个线程
void producer()
{
while(1)
{
GeneratePacket();
PutPacketIntoBuffer();
Signal(customer);
}
}
void customer()
{
while(1)
{
WaitForSignal();
if(PacketInBuffer>10)
{
ReadAllPackets();
ProcessPackets();
}
}
}
1有没有其他方法可以提高程序的性能
2)可不可以不使用信号之类的机制来实现上述的功能
4
优化下面的程序
(0)sum=0
(1)I=1
(2)T1
4*I
(3)T2=address(A)-4
(4)T3=T2[T1]
(5)T4=address(B)-4
(6)T5=4*I
(7)T6=T4[T5]
(8)T7=T3*T5
(9)sum=sum+T6
(10)I=I+1
(10)IF I<20 GOTO (2)

2003
年的

1
:概率题。x,y为随机变量,联合概率密度 f(x,y) = intig(0,1)*dx*intig(0,x)*k*d
y
k为常数,求
k=? E(xy)=?
注:intig(a,b)ab的定积分。


2
:概率题。A,B为随机事件,以下哪个正确
A. P(A U B)*p(AB) <= P(A)P(B)
B. P(A U B)*p(AB) >= P(A)P(B)
C. P(A U B)*p(AB) <= P(A) + P(B)
D. P(A U B)*p(AB) >= P(A) + P(B)

3:
信道带宽200kHz,信噪比10dB,求信道波特率=?

4
:以下代码运行结果是什么

int main()
{
int a,b,c,abc = 0;
a=b=c=40;
if(c)
{
int abc;
abc = a*b+c;
}
printf("%d,%d", abc, c);
return 0;
}

5
:给出了从纽约出发和到达落山鸡的各种航班信息,写出找到一条从纽约到落山鸡的最
短距离的航班组合的代码。

6
:从计算机图形上截取某个物体边缘的若干个坐标,求这个物体面积,并跟判断是方形
还是圆形,为啥。(坐标不记得,大概是个圆)
2005年腾讯招聘
选择题(60) 
  c/c++ os linux 
方面的基础知识 cSizeof函数有好几个

程序填空
(40) 
1.(20) 4
x5 
  
不使用额外空间, A,B两链表的元素交叉归并
 
2.(20) 4
x5 
MFC  
将树序列化 转存在数组或 链表中!

 

1.请定义一个宏,比较两个数ab的大小,不能使用大于、小于、if语句

// 这样转向定义应该不算违规吧!

#include <iostream>

using namespace std;

 

#define Cmp(x,y) compare(x,y)

 

int compare( int a, int b)

{

     a^=(1<<31); b^=(1<<31);

     int i=31;

    while ((i^-1) && !((a&(1<<i))^(b&(1<<i))))     i--;

     return (i^-1)?(((a>>i)&1)?1:-1):0;

}

 

int _tmain()

{

     int c;

     c = Cmp(5,4);

     cout<<c<<endl;

     return 0;

}

(一叶落而知天下秋) 的答案:

#define   COMPARE(a,b)   ((a)-(b)) ? b:a

2.如何输出源文件的标题和目前执行行的行数

cout   <<   "Filename   "   <<   __FILE__   <<   "   Line   "   <<   __LINE__   <<   endl;

3.两个数相乘,小数点后位数没有限制,请写一个高精度算法

  算法提示:

          输入 string a, string b 计算string c=a*b; 返回 c;

1    纪录小数点在a,b中的位置l1,l2 则需要小数点后移动位置数为l=length(a)+length(b)-l1-l2-2;

2    去掉a,b中的小数点,(a,b小数点后移,使a,b变为整数)

3    计算c=a*b; (同整数的大数相乘算法)

4    输出c,(注意在输出倒数第l个数时,输出一个小数点。若是输出的数少于l个,就补0

du51(郁郁思扬)的答案:


变为整数求就行了.输入的时候记一下,小数点位置..输出再做点文章就行了.
下面的是大整数的运算
.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
   int data;
   Node *next;
};
void output(Node *head)
{
   if(!head->next&&!head->data)return;
   output(head->next);
   cout<<head->data;
}
void Mul(char *a,char *b,int pos)        
{
   char *ap=a,*bp=b;
   Node *head=0;
   head=new Node;head->data=0,head->next=0;   //

   Node *p,*q=head,*p1;
   int temp=0,temp1,bbit;
   while(*bp)                //
若乘数不为空 ,继续.
   {
       p=q->next;p1=q;
       bbit=*bp-48;          //
把当前位转为整型

       while(*ap||temp)            //
若被乘数不空,继续
       {
           if(!p)            //
若要操作的结点为空,申请之
           {
               p=new Node;
               p->data=0;
               p->next=0;
               p1->next=p;
           }
           if(*ap==0)temp1=temp;
           else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
           p1->data=temp1%10;    //
留当前位
           temp=temp1/10;    //
进位以int的形式留下.
           p1=p;p=p->next;                 //
被乘数到下一位

       }
       ap=a;bp++;q=q->next;                //q
进下一位
   }
   p=head;
   output(p);                   //
显示
   cout<<endl;
   while(head)                 //
释放空间
   {
           p=head->next;
           delete head;
           head=p;
   }
}
int main()
{
   cout<<"
请输入两个数"<<endl;
   char test1[MAX],test2[MAX];
   cin.getline(test1,MAX,'/n');
   cin.getline(test2,MAX,'/n');
   Mul(strrev(test1),strrev(test2));
   system("PAUSE");
   return 0;
}
上面大整数已经写了.你加几个东西就行了
.
#include<iostream>
using namespace std;
#define MAX 10000
struct Node{
   int data;
   Node *next;
};
void output(Node *head,int pos)
{
   if(!head->next&&!head->data)return;
   output(head->next,pos-1);
   cout<<head->data;
   if(!pos)cout<<".";
}
void Mul(char *a,char *b,int pos)        
{
   char *ap=a,*bp=b;
   Node *head=0;
   head=new Node;head->data=0,head->next=0;   //

   Node *p,*q=head,*p1;
   int temp=0,temp1,bbit;
   while(*bp)                //
若乘数不为空 ,继续.
   {
       p=q->next;p1=q;
       bbit=*bp-48;          //
把当前位转为整型

       while(*ap||temp)            //
若被乘数不空,继续
       {
           if(!p)            //
若要操作的结点为空,申请之
           {
               p=new Node;
               p->data=0;
               p->next=0;
               p1->next=p;
           }
           if(*ap==0)temp1=temp;
           else { temp1=(p1->data)+(*ap-48)*bbit+temp;ap++; }
           p1->data=temp1%10;    //
留当前位
           temp=temp1/10;    //
进位以int的形式留下.
           p1=p;p=p->next;                 //
被乘数到下一位

       }
       ap=a;bp++;q=q->next;                //q
进下一位
   }
   p=head;
   output(p,pos);                   //
显示
   cout<<endl;
   while(head)                 //
释放空间
   {
           p=head->next;
           delete head;
           head=p;
   }
}
int main()
{
   cout<<"
请输入两个数"<<endl;
   char test1[MAX],test2[MAX],*p;
   int pos=0;
   cin.getline(test1,MAX,'/n');
   cin.getline(test2,MAX,'/n');
   if(p=strchr(test1,'.'))
   {
       pos+=strlen(test1)-(p-test1)-1;
       do
       {
           p++;
           *(p-1)=*p;
       }while(*p);
   }       
   if(p=strchr(test2,'.'))
   {
       pos+=strlen(test2)-(p-test2)-1;
       do
       {
           p++;
           *(p-1)=*p;
       }while(*p);
   }   
   Mul(strrev(test1),strrev(test2),pos);
   system("PAUSE");
   return 0;
}

4.写一个病毒

cout<<"一个病毒"<<endl;

(开玩笑的,没搞过,^_^)

 

5.让你在100000000个浮点数中找出最大的10000个,要求时间复杂度优。

//本算法使用快排,O(n*lg(n)) 

//最低可以找到线性算法,使用预先区域统计划分!类试于构造Quad Trees! 写起来代码会长些!

 

#include <stdio.h>

#include <stdlib.h>

 

#define Max 100000000

int a[Max+10];

 

int cmp( const void *a, const void *b)

{

     int *x = ( int *) a;

     int *y = ( int *) b;

     return *x-*y;

}

 

int main()

{

     int n=0;

     while (scanf("%d",&a[n])==1)     n++;

     qsort(a,n,4,cmp);

     for ( int i=0;i<3;i++)     printf("%d",a[ i ]);

     return 1;

}

5 、有 A B C D 四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时 1 2 5 10 分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在 17 分钟内这四个人都过桥?

Solution:关键是时间最长的两个人必须同时过桥

The First Time       A(1) B(2) 过桥, A(1) 返回 Cost 1+2
The Second Time
   C(5) D(10) 过桥, B(2) 返回 Cost
10+2
The Third Time     A(1)
B(2) 过桥 Cost
2

Total Time Cost
   (1+2)+(10+2)+2=17 minutes

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值