计算机专业面试题目_第1页
计算机专业面试题目_第2页
计算机专业面试题目_第3页
计算机专业面试题目_第4页
计算机专业面试题目_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算机专业面试题集计算机随笔 2008-05-05 19:28:18阅读 2083 评论 0 字号 : 大中小订阅一些面试准备题 ( 包括高质量 c+题)const char*, char const*, char*const的区别问题几乎是C+面试中每次都会有的题目。事实上这个概念谁都有只是三种声明方式非常相似很容易记混。Bjarne 在他的 The C+ Programming Language 里面给出过一个助记的方法:把一个声明从右向左读。char * const cp; ( *读成 pointer to )const cp指向字符串 ; 即指向字符串的常指针 ;const char

2、* p;p 指向字符串常量 , 即指向字符串常量的指针;char const * p;这个和上面的事一样的 , 表达的意思也是指向字符串常量的指针同上因为 C+里面没有 const* 的运算符 , 所以 const 只能属于前面的类型。-下面这个程序执行后会有什么错误或者效果:#define MAX 255int main()unsigned char AMAX,i;for (i=0;i<=MAX;i+)Ai=i;解答 :MAX=255数组 A 的下标范围为 :0.MAX-1, 这是其一 .其二 . 当 i 循环到 255 时, 循环内执行 :A255=255;这句本身没有问题 . 但是

3、返回 for (i=0;i<=MAX;i+)语句时 ,由于unsigned char的取值范围在(0.255),i+以后i又为0 了.无限循环下去 .注 :char类型为一个字节, 取值范围是-128,127,unsigned char 0 ,255-编写用 C语言实现的求 n 阶阶乘问题的递归算法 :*仅仅只要是一个算法就 ok, 不用管那么多 , 能用就行。long int fact(int n)int x;long int y;if(n<0)printf("error!");if(n=0)return 1;x=n-1;y=fact(x); /这是一个递归调

4、用过程 ,return (n*y);Long int fact(int n)If(n<0)Printf(“error ”);If(n=0)Return 1;ElseReturn n*fact(n-1);-二分查找算法 :/已经在排好序的情况下进行查找1、递归方法实现 :int BSearch(elemtype a,elemtype x,int low,int high)/* 在下届为 low, 上界为 high 的数组 a 中折半查找数据元素x*/int mid;if(low>high) return -1;/errormid=(low+high)/2;if(x=amid) ret

5、urn mid;if(x<amid) return(BSearch(a,x,low,mid-1);else return(BSearch(a,x,mid+1,high);Int base(elemtype a,elemtype x,int low,int high)Int mid;If(low>high)Return -1;Mid=(low+high)/2;If(x=amid)Return mid;If(x<mid) return base(a,x,low,mid-1);Elae return base(a,x,mid+1,high);2、非递归方法实现 :int BSear

6、ch(elemtype a,keytype key,int n)int low,high,mid;low=0;high=n-1;while(low<=high)mid=(low+high)/2;if(amid.key=key) return mid;else if(amid.key<key) low=mid+1;else high=mid-1;return -1;-非递归计算如下递归函数的值( 斐波拉契 ):f(1)=1f(2)=1f(n)=f(n-1)+f(n-2) n>2解 :int f(int n)int i,s,s1,s2;s1=1;/*s1用于保存 f(n-1)的值

7、 */s2=1;/*s2用于保存 f(n-2)的值 */s=1;for(i=3;i<=n;i+)s=s1+s2;s2=s1;s1=s;return(s);-交换两个数 , 不用第三块儿内存 :int a =;int b =;a = a + b;b = a - b;a = a - b;-Q1:请你分别划划OSI 的七层网络结构图 , 和 TCP/IP 的五层结构图 ?1、OSI 每层功能及特点a 物理层为数据链路层提供物理连接, 在其上串行传送比特流 , 即所传送数据的单位是比特。此外 , 该层中还具有确定连接设备的电气特性和物理特性等功能。b 数据链路层负责在网络节点间的线路上通过检测、

8、流量控制和重发等手段,无差错地传送以帧为单位的数据。为做到这一点 , 在每一帧中必须同时带有同步、地址、差错控制及流量控制等控制信息。c 网络层为了将数据分组从源 ( 源端系统 ) 送到目的地 ( 目标端系统 ), 网络层的任务就是选择合适的路由和交换节点 , 使源的传输层传下来的分组信息能够正确无误地按照地址找到目的地 , 并交付给相应的传输层 , 即完成网络的寻址功能。d 传输层传输层是高低层之间衔接的接口层。数据传输的单位是报文 , 当报文较长时将它分割成若干分组 , 然后交给网络层进行传输。传输层是计算机网络协议分层中的最关键一层 , 该层以上各层将不再管理信息传输问题。e 会话层该层

9、对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。例如 , 确定是双工还是半双工工作。f 表示层该层的主要任务是把所传送的数据的抽象语法变换为传送语法, 即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。此外 , 对传送的数据加密 ( 或解密 ) 、正文压缩 ( 或还原 ) 也是表示层的任务。g 应用层该层直接面向用户 , 是 OSI 中的最高层。它的主要任务是为用户提供应用的接口 , 即提供不同计算机间的文件传送、访问与管理 , 电子邮件的内容处理 ,不同计算机通过网络交互访问的虚拟终端功能等。2、TCP/IPa 网络接口层这是TCP/I

10、P 协议的最低一层 , 包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP 数据报并通过特定的网络进行传输, 或从网络上接收物理帧 , 抽取出 IP 数据报并转交给网际层。b 网际网层 (IP 层 ) 该层包括以下协议 :IP( 网际协议 ) 、 ICMP(Internet Control Message Protocol, 因特网控制报文协议 ) 、ARP(Address ResolutionProtocol,地址解析协议 ) 、RARP(Reverse Address Resolution Protocol,反向地址解析协议 ) 。该层负责相同或不同网络中计算机之间的通信 ,

11、 主要处理数据报和路由。在 IP 层中 ,ARP协议用于将 IP 地址转换成物理地址 ,RARP协议用于将物理地址转换成 IP 地址 ,ICMP 协议用于报告差错和传送控制信息。 IP 协议在 TCP/IP 协议组中处于核心地位。c 传输层该层提供 TCP(传输控制协议 ) 和 UDP(User Datagram Protocol, 用户数据报协议 ) 两个协议 , 它们都建立在 IP 协议的基础上 , 其中 TCP提供可靠的面向连接服务 ,UDP提供简单的无连接服务。传输层提供端到端 , 即应用程序之间的通信 ,主要功能是数据格式化、数据确认和丢失重传等。d 应用层 TCP/IP 协议的应用

12、层相当于OSI 模型的会话层、表示层和应用层,它向用户提供一组常用的应用层协议, 其中包括 :Telnet 、SMTP、DNS等。此外 , 在应用层中还包含有用户应用程序, 它们均是建立在TCP/IP 协议组之上的专用程序。3、OSI 参考模型和 TCP/IP 参考模型的区别 :a OSI 模型有 7 层 ,TCP/IP 只有 4 层 ;b OSI 先于协议出现 , 因此不会偏向于任何一组特定的协议 , 通用性更强 , 但有些功能不知该放哪一层上 , 因此不得不加入一些子层 ;TCP/IP 后于协议出现 , 仅是将已有协议的一个描述 , 因此两者配合的非常好 ; 但他不适合其他的协议栈 , 不

13、容易描述其他非 TCP/IP 的网络 ;c OSI 中网络层同时支持无连接和面向连接的通信, 但在传输层上只支持面向连接的通信 ;TCP/IP 中网络层只支持无连接通信, 传输层同时支持两种通信;d 在技术发生变化时 ,OSI 模型比 TCP/IP 模型中的协议更容易被替换。-Q2:请你详细的解释一下IP 协议的定义 , 在哪个层上面 , 主要有什么作用 ?TCP与 UDP呢 ?解 : 与 IP 协议配套使用的还有三个协议 : ARP-地址解析协议RARP逆-地址解析协议ICMP-因特网控制报文协议ICMPIP 协议 - 网际协议IP 地址、 IP 包头-Q3:请问交换机和路由器分别的实现原理

14、是什么?分别在哪个层次上面实现的?将网络互相连接起来要使用一些中间设备( 或中间系统 ),ISO 的术语称之为中继 (relay) 系统。根据中继系统所在的层次 , 可以有以下五种中继系统 :1. 物理层 ( 即常说的第一层、层 L1) 中继系统 , 即转发器 (repeater) 。2. 数据链路层 ( 即第二层 , 层 L2), 即网桥或桥接器 (bridge) 。3. 网络层 ( 第三层 , 层 L3) 中继系统 , 即路由器 (router) 。4. 网桥和路由器的混合物桥路器 (brouter) 兼有网桥和路由器的功能。5. 在网络层以上的中继系统 , 即网关 (gateway).当

15、中继系统是转发器时 , 一般不称之为网络互联 , 因为这仅仅是把一个网络扩大了 , 而这仍然是一个网络。高层网关由于比较复杂 , 目前使用得较少。因此一般讨论网络互连时都是指用交换机和路由器进行互联的网络。本文主要阐述交换机和路由器及其区别。第二层交换机和路由器的区别:传统交换机从网桥发展而来 , 属于 OSI 第二层即数据链路层设备。它根据 MA C地址寻址 , 通过站表选择路由 , 站表的建立和维护由交换机自动进行。路由器属于OSI 第三层即网络层设备 , 它根据 IP 地址进行寻址 , 通过路由表路由协议产生。因特网的路由选择协议 : 内部网关协议 IGP 和外部网关协议EGP第三层交换

16、机和路由器的区别:第三层交换技术出现之前 , 几乎没有必要将路由功能器件和路由器区别开来 , 他们完全是相同的 : 提供路由功能正在路由器的工作 , 然而 , 现在第三层交换机完全能够执行传统路由器的大多数功能。综上所述 , 交换机一般用于 LAN-WAN的连接 , 交换机归于网桥 , 是数据链路层的设备 , 有些交换机也可实现第三层的交换。路由器用于 WAN-WAN之间的连接 , 可以解决异性网络之间转发分组 , 作用于网络层。他们只是从一条线路上接受输入分组 , 然后向另一条线路转发。这两条线路可能分属于不同的网络 , 并采用不同协议。相比较而言 , 路由器的功能较交换机要强大 , 但速度

17、相对也慢 , 价格昂贵 , 第三层交换机既有交换机线速转发报文能力, 又有路由器良好的控制功能, 因此得以广播应用。-Q4:请问 C+的类和 C 里面的 struct有什么区别 ?c+中的类具有成员保护功能, 并且具有继承 , 多态这类 oo 特点 , 而 c 里的struct没有-Q5:请讲一讲析构函数和虚函数的用法和作用?析构函数也是特殊的类成员函数, 它没有返回类型 , 没有参数 , 不能随意调用 ,也没有重载。知识在类对象生命期结束的时候, 由系统自动调用释放在构造函数中分配的资源。这种在运行时 , 能依据其类型确认调用那个函数的能力称为多态性 , 或称迟后联编。另 :析构函数一般在对

18、象撤消前做收尾工作 , 比如回收内存等工作 , 虚拟函数的功能是使子类可以用同名的函数对父类函数进行重载 , 并且在调用时自动调用子类重载函数 , 如果是纯虚函数 , 则纯粹是为了在子类重载时有个统一的命名而已。-Q6:全局变量和局部变量有什么区别?实怎么实现的 ?操作系统和编译器是怎么知道的 ?全局变量的生命周期是整个程序运行的时间 , 而局部变量的生命周期则是局部函数或过程调用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在 main 函数调用后 , 就开始分配 ,如果是静态变量则是在 main 函数前就已经初始化了。而局部变量则是在用户栈中动态分配的 ( 还是建议看编译

19、原理中的活动记录这一块)-Q7:一些寄存器的题目 , 主要是寻址和内存管理等一些知识。-Q8:8086 是多少尉的系统 ?在数据总线上是怎么实现的?8086 系统是 16 位系统 , 其数据总线是 20 位-C+一、请填写 BOOL , float,指针变量与“零值”比较的if语句。 (10 分)请写出 BOOL flag 与“零值”比较的if语句。 (3 分)标准答案 :if ( flag )if ( !flag )如下写法均属不良风格 , 不得分。if (flag = TRUE)if (flag = 1 )if (flag = FALSE)if (flag = 0)请写出 float x与

20、“零值”比较的if语句。 (4 分)标准答案示例 :const float EPSINON = 0.00001;if (x >= - EPSINON) && (x <= EPSINON)不可将浮点变量用“ =”或“ != ”与数字比较 , 应该设法转化成“ >=”或“ <=”此类形式。如下是错误的写法 , 不得分。if (x = 0.0)if (x != 0.0)请写出 char *p与“零值”比较的if语句。 (3 分)标准答案 :if (p = NULL)if (p != NULL)如下写法均属不良风格 , 不得分。if (p = 0)if (p !

21、= 0)if (p)if (!)二、以下为 Windows NT 下的 32 位 C+程序 , 请计算 sizeof的值 (10 分 )void Func ( char str100)请计算sizeof( str ) = 4 (2分)char str =“Hello ” ;char *p = str ;int n = 10;请计算sizeof (str ) = 6 (2分)sizeof ( p ) = 4 (2分 )sizeof ( n ) = 4 (2分 )void *p = malloc( 100 );请计算sizeof ( p ) = 4 (2分 )三、简答题 (25 分)1、头文件中的

22、 ifndef/define/endif干什么用 ?(5 分 )答 : 防止该头文件被重复引用。2、#include <filename.h>和#include“filename.h ” 有什么区别 ?(5 分 )答 : 对于 #include <filename.h> ,编译器从标准库路径开始搜索filename.h对于 #include“filename.h ” , 编译器从用户的工作路径开始搜索filename.h3、const有什么用途 ?( 请至少说明两种 )(5分)答 :(1) 可以定义 const 常量(2)const可以修饰函数的参数、返回值, 甚至函数

23、的定义体。被const修饰的东西都受到强制保护 , 可以预防意外的变动 , 能提高程序的健壮性。4、在 C+ 程序中调用被 C 编译器编译后的函数 , 为什么要加 extern“C”?(5 分 )答 :C+语言支持函数重载 ,C 语言不支持函数重载。函数被 C+编译后在库中的名字与 C 语言的不同。假设某个函数的原型为:void foo(int x, int y);该函数被 C 编译器编译后在库中的名字为_foo , 而 C+编译器则会产生像_foo_int_int之类的名字。C+提供了 C 连接交换指定符号extern “C”来解决名字匹配问题。5、请简述以下两个for循环的优缺点 (5 分

24、 )for (i=0; i<N; i+)if (condition)DoSomething();elseDoOtherthing();if (condition)for (i=0; i<N; i+)DoSomething();elsefor (i=0; i<N; i+)DoOtherthing();优点 : 程序简洁缺点 : 多执行了 N-1 次逻辑判断 , 并且打断了循环“流水线”作业, 使得编译器不能对循环进行优化处理, 降低了效率。优点 : 循环的效率高缺点 : 程序不简洁四、有关内存的思考题 ( 每小题 5 分, 共 20 分 ) void GetMemory(cha

25、r *p)p = (char *)malloc(100);void Test(void)char *str = NULL;GetMemory(str);strcpy(str, "hello world");printf(str);请问运行 Test 函数会有什么样的结果 ?答 : 程序崩溃。因为 GetMemory 并不能传递动态内存 ,Test函数中的 str一直都是 NULL。strcpy(str, "hello world");将使程序崩溃。char *GetMemory(void)char p = "hello world"r

26、eturn p;void Test(void)char *str = NULL;str = GetMemory();printf(str);请问运行 Test 函数会有什么样的结果 ?答 : 可能是乱码。因为 GetMemory 返回的是指向“栈内存”的指针 , 该指针的地址不是NULL,但其原现的内容已经被清除 , 新内容不可知。void GetMemory2(char *p, int num)*p = (char *)malloc(num);void Test(void)char *str = NULL;GetMemory(&str, 100);strcpy(str, "

27、hello");printf(str);请问运行 Test 函数会有什么样的结果 ?答 :(1) 能够输出 hello(2) 内存泄漏void Test(void)char *str = (char *) malloc(100);strcpy(str,“hello”);free(str);if(str != NULL)strcpy(str,printf(str);“world ”);请问运行 Test 函数会有什么样的结果 ?答 : 篡改动态内存区的内容 , 后果难以预料 , 非常危险。因为 free(str);之后 ,str成为野指针 ,if(str != NULL)语句不起作用。

28、五、编写 strcpy函数 (10 分)已知 strcpy函数的原型是char *strcpy(char *strDest, const char *strSrc);其中 strDest是目的字符串 ,strSrc是源字符串。(1) 不调用 C+/C 的字符串库函数 , 请编写函数 strcpy char *strcpy(char *strDest, const char *strSrc);assert(strDest!=NULL) && (strSrc !=NULL); / 2分char *address = strDest; / 2分while( (*strDest+= *

29、 strSrc+) !=0?)/2分NULL ;return address ; / 2分(2)strcpy能把strSrc的内容复制到strDest,为什么还要char *类型的返回值 ?答: 为了实现链式表达式。/ 2分例如 int length = strlen( strcpy( strDest,“hello world”) );六、编写类 String的构造函数、析构函数和赋值函数(25 分)已知类 String的原型为 :class Stringpublic:String(const char *str = NULL); /普通构造函数String(const String &

30、;other); /拷贝构造函数 String(void); /析构函数String & operate =(const String &other); / private:赋值函数char *m_data; /;用于保存字符串请编写 String的上述 4 个函数。标准答案 :/ String的析构函数String:String(void) / 3分delete m_data;/ 由于 m_data 是内部数据类型 , 也可以写成 delete m_data; / String的普通构造函数String:String(const char *str) / 6 分if(str=

31、NULL)m_data = new char1; /若能加 NULL 判断则更好*m_data =0?;elseint length = strlen(str);m_data = new charlength+1; /若能加NULL 判断则更好strcpy(m_data,str);/拷贝构造函数String:String(const String &other) / 3int length = strlen(other.m_data);分m_data = new charlength+1; /若能加NULL 判断则更好strcpy(m_data,other.m_data);/赋值函数S

32、tring & String:operate =(const String &other) / 13 分/ (1)检查自赋值/ 4分if(this = &other)return *this;/ (2)释放原有的内存资源/ 3分delete m_data;/ (3) 分配新的内存资源 , 并复制内容 / 3 分int length = strlen(other.m_data);m_data = new charlength+1; /若能加NULL 判断则更好strcpy(m_data, other.m_data);/ (4) 返回本对象的引用 / 3 分return *

33、this;-winsocket编程#include <Winsock2.h>#include <stdio.h>void main()WORDwVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1,1);err = WSAStartup(wVersionRequested,&wsaData);if( err != 0)return;if(LOBYTE( wsaData.wVersion ) != 1|HIBYTE( wsaData.wVersion) != 1)WSACle

34、anup();return;SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR);listen(sockSrv,5);SOCKADDR_IN addrClient;int len=sizeof(SOCKADDR);while(1)SOCKET sockConn=accept(sockSrv,(SOCKA

35、DDR*)&addrClient,&len);char sendBuf100;sprint(sendBuf,"Welcome %s to ",inet_ntoa(addrClient.sin_addr);send(sockConn,sendBuf,strlen(sendBuf)+1,0);char recvBuf100;recv(sockConn,recvBuf);printf("%sn",recvBuf);closesocket(sockConn);WSACleanup();注 : 这是 Server 端;File->New-&g

36、t;Win32 Console Application,然后 ,File->New->C+ Source File,文件名 :TcpSrv; 在该工程的的 Object/library modules项要加入 ws2_32.lib工程名 :TcpSrv;Setting的 Link-#include <Winsock2.h>#include <stdio.h>void main()WORDwVersionRequested;WSADATA wsaData;int err;wVersionRequested = MAKEWORD(1,1);err = WSASt

37、artup(wVersionRequested,&wsaData);if( err != 0)return;if(LOBYTE( wsaData.wVersion ) != 1|HIBYTE( wsaData.wVersion) != 1)WSACleanup();return;SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_IN addrSrv;addrSrv.sin_family=AF_INET;addrSrv.sin_porthtons(6000);connect(sockClient,(SOCKADDR*)&am

38、p;addrSrv,sizeof(SOCKADDR);char recvBuf100;recv(sockClient,recvBuf,100,0);printf("%sn",recvBuf);send(sockClient,"This is zhangsan",strlen("This is zhangsan")+1,0);closesocket(sockClient);WSACleanup();注 : 这是 Client端;File->New->Win32 Console Application,工程名 :TcpClient;然后 ,File->New->C+ Source File,文件名 :TcpClient;同理 , 在该工程的 Setting的 Link 的 Object/library modules项要加入 ws2_32.lib-C+#include <iostream.h>class humanpublic:human(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论