1、CC+笔试题5资料仅供参考4. static有什么用途?(请至少说明两种)1.限制变量的作用域2.设置变量的存储域7. 引用与指针有什么区别?1) 引用必须被初始化,指针不必。2) 引用初始化以后不能被改变,指针能够改变所指的对象。2) 不存在指向空值的引用,可是存在指向空值的指针。8. 描述实时系统的基本特性在特定时间内完成特定的任务,实时性与可靠性9. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别?全局变量储存在静态数据库,局部变量在堆栈10. 什么是平衡二叉树?左右子树都是平衡二叉树 且左右子树的深度差值的绝对值不大于111. 堆栈溢出一般是由什么原因导致的?没有回收垃圾资源
2、12. 什么函数不能声明为虚函数?constructor13. 冒泡排序算法的时间复杂度是什么?O(n2)14. 写出float x 与“零值”比较的if语句。if(x0.000001&x-0.000001)16. Internet采用哪种网络协议?该协议的主要层次结构?tcp/ip 应用层/传输层/网络层/数据链路层/物理层17. Internet物理地址和IP地址转换采用什么协议?ARP (Address Resolution Protocol)(地址解析協議)18.IP地址的编码分为哪俩部分?IP地址由两部分组成,网络号和主机号。不过是要和“子网掩码”按位与上之后才能区分哪些是网络位哪些
3、是主机位。2.用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。循环链表,用取余操作做3.不能做switch()的参数类型是:switch的参数不能为实型。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如2,4,3,4,7中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。函数接口为:int find_orderk(const int* narry,const int n,const int k) 要求算法复杂度不能是O(n2)谢谢!能够先用快速排序进行排序,其中用另外一个进行地址查找代码如下,在VC+6.0
4、运行经过。给分吧-/快速排序#includeusingnamespacestd;intPartition (int*L,intlow,int high)inttemp = Llow;intpt = Llow;while (low high)while (low = pt)-high;Llow = Lhigh;while (low high & Llow = pt)+low;Llow = temp;Llow = temp;returnlow;voidQSort (int*L,intlow,int high)if (low high)intpl = Partition (L,low,high);Q
5、Sort (L,low,pl - 1);QSort (L,pl + 1,high);intmain ()intnarry100,addr100;intsum = 1,t;cout Input number: t;while (t != -1)narrysum = t;addrsum - 1 = t;sum+;cin t;sum -= 1;QSort (narry,1,sum);for (int i = 1; i = sum;i+)cout narry i t;cout endl;intk;cout Please input place you want: k;intaa = 1;intkk =
6、 0;for (;)if (aa = k)break;if (narrykk != narrykk + 1)aa += 1;kk+;cout The NO. k number is: narrysum - kk endl;cout And its place is: ;for (i = 0;i sum;i+)if (addr i = narrysum - kk)cout i t;return0;1、找错Void test1()char string10;char* str1=;strcpy(string, str1);/ 溢出,应该包括一个存放0的字符string11Void test2()c
7、har string10, str110;for(I=0; I10;I+)str1 i =a;strcpy(string, str1);/ I,i没有声明。str19=0;Void test3(char* str1)char string10;if(strlen(str1)=10)/ 改成10,字符溢出。不能将strlen改为sizeof。strcpy(string, str1);2.void g(int*);int main()int line10,i;int *p=line; /p是数组首地址for (i=0;i10;i+)*p=i;g(&p);/数组对应的值加1for(i=0;i10;i
8、+)printf(%dn,line i);return 0;void g(int*p)(*p)+;(*p)+;/ 指向数组下一个元素输出:12 3 4 5 6 7 8 9 103. 写出程序运行结果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;Inext!=NULL&qa-next!=NULL)if(pa-dataqa-data)ra-next=qa;qa=qa-next;elsera-next=pa;pa=pa-next;if(pa-next
9、!=NULL)ra-next=pa;if(qa-next!=NULL)ra-next=qa;return R;2、运用四色定理,为N个局域举行配色,颜色为1、2、3、4四种,另有数组adjN,如adj ij=1则表示i区域与j区域相邻,数组colorN,如color i=1,表示i区域的颜色为1号颜色。四色填充3、用递归算法判断数组aN是否为一个递增数组。递归的方法,记录当前最大的,而且判断当前的是否比这个还大,大则继续,否则返回false结束:bool fun( int a, int n )if( n= =1 )return true;if( n= =2 )return an-1 = an-
10、2;return fun( a,n-1) & ( an-1 = an-2 );4、编写算法,从10亿个浮点数当中,选出其中最大的10000个。用外部排序,在数据结构书上有计算方法导论在找到第n大的数的算法上加工5、编写一unix程序,防止僵尸进程的出现.同学的4道面试题,应聘的职位是搜索引擎工程师,后两道超级难,(希望大家多给一些算发)1.给两个数组和她们的大小,还有一动态开辟的内存,求交集,把交集放到动态内存dongtai,而且返回交集个数long jiaoji(long* a,long b,long* alength,long blength,long* dongtai)2.单连表的建立,
11、把a-z26个字母插入到连表中,而且倒叙,还要打印!方法1:typedef struct val int date_1; struct val *next;*p;void main(void) char c; for(c=122;c=97;c-) p.date=c; p=p-next; p.next=NULL; 方法2:node *p = NULL;node *q = NULL;node *head = (node*)malloc(sizeof(node);head-data = ;head-next=NULL;node *first = (node*)malloc(sizeof(node);
12、first-data = a;first-next=NULL;head-next = first;p = first;int longth = z - b;int i=0;while ( idata = b+i;temp-next=NULL;q=temp;head-next = temp; temp-next=p;p=q;i+;print(head);3.可怕的题目终于来了象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,请描述思想,写出算发(c语言),空间和时间复杂度,4.国内的一些帖吧,如baidu,有几
13、十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度,#include string.hmain(void) char *src=hello,world; char *dest=NULL; dest=(char *)malloc(strlen(src); int len=strlen(str); char *d=dest; char *s=srclen; while(len-!=0) d+=s-; printf(%s,dest);找出错误!#include string.h#include stdio.h#include ma
14、lloc.hmain(void) char *src=hello,world; char *dest=NULL; dest=(char *)malloc(sizeof(char)*(strlen(src)+1); int len=strlen(src); char *d=dest; char *s=src+len-1; while(len-!=0) *d+=*s-;*d=0; printf(%s,dest);1. 简述一个Linux驱动程序的主要流程与功能。2. 请列举一个软件中时间换空间或者空间换时间的例子。void swap(int a,int b)int c; c=a;a=b;b=a;-
15、空优 void swap(int a,int b)a=a+b;b=a-b;a=a-b;6. 请问一下程序将输出什么结果?char *RetMenory(void) char p = “hellow world”; return p;void Test(void) char *str = NULL; str = RetMemory(); printf(str);RetMenory执行完毕,p资源被回收,指向未知地址。返回地址,str的内容应是不可预测的, 打印的应该是str的地址写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)功
16、能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:abcd12345ed125ss的首地址传给intputstr后,函数将返回9,outputstr所指的值为int continumax(char *outputstr, char *inputstr)char *in = inputstr, *out = outputstr, *temp, *final;int count = 0, maxlen = 0;while( *in != 0 )if( *in 47 & *in 47 & *in 58 ; in+ )co
17、unt+;elsein+;if( maxlen count )maxlen = count;count = 0;final = temp;for(int i = 0; i maxlen; i+)*out = *final;out+;final+;*out = 0;return maxlen;不用库函数,用C语言实现将一整型数字转化为字符串方法1:int getlen(char *s) int n; for(n = 0; *s != 0; s+) n+; return n;void reverse(char s) int c,i,j; for(i = 0,j = getlen(s) - 1; i
18、 j; i+,j-) c = s i; s i = sj; sj = c; void itoa(int n,char s) int i,sign; if(sign = n) 0);/*delete the number*/ if(sign 0) si+ = -; s i = 0; reverse(s);方法2:#include using namespace std;void itochar(int num);void itochar(int num)int i = 0;int j ;char stra10;char strb10;while ( num )strai+=num%10+48;n
19、um=num/10;stra i = 0;for( j=0; j i; j+)strbj = strai-j-1;strbj = 0;coutstrbnum;itochar(num);return 0;前几天面试,有一题想不明白,请教大家! typedef struct int a:2; int b:2; int c:1; test; test t; t.a = 1; t.b = 3; t.c = 1; printf(%d,t.a); printf(%d,t.b); printf(%d,t.c); 谢谢!t.a为01,输出就是1t.b为11,输出就是1t.c为1,输出也是-13个都是有符号数i
20、nt嘛。这是位扩展问题 01111编译器进行符号扩展求组合数: 求n个数(1.n)中k个数的组合. 如:combination(5,3) 要求输出:543,542,541,532,531,521,432,431,421,321,#include#include int pop(int *);int push(int );void combination(int ,int );int *stack;int top;int k;int main()int n,m;printf(Input two numbers:n);while( (2!=scanf(%d%*c%d,&n,&m) )fflush(
21、stdin);printf(Input error! Again:n);k=m;top=-1;stack = new intn;memset(stack, 0, sizeof(int)*n);combination(n,m);printf(n);delete stack;void combination(int m,int n)int temp=m;push(temp);while(1)if(1=temp)if(pop(&temp)&stack0=n) /&break;else if( push(-temp)for(int i=0;in;i+)printf(%d,stack i);/ä
22、;?printf( );pop(&temp);int push(int i)stack+top=i;if(top=0)return 0;elsereturn 1;1、用指针的方法,将字符串“ABCD1234efgh”前后对调显示#include #include #include int main() char str = ABCD1234efgh; int length = strlen(str); char * p1 = str; char * p2 = str + length - 1; while(p1 p2) char c = *p1; *p1 = *p2; *p2 = c; +p1
23、; -p2; printf(str now is %sn,str); system(pause); return 0;2、有一分数序列:1/2,1/4,1/6,1/8,用函数调用的方法,求此数列前20项的和#include double getValue() double result = 0; int i = 2; while(i 1-2(删除)-3-4-5(删除)-6-7-0(删除),如此循环直到最后一个数被删除。方法1:数组#include using namespace std;#define null 1000int main()int arr1000;for (int i=0;i1
24、000;+i)arr i=i;int j=0;int count=0;while(count999)while(arrj%1000=null)j=(+j)%1000;j=(+j)%1000;while(arrj%1000=null)j=(+j)%1000;j=(+j)%1000;while(arrj%1000=null)j=(+j)%1000;arrj=null;+count;while(arrj=null)j=(+j)%1000;coutjendl;return 0;方法2:链表#includeusing namespace std;#define null 0struct nodeint
25、data;node* next;int main()node* head=new node;head-data=0;head-next=null;node* p=head;for(int i=1;idata=i;tmp-next=null;head-next=tmp;head=head-next;head-next=p;while(p!=p-next)node *q=p-next-next;p-next-next=p-next-next-next;delete q;p=p-next-next;coutdata;delete p;return 0;方法3:通用算法#include #define
26、 MAXLINE 1000 /元素个数/*MAXLINE 元素个数a 元素数组R 指针场suffix 下标index 返回最后的下标序号values 返回最后的下标对应的值start 从第几个开始K 间隔*/int find_n(int a,int R,int K,int& index,int& values,int s=0) int suffix; int front_node,current_node; suffix=0; if(s=0) current_node=0; front_node=MAXLINE-1; else current_node=s; front_node=s-1; w
27、hile(Rfront_node!=front_node) printf(%dn,acurrent_node); Rfront_node=Rcurrent_node; if(K=1) current_node=Rfront_node; continue; for(int i=0;iK;i+) front_node=Rfront_node; current_node=Rfront_node; index=front_node;values=afront_node;return 0;int main(void) int aMAXLINE,RMAXLINE,suffix,index,values,s
28、tart,i,K;suffix=index=values=start=0;K=2;for(i=0;iMAXLINE;i+) a i=i;Ri=i+1;Ri-1=0;find_n(a,R,K,index,values,2);printf(the value is %d,%dn,index,values);return 0;试题: void test2() char string10, str110; int i; for(i=0; i10; i+) str1 i = a; strcpy( string, str1 ); 解答:对试题2,如果面试者指出字符数组str1不能在数组内结束能够给3分;如
29、果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性能够给7分,在此基础上指出库函数strcpy工作方式的给10分;str1不能在数组内结束:因为str1的存储为:a,a,a,a,a,a,a,a,a,a,没有0(字符串结束符),因此不能结束strcpy( char *s1,char *s2)她的工作原理是,扫描s2指向的内存,逐个字符付到s1所指向的内存,直到碰到0,因为str1结尾没有0,因此具有不确定性,不知道她后面还会付什么东东。正确应如下void test2() char string10, str110; in
30、t i; for(i=0; inumber=key)slnodetype *Delete(slnodetype *Head,int key)slnodetype *pre, *cur;if(!Head)return Head;cur = Head;if(Head-number=key)Head=Head-next;delete cur;return Head;pre = cur;cur = cur-next;while(cur)if(cur-number = key)pre-next = cur-next;delete cur;return pre;cur = cur-next;return null;有一个16位的整数,每4位为一个数,写函数求她们的和。解释:整数0111和 1101+0101+1011+0111感觉应该不难,当时对题理解的不是很清楚,因此写了一个函数,也不知道对不对。疑问: 既然是16位的整数,0111是2进制的,那么函数参数怎么定义呢,请大虾指教。答案:用十进制做参数,计算时按二进制考虑。/* n就是16位的数,函数返回它的四个部分之和 */char SumOfQuaters(unsigned short n) char c = 0; int i =