随笔-4  评论-0  文章-0  trackbacks-0

一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分)

1、有数组定义int a[2][2]={{1},{2,3}};则a[0][1]的值为0。(     正确 )

2、int (*ptr) (),则ptr是一维数组的名字。( 错误 int (*ptr) ();定义一个指向函数的指针变量    )

3、指针在任何情况下都可进行>,<,>=,<=,==运算。(    错误 )

4、switch(c) 语句中c可以是int ,long,char ,float ,unsigned int 类型。(   错,不能用实形 )

二、填空题(共30分)

1、在windows下,写出运行结果,每空2分,共10分。

char str[ ]= "Hello";

char *p=str;

int n=10;

sizeof(str)=(      )

sizeof(p)=(       )

sizeof(n)=(       )

void func(char str[100]){    }

sizeof(str)=(     )

答案:6,4,4,4, 具体解释请参看我的空间里的“C/C++程序员应聘试题剖析

2、void getmemory(char **p, int num)

{ *p=(char *) malloc(num);}

void test(void)

{ char *str=NULL;

   getmemory(&str,100);

   strcpy(str,"hello");

   printf(str);

}

运行test函数有什么结果?(                                )10分

答案:输出hello,但是发生内存泄漏。

3、设int arr[]={6,7,8,9,10};

     int *ptr=arr;

   *(ptr++)+=123;

printf("%d,%d",*ptr,*(++ptr));

(                                   ) 10分

答案:8,8。这道题目的意义不大,因为在不同的编译器里printf的参数的方向是不一样的,在vc6.0下是从有到左,这里先*(++ptr) 后*pt,于是结果为8,8

二、编程题(第一小题20,第二小题30分)

1、 不使用库函数,编写函数int strcmp(char *source, char *dest)

相等返回0,不等返回-1;

答案:一、

int strcmp(char *source, char *dest)
{
assert((source!=NULL)&&(dest!=NULL));
int i,j;

for(i=0; source[i]==dest[i]; i++)
{
   if(source[i]=='\0' && dest[i]=='\0')
    return 0;
   else
    return -1;
}
}

答案:二、

int strcmp(char *source, char *dest)
{

    while
( (*source != '\0') && (*source == *dest))
    {

source++;
dest
++;
    }


    return
( (*source) - (*dest) ) ? -1 : 0;

}

2、 写一函数int fun(char *p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1

答案:一、

int fun(char *p)
{
if(p==NULL)
   return -1;
else
{
   int length = 0;
   int i = 0;
   int judge = 1;
   length = strlen(p);
   for(i=0; i<length/2; i++)
   {
    if(p[i]!=p[length-1-i])
     judge = 0;
    break;
   }
   if(judge == 0)
    return 0;
   else
    return 1;
}
}

答案:二、

int fun(char *p)
{

int
len = strlen(p) - 1;
char
*q = p + len;
if
(!p)
return
-1;
while
(p < q) {
if
((*p++) != (*q--))
return
0;
}

return
1;
}
 
华为笔试网络题(3)
2006-09-30 12:48
1.OSI 7 层模型中,网络层的功能有( )
A.确保数据的传送正确无误   B.确定数据包如何转发与路由
C.在信道上传送比特流    D.纠错与流控
2.FDDI 使用的是___局域网技术。( )
A.以太网;    B.快速以太网;    C.令牌环;    D.令牌总线。
3.下面那种LAN 是应用CSMA/CD协议的 ()
A.令牌环    B.FDDI    C.ETHERNET    D.NOVELL
4.TCP UDP 协议的相似之处是 ( )
A.面向连接的协议    B.面向非连接的协议    C.传输层协议    D.以上均不对
5.应用程序PING 发出的是___报文.( )
A.TCP 请求报文。    B.TCP 应答报文。    C.ICMP 请求报文。   D.ICMP 应答报文。
6.以下说法错误的是() ( )
A.中继器是工作在物理层的设备    B.集线器和以太网交换机工作在数据连路层
C.路由器是工作在网络层的设备     D.桥能隔离网络层广播
7.当桥接收的分组的目的MAC地址在桥的映射表中没有对应的表项时,采取的策略是( )
A.丢掉该分组   B.将该分组分片    C.其他端口广播该分组    D.以上答案均不对
8.LAN Switch 在网络层次模型中的地位( )
A.物理层    B.链路层    C.网络层    D.以上都不是
9.小于___TCP/UDP端口号已保留与现有服务一一对应,此数字以上的端口号可自由分配。( )
A.199      B.100     C.1024      D.2048
10.当一台主机从一个网络移到另一个网络时,以下说法正确的是 ( )
A.必须改变它的IP 地址和MAC 地址    B.必须改变它的IP 地址,但不需改动MAC 地址

C.必须改变它的MAC 地址,但不需改动IP 地址    D.MAC 地址.IP 地址都不需改动

答案:1.B; 2.C; 3.C; 4.C; 5.C; 6.BD; 7.C; 8.B; 9.C; 10.B.

 
华为笔试题(4)
2006-09-30 13:00
1. 找错

void test1()
{
    char string[10];
    char* str1="0123456789";
    strcpy(string, str1);
}

答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char string[11],这样最后一个元素可以存储字符串结尾符'\0';


void test2()
{
    char string[10], str1[10];
for(int I=0; I<10;I++)
{
    str1[I] ='a';
}
strcpy(string, str1);
}

答:strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='\0',这样就正常了。


void test3(char* str1)
{
    char string[10];
    if(strlen(str1)<=10)
{
    strcpy(string, str1);
}
}

答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)<=10改为strlen(str1)<10。

2. 找错

#define MAX_SRM 256

DSN get_SRM_no()
{
    static int SRM_no;
    int I;
    for(I=0;I<MAX_SRM;I++,SRM_no++)
{
    SRM_no %= MAX_SRM;
    if(MY_SRM.state==IDLE)
    {
      break;
    }
}
if(I>=MAX_SRM)
    return (NULL_SRM);
else
    return SRM_no;
}

答:我不知道这段代码的具体功能,但明显有两个错误
1,SRM_no没有赋初值
2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为SRM_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉static声明。

3. 写出程序运行结果

int sum(int a)
{
    auto int c=0;
    static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
    int I;
int a=2;
for(I=0;I<5;I++)
{
    printf("%d,", sum(a));
}
}

答:8,10,12,14,16
该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。


4.

int func(int a)
{
    int b;
    switch(a)
    {
        case 1: b=30;
        case 2: b=20;
        case 3: b=16;
        default: b=0;
   }
   return b;
}

则func(1)=?
答:func(1)=0,因为没有break语句,switch中会一直计算到b=0。这是提醒我们不要忘了break。呵呵。

5:

int a[3];
a[0]=0; a[1]=1; a[2]=2;
int *p, *q;
p=a;
q=&a[2];

则a[q-p]=?
答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点

6.
定义 int **a[3][4], 则变量占有的内存空间为:_____
答:此处定义的是指向指针的指针数组,对于32位系统,指针占内存空间4字节,因此总空间为3×4×4=48。

7.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
答:

/*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/
void NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond)
{
int nDays;
(*nSecond)++; // 秒加1
if(*nSecond>=60) // 秒满60,做出特殊处理,下面时,日,月等类同
{
    *nSecond=0;
    (*nMinute)++;
    if(*nMinute>=60)
    {
      *nMinute=0;
      (*nHour)++;
      if(*nHour>=24)
      {
        *nHour=0;
        (*nDate)++;
        switch(*nMonth)
        {
          case 1:
          case 3:
          case 5:
          case 7:
          case 8:
          case 10:
          case 12:
            nDays=31;
          break;
          case 2:// 判断闰年
            if(*nYear%400==0||*nYear%100!=0&&*nYear%4==0)
            {
            nDays=29;
            }
            else
            {
            nDays=28;
            }
          break;
          default:
            nDays=30;
          break;
        }
        if(*nDate>nDays)
        {
          *nDate=1;
          (*nMonth)++;
          if(*nMonth>12)
          {
          *nMonth=1;
          (*nYear)++;
          }
        }
      }
    }
}
}
/*示例可运行代码*/
void main()
{
int nYear=2004,nMonth=12,nDate=31,nHour=59,nMinute=59,nSecond=59;
NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond);
printf("The result:%d-%d-%d %d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond);
}

 

posted on 2008-11-18 20:19 Rockin 阅读(159) 评论(0)  编辑 收藏 引用
只有注册用户登录后才能发表评论。