昨天去联发博动笔试了,人那个多呀,人山人海~~
说题目吧。
第一题,请编写两个函数,函数的接口如下所示。第一个函数负责把一个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;
}
问答题。
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,即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;//as same as C)
8. 用变量a给出下面的定义
举例:
一个整型数(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);
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);
}
这个公司连面试机会都没有给我,听说已经有同学拿到了offer,效率真高。人家都说80%的offer掌握在20%的人手里。而我是80%的人。加油吧。