《C++笔试题整理.pdf》由会员分享,可在线阅读,更多相关《C++笔试题整理.pdf(65页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 .链表反转单向链表的反转是一个经常被问到的一个面试题,也是一个非常基础的问题。比如一个链表是这样的:1-2-3-4-5 通过反转后成为 5-4-3-2-1。最容易想到的方法遍历一遍链表,利用一个辅助指针,存储遍历过程中当前指针指向的下一个元素,然后将当前节点元素的指针反转后,利用已经存储的指针往后面继续遍历。源代码如下:1.struct linka 2.int data;3.linka*next;4.);5.void reverse(linka*&head)6.if(head=NULL)7.return;8.linka*pre,*cur,*ne;9.pre=head;10.cur=head
2、-next;11.while(cur)12.13.ne=cur-next;14.cur-next=pre;15.pre=cur;16.cur=ne;17.18.head-next=NULL;19.head=pre;20.2求下面函数的返回值(微软)int func(x)(int countx=0;while(x)countx+;x=x&(x-1);)return countx;)假定x=9999o答案:8思路:将x转化为2进制,看含有的1的个数。3.什么是“引用”?申明和使用“引用”要注意哪些问题?答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同。申明
3、 个引用的时候,切记要对其进行初始化。引用声明完毕后,相当于目标变量名有两个名称,即该H标原名称和引用名,不能再把该引用名作为其他变量名的别名。声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单兀,系统也不给引用分配存储单元。不能建立数组的引用。4.将“引用”作为函数参数有哪些特点?(D传递引用给函数与传递指针的效果是样的。这时,被调函数的形参就成为原来主调函数中的实参变量或对象的一个别名来使用,所以在被调函数中对形参变量的操作就是对其相应的目标 对 象(在主调函数中)的操作。(2)使用引用传递函数的参数,在内存中并没有产
4、生实参的副本,它是直接对实参操作:而使用一般变量传递函数的参数,当发生函数调用时,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率和所占空间都好。(3)使用指针作为函数的参数虽然也能达到与使用引用的效果,但是,在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名 的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。而引用更容易使用,更清晰。5.在什么时候需要使用“常引用”?如果既要利用引用提高程序的效率,又要保护传递给函
5、数的数据不在函数中被改变,就应使用常引用。常引用声明方式:const类型标识符&引用名=目标变量名;例1int a;const int&ra=a;ra=1;错误a=1;正确6 .结构与联合有和区别?1.结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。2.对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。下面关于“联合”的题目的输出?#i nclude unionint i;char x2;)a;void main()(
6、a.x0=1 0;/低地址a.x1=1;高地址printf(%d,a.i);)答案:266(低位低地址,高位高地址,内存占用情况是0 x01 0A)7.已知St ri n g类定义如下:class String(public:String(const char*str=NULL);/通用构造函数String(const String&another);/拷贝构造函数 String();/析构函数String&operater=(const String&rhs);/赋值函数private:char*m_data;/用于保存字符串);尝试写出类的成员函数实现。答案:String:String(c
7、onst char*str)(if(str=NULL)/strlen在参数为NULL时会抛异常才会有这步判断(m_data=new char1;m_data0=0;)elsem_data=new charstrlen(str)+1;strcpy(m_data,str);)String:String(const String&another)(m_data=new charstrlen(another.m_data)+1 ;strcpy(m_data,other.m_data);)Strings String:operator=(const String&rhs)if(this=&rhs)ret
8、urn*this;delete 口m_data;删除原来的数据,新开一块内存m_data=new charstrlen(rhs.m_data)+1;strcpy(m_data,rhs.m_data);return*this;)String:String()(delete m_data;)8.#i nclude 与#i nclude file.h 的区别?答:前者是从Standard Library的路径寻找和引用file.h,而后者是从当前工作路径搜寻并引用 file.ho9,面向对象的三个基本特征,并简单叙述之?1.封 装:将客观事物抽象成类,每 个 类 对 自 身 的 数 据 和 方 法
9、实 行protection(private,protected,public)2.继承:广义的继承有三种实现形式:实现继承(指使用基类的属性和方法而无需额外编码的能 力)、可视继承(子窗体使用父窗体的外观和实现代码)、接口继承(仅使用属性和方法,实现滞后到子类实现)。前两种(类继承)和后一种(对象组合=接口继承以及纯虚函数)构成了功能复用的两种方式。3.多态:是将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。1 0.载(overload)和重写(o ve r
10、rie d,有的书也叫做“覆盖)的区别?常考的题目。从定义上来说:重载:是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。重写:是指子类重新定义复类虚函数的方法。从实现原理上来说:重载:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的 函 数(至 少 对 于 编 译 器 来 说 是 这 样 的)。如,有 两 个 同 名 函 数:functionfunc(p:integer):integer;function func(p:string):integer;那么编译器做过修饰后的函数名称可能是这样的:int_fu
11、nc、str_func对于这两个函数的调用,在编译器间就已经确定了,是静态的。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!重写:和多态真正相关。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚绑定)。1 1 .多态的作用?主要是两个:1.隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用;2.接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。1 2.New del
12、ete 与 m allocfree 的联系与区别?答案:都是在堆(heap)上进行动态的内存操作。用malloc函数需要指定内存分配的字节数并且不能初始化对象,new会自动调用对象的构造函数。delete会调用对象的destructor,而free不会调用对象的destructor.13.C+是不是类型安全的?答案:不是。两个不同类型的指针之间可以强制转换(用reinterpret cast)。C#是类型安全的。14.描述内存分配方式以及它们的区别?1)从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。2)在栈上创建。在执
13、行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集。3)从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由程序员决定,使用非常灵活,但问题也最多。1 5.struct 和 class 的区别答案:struct的成员默认是公有的,而类的成员默认是私有的。struct和class在其他方面是功能相当的。16.分别写出BOOL,int,float,指针类型的变量a 与“零”的比较语句。答案:BOOL:if(la)or
14、if(a)int:if(a=0)float:const EXPRESSI ON EXP=0.000001if(a-EXP)pointer:if(a!=NULL)or if(a=NULL)1 7.请说出co n st与#d e fin e 相比,有何优点?答案:1)const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对后者只进行字符替换,没有类型安全检查,并且在字符替换可能会产生意料不到的错误。2)有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。18.简述数组与指针的区别?数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。指针
15、可以随时指向任意类型的内存块。(1)修改内容上的差别char a=hello;a0=X;char*p=world;/注意p指向常量字符串p0=X;/编译器不能发现该错误,运行时错误(2)用运算符sizeof可以计算出数组的容量(字节数)。sizeof(p),p为指针得到的是一个指针变量的字节数,而不是p所指的内存容量。C+/C语言没有办法知道指针所指的内存容量,除非在申请内存时记住它。注意当数组作为函数的参数进行传递时,该数组自动退化为同类型的指针。char a=hello world;char*p=a;cout sizeof(a)endl;/12 字节cout sizeof(p)endl;/
16、4 字节计算数组和指针的内存容量void Func(char a100)(cout sizeof(a)endl;/4 字节而不是 100 字节)19.类成员函数的重载、覆盖和隐藏区别?答案:a.成员函数被重载的特征:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual关键字可有可无。b.覆盖是指派生类函数覆盖基类函数,特征是:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数相同;(4)基类函数必须有virtual关键字。c.“隐藏”是指派生类的函数屏蔽了与其同名的基类函数,规则如下:(1 )如果派生类的函数与基类的函数同名,但是参数
17、不同。此时,不论有无virtual关键字,基类的函数将被隐藏(注意别与重载混淆)。(2)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆)20.There are two int variables:a and b,dont use if,?:sw itchor other j udgem ent statem ents,find out the biggestone of the two numbers.答案:(a+b)+abs(a-b)/221.文件中有一组整数,要求排序后输出到另一个文件中答案:#includ
18、e#include#includeusing namespace std;void Order(vector&data)/bubble sort(int count=data.size();int tag=false;/设置是否需要继续冒泡的标志位for(int i=0;i count;i+)(for(int j=0;j dataj+1)tag=true;int temp=dataj;dataj=dataj+1;dataj+1 =temp;)if(!tag)break;)void main(void)int i;vectordata;ifstream in(c:data.txtu);if(!i
19、n)(couttemp;data.push_back(temp);)in.close();关闭输入文件流Order(data);of st ream out(,c:result.txtn);if(lout)(coutfile error!,;exit(1);)for(i=0;i data.size();i+)outdatainext=NULL)return head;Node*p1=head;Node*p2=p1-next;Node*p3=p2-next;p1-next=NULL;while(p3!=NULL)(p2-next=p1;p1=p2;p2=p3;p3=p3-next;)p2-nex
20、t=p1;head=p2;return head;)(2)已知两个链表headl和head2各自有序,请把它们合并成 个链表依然有序。(保留所有结点,即便大小相同)Node*Merge(Node*headl,Node*head2)(if(headl=NULL)return head2;if(head2=NULL)return headl;Node*head=NULL;Node*p1=NULL;Node*p2=NULL;if(headl-data data)(head=headl;p1=headl-next;p2=head2;)elsehead=head2;p2=head2-next;p1=he
21、adl;)Node*pcurrent=head;while(p1!=NULL&p2!=NULL)(if(p1-data data)(pcurrent-next=p1;pcurrent=p1;p1=p1-next;)else(pcurrent-next=p2;pcurrent=p2;p2=p2-next;)if(p1!=NULL)pcurrent-next=p1;if(p2!=NULL)pcurrent-next=p2;return head;)已知两个链表headl和head2各自有序,请把它们合并成一个链表依然有序,这次要求用递归方法进行。(Autodesk)答案:Node*MergeRec
22、ursive(Node*headl,Node*head2)(if(headl=NULL)return head2;if(head2=NULL)return headl;Node*head=NULL;if(headl-data data)(head=headl;head-next=MergeRecursive(headl-next,head2);)else(head=head2;head-next=MergeRecursive(head1,head2-next);)return head;)23.写一个函数找出一个整数数组中,第二大的数(m icrosoft)答案:const int MINNU
23、MBER=-32767;int find_sec_max(int data,int count)(int maxnumber=data0;int sec_max=Ml NNUMBER;for(int i=1 ;i maxnumber)(sec_max=maxnumber;maxnumber=datai;)else(if(datai sec_max)sec_max=datai;)return sec_max;)24.如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)struct node char val;node*next;bool check(const node*he
24、ad)/return false:无环;true:有环一种0(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):bool check(const node*head)(if(head=NULL)return false;node*low=head,*fast=head-next;while(fast!=NULL&fast-next!=NULL)(low=low-next;fast=fast-next-next;if(low=fast)return true;)return false;)25.中序表达式:a-b*c+d对应的前序表达式是什么?
25、中序表达式:a-b*c+d对应的前序表达式是+-a*bcd。先将中序表达式按照运算规则加括号,然后把所有的符号放到括号前面即可。(a-(b*c)+d)表达式a*(b+C)-d的后缀表达式什么?根据所给表达式(其实正常的都是中缀表达式)可以构造二叉树*d/a+/b c中缀表达式就是中序遍历a*(b+c)-d后缀表达式就是后续遍历abc+*d-前缀表达式就是前序遍历-*a+bcd前缀表达式如何求值对于一个前缀表达式的求值而言,首先要从右至左扫描表达式,从右边第一个字符开始判断,如果当前字符 是 数 字 则 直到数字串的末尾再记录下来,如果是运算符,则将右边离得最近的两个“数字串”作相应的运算,以此
26、作为一个新的“数字串”并记录下来。一直扫描到表达式的最左端时,最后运算的值也就是表达式的值。例如,前 缀 表 达 式+23”的求值,扫描到3时,记录下这个数字串,扫描到2时,记录下这个数字串,当扫描到+时,将+右移做相邻两数字串的运算符,记为2+3,结果为5,记录下这个新数字串,并继续向左扫描,扫描到1时,记录下这个数字串,扫描到-时,将-右移做相邻两数字串的运算符,记为1-5,结果为-4,所以表达式的值为-4。2 6.请 简 单 描 述W in d o w s内 存 管 理 的 方 法。内存管理是操作系统中的重要部分,两三句话恐怕谁也说不清楚吧我先说个大概,希望能够抛砖引玉吧当程序运行时需要
27、从内存中读出这段程序的代码。代码的位置必须在物理内存中才能被运行,由于现在的操作系统中有非常多的程序运行着,内存中不能够完全放下,所以引出了虚拟内存的概念。把哪些不常用的程序片断就放入虚拟内存,当需要用到它的时候在load入主存(物理内存)中。这个就是内存管理所要做的事。内存管理还有另外一件事需要做:计算程序片段在主存中的物理位置,以便CPU调度。内存管理有块式管理,页式管理,段式和段页式管理。现在常用段页式管理块式管理:把主存分为一大块、一大块的,当所需的程序片断不在主存时就分配一块主存空间,把 程 序 片 断load入主存,就算所需的程序片度只有几个字节也只能把这一块分配给它。这样会造成很
28、大的浪费,平均浪费了 50%的内存空间,但时易于管理。页式管理:把主存分为一页一页的,每一页的空间要比一块一块的空间小很多,显然这种方法的空间利用率要比块式管理高很多。段式管理:把主存分为一段一段的,每一段的空间又要比一页一页的空间小很多,这种方法在空间利用率上又比页式管理高很多,但是也有另外一个缺点。一个程序片断可能会被分为几十段,这样很多时间就会被浪费在计算每一段的物理地址上(计算机最耗时间的大家都知道是I/O吧。段页式管理:结合了段式管理和页式管理的优点。把主存分为若干页,每一页又分为若干段。好处就很明显,不用我多说了吧。各种内存管理都有它自己的方法来计算出程序片断在主存中的物理地址,其
29、实都很相似。这只是一个大概而已,不足以说明内存管理的皮毛。无论哪一本操作系统书上都有详细的讲解27.const符号常量;(1)const char*p(2)char const*p(3)char*const p说明上面三种描述的区别;如果const位于星号的左侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;如果const位于星号的右侧,const就是修饰指针本身,即指针本身是常量。(1)const char*p一个指向char类型的const对象指针,p不是常量,我们可以修改p的值,使其指向不同的char,但是不能改变它指向非char对象,如:const char*p;char
30、 c1=a;char c2=b;p=&c1;/okp=&c2;/ok*p=c1;/error(2)char const*p(3)char*const p这两个好象是一样的,此时*p可以修改,而p不能修改。(4)const char*const p这种是地址及指向对象都不能修改。28.下面是C 语言中两种i f 语句判断方式。请问哪种写法更好?为什么?int n;if(n=10)/第一种判断方式if(10=n)/第二种判断方式第二种方式如果少了个=号,编译时就会报错,减少了出错的可能行,可以检测出是否少了=,而第一种方式如果少了个=号,编译器会当成赋值操作,不会报错,从而给调试带来困难29.下面
31、代码有什么问题?Void test2()char string 10,str1 10;for(i=0;i10;i+)(str1i=a;)strcpy(string,str1);)数组越界strcpy是专门用来处理字符串数组的,最后复制完后,会在最后加一个“/0”,而此时string已经没有空间了。分清字符串数组与字符数组的区别30.写出运行结果:/testlchar str=world;cout sizeof(str)“:;char*p=str;cout sizeof(p):;char i=10;cout sizeof(i):;void*p=malloc(10);cout sizeof(p)e
32、ndl;)6:4:1:431.用C+写个程序,如何判断一个操作系统是1 6 位还是3 2 位的?不能用sizeof()函数A1:16位的系统下,int i=65536;cout i;/输出 0;int i=65535;cout i;/输出-1;3 2 位的系统下,int i=65536;cout i;/输出 65536;int i=65535;cout 65536)(cout32 bitendl;)else(cout*1 6 bitendl;)3 2 .C和C+有什么不同?从机制上:C是面向过程的(但C也可以编写面向对象的程序);C+是面向对象的,提供了类。但是,C+编写面向对象的程序比C容易
33、从适用的方向:C适合要求代码体积小的,效率高的场合,如嵌入式;C+适合更上层的,复杂的;llinux核心大部分是c 写的,因为它是系统软件,效率要求极高。从名称上也可以看出,C+比c 多了+,说明C+是c 的超集;那为什么不叫c+而叫C+呢,是因为C+比C来说扩充的东西太多了,所以就在C后面放上两个+;于是就成了 C+C 语言是结构化编程语言,C+是面向对象编程语言。C+侧重于对象而不是过程,侧重于类的设计而不是逻辑的设计。3 3.在不用第三方参数的情况下,交换两个参数的值#include void main()(int i=60;int j=50;i=i+j;)方法二:iA=j;jA=i;i
34、A=j;34.i 最后等于多少?int i=1;int j=i+;if(ij+)&(i+=j)i+=j;答:i=535.s ta tic 变量和s ta tic 函数各有什么特点?答:static变量:在程序运行期内直有效,如果定义在函数外,则在编译单元内可见,如果在函数内,在在定义的block内可见;static函数:在编译单元内可见;36.用C 写一个输入的整数,倒着输出整数的函数,要求用递归方法;答:void fun(int a)printf(%d,a%10);a/=10;if(a =0;-i)/反向遍历 array 数组cout arrayi endl;答:首先数组定义有误,应加上类型
35、参数:vector a rra y.其次vector:size_type被定义为unsigned in t,即无符号数,这样做为循环变量的i 为0 时再减1 就会变成最大的整数,导致循环失去控制。38.再看看下面的一段程序有什么错误:swap(int*pl,int*p2)(int*p;*p=*pl;*pl=*p2;*p2=*p;)在 swap函数中,p 是一个“野”指针,有可能指向系统区,导致程序运行的崩溃。在 VC+中 DEBUG运行时提示错误Access Violation。该程序应该改为:swap(int*pl,int*p2)(int p;p=*pl;*pl=*p2;*p2=p;39.分
36、别给出BOOL,int,float,指针变量与“零值”比较的i f 语句(假设变量名为var)解答:BOOL 型变量:if(!var)int 型变量:if(va=0)float型变量:const float EPS1NON=0.00001;if(x=-EPSINON)&(x =,或“=,形式。如果写成if(x=0.0),则判为错,得。分。40.试题2:以下为Windows NT下的32位 C+程序,请计算sizeof的值void Func(char str100)(sizeof(str)=?)void*p=malloc(100);sizeof(p)=?解答:sizeof(str)=4sizeo
37、f(p)=4剖析:Func(char str100)函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。数组名的本质如下:(1)数组名指代一种数据结构,这种数据结构就是数组;例如:char str10;cout sizeof(str)endl;输出结果为10,str指代数据结构char10。(2)数组名可以转换为指向其指代实体的指针,而且是一个指针常量,不能作自增、自减等操作,不能被修改;char str10;str+;编译出错,提示sir不是左值41.写一个“标准”宏 M IN,这个宏
38、输入两个参数并返回较小的一个。另外,当你写下面的代码时会发生什么事least=MIN(*p+,b);解答:#define MIN(A,B)(A)=(B)?(A):(B)MIN(*p+,b)会产生宏的副作用剖析:这个面试题主要考查面试者对宏定义的使用,宏定义可以实现类似于函数的功能,但是它终归不是函数,而宏定义中括弧中的“参数”也不是真的参数,在宏展开的时候对“参数”进行的是一对一的替换。程序员对宏定义的使用要非常小心,特别要注意两个问题:(1)谨慎地将宏定义中的“参数”和整个宏用用括弧括起来。所以,严格地讲,下述解答:#define MIN(A,B)(A)=(B)?(A):(B)#define
39、 MIN(A,B)(A=B?A:B)都应判0分;(2)防止宏的副作用。宏定义#define MIN(A,B)(A)=(B)?(A):(B)对 MIN(*p+,b)的作用结果是:(*p+)=(b)?(*p+):(b)这个表达式会产生副作用,指 针p会作两次+自增操作。除此之外,另一个应该判0分的解答是:#define MIN(A,B)(A)n e x t =N U L L;P=h;f o r (i=0;i n e x t =s;p r i n t f (Z/Pl e a s e i n p u t t h e i n f o r m a t i o n o f t h e s t u d e n
40、 t:n a m e s e x n o a g e n);s c a n f (版%c%d%d,z,s-n a m e,&s-s e x,&s-n o,&s-a g e);s-n e x t =N U L L;P=s;p r i n t f (C r e a t e s u c c e s s f u l !,z);r e t u r n(h);)v o i d d e l e t e l i s t(s t r u c t s t u *s,i n t a)(s t r u c t s t u *p;w h i l e(s-a g e!=a)(P=s;s =s-n e x t;)i f(s
41、二二N U L L)p r i n t f(/zTh e r e c o r d i s n o t e x i s t.);e l s e(p-n e x t =s-n e x t;p r i n t f (D e l e t e s u c c e s s f u l !,z);v o i d d i s p l a y(s t r u c t s t u *s)(s =s-n e x t;w h i l e(s!=N U L L)(p r i n t f (z,%s%c%d%d nz,,s-n a m e,s-s e x,s-n o,s-a g e);s =s-n e x t;i n t
42、 m a i n O(s t r u c t s t u *s;i n t n,a g e;p r i n t f(Pl e a s e i n p u t t h e l e n g t h o f s e q l i s t:n);s c a n f&n);s =c r e a t l i s t(n);d i s p l a y(s);p r i n t f(z,Pl e a s e i n p u t t h e a g e:n);s c a n f&a g e);d e l e t e l i s t (s,a g e);d i s p l a y (s);r e t u r n 0
43、;)2、实现一个函数,把一个字符串中的字符从小写转为大写。i n c l u d e s t d i o.h i n c l u d e “c o n i o.h v o i d u p p e r s(c h a r *s,c h a r *u s)(f o r (;*s!=,0*;s+,u s+)(i f (*s=,a&*s=,z)*u s =*s-32;e l s e*u s =*s;)*u s =0;)i n t m a i n()(c h a r *s,*u s;c h a r s s 20;p r i n t f(Pl e a s e i n p u t a s t r i n g
44、:n);s c a n f (%s”,s s);s =s s;u p p e r s (s,u s);p r i n t f (Z/Th e r e s u l t i s:n%s n,u s);g e t c h ();)48.有个数组a100存放了 100个数,这 100个数取自1-99,且只有两个相同的数,剩下的98个数不同,写一个搜索算法找出相同的那个数的值.(注意空间效率时间效率尽可能要低).题目描述的不是很清晰啊,搜索算法是找出这个数还是找出这个重复数字的两个下标(位置)?一,如果仅仅是找出这个数,那么可以这么做:int baseSum=(1+99)/2*99;/1+2+.99in
45、t sum=0;inti;for(i=0;i100;i+)sum+=ai;)/sum-baseSum即是要搜索的数字二,如果需要找出重复数字的下标,可以以空间换取时间的代价:int b100;bi=x,表示 ax=imemset(b,sizeof(int)*100,-1);inti;for(i=0;i100;i+)if(-1=bai)(bai=i;)else(说明ai这个数曾经出现过,那么ai就是重复的数字,/之前保存的下标ba叩和当前的i就是两个下标)49.编写一个函数,返回两个字符串的最大公串!例如,adbccadebbca”和“edabccadece”,返回“bccade”#includ
46、eusing namespace std;int pos=0;int max=0;void maxstr(char*m,char*n)(int i=0;int j=0;i j 分别作为字符数组m,n的循环变量intlen=0;相同字符串的长度int posl=0;记录外层循环i,因为在循环中i 值会变换int pos2=0;/当前最大相同字符串在m 中对应的下标值while(mi!=0)posl=i;while(mi!=O,)&(nj!=,O)(if(mi=nj)(i+;j+;continue;)if(i-posllen)(len=i-posl;pos2=posl;对最大相同字符串的长度和位置
47、进行更新)j=j-(i-posl)+l;i=posl;)i=posl+l;j=0;)pos=pos2;max=len;)void main()(char p20;char q20;cout nLplease enter stringl:Mendl;cinp;cout n2.please enter string!:Hendl;cinq;coutendl;/char*p=Hadbccadebbcan;/char*q=nedabccadecen;/puts(p);/puts(q);maxstr(p,q);cou tp osn nm axendl;cou tnthe same string is:n
48、endl;if(max=0)cou tnno same string.*;for(int i=0;imax;i+)coutppos+il;coutendl;5 0.设计函数 int atoi(char*s).int atoi(const char*nptr);函数说明atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时(0)才结束转换,并将结果返回。返回值返回转换后的整型数。include include int myAtoi(const char*s)int result=0;int flag=1;int i=0;whil
49、e(isspace(si)i+;if(si=-)flag=-1;i+;)if(si=+)i+;while(si!=0)if(si9)|(si0)break;intj=si-O;result=10*result+j;i+;)result=result*flag;return result;int main()char*a=n-1234def;char*b=+1234”;int i=myAtoi(a);int j=myAtoi(b);printf(n%d nM,i);printf(”d”,j);return 0;)51.下面这个程序执行后会有什么结果struct name1char str;sho
50、rt x;int num;)struct name2char str;int num;short x;)sizeof(struct name1)=?,sizeof(struct name2)=?答案:sizeof(struct namel)=8,sizeof(struct name2)=12在第二个结构中,为保证num按四个字节对齐,char后必须留出3 字节的空间:同时为保证整个结构的自然对齐(这里是4 字节对齐),在 x 后还要补齐2 个字节,这样就是12字节。52.写出判断ABCD四个表达式的是否正确,若正确,写出经过表达式中a 的值(3分)int a=4;(A)a+=(a+);(B)a