联发博动笔试 - 奋起的blog - CSDN博客

来源:百度文库 编辑:神马文学网 时间:2024/04/27 22:16:20

 联发博动笔试收藏

 

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

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

(1)   intStrToInt(const char *Str);

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

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

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

int StrToInt(char *Str)

{

assert(Str!=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)

{

assert(Str!=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);

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

递归:

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

{

     if(lower > upper){

         return -1;

     }

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

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

     {

         return mid;

     }

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

     {

         returnBinarySearch(array, lower, mid - 1, target);

     }

     else {

         returnBinarySearch(array, mid +1, upper, target);

     }

}

非递归:

int BinarySearch(const int* array, int lower, intupper, 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.下列程序的运行有什么结果或效果。
#defineMAX 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,即0~255(难道是-128~127?)

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的值是什么.

i3,i4栈,i1,p1,i2静态数据段。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;//assame as C)


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

举例:

一个整型数(An integer) int a;

 

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

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

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

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

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

6) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数( An array of ten pointers tofunctions 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;

}

改正:

voidRemoveHead(node **head)

{

 node *p = *head;

*head= (*head)->next;

free(p);

}