return;
}20.请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?21.请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP与UDP呢?22.请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?
头文件中<>和“”的区别?
4、定义一个宏,输入两个参数,输出积。
1.以下三条输出语句分别输出什么?[C易](视编译器而定)charstr1[]="abc";charstr2[]="abc";constcharstr3[]="abc";constcharstr4[]="abc";constchar*str5="abc";constchar*str6="abc";cout< 答:分别输出false,false,true。str1和str2都是字符数组,每个都有其自己的存储区,它们的值则是各存储区首地址,不等;str3和str4同上,只是按const语义,它们所指向的数据区不能修改。str5和str6并非数组而是字符指针,并不分配存储区,其后的“abc”以常量形式存于静态数据区,而它们自己仅是指向该区首地址的指针,相等。 12.以下代码中的两个sizeof用法有问题吗?[C易]voidUpperCase(charstr[])//将str中的小写字母转换成大写字母{for(size_ti=0;iif('a'<=str[i]&&str[i]<='z')str[i]-=('a'-'A');}charstr[]="aBcDe";cout<<"str字符长度为:"< [color=#DC143C]13.非C++内建型别A和B,在哪几种情况下B能隐式转化为A?[C++中等]答:a.classB:publicA{……}//B公有继承自A,可以是间接继承的b.classB{operatorA();}//B实现了隐式转化为A的转化c.classA{A(constB&);}//A实现了non-explicit的参数为B(可以有其他带默认值的参数)构造函数d.A&operator=(constA&);//赋值操作,虽不是正宗的隐式类型转换,但也可以勉强算一个[/color] 4.以下代码有什么问题?[C++易]structTest{Test(int){}Test(){}voidfun(){}};voidmain(void){Testa(1);a.fun();Testb();b.fun();} 答:变量b定义出错。按默认构造函数定义对象,不需要加括号。 5.以下代码有什么问题?[C++易]cout<<(true1:"1")< 8.以下代码能够编译通过吗,为什么?[C++易]unsignedintconstsize1=2;charstr1[size1];unsignedinttemp=0;cin>>temp;unsignedintconstsize2=temp;charstr2[size2];答:str2定义出错,size2非编译器期间常量,而数组定义要求长度必须为编译期常量。 2.以下反向遍历array数组的方法有什么错误?[STL易]vectorarray;array.push_back(1);array.push_back(2);array.push_back(3);for(vector::size_typei=array.size()-1;i>=0;--i)//反向遍历array数组{cout< 答:首先数组定义有误,应加上类型参数:vectorarray。其次vector::size_type被定义为unsignedint,即无符号数,这样做为循环变量的i为0时再减1就会变成最大的整数,导致循环失去控制。 [color=#DC143C]9.以下代码中的输出语句输出0吗,为什么?[C++易]structCLS{intm_i;CLS(inti):m_i(i){}CLS(){CLS(0);}};CLSobj;cout< 答:不能。在默认构造函数内部再调用带参的构造函数属用户行为而非编译器行为,亦即仅执行函数调用,而不会执行其后的初始化表达式。只有在生成对象时,初始化表达式才会随相应的构造函数一起调用。[/color] [color=#DC143C]10.C++中的空类,默认产生哪些类成员函数?[C++易]答:classEmpty{public:Empty();//缺省构造函数Empty(constEmpty&);//拷贝构造函数~Empty();//析构函数Empty&operator=(constEmpty&);//赋值运算符Empty*operator&();//取址运算符constEmpty*operator&()const;//取址运算符const};[/color] 6.以下代码有什么问题?[STL易]typedefvectorIntArray;IntArrayarray;array.push_back(1);array.push_back(2);array.push_back(2);array.push_back(3);//删除array数组中所有的2for(IntArray::iteratoritor=array.begin();itor!=array.end();++itor){if(2==*itor)array.erase(itor);} 答:同样有缺少类型参数的问题。另外,每次调用“array.erase(itor);”,被删除元素之后的内容会自动往前移,导致迭代漏项,应在删除一项后使itor--,使之从已经前移的下一个元素起继续遍历。 [color=#DC143C]11.写一个函数,完成内存之间的拷贝。[考虑问题是否全面]答:void*mymemcpy(void*dest,constvoid*src,size_tcount){char*pdest=static_cast(dest);constchar*psrc=static_cast(src);if(pdest>psrc&&pdest{for(size_ti=count-1;i!=-1;--i)pdest[i]=psrc[i];}else{for(size_ti=0;ipdest[i]=psrc[i];}returndest;}[/color] 原题如下:#includestructbit{inta:3;intb:2;intc:3;}; intmain(intargc,char*argv[]){bits;char*c=(char*)&s;*c=0x99;cout<<<<< Output: 答案:此题在在X86little-endian下是1-1-4在powerPC等bigendian机器下,还要重新考虑 因为0x99在内存中表示为10011001,a=001,b=11,c=100当c为有符号数时,c=100,最高位1表示c为负数,负数在计算机用补码表示,所以c=-4;同理b=-1;当c为有符合数时,c=100,即c=4,同理b=3 位域的概念 有些信息在存储时,并不需要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:struct位域结构名{位域列表};其中位域列表的形式为:类型说明符位域名:位域长度例如:structbs{inta:8;intb:2;intc:6;};位域变量的说明与结构变量说明的方式相同。可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:structbs{inta:8;intb:2;intc:6;}data;说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明: 1.一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:structbs{unsigneda:4unsigned:0/*空域*/unsignedb:4/*从下一单元开始存放*/unsignedc:4}在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。 2.由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。 3.位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:structk{inta:1int:2/*该2位不能使用*/intb:3intc:2};从以上分析可以看出,位域在本质上就是一种结构类型,不过其成员是按二进位分配的。 二、位域的使用位域的使用和结构成员的使用相同,其一般形式为:位域变量名·位域名位域允许用各种格式输出。main(){structbs{unsigneda:1;unsignedb:3;unsignedc:4;}bit,*pbit; pbit=newbs; bit.a=1;bit.b=7;bit.c=15; pbit->a=1;pbit->b=2;pbit->c=3; printf("%d,%d,%d",bit.a,bit.b,bit.c);printf("%d,%d,%d",pbit->a,pbit->b,pbit->c);} 一、单项选择题(从四个备选答案中选择一个正确答案,每小题1分,共20分)1.C++中,关键字struct和class的区别仅仅在于(C)。 (A)struct用来定义结构体,而class用来定义类; (B)struct用来定义类,而class用来定义类结构体; (C)struct定义的类的缺省成员为公有的,而class定义的类的缺省成员为私有的; (D)struct定义的类的成员须全部为公有的,而class定义的类的成员可以为私有的; 2.以下程序执行后,输出结果为(C). #include intVar=3; voidmain(void) {intVar=10; ::Var++; cout<<”Var=”<<<”,::Var=”<<::Var< } (A)Var=11,::Var=11(B)Var=11,::Var=3 (C)Var=10,::Var=4(D)Var=4,::Var=10 3.抽象基类是指(C)。 (A)嵌套类(B)派生类 (C)含有纯虚函数(D)多继承类 4.如果有#defineAREA(a,b)a+b则语句ints=AREA(3,4)*AREA(3,4)执行后变量s值为(D)。 (A)24(B)49(C)144(D)19 5.C++中条件表达式的值为(C)。 (A)–1或者+1(B)–231~231–1(C)0或者1(D)0~231–1 6.现在有以下语句: structMyBitType {inta:3; unsignedb:3; unsignedc:20; intd; }; intsz=sizeof(MyBitType); 则执行后,变量sz的值将得到(B)。 (A)2(B)8(C)28(D)58 7.假设有一个C++类名为Country,则此类的析构函数为(C). (A)::Country()(B)void~Country(void) (C)~Country()(D)void~Country() 8.如果定义一个C++类CDate,语句“CDate*p=newCDate;”的含义是(A)。 (A)调用CDate类的缺省构造函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p; (B)调用CDate类的拷贝构造函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p; (C)调用CDate类的析构函数从内存中分配一个CDate类型的对象,并将该对象地址赋值给指针p; (D)从内存中释放指针p所指向的CDate类的对象; 9.如果有一个类CRect及语句“CRectx1,x2;”要使语句“x1=x2;”合法,可在类中定义成员函数(C)。 (A)intoperator(x2)(B)intoperator=(x2) (C)voidoperator=(CRect&);(D)voidoperator=() 10.结构体变量S实际所占内存的大小为(A)字节。 (A)sizeof(S)(B)strlen(S) (C)结构体中最长成员的长度(D)结构体中最短成员的长度 11.在C++中,下列算符(D)不能重载。 (A)<<(B)>>(C)delete(D):: 12.下列正确的是(D) (A)结构不能有构造函数、析构函数;(B)缺省时类的成员是公有的; (C)类中如果定义了析构函数,则必须定义构造函数; (D)缺省时结构的成员是公有的; 13.下列关于静态数据成员正确的是(B) (A)可以通过this指针访问静态数据;(B)可以用类名和作用域访问静态数据; 14.下列关于友元正确的说法是(D) 15.基类的(A)在派生类内不能被访问。 (A)私有成员(B)保护成员 (C)公有数据成员(D)公有静态数据成员 16.下列关于运算符重载的描述中正确的是(D) (A)运算符重载可以改变该运算符的优先级; (B)运算符重载可以改变该运算符目数,即该算符运算的操作数个数; (C)运算符重载函数只能在类中定义; (D)new和delete允许重载; 17.左值是指(A) (A)赋值算符左边的变量;(B)赋值算符左边的表达式的值; (D)出现在赋值算符右边的表达式的值; (E)二元算符左边表达式的值; (A)voidvirtualprint()=0;(B)virtualvoidprint()=0; (C)virtualvoidprint(){};(D)virtualvoidprint(); 19.如果在类对象a的类中重载运算符“+”,则a+5的显示调用方式为(C) (A)a.operator(5)(B)a->operator+(5); (C)a.operator+(5)(D)5.operator+(a) 20.一个类如果有一个以上的基类就叫做(B)。 (A)循环继承(B)单继承 (C)非法继承(D)多继承 二、多项选择题(从五个备选答案中选择2~5个正确答案,每小题2分,共10分)1.如果已定义了一个C++类CMyList并有以下语句: CMyListlist(3); 以下说法正确的是(AC)。 (A)该语句会创建一个CMyList类的一个对象; (B)该语句会创建一个CMyList类的3个对象; (C)必须为类CMyList定义一个构造函数; (D)必须为类CMyList定义一个析构函数; (E)必须定义函数CMyListlist(int); 2.以下说法正确的是(ABCDE)。 (A)内联(inline)函数改善了函数调用的执行效率。 (B)类A的友元(friend)函数可以访问类A的私有成员。 (C)类A的友元(friend)类B可以访问类A的私有成员。 (D)类A的静态数据成员为类A的所有对象所共享。 (E)类A的静态成员函数没有传递this指针作为参数。 3.类B从类A派生,则类B可以访问类A中的(AC)成员。 (A)public成员(B)private成员(C)protected成员 (D)数据成员(E)函数成员 4.面向对象的程序设计语言具有(ABE)等共同特性。 (A)封装性(B)多态性(C)简单性(D)复杂性 (E)继承性 5.现有一个程序如下: classA {public: voidf(){cout<<"A::f()"< classB voidf(){cout<<"B:f()"< voidg(){cout<<"B:g()"< classC:publicA,publicB voidg(){cout<<"C::g()"< voidh() {cout<<"C::h()"< f();//语句1 voidmain() {Cobj; obj.f();//语句2 obj.A::f();//语句3 obj.B::f();//语句4 obj.g();//语句5 则编译时会产生错误的语句有(AB)。 (A)语句1(B)语句2(C)语句3 (D)语句4(E)语句5 三、判断分析题(正确的画上√,错误的画上×,每小题1分,共10分)1.如果一个类的所有对象都共享某一个变量,则应当将该变量定义为该类的static成员。(√) 2.语句“typedefstruct_MYSTRUC{intx;inty;doublez;}MYSTRUC;”是非法语句。(×) 3.语句“int(*p)(intx,inty);”说明了p是一个指向整数的指针。(×) 4.VisualC++集成开发环境中,一个Workspace中只能创建一个Project。(×) 5.能访问一个类CMyClass中的private成员的可以是类CMyClass的成员函数,友元函数和友元类中的函数。(√) 6.所有的MFC应用程序都必须有一个且只有一个CWinApp对象。(√) 7.C++中的多态性就是指在编译时,编译器对同一个函数调用,根据情况调用不同的实现代码。(×) 8.在for循环中,是先执行循环体后再判断循环条件。(×) 9.C++中,如果条件表达式值为-1,则表示逻辑为假。(×) 10.在C++中用new分配的内存空间,在不需要时一般用free将该空间释放。(×) 四、填空题(每空2分,共20分)1.以下函数完成求表达式的值,请填空使之完成此功能。 floatsum(floatx) {floats=0.0; intsign=1; floatt=1.0; for(inti=1;i<=100;i++) { t=t*x; s=s+-sign*i/(t+sign*i); sign=-sign; returns; 2.以下程序中实现类CSort,完成对其成员p所指向的整数数组进行从小到大排序,该数组的元素个数由num表示,请填空完善该程序。 classCSort int*p; intnum; public: voidOrder(); CSort(int*,int); voidDisp(); CSort::CSort(int*arry,intn) :p(arry),num(n) {} voidCSort::Order()//函数Order原型 {intm,tmp; for(inti=0;i {m=i; for(intj=i+1;j {if(p[j] m=j; if(m!=i) {tmp=p[i]; p[i]=p[m]; p[m]=tmp; voidCSort::Disp() {for(inti=0;i cout<<<","; cout<< {staticinta[]={10,-15,-3,5,-4,7,2}; CSortobj(a,2); obj.Disp();//应输出一行:10,-15,-3,5,-4,7,2 obj.Order();//对数组排序 obj.Disp();//应输出一行:-15,-4,-3,2,5,7,10 3.以下函数完成求两个数n1和n2的最大公约数。 intfac(intn1,intn2) {inttmp; if(n1 {tmp=n1; n1=n2; n2=tmp; while(n1%n2!=0) {tmp=n1%n2;n1=n2;n2=tmp; returnn2; 2005年华为招聘--C语言笔试试题 一、判断题(对的写T,错的写F并说明原因,每小题4分,共20分) 1、有数组定义inta[2][2]={{1},{2,3}};则a[0][1]的值为0。() 2、int(*ptr)(),则ptr是一维数组的名字。() 3、指针在任何情况下都可进行>,<,>=,<=,==运算。() 4、switch(c)语句中c可以是int,long,char,float,unsignedint类型。() 5、#defineprint(x)printf("theno,"#x",is") 二、填空题(共30分) 1、在windows下,写出运行结果,每空2分,共10分。 charstr[]="Hello"; char*p=str; intn=10; sizeof(str)=() sizeof(p)=() sizeof(n)=() voidfunc(charstr[100]) 2、voidsetmemory(char**p,intnum) {*p=(char*)malloc(num);} voidtest(void) {char*str=NULL; getmemory(&str,100); strcpy(str,"hello"); printf(str); 运行test函数有什么结果?()10分 3、设intarr[]={6,7,8,9,10}; int*ptr=arr; *(ptr++)+=123; printf("%d,%d",*ptr,*(++ptr)); ()10分 二、编程题(第一小题20,第二小题30分) 1、不使用库函数,编写函数intstrcmp(char*source,char*dest) 相等返回0,不等返回-1; 2、写一函数intfun(char*p)判断一字符串是否为回文,是返回1,不是返回0,出错返回-1 五、阅读程序题(每个小题5分,共20分)1.阅读以下程序,概括地写出程序的功能。 doubleExp(doublex) {doublesum=1.0; doubleterm=x; doublei=1; while(term>=1.0E-8) {sum+=term; i++; term=term*x/i; returnsum; {doubles; s=Exp(1.0)+Exp(2.0); cout.precision(8); cout<<"s="<< zz 2.阅读程序,写出程序执行时输出结果。 constintSIZE=10; classstack {charstck[SIZE]; inttop; voidinit(); voidpush(charch); charpop(); voidstack::init() {top=0;} voidstack::push(charch) {if(top==SIZE) {cout<<"Stackisfull.\n"; stck[top++]=ch; charstack::pop() {if(top==0) {cout<<"Stackisempty.\n"; return0; returnstck[--top]; {stacks1,s2; s1.init(); s2.init(); s1.push('a'); s1.push('b'); s1.push('c'); s2.push('x'); s2.push('y'); s2.push('z'); for(inti=0;i<3;i++) cout<<"Pops1:"<< for(i=0;i<3;i++) cout<<"Pops2:"<< 程序结果: Pops1:c Pops1:b Pops1:a Pops2:z Pops2:y 3.阅读程序,写出程序运行时输出结果。 classTdate Tdate(); Tdate(intd); Tdate(intm,intd); Tdate(intm,intd,inty); protected: intmonth; intday; intyear; Tdate::Tdate() {month=4; day=15; year=1995; cout<<<"/"<<<"/"<< Tdate::Tdate(intd) day=d; year=1996; Tdate::Tdate(intm,intd) {month=m; year=1997; Tdate::Tdate(intm,intd,inty) year=y; {Tdateaday; Tdatebday(10); Tdatecday(2,12); Tdatedday(1,2,1998); 运行结果: 4/15/1995 4/10/1996 2/12/1997 1/2/1998 4.阅读程序,写出程序运行时输出结果。 classshape shape(doublex,doubley):xCoord(x),yCoord(y){} virtualdoubleArea()const{return0.0;} doublexCoord,yCoord; classAA:publicshape AA(doublex,doubley,doubler):shape(x,y),rad(r){} virtualdoubleArea()const{return3.0*rad*rad;} doublerad; classBB:publicshape BB(doublex1,doubley1,doublex2,doubley2) :shape(x1,y1),x2Coord(x2),y2Coord(y2){} virtualdoubleArea()const; doublex2Coord,y2Coord; doubleBB:Area()const {returnfabs((xCoord-x2Coord)*(yCoord-y2Coord)); //库函数fabs(doublet)求得t的绝对值 voidfun(constshape&sp) {cout<< {AAaa(2.0,5.0,4.0); fun(aa); BBbb(2.0,8.0,12.0,17.0); fun(bb); 48 30 六、编写程序题(每小题10分,共20分)1.编写一个函数intJudge(int*pArray,intn),判断一个n×n二维整数数组pArray是否为“魔方阵”,若是返回1,否则返回0。所谓魔方阵就是将1到n2的各个数字组成的方阵,它的每一行、每一列以及两个对角线上数字之和均相等。例如,3×3的中,A是魔方阵,而B不是魔方阵。然后在主程序中调用Judge函数判断数组A是否为魔方阵。 参考程序 intJudge(int*pArray,intn) {ints1,s2,s3,s4,sum=0; int*p=pArray; for(inti=1;i<=n*n;i++) {intFound=0;//为0,不在方阵中; for(intj=0;j if(p[j]==i) {Found=1;//为1,在方阵中 break; if(Found==0)return0;//值为i的元素不在数组中,显然不是魔方阵