昨天去联发博动笔试了,人那个多呀,人山人海~~ 第一题,请编写两个函数,函数的接口如下所示。第一个函数负责把一个ASCII字符串转换成一个带符号整数,第二个寒暑负责把一个带符号的整数转换为一个ASCII字符串。 (1) int StrToInt(const char *Str); (2) int IntToStr(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, 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; } 问答题。 int main(void){ unsigned char 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.youkuaiyun.com/haiyan0106/archive/2008/10/09/3043998.aspx 5.以下程序有什么问题。如果有问题,那该程序运行是正确的,为什么。 If(pa== NULL || pb==NULL) Return 0; *pt = *pa; 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为随机值。 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) 举例: 一个整型数(An integer) int a; 1)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to an intege)r 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); Void put(short num1, short num2, int& result) { int t = (int)num1; result = (t<<16)+ num2; } 10.下面是一个用来删除单向链表头节点的函数,请找出其中程序的漏洞并加以改正。 { free(head); head = head->next; } 改正: void RemoveHead(node **head) { node *p = *head; *head = (*head)->next; free(p); }
说题目吧。
第二题:请实现二分搜索函数,该函数对一个排好序的整数数组进行二分法搜索,函数原型如下:
1.下列程序的运行有什么结果或效果。
#define MAX 255
unsigned char a[MAX];
for(i=0; i<=MAX; i++)
{
a[i] = i;
}
int ExchangeValue(int *pa, int *pb)
{
int *pt;
*pa = *pb;
*pb =*pt;
return 1;
}
7。下列哪些语句没有编译和运行错误,对有错误的组,说明哪些语句是错误的,为什么。
8. 用变量a给出下面的定义
9.将两个有符号16位数分别放入有符号32位的高16位和低16位,写代码。不要使用函数返回值传递数据。
void RemoveHead(node *head)
这个公司连面试机会都没有给我,听说已经有同学拿到了offer,效率真高。人家都说80%的offer掌握在20%的人手里。而我是80%的人。加油吧。