分享

联发博动笔试

 jason zhai 2010-08-04

  联发博动笔试 收藏

 

昨天去联发博动笔试了, 人那个多呀,人山人海~~
说 题目吧。

第一题,请编写两个函 数,函数的接口如下所示。第一个函数负责把一个ASCII字符串转换成一个带符号整数,第二个寒暑负责把一个带符号的整数转换为一个ASCII字符串。

(1)   int StrToInt(const char *Str);

(2)   int IntToStr(int num, char *Str);

已知条件:传递给IntToStr函数的缓冲区的长度足以容纳下int整数范围内的数,传递给StrToInt

的字符串只包含数字和负 号,是一个格式正确的整数值。

int StrToInt(char *Str)

{

assertStr = NULL;

     int num = 0;

     char *p = Str;

     int flag = 0;

     if(*p == '-')

     {

         flag = 1;

         p++;

     }

     while(*p !='\0')

     {

         num += (int)(*p - 48);

         num *=10;

         p++;

     }

     num /=10;

     if(flag)

     {

         num = -num;

     }

     return num;

 

}

 

int IntToStr(int num, char *Str)

{

assertStr = NULL;

     char *p =Str;

     if(num<0)

     {

         *p = '-';

         p++;

         num =-num;

     }

     while(num>0)

     {

         *p = (char)(num%10 + 48);

         p++;

         num /= 10;

     }

     *p = '\0';

     char *q = Str;

     if(*q == '-')

     {

         q++;

     }

     p--;

     while(q < p)

     {

         char t = *q;

         *q = *p;

         *p = t;

         q++;

         p--;

     }

     return 1;

}
第二题:请实现二分搜索函数,该函数对一个排好序的整数数组进行二分法搜索,函数原型如下:

int BinarySearch(const int* array, int lower, int upper, int target);

其中lowerupper分别是需要进行搜索的开始和结束的索引值,分别用递归和非递归 两种方式实现该函数。

递 归:

int BinarySearch(const int* array, int lower, int upper, int target)

{

     if(lower > upper){

         return -1;

     }

     int mid = lower + (upper - lower)/2;

     if(target == *(array + mid))

     {

         return mid;

     }

     else if (target < *(array + mid))

     {

         return BinarySearch(array, lower, mid - 1, target);

     }

     else {

         return BinarySearch(array, mid +1, upper, target);

     }

}

非 递归:

int BinarySearch(const int* array, int lower, int upper, int target)

{

     assert(upper > = lower);

     while(lower <= upper){

     int mid = lower + (upper - lower)/2;

     if(target == *(array + mid))

     {

         return mid;

     }

     else if (target < *(array + mid))

     {

         upper = mid - 1;

     }

     else {

         lower = mid +1;

     }

     }

     return -1;

}

问答题。
1.
下列程序的运行有什么结果或效果。
#define MAX 255

int main(void){

unsigned char i;
unsigned char a[MAX];
for(i=0; i<=MAX; i++)
{
a[i] = i;
}

return 0;

}

无 限循环

2.32位小端字序系统里,

Char array[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

Char *cp=array;

int *ip=(int*)array;

1*(cp+2)=?

(2) *(ip+2)=?

*(cp+2)应该是2所对应的ASCII码吧,*(ip+2)=185207048(VC6.0的结果,不知道怎么算出来的,偶怎么 也算不出这个数)

3. c是 一个char型 的变量,c的取值 范围是多少。如果c的值是0xf0,那么c>>3 =?,请给出十进制的答案。

0x00~0xff,0255(难道是-128127?)

c>>3= -16(vc6.0的结果,不知道为什么)

4.调用 函数时,请列举不使用函数原型潜在的风险。

这 个的详细答案在另外的文章,请参考:

http://blog.csdn.net/haiyan0106/archive/2008/10/09/3043998.aspx

5.以下 程序有什么问题。如果有问题,那该程序运行是正确的,为什么。
int ExchangeValue(int *pa, int *pb)
{
    int *pt;

If(pa== NULL || pb==NULL)

Return 0;

*pt = *pa;
    *pa = *pb;
    *pb =*pt;
    return 1;
}

int *pt = new int(1);

没有为pt所指向的对象分配空间,造成运行错误。

6.

int i1;

Const char *p1 = “AAA”;

int main(){

static int i2;

int i3;

int *i4 = malloc(sizeof(int));

}

上面程序中的变量(i1,ip1,i2,i3,i4)分别存在于哪些内存位置(数据段,堆栈,堆)?i1,i2,i3,*i4的值是什么.

i3i4栈,i1p1i2静态数据段。i1=0,i2=0,i3,*i4为随机值。
7
。下列哪些语句没有编译和运行错误,对有错误的组,说明哪些语 句是错误的,为什么。

A)   const int a;//只读,必须初始化

B)   char *pa =”AAA”;

const char *pb = “BBB”;

pb = pa;//正确

C)    

char *pa = “AAA”:

char *const pb =”BBB”;

char *const pc = (char *)malloc(4);

*pb=’A’;//这个

*(pc+1) = ‘A’;

Pb = pa;//pb是一个常指针,不能为左值

D)

Char *pa;

Const char* const pb=”BBB”;

Char * const pc;//A一样,得初始化

Pa = “AAA”;

Pc = pa;//as same as C)


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

举例:

一个整型数(An integer int a;

 

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

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

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

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

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

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

1) int **a;

2) int a[10];

3) int *a[10];

4) int (*a)[10];

5) int (*a)(int);

6) int (*a[10])(int);
9.
将两个有符号16位数分别放入有符号32位的高16位和低16位,写代码。不要使用函数返回值传递数据。

Void put(short num1, short num2, int& result)

{

int t = (int)num1;

result = t<<16+ num2;

}

10.下面是一个用来删除单向链表头节点的函数,请找出其中程序的漏 洞并加以改正。
void RemoveHead(node *head)

{

free(head);

head = head->next;

}

改正:

void RemoveHead(node **head)

{

 node *p = *head;

*head = (*head)->next;

free(p);

}

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多