您的位置:首页 > 职场人生

几道面试题

2013-02-22 14:28 120 查看
1、一张纸上有若干个点,任意划一条线,让它通过的点数最多,设计程序实现

其实转换一下思路就比较容易了。

我们知道每条直线都有自己的k值和b值,依次遍历所有的点,就获得N个(k,b)对,然后在这些数据中找到相同的数量最多的一种。

2、如何获取源文件的标题和行数

使用预处理器

__FILE__ 文件名

__LINE__ 当前行号

__TIME__ 文件被编译的时间

__DATE__ 文件被编译的日期

3、两个数相乘,小数点后位数没有限制,请写出一个高精度算法与大数相乘原理一样,只是调整小数点位置,即有效小数个数。

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

这里还是记录小数点的位置,然后小数点后移,大数相乘,再移回小数点

4、关于static

一个变量如果位于函数的作用域内,但生命期却跨越了这个函数的多次调用,这种变量往往很有用。

static局部对象确保不迟于在程序执行流程第一次经过该对象的定义语句时进行初始化,这种对象一旦被创建,在程序结束前都不会被撤销。当定义静态局部对象的函数结束时,静态局部对象不会被撤销。在该函数被多次调用的过程中,静态局部对象会持续存在并保存它的值。---以上来自C++ Primer

在同时编译多个文件时,未加static的变量都具有全局可见性。这样就可以解决命名冲突的问题。

static的第二个作用就是保持变量内容的持久,储存在静态存储区的内容会在程序刚开始运行时就进行初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。

与全局变量相比,static限制了其作用域。全局变量在整个源程序中有效,而static变量只在单个源文件中有效。

5、Typedef 在C语言中频繁用以声明一个已经存在的数据类型的同义字。也可以用预处理器做类似的事。例如,思考一下下面的例子:

#define dPS struct s *

typedef struct s * tPS;

以上两种情况的意图都是要定义dPS 和 tPS 作为一个指向结构s指针。哪种方法更好呢?(如果有的话)为什么?

这是一个非常微妙的问题,任何人答对这个问题(正当的原因)是应当被恭喜的。

答案是:typedef更好。思考下面的例子:

dPS p1,p2;

tPS p3,p4;

第一个扩展为

struct s * p1, p2;

上面的代码定义p1为一个指向结构的指,p2为一个实际的结构,这也许不是你想要的。第二个例子正确地定义了p3 和p4 两个指针。

6、 main()

{

int x = 1, y = 2;

x = x++ + y++;

y = ++x + ++y;

printf("%d %d", x, y);

}

结果为 5,9 因为i++ 的优先级比 + 高

7、 写一个“标准”宏MIN,这个宏输入两个参数并返回较小的一个。

这个测试是为下面的目的而设的:

1) 标识#define在宏中应用的基本知识。这是很重要的。

因为在 嵌入(inline)操作符 变为标准C的一部分之前,

宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,

为了能达到要求的性能,嵌入代码经常是必须的方法。

2)三重条件 操作符的知识。这个操作符存在C语言中的原因是

它使得编译器能产生比if-then-else更优化的代码,

了解这个用法是很重要的。

3) 懂得在宏中小心地把参数用括号括起来

4) 我也用这个问题开始讨论宏的副作用,

例如:当你写下面的代码时会发生什么事?

least = MIN(*p++, b);

#include <iostream>
using namespace std;
const int Max = 6;
#define MIN(A,B) ((A)<=(B)?(A):(B))
int _tmain(int argc, _TCHAR* argv[])
{
    int *pt = new int[Max];
    cout<<"Please enter a number: ";
    for (int i=0;i<Max;i++)
    {
       cin>>pt[i];
       cout<<"Enter next number: ";
    }
    int b = pt[Max-1];
    int least = MIN(*pt++,b);
    cout<<"About MIN(*p++,b): "<<least<<endl;
    delete [] pt;
    pt = NULL;
    system("pause");
    return 0;
}


没有弄清楚结果为什么是2,难道是因为在define里面连续两次使用了*pt++

8、在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序数对。一个排列中逆序的总数就称为这个排列的逆序数。如{2,4,3,1}中,2和1,4和3,4和1,3和1是逆序数对,因此整个数组的逆序数对个数为4,现在给定一数组,要求统计出该数组的逆序数对个数。

#include <iostream>
using namespace std;

int main()
{
    cout<<"假定逆序队列已定"<<endl;
    const int MAXn=8;
    int list[MAXn]={1,7,2,9,6,4,5,3};
    int rnum=0;
    for(int i=0;i<MAXn;++i)
    {
       for(int j=i+1;j<MAXn;++j)
       {
          if(list[i]>list[j])
            rnum++;
        }
     }
     cout<<"逆序数为"<<rnum<<endl;
     return 0;
}


9. 用变量a给出下面的定义

a) 一个整型数(An integer)

b) 一个指向整型数的指针(A pointer to an integer)

c) 一个指向指针的的指针,它指向的指针是指向一个整型数(A pointer to a pointer to an integer)

d) 一个有10个整型数的数组(An array of 10 integers)

e) 一个有10个指针的数组,该指针是指向一个整型数的(An array of 10 pointers to integers)

f) 一个指向有10个整型数数组的指针(A pointer to an array of 10 integers)

g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a function that takes an integer as an argument and returns an integer)

h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers to functions that take an integer argument and return an integer )

a) int a;

b) int *a;

c) int **a;

d) int a[10];

e) int *a[10];

f) int (*a)[10];

g) int (*a)(int);

h) (*a[10])(int);

10、TCP协议栈如何进行流量控制

TCP使用滑动窗口进行流量控制,当接受方的缓存空间吃紧,在发送确认报文时,将其中的窗口值调小甚至变0,这样就限制的发送发发送报文的速度
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: