试题和资料(深圳IT行业C语言笔试)_第1页
试题和资料(深圳IT行业C语言笔试)_第2页
试题和资料(深圳IT行业C语言笔试)_第3页
试题和资料(深圳IT行业C语言笔试)_第4页
试题和资料(深圳IT行业C语言笔试)_第5页
已阅读5页,还剩165页未读 继续免费阅读

下载本文档

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

文档简介

分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在//这样转向定义应该不算违规吧!^#defineCmp(x,y)compareintcompare(inta,intb){inti=31;while((i^-1)&&!((areturn(i^-1)?(((a>>i)&1)?1:-1)}#defineCOMPARE(a,b)((a)-(b))//<0:a<b=0:a==b>3.两个数相乘,小数点后位数没有限制,请写一个算法提示:l=length(a)+length(b)-du51(郁郁思扬)的答案:变为整数求就行了.输入的时候记一下,小数点位置..输出再下面的是大整数的运算.{if(!head->next&&!head->data}{head=newNode;head->data=0,head->next=0;/{p=q->next;p1=q;bbit=*bp-48;//把当前位转为整型while(*ap||temp)//若被乘数不空{{p=newNode;p->data=0;p->next=0;p1->next=p;}p1->data=temp1%10;//留当前位p1=p;p=p->next;//被乘数到下一位}ap=a;bp++;q=q->next;}p=head;{p=head->next;}}{cin.getline(test1,Mcin.getline(test2,MMul(strrev(test1),strrev(tes}上面大整数已经写了.你加几个东西就行了.{if(!head->next&&!head->data}{head=newNode;head->data=0,head->next=0;/{p=q->next;p1=q;bbit=*bp-48;//把当前位转为整型while(*ap||temp)//若被乘数不空{{p=newNode;p->data=0;p->next=0;p1->next=p;}p1->data=temp1%10;//留当前位p1=p;p=p->next;//被乘数到下一位}ap=a;bp++;q=q->next;}p=head;{p=head->next;}}{chartest1[MAX],test2[cin.getline(test1,Mcin.getline(test2,MA{pos+=strlen(test1)-(p-test1)-1;{p++;}{pos+=strlen(test2)-(p-test2)-1;{p++;}Mul(strrev(test1),strrev(test2),}5.让你在100000000个浮点数中找出最大的10000个,要//本算法使用快排,O(n*lg(n))//最低可以找到线性算法,使用预先区域统计划分!类试于构造QuadTrees!写起来代码会长些!{}{intn=0;while(scanf("%d",&a[n])==1)nfor(inti=0;i<3;i++)printf("%d",a);}TotalTimeCost:(1+2)+(1答:typedefstructDulNode{ElemTypedata;StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e){if(!(p=GetElemP_DuL(L,i)))//此处得到i位置的节点指针,如果有需要也得写出具体函数p->prior->next=p->next;p->next->prior=p->pror;free(p);}StatusListInsert_DuL(DuLinkList&L,int{if(!(s=(DuLinkList)malloc(sizeof(DuLp->prior->next=s;p->prior=s;returnOK;}2.写一个函数,将其中的\t都转换成4个空格。答:函数实现为:char*convert(char*st{inti=0;while(*strSrc&&i<length)//跳{if(*strSrc=='\t')//将\t转换成4{for(intj=0;j<4;j++)*cp++='';}}}答:接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统。答:所谓的回调函数,就是预先在系统的对函数进行注册,让系统知道这个函数的存在,以后,当某个事件发生时,再调用这个函数对事件进行响应。5.C++里面是不是所有的动作都是main()引起的?如果不是,请举例。答:不是,比如中断引起的中断处理不是直接由main()引起的,而是由外部事件引起的。intb;答:各式表示的意思分别为:Cconstint*consta=&b;//a和*a都是Dintconst*consta=&b;//a和*a都是con总结个技巧:如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。表达式用内联函数的函数体来代替。答:C错误,左侧不是一个有效变量,不能赋值,可改为(++a)charstr[]=“”sizeof(str)=1)sizeof(p)=2)sizeof(n)=3)voidFoo(charstr[100]){sizeof(str)=4)}sizeof(p)=5)答1)17(2)4(3)4(4)4(5)4(1).头文件中的ifndef/define/endif干什么用?预处理答:前者用来包含开发环境提供的库头文件,后者用来包含自己编写的头文件。答:函数和变量被C++编译后在符号库中的名字与C语言的不同,被extern"C"修饰的变量函数。C++提供了一个C连接交换指定符号extern“C”来解决这个问题。(1).}printf(str);}答:输出“hello”(2).printf(str);}}(3).charp[]="helloworld";}str=GetMemory();printf(str);}其中strDest是目的字符串,strSrc是源字符串。答:VC源码:{cp++;}答:不是,其它数据类型转换到CStrin7.C++中为什么用模板类。(2)它是类型无关的,因此具有很高的可复用性。(3)它在编译时而不是运行时检查数据类型8.CSingleLock是干什么的。9.NEWTEXTMETRIC是什么。10.程序什么时候应该使用线程,什么时候单线程效率高。的运行部分,这样的程序会利于理解和修改。其他情况都使用单线程。12.Linux有内核级线程么。控制用户线程。这种线程甚至在象DOS这样的操作系统中也可实现,但户程序完成,这有些类似Windows3.x的协作式多任务。另外一种则需要内核的参与,由被定制或修改以适应特殊应用的要求,但是当一个线程因I/O而处于等待状态时,整个进制,有利于发挥多处理器的并发优势,但却占用了更多的系统开支。WindowsNT和OS/2支持内核线程。Lin答:栈:存放局部变量,函数调用参数,函数返回值,函数返回地址。堆:程序运行时动态申请,new和mall近堆还是远堆不是很清楚。14.使用线程是如何防止出现大的波峰。度效率和限制资源使用的好处,线程池中的线程达到最大数时,其他线程就会排队等候。由程序员在程序中显式地指定。志。也就是说基本上处于不能使用的状态。户所修改。因而行级锁即可保证数据的一致性又能提高数据操作的迸发性。自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;然而,对齐的内存访问仅需要一次访问。21.对数据库的一张表进行操作,同时要对另一张表进行操22.TCP/IP建立连接的过程?(3-wayshake)答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1同时自己也发送一个SYN包(syn=k即SYN+ACK包,此时服务此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。答:Internet控制报文协议,处于网络层(IP层)保对数据的处理必须符合由这些SQL语句所定义的规则。25.winsock建立连接的主要实现步骤?答:服务器端:socker(建)立套接字,绑定(bind)并监端连接。套接字上写读数据,直至数据交换完毕,closesocket()关闭套接字。服务器端:accept发现有客户端连接,建立一个新的套接字,自身重新开始等待连接。该新产生的套接字使用send()和recv写读数据,直至数据交换完毕,c接字。1.载入时动态链接(load-timedynamiclinking模块非常明确调用某个导出函数,使们就像本地函数一样。这需要链接时链接那些函数所在DLL的导入库,导入库向系统提供了载入DLL时所需的信息及DLL函函数的出口地址,然后就可以通过返回的函数指针调用DLL函数了。如此即可避免导入库文件了。答:Internet上产生的许多新的应用,特别是高带宽的多媒体应用,对如何节约网络资源的前提下保证服务质量。typedefstructdoublecyclelink{DoubleCycleLinkT*find遍历整个双向循环链表,将第一个与key值相同的结点移出链表,并返回。若没有找到则返回NULL。答:DoubleCycleLinkT*fin{p=link->next;while(p->next!=link)//链{if(p->key==key)//查找到key值相同,删除该节点{p->prev->next=p->next;p->next->prev=p->prev;p=p->next;//否则查找下一节点}if(p->next==link)returnNULL;//没找到,返回NULL}*voidprintTriangle(constunsignedcharlin输入行数,打印三角形。答:voidprintTriangle(constunsignedcharli{for(inti=1;i<=line;i++){for(intj=0;j<(line*2-1);j++)//5行每行需打印9个字符{if(i%2==1)//奇数行{if(j%2==(line-1)%2&&j>=(line-1-i/2*2)&&j<=(line-1+i/2*2))if(j%2==(line)%2&&j>=(line-2-(i/2-1)*2)&&j<=(line+(i/2-1)*2))printf("*");}printf("\n");}}答:{{if(!*s2)}}{chari=0;{}}答:是个死循环,无限次啊,无限次。答:#defineMIN(365*24*6{intx=10,y=3;printf("%d\n",y=x/y);}intF(intx){}{printf("%d\n",F(3+5));}:?{数最多的成员就可。答:明这个数据包不能继续向前传送,因为其TTL已经过期了。t知道这个路由器存在于这个路径上,接着traceroute再送出另一个TTL是2的数据包,发现第2个路由器这个重复的动作一直持续到某个datagram抵达□□*□□□□□□***□□□□□□*****□□□□□□*******□□□□□□*********□□□□□□***********□□*************□□□□□□***************□□□□□*****************□□□□□□*******************□□□□□□*****************□□□□□□***************□□□□□□*************□□□□□□***********□□□□□□*********□□□□□□*******□□□□□□*****□□□□□□***□□□□□□*□□□□{答:{charch='*';for(inti=0;i<maxsize;++i){{intk=(maxsize+1-2*i)/2;{}printf(format,ch);printf("\n");stars[maxsize-1-(2*(i+1)-maintk=(2*(i+2)-maxsize-1)/2;strcat(format,tmp);strcat(format,"c");strcat(format,stars);printf(format,ch);printf("\n");}}{}输出结果:for(inti=10;(i++^--i)=答:5.Emailrelay和Emailaccess分别用了什么协议?(其他还有很多,略)A.rom,B.flashC.eepromD答:存取存储器,也就是内存了。不管是堆还是栈都是放在内存里的。答:x在PC机上的内存存放顺序为78563412,高字节在前,低字节在后,因此输出chara[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23答:*(*(*(a+i/6)+(i/3%2)){}{}答:输出结果为:Ab,因为在fun函数里,指针a指向s++{{}{}voidAllocte(intsize)(3){}{{}voidSaveString(constchar*pText)co{}{{buffer1.SaveString("Microsprintf(buffer1.GetBuffe}将voidSaveString(constchar*pText)co{strcpy(m_pBuffer,pText);}voidSaveString(constchar*pText)(1){Allocte(strlen(pText)+1);(2)strcpy(m_pBuffer,pText);}原因:(1)const成员函数表示不会修改数据成员,而{}{{}//copy“Welcome”tonastrcat(name,GetName()//printout}#include<malloc.h>//malloc函{//charname[]="MSRAsiachar*name=(char*)malloc(strlen("MSRAsia"}voidmain(intargc,c{//for(inti=0;i<=32;i+for(inti=0;i<=31;i++)//数组越界{}//copy“Welcome”tonastrcat(name,"Welcome");///Appendablankchar//Appendstringtonamechar*p=GetName();放//printoutprintf(name);}{{printf("FuncAcalled}{printf("FuncBcalled{{printf("FuncABcalled}{printf("FuncBBcalled{}答:pa2->FuncB();输出intFindSubString(char{{{}{}}{{}{}}voidModifyString(char*pTe{{intcount=FindSubStrin{{}}{}}{chartext[32]="XYBC}*{intj;}答:{inti;intj;intk;{{printf("*");printf(".");}printf("\n");}}{intarray[]={45,56,76,234,1,34,23,2,3};//}{}待排序数组。不知道这样做是否符合题意。{for(inti=0;i<num-1;i++)for(intj=i+1;j<num;j++)if(array[i]<array[j]){}但要说明你选择的理由。intPheponatch(int);{printf("The10this%d",Pheponatch(10));}intPheponatch(intN){答:太深,则堆栈会溢出。intPheponatch(intN){if(N==2||N==1)returnPheponatch(N-1)+Pheponatch(N-}typedefstructTNode{{append(17);//Again}{TNode*NewNode=(TNode*NewNode->value=N;{{while((N>=temp->value&&temp->left!=NULL)||(N<temp->valu{while(N>=temp->value&&temp->left!=NUwhile(N<temp->value&&temp->right!=NU}}答:{TNode*NewNode=(TNode*NewNode->value=N;NewNode->left=NULL;NewNode->right=NULL;if(root==NULL){{//while((N>=temp->value&&temp->left!=NULL)||(N<temp->value&&temp->right!=NULL))//易引起死循环,去掉while(N>=temp->value&&temp->left!=NUwhile(N<temp->value&&temp->right!=NU{temp->left->right=NewNNewNode->left=temp->left;NewNode->right=temp;{temp->right->left=NewNNewNode->right=temp->right;NewNode->left=temp;}}{}{{}}答:strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,voidtest3(char*st{{}}str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)<=10改为strlen(str1)<10。{for(I=0;I<MAX_SRM;I++,S{{}}答:我不知道这段代码的具体功能,但明显2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值声明。{}{{}}该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。{{}}答:a[q-p]=a[2]=2;这题是要告诉我们指针答:此处定义的是指向指针的指针数组,对于32位系统,指针占答:/*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/{intnDays;{break;if(*nYear%400==0||*nYear%100!=0&&*nYe{{}break;break;}(*nSecond)++;//秒加1{{{{{}}}}/*示例可运行代码*/{intnYear=2004,nMonth=12,nDate=31,nHour=23,nMinute=59,nSecboolres=NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond);printf("Theresult:%d-%d-%d%d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond);printf("Inputerror!\n");}constchar*,charconst*,char*const的区别问题几乎是C++面试中每次都会有的题目。事实上这个概念谁都有只是三种声明方式非常相似很容易记混。Bjarne在他的TheC++ProgrammingLanguage里面给出过一个助记的把一个声明从右向左读。{}解答:数组A的下标范围为:0..MAX-1这句本身没有问题..但是返回for(i=0;ilongintfact(intn){{printf("error!");}}二分查找算法:intBSearch(elemtypea[],elemtypex,intlow,inthigh)/*在下届为low,上界为high的数组a中折半查找数据元素x*/{if(x<a[mid])return(BSearch(a,x,low,elsereturn(BSearch(a,x,mid+}intBSearch(elemtypea[],keytypeke{{if(a[mid].key==key)retelseif(a[mid].key<key)low=mid+1;}}非递归计算如下递归函数的值(斐波拉契):解:{inti,s,s1,s2;{}}交换两个数,不用第三块儿内存:intb=……;a物理层为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位是比特。此外,该层中还具有确定连接设备的电气特性和物理特性等功能。b数据链路层负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错地传量控制等控制信息。目的地,并交付给相应的传输层,即完成网络的寻址功能。d传输层传输层是高低层之间衔接的接口层。数据传输的单位是报文,当报文该层以上各层将不再管理信息传输问题。e会话层该层对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进程之间建立、组织和协调交互。例如,确定是双工还是半双工工作。f表示层该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计算机内部的不同表示形式转换成网络通信中的标准表示形式。此外,对传送的数据加密(或解交互访问的虚拟终端功能等。a网络接口层这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收物理帧,抽取出IP数据报并转交给网际层。算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICIP协议在TCP/IP协议组中处于核心地位。化、数据确认和丢失重传等。d应用层TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向用户有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。bOSI先于协议出现,因此不会偏向于任何一组特定的协议该放哪一层上,因此不得不加入一些子层;TCP/IP后于协议出现,仅是将已有协议的一个描述,因此两者配合的非常好;但他不适合其他的协议栈,不容易描述其他非TCP/I络;cOSI中网络层同时支持无连接和面向连接的通信,但在d在技术发生变化时,OSI模型比TCP/IP模型中的协议更容易被替换。--将网络互相连接起来要使用一些中间设备(或中间系统ISO的术语称之为中继(relay)系统。根据中继系统所在的层次,可以有以下五种中继系统:1.物理层(即常说的第一层、层L1)中继系统,即转发器(repe2.数据链路层(即第二层,层L2即网桥或桥接器(bridge)。3.网络层(第三层,层L3)中继系统,即路由器(router)。4.网桥和路由器的混合物桥路器(brouter)兼有网桥和路由器的功能。5.在网络层以上的中继系统,即网关(gateway).当中继系统是转发器时,一般不称之为网络互是指用交换机和路由器进行互联的网络。本文主要阐述交换机和路由器及其区别。第二层交换机和路由器的区别:传统交换机从网桥发展而来,属于OSI第二层即数据链路层设备。它根据MAC地址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于OSI第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。因特网的路由选择协议:内第三层交换机和路由器的区别:器的大多数功能。综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层的设备,有些交换机也可实现第三层的交换。路由器用于WAN-WAN之间的连接,可以解决异性又有路由器良好的控制功能,因此得以广播应用。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的资源。这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。另:在子类重载时有个统一的命名而已。用的时间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在m用后,就开始分配,如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用Q7:一些寄存器的题目,主要是寻址和内存管理等一些知识。标准答案:如下写法均属不良风格,不得分。if(flag==TRUE)if(flag==FALSE)if(flag==0)标准答案示例:if((x>=-EPSINON)&&(x<=比较,应该设法转化成“>=”或“<=”此类形式。如下是错误的写法,不得分。标准答案:if(p==NULL)如下写法均属不良风格,不得分。if(p==0)if(p)if(!){sizeof(str)=4(2分)}sizeof(str)=6(2分)sizeof(p)=4(2分)sizeof(n)=4(2分)sizeof(p)=4(2分)答:防止该头文件被重复引用。答1)可以定义const常量(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。答:C++语言支持函数重载,C语言不支持函数重载。函数与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);_foo_int_int之类的名字。C++提供了C连接交换指定符号extern“C”来解决名字{if(condition)}if(condition){{}率。{}{strcpy(str,"helloworld");printf(str);}答:程序崩溃。Test函数中的str一直都是NULstrcpy(str,"helloworld");将使程序崩溃。{charp[]="helloworld";}{str=GetMemory();printf(str);}答:可能是乱码。因为GetMemory返回的是指向“栈内存”现的内容已经被清除,新内容不可知。{}{printf(str);}答:1.AclassBnetworkontheintemaximumnumberofhostspersubnet.答:C对于B类网络地址,子网掩码255.2具体计算公式见:/blogview.asp?logID=95&cateI2.Whatisthedifference:betweeno(logn)a.o(logn^2)isbiggerb.o(llogn^2=2*logn(n^2a.compilationerrorbc.stackoverflowd.noneoftheab答:C相当于递归调用,不停的在栈上分配空间使栈溢出。b.keywordc.operatord.noneoftheabove答:C注意new/delete都是C直接支持的运算符,其他可能错认为是库函数的的有sizeof()和typeid()及C++新增的四个类型转换运算符。5.Whichofthefollowinginformationisnotcontained答:C每个文件的信息存储在inodes中。通常inode信息包含两部分:1)文件的所有者、类型、文件名只是与inode相关联,inode再提供对数据块的访问。具体情况要看UNIX文件系统的书。答:B假设两个排好序的数组为a{1,3}和b{2,4}(此种交错为最坏情况)要排序成一个数组n>1otherwise1theorder答:a解得:T(n)=1+1+1/2+1/3+……当n很大时,有:1+1/2+1/3+1/4+1/5+1/6+...1/n=0.577215664参见:/xuebao/2003-3/pages/oulachangshu8.Thenumberof'1'inthebinaryrepresentatio答:C分解为:11*1000000000000+1111*100000000+101*10000+11=过程。答:1.实模式,又叫实地址模式,CPU完全按照8086的实际寻址方法访问从00000h--FFFFFh(1MB大小)的地址范围的内存,在这种模式下,CPU只能做单任务运行物理地址=左移4位的段地址+偏移地址,即:物理地址是由16位的段地址和16位的段内偏移地址组成的。模式下,系统运行于多任务,设计这种模式的原因和好处是:保护模式增加了寻址空间,和特权级,各应用程序和操作系统的代码和核心是被保护的,这也是多任务支持键和保护这个名字的由来)。寻址过程为:物理地址=由段地址查询全局描段基址+偏移地址,即:物理地址由影像寄存器中的基址加上16位或者32{virtualvoiddoSth(){printf("IamA"{virtualvoiddoSth(){printf("IamB"答:谁知道怎么处理补上吧。?(答:即要求列出线程同步方法,具体答案可见下面一题。答:这些对象都是用于线程同步的对象。临界区:一种保证在某一时刻只有一个线程能访问数据的简便办LeaveCriticalSection。互斥对象:互斥对象跟临界区相似,但它不仅仅能够在同一应用程序不同线程中的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享,当然下面两者也有这个特点。主要API函数有,创建互斥量:CreateMutex,打开一个存在的互斥量:同时访问共享资源的线程最大数目。它的API函数和使用方法都与互斥对象相似,如创建事件:用来通知其他进程/线程某件操作已经完成。API函数有创殊点的是可以用函数SetEvent人工设置事件为有无信号状使用函数SetEvent。答:三者都是函数调用的约定。函数在返回前清理传送参数的内存栈。分也是不同的。注意:单词间的间隔不一定是一个空格。答:可执行程序代码如下,假设该文本已存入text这个数组里。{chartext[1000]={"Asatechnointi=0,count=0;boolflag=false;//前面的字符是否为字母while(text[i]&&i<100{if(flag&&!((text[i]>='a'&&text[i]<='z')||(text[i]>='A'&}elseif(!flag&&((text[i]>='a'&&text[i]<='z')||(text[i]>='A'&&text[i]<='Z')))}}}个棋盘放置8个皇后,并使它们互相无法威胁到彼此。答:以下是可执行C代码,采用非递归解法,你如果想了解皇后问题的算法的详细过程可看下面网址:/infoview/2005031720203563221270.h一样的。#defineQUEEN8/intqueen[QUEEN];//下标代表所在列号,值代boolrow_YN[QUEEN];boolpassive_YN[2*QUEEN-1];boolnegative_YN[2*QUEEN{boolflag=false;while(row>=0)//跳出条件是回溯到无法{queen[row]++;if(queen[row]>=QUEEN)//{if(row>=0)//回溯时要清理如下行{row_YN[queen[row]]=falpassive_YN[queen[row]+row]=false;negative_YN[QUEEN-1+row-que}{if(row_YN[queen[row]]={//以下检查当前棋子是否与之前的棋子斜线if(flag)//flag{if(row==QUEEN-1)//列到达最后,即最后一个皇后也{cout<<"***第"<<count<<"种解法***"<<for(inti=0;i<QUEEN;i++)cout<<"第"<<i<<"列皇后在第"<<queen[i]<<"}row_YN[queen[row]]=trpassive_YN[queen[row]+row]=trnegative_YN[QUEEN-1+row-queen[row]]=true;//当前行负斜率方向上也有棋子row_YN[queen[row]]=falpassive_YN[queen[row]+row]=false;negative_YN[QUEEN-1+row-queen[row]}}}}cout<<QUEEN<<"皇后问题一共有"<<count<<"种解法"<<endl;}确结果。思路是:将大数当作字符串进行处理,也就是将大数用10进拟人们手工进行“竖式计算”的过程编写乘法。intstr_num(charstr[])//计算字符串的长度,等效于strlen(str);{inti=0,num_str=0;}}voidplace(intnum_str,charstr[])//将字符串高低颠倒。{for(i=0,j=num_str-1;i<}voidtransition(unsignedinta[],charstr1[])//数字字符转化为数字。{inti=0;}voidmultiply_int(unsignedinta[],unsignedintb[],unsignedintc[])//大数相乘算法,入口为整形数组。{inti=0,j=0;{}voidoutput(intsign,unsignedintc[],intquan)//数据输出。{intsign_temp=0,i=0;{}{}}voidmultiply_string(charstr1[],charstr2[],unsignedintc[])//大数相乘,入口为字符串。{unsignedinta[MAX]={0},b[MAX]={0};}intsign_comp(charstr1[],charstr2[])//符号判断,如果为负数将作相应处理。{inti=0,sign_num=0;}}}intformat(charstr[])//将输入的字符串进行格式化。以得到字符的一些标志信息和相应格式的新数据串。{intpoint=0,quan=0,i=0,j,k=0,sign_point=0,nu{}}}}{for(j=sign_point;j<nu_}place(num_str,str);}voidclear(charstr[])//清空函数。{inti;{}voidmain(void)//主函数。{charstr1[MAX]={0},str2[MAX]={0};intquan1=0,quan2=0unsignedintc[MAX*2+1]={0};{cout<<"Pleaseinputthefirstcout<<"Pleaseinputthesecond{}}while(quan1==-1||quan2==-1||str1multiply_string(str1,str2,}指针,一直被认为是C语言中的精华。只有掌握了指针,你才能说你学会了C语言。相当初,我是把指针这一章足足看了三遍才算是“学了这一章”下面的大家也会有所帮助。指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的我们分别说明。先声明几个指针放着做例子:例一:++的复杂类型声明>>。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中类型:(4)int(*ptr)[3];/器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的(4)int(*ptr)[3];//指针在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型(即指针本身的类型)和指针所来越熟悉时,你会发现,把与指针搅和在一起的“类型”这个少书,发现有些写得差的书中,就把指针的这两个概念搅在一来前后矛盾,越看越糊涂。指针的值是指针本身存储的数值,这个值将被编译器当作32位程序里内存地址全都是32位长。指针所指向的内存区就是从指针的值所代表的那个内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针本身占了多大的内存?你只要用函数s指针本身占据的内存这个概念在判断一个指针表达式=======================部分字符串处理函数puts(字符数组)将一个字符串输出到终端。gets(字符数组)从终端输入一个字符串到字符数组,并且得到一个函数值首地址strcat(字符数组1,字符数组2)连接两个字符数返回负数。Strlen(字符数组)求字符串长度。Strupr(字符串)将字符串中的小写字母以上是一些比较常用的字符串处理函数。变量分配存储空间。C语言中,变量的存储方法分为两大类:静态存储类和动态存储类,具体包括:自动的函数中的局部变量如不作专门说明,都之auto的,即动态存储的,auto可以省略。局部变数可以作为register变量,其它不行。能在本文件中引用了,而不能被其它文件引用。局部变量:自动变量,即动态局部变量(离开函数,(形参可定义为自动变量和寄存器变量)要调用此函数的文件中,一般要用extern说明。c编译系统在对程序进行通常的编译之前,先进行预处理。c提供的预处理功能主要有以下用一个指定的标识符来代表一个字符串,形式:#几点说明:2)宏定义不作语法检查,只有在编译被宏5)可以用#undef命令终止宏定义的作用域这和函数有些类似,但他们是不同的:编译。<>表示系统直接按指定的标准方式检索目录。所以用""保险一点。条件编译指不对整个程序都编译,而是编译满足条件的那部分。条件编译有以下几种形式:#endif它的作用:当标识符在前面已经被定义过(一般用#define则对程序段1编译,否则对程序段2编译。2)#ifndef标识符#endif它的作用和#ifdef相反,当标识符没被定义过,对程序段1编译,否则对程序段2编译。3)#if表达式#endifconstinti=5;intj=0;j=i;//合法constinti=5;//合法constintj;//非法,导致编译错误externconstinti;//合法externconstintj=10;//非法,常量不可以被再次赋值用const方法可以使编译器对处理内容有更多了解。constlong&i=10;/*dapingguo提醒:由于以后的引用中,以致在以后的代码中没有错误,为有优化措施,即使constlongi=10;charh=I;//没有错charh=i;//编译警告,可能由于数的截短带来错误赋值。constcharstring[]="abcdefghprintf(STRING);//为STRIprintf(string);//为string一次分printf(STRING);//为STRINprintf(string);由于const定义常量从汇编的角度来看而不是象#define一样给出的是立即数,所以,const定义程序运行过程中只有一份拷贝,而#define定义的常量若干个拷贝。constinti=value();dapingguo说:假定对ROM编写程序时,由于目标代码的不可改本语句将会无效,不过可以变通一下:值有不会被修改。观察以下一段代码:constinti=0;p=100;通过强制类型转换,将地址赋给变量,再作修改即可以改变const常量值。8.请分清数值常量和指针常量,以下声明颇为玩味:intii=0;constinti=0;//i是常量,i的值不会被修改p1i=ⅈ//合法*p2i=100;关于C++中的const关键字的用法非常灵活,而使用const将大大改善程序的健壮性,参考了康建东兄的const使用详解一文,对其中进行了一些补充,写下了本文。优点:const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检2.const修饰类的数据成员。如:{}const数据成员只在某个对象生存期内是常量,而对于整个类而言却是可变的。因为类可以创建多个对象,不同的对象其const数据成员的值可以不同。所以不能在类声明中初始化const数据成员,因为类的对象未被创建时,编译器不知道c{intarray[size];}const数据成员的初始化只能在类的构造函数的初始化表中进行。要想建立在整个类中都恒}型是整数,其最大值有限,且不能表示浮点数。3.const修饰指针的情况,见下式:intb=500;系,我们可以参考《Effectivec++》Item21上的做法,是修饰指针本身,即指针本身是常量。因此,[1]和[2]的情况相同,都是指针所指向的内容能*a=3;[3]为指针本身是常量,而指针所指向的内容不是常量,这种情况下不能对指针本身进行更改操作,如a++是错误的;[4]为指针本身和指向的内容均为常量。2)指针const常量初始化的情或者:constA*c=newconstA&e=f;//这样般的成员函数;5.另外const的一些强大的功能在于它在函数声明中的应用。在一个函数声明中,const情况,以下会逐渐的说明用法:A&operator=(constA&voidfun1()const;/调用函数的时候,用相应的变量初始化const常量,则在函数体中,按照const所修饰的部原对象的属性。用“值传递”方式,由于函数将自动产生临时变量用于复制该参数,该参数本就不需要保护,所以不用const修饰。是为了提高效率。例如,将voidFunc(Aa)对于内部数据类型的输入参数,不要将“值传递”的方式改为“const引用传递”。否则既达不到提高效率的目的,又降低了函数的可理解性。例如voidFunc(intx)不应该改为voidFunc(constint&x)operator*(constRational&lhs,constRatio{returnRational(lhs.numerator()}返回值用const修饰可以防止允许这样的操作发生产生新对象的时候。重载。通常,不建议用const修饰函数的返回值类型为某个对象或对某个对象引用的情况。原因如下:如果返回值为某个对象为const(constAtest=A实例)或某个对象的引用为少用到。2.如果给采用“指针传递”方式的函数返回值加const的内容不能被修改,该返回值只能被赋给加const修饰的如下语句将出现编译错误:正确的用法是:3.函数返回值采用“引用传递”的场合不多,这种方式一般只出现在类的赙值函数中,目的是为了实现链式表达。如:A&operate=(constA&other);//负}Aa,b,c;//a,ba=b=c;(a=b)=c;确。(a=b)=c就不正确了。constA&operator=(const一般放在函数体后,形如:voidfun()任何不会修改数据成员的函数都因该声明为const类型。如果在编写const成员函数时,不慎修改了数据成员,或者调用了其他非con的健壮性。如:{public:voidPush(intelem);intGetCount(void)const;//constprivate:{}2要避免最一般的赋值操作错误,如将const变量赋值,具体可见思考3在参数中使用const应该使用引用或指针,而不是一般的对象实4const在成员函数中的三种用法(参数、返回值、函数)要很好的使用;指向的是一个常量,所以不正确;2这种方法正确,因为声明指针所指向的内容可变;3这种做法不正确;在constA::operator=(constA时侯,问题就出现了:简单的strcpy函数都可看出面试者在技术上究竟达strcpy函数吗?我们都觉得自己能,可是我们写读者可从本文看到strcpy函数从2分到10外,还有一些面试题考查面试者敏捷的思维能力。深入剖析则可进一步增强自身的内功。{}{inti;{}}voidtest3(char*st{{}}解答:试题1字符串str1需要11个字节才能存放下(包节的空间,strcpy会导致数组越界;性可以给7分,在此基础上指出库函数所占用的1个字节。剖析:考查对基本功的掌握:(1)字符串以’\0’结尾;(2)对数组越界把握的敏感度;几个不同得分的答案:{}{}{}//为了实现链式操作,将目的地址返回,加3分!{}真不是盖的!需要多么扎实的基本功才能写一个完美的s(4)对strlen的掌握,它没有包括字符串末尾读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为:intstrlen(c{}{strcpy(str,"helloworld");}{charp[]="helloworld";}{}{}{}{}解答:charp[]="helloworld";的p[]数组为函数内的局部自动变量,在函数返回后,内存已经被释放。这是许多程序员常犯的错误,其根源在于不理解变量的生存期。试题6的getmemory避免了试题4的问题,传入getmemory的参数为字符串指针的指后未判断内存是否申请成功,应加上:{}个“野”指针,应加上:剖析:试题4~7考查面试者对内存操作的理解程度,基本功扎实的答其中50~60的错误。但是要完全解答正确,却也绝非易事。对内存操作的考查主要集中在:(1)指针的理解;(2)变量的生存期及作用范围;(3)良好的动态内存申请和释放习惯。再看看下面的一段程序有什么错误:{}{}解答:bool型变量:if(!var)float型变量:剖析:但是未能清晰地表达程序的意思。惯。{}sizeof(p)=?解答:剖析:func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的减等操作,可以被修改。数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构就是数组;例如:charstr[10];(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、charstr[10];(3)数组名作为函数形参时,沦为普通指针。f解答:剖析:行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:都应判0分;(2)防止宏的副作用。宏定义#definemin(a,b)((a)<=(b)这个解答在宏定义的后面加“;”,显示编写者对宏的概念模糊不清,只能被无情地判0分并被面试官淘汰。#ifndef__incvxworksh#ifdef__cplusplus#endif/*...*/#ifdef__cplusplus}#endif#endif/*__incvxworksh*/解答:#ifndef__incvxworksh#endif的作用是防止被重复引用。作为一种面向对象的语言,c++支持函数重载,而过程式语言c则不支持。函数被c++编译后在symbol库中的名字与c语言的不同。例如,假设某个函数的原型为:该函数被c编译器编译后在symbol库中的名字为_foo,而c++编译器则会产生像c++就是考这种机制来实现函数重载的。为了实现c和c++的混合编程,c++提供了c连接交换指定符号extern"c"来解决名字匹配问题,函数声明前加上extern"c"后,则编译器就会按照c语言的方式将该函数编译为试题5:编写一个函数,作用是把一个char组成的字符串循环右移n个。比如原来是“abcdefghi”如果n=2,移位后应该是“hiabcdefgh”函数头是这样的://pstr是指向以'\0'结尾的字符串的{}解答:{strcpy(pstr,tmp);}{memcpy(tmp,pstr+n,steps);memcpy(pstr+steps,pstr,nmemcpy(pstr,tmp,steps);}剖析:程度上简化程序编写的工作量。最频繁被使用的库函数包括:文件头并解析wav格式的各项信息。解答:typedefstructtagwaveformat{uin16nsamplesperseuin32navgbytesperseuin16nbitnumpersampl假设wav文件内容读出后存放在指针buffer开始的内存单元内,则分析文件格式的代码很简单,为:waveformatwaveformmemcpy(&waveformat,buffer,sizeof(waveformat));直接通过访问waveformat的成员,就可以获得特定wav文件的各项格式信息。剖析:员组织为一个结构体,利用指针类型转换,可以将memcpy、memset等函数直接用于结构体地址,进行结构体的整体操作。透过这个题可以看出面试者的程序设计经验是否丰富。{public:string(conststring&other);~~string&operate=(conststriprivate:解答:{{m_data=newchar[1];//得分点:对空字符串自动申请存放结束标志'\0//加分点:对m_data加null判断{m_data=newchar[length+1];//若能加null判}{}string::string(constst{intlength=strlen(other.m_data=newchar[length+strcpy(m_data,other.m_dat}//加分点:对m_data加null判断string&string::operate=(conststring&other

温馨提示

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

评论

0/150

提交评论