练习3.1 假定对于下标越界的数组元素即使取地址也是非法的,那么书中3.6节中的bufwrite程序应该如何写?
3.6节中的源程序是:
void bufwrite(char *p,int n)
{
while(n > 0){
int k,rem;
if(bufptr == &buffer[N])
flushbuffer();
rem = N - (bufptr - buffer);
k = n > rem ? rem : n;
memcpy(bufptr,p,k);
bufptr += k;
p += k;
n -= k;
}
}
按照自己的想法将
if(bufptr == &buffer[N])
改成如下语句:
if(bufptr > &buffer[N - 1])
练习3.2 个人觉得练习中的flush函数,效率会低一些,会多一步比较的操作
练习3.3 编写一个函数,对一个已排序的整数表执行二分查找。函数的输入包括一个指向表头的指针,表中的元素个数,以及待查找的数值。函数的输出是一个满足查找要求的元素的指针,当未查找到满足要求的数值时,输出一个NULL指针。
书写的程序如下:
int *FindNum(int *pTab,int TolNum,int FindNum)
{
int low = 0,high = TolNum - 1,mid = 0;
if(pTab[low] == FindNum){
return pTab;
}
if(pTab[high] == FindNum){
pTab = pTab + high;
return pTab;
}
while(low <= high){
mid = ((high - low) / 2) + low;
if(pTab[mid] == FindNum){
pTab = pTab + mid;
return pTab;
}
else{
if(pTab[mid] > FindNum)
high = mid - 1;
else
low = mid + 1;
}
}
return NULL;
}