C++笔试题打印版.doc_第1页
C++笔试题打印版.doc_第2页
C++笔试题打印版.doc_第3页
C++笔试题打印版.doc_第4页
C++笔试题打印版.doc_第5页
已阅读5页,还剩212页未读 继续免费阅读

下载本文档

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

文档简介

C+笔试题1.多态类中的虚函数表是Compile-Time,还是Run-Time时建立的?答案:虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而对象的隐藏成员-虚拟函数表指针是在运行期-也就是构造函数被调用时进行初始化的,这是实现多态的关键.2.将一个 1M -10M 的文件,逆序存储到另一个文件,就是前一个文件的最后一个字符存到新文件的第一个字符,以此类推。/实现对一个文本文件内容的反向显示。#include #include void main ( ) char c;FILE *fp;if (fp=fopen(test.txt,r) = NULL) /以读方式打开文本文件 printf (Cannot open file.n);exit(1);fseek( fp, 0L, 2 ); /定位文件尾。注意此时并不是定位到文件的最后一字符,/而是在定位文件最后一个字符之后的位置while (fseek(fp, -1L, 1)!=-1) / 相对当前位置退后一个字节 c=fgetc(fp); putchar (c);/如果定位成功,读取当前字符并显示/* 读取字符成功,文件指针会自动移到下一字符位置 */if (c=n) /* 若读入是n字符 */fseek(fp, -2L,1); /* 由于DOS在文本文件中要存回车0x0d和换 */* 行0x0a两个字符,故要向前移动两个字节 */else fseek (fp, -1L, 1); /* 文件指针向前移动一个字节,使文 */ /* 件指针定位在刚刚读出的那个字符 */fclose (fp); /* 操作结束关闭文件 */5.给一个字符串、例如 “ababc”要求返回“ab”. 因为“ab”连续重复出现且最长。 用C/C语言写一函数完成该算法,给出复杂度从对一个字符开始,假设其为最长的串的第一个,向后查找下一个与它相同的字符,确定单循环的长度,再验证是否是连续出现的(类似于循环节),如后面不重复,则向后取一个字符,重复开始判断,当取得一个循环节并且后面重复时,记录其总长度,向后开继续判断,如找到更长的,则输出最长的,否则,把第一个结果输出 。6.对序列1、1、2、3、5、8、13。 是Fab.数列, 2、3、5、13.是Fab.质数数列,因为他们与自己前面的Fab.数列都互质,给出k,返回比k小的Fab.质数217#include #include #include using namespace std;void findFib(int k)vector fib1;vector fib2;fib1.push_back(1);fib1.push_back(1);fib1.push_back(2);fib2.push_back(2);bool found = false;int len = fib1.size();int f = 0;while (fib1len - 1 k)f = fib1len - 2 + fib1len - 1;fib1.push_back(f);len +;for (int i = 2;i fib1.size()-1;i+)found = true;for (int j = 0; j fib2.size();j+)if (fib1i % fib2j = 0)found = false;break;/end if/end for 2if (found)fib2.push_back(fib1i);/end for 1for (i = 0;i 2)findFib(k);printf(input kn);scanf(%d,&k);9.变量的声明和定义有什么区别?声明是向编译器介绍名字标识符。它告诉编译器“这个函数或变量在某处可找到,它的模样象什么”。而定义是说:“在这里建立变量”或“在这里建立函数”。它为名字分配存储空间。无论定义的是函数还是变量,编译器都要为它们在定义点分配存储空间。对于变量,编译器确定变量的大小,然后在内存中开辟空间来保存其数据,对于函数,编译器会生成代码,这些代码最终也要占用一定的内存。 在C和C中,可以在不同的地方声明相同的变量和函数,但只能有一个定义(有时这称为ODR,单一定义规则)。 定义也可以是声明,如果有int x;,之前编译器未发现标识符x,编译器则把这一标识符看成是定义并立即为它分配存储空间。 。 对“变量声明”的解释向来模糊且自相矛盾。 函数声明包括函数类型、函数名、参数列表和一个分号,这些信息足以编译器认出它是一个函数声明并可识别出这个函数的外部特征。由此推断,变量声明应是类型标识后面跟一个标识符。如int a;但这产生了一个矛盾,这段代码有足够的信息让编译器为之分配存储空间,而且编译器也确实给之分配了存储空间。要解决这个问题,对于C和C需要一个关键字来说明“这是一个声明,它的定义在别的地方”,这个关键字就是extern,它表示变量是在文件以外定义的,或在文件后面定义的。 在变量定义前加extern表示声明一个变量但不定义它,如: extern int a; extern也可用于函数声明,如: extern int func1(int length,int width); 但由于没有函数体,编译器必把它当成声明而非定义,extern对于函数来说是多余的、可选的。C语言的设计者并不要求函数声明使用extern,这可能有些令人遗憾,如果函数声明也要求用extern,那么形式上与变量声明更加一致了,从而减少了混乱(但这就需要更多的输入,这也许能解释为什么不要求函数声明使用extern的原因)。 10.请写出下面代码在 32 位平台上的运行结果,并说明 sizeof 的性质:#include #include int main(void) char a30; char *b = (char *)malloc(20 * sizeof(char); printf(%dn, sizeof(a);/30 printf(%dn, sizeof(b);/4 printf(%dn, sizeof(a3);/1 printf(%dn, sizeof(b+3);/4 printf(%dn, sizeof(*(b+4);/1 return 0 ; sizeof就是要求一种数据(类型)所占内存的字节数. 对于4.1中的s和psizeof(s)应为6, 而sizeof(p)应为一个指针的大小.13.我们需要编写一个图形相关的应用程序,需要处理大量图形(Shape)信息,图形有矩形(Rectangle),正方形(Square),圆形 (Circle)等种类,应用需要计算这些图形的面积,并且可能需要在某个设备上进行显示(使用在标准输出上打印信息的方式做为示意)。 a)请用面向对象的方法对以上应用进行设计,编写可能需要的类 b)请给出实现以上应用功能的示例性代码,从某处获取图形信息, 并且进行计算和绘制 c)如果你的Square继承自Rectangle,请给出理由,如果不是,请给出理由,并且请比较两种方式的优劣d)请问你所编写的类,在如下代码中会有何表现,请解释 void test_rectangle_area(Rectangle& r) r.set_width(10); r.set_height(15); assert(r.area() = 150);15.写一个程序,把一个100以内的自然数分解因数。(自然数分解因数就是将一个自然数分解为几个素数的乘积,提示,由于该数不是很大,所以可以将质数保存在数组中,以加快计算速度)/*-分解质因数的算法2005-03-13RainFly-*/#include #include #include int main() int i=2,N; coutN;bool fcontinue = false;bool found = false; while(1) /永远循环 int t = (int) sqrt(N);printf(sqrt(%d) = %dn,N,t); for (;i= sqrt(N);i+) printf(i= %d,sqrt(%d) = %d nn,i,N,t); if(N % i = 0) /i肯定是质数,N肯定不是质数 fcontinue = true; /如果找到一个质数,则可以继续分解 printf(发现一个质数,继续分解n); found = true;/至少发现一个质数 printf(在本次中,至少发现一个质数n); couti sqrt(N) printf(for loop is finishedn); if(fcontinue) printf(跳过后面的部分,开始下一次分解n); fcontinue = false; continue; if(found) printf(在前面中,发现质数 ,在此输出n); coutNendl; else coutN是个质数,不能分解endl; printf(中断循环,结束n); break; return 0;16.编写一个Identify的分配、释放的函数,为110000之间的自然数。17.分别实现itoa和atoi.18.Consider the following code:#include #include int main(int argc, char *argv) int i = 1;char buf4;strcpy(buf, AAAA);printf(%dn, i);return 0;a) When compiled and executed on x86, why does this program usually not output what the programmer intended? 在x86上为什么不能得到预期结果b) Name several ways in which the security problem that causes this program not to output what the programmer intended can be prevented WITHOUT changing the code.参考:第一个问题: 32位情况: x86下,栈方向向上生长.在main的栈中,先分配i空间(4byte),然后分配4个字节的buf(地址在i的上面,比i小).strcpy越界,用0把buf开始的第4(0开始)个字节覆盖掉了.而x86是LSB排列顺序,所以真好覆盖了i的内个数字1.所以显示出数字0. 16位情况同样分析即可. 第2问?20.说出结果 ?#include main() FILE *fp; int i,a4=1,2,3,4,b; fp=fopen(data.dat,wb);/这里帮忙解释一下 for(i=0;i4;i+) fwrite(&ai,sizeof(int),1,fp);/这里也帮忙看一下 fclose(fp); fp=fopen(data.dat,rb); fseek(fp,-2L*sizeof(int),SEEK_END);/还有这里 fread(&b,sizeof(int),1,fp);/这里还有也看一下 fclose(fp); printf(b=%dn,b); 22.char * GetStr()char *tmp;tmp = 123return tmp;void main()printf(%s, GetStr();会输出123吗?123创建在堆上还是栈上呢?123的空间是什么时候释放的?参考:123 是常量字符串,存储在全局变量区,和静态变量一起。即不在堆,也不在栈 在程序结束时自动释放 4)char *p, a168; 问:p=a是否会导致程序在以后出现问题?为什么?参考: 这个不会导致出现问题,但是要注意p的使用,如a12 等价的为 *(*(p+1)+2)而不是*(p+11),会的,这样会出现编译错误 正确的是:char a55; char (*p)5; p=a;如下所述的if else和switch语句哪个的效率高?为什么?5)在同一个进程中,一个模块是否可以通过指针操作破坏其它模块的内存,为什么?(华为)6)应用程序在运行时的内存包括代码区和数据区,其中数据区又包括哪些部分?参考:对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。动态数据区一般就是“堆栈”。栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”。全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。24.Assignment 2: Picture ProcessingUse C+, Java, or similar languages or/and any middleware such as EJB and J2EE to process a picture with a high resolution (3 Mega Pixels for example). Use some methodologies to degrade the resolution of the picture to make it quicker for browsing. Then divide the degraded picture into 9 sectors equally. Click any of the 9 sectors will result a detailed picture for this sector with the same resolution as that of the original picture. This assignment is designed for you to demonstrate your ability to handle pictures. 26.要开辟P1,P2,P3,P4内存来做缓冲,大小自定,但这四个缓冲的大小要一样,并且是连续的27.有一浮点型数组A,用C语言写一函数实现对浮点数组A进行降序排序,并输出结果,要求要以数组A作为函数的入口.(建议用冒泡排序法)void BubbleSort(double arr, int n) int i,j; int exchange = 1; /交换标志 for(i=1;i=i;j-) /对当前无序区Ri.n自下向上扫描 if(arrj+1 arrj)/交换记录 arr0=arrj+1; /R0不是哨兵,仅做暂存单元 arrj+1=arrj; arrj=arr0; exchange=1; /发生了交换,故将交换标志置为真 if(!exchange) /本趟排序未发生交换,提前终止算法 return; /endfor(外循环) 28.找错:#include #include class Base private:char * name;public:Base(char * className)name = new charstrlen(className);strcpy(name, className);Base()delete name;char * copyName()char newname 256;strcpy(newname, name);return newname;char * getName()return name;static void print(Base base)printf(name: %sn , );class Subclass : public Basepublic:Subclass(char * className) : Base(className) ;int main()Base * pBase = new Subclass(test);Base:print(*pBase);printf(name: %sn, pBase-getName();printf(new name: %sn, pBase-copyName();return 0;29.编写一个函数,函数接收一个字符串,是由十六进制数组成的一组字符串,函数的功能是把接到的这组字符串转换成十进制数字.并将十进制数字返回.答案:BOOL HexToDec( LPCTSTR shex,int& idec ) int i,mid; int len = lstrlen( shex ); if( len8 ) return FALSE; mid = 0; idec = 0; for( i=0;i=0&shexi=a&shexi=A&shexi=F ) mid = shexi -A +10; else return FALSE; mid = (len-i-1)2); / 移位表示变为2的n次方倍 idec =idc+mid; return TRUE; 30.编写一个函数将一条字符串分成两部分,将前半部分按ASCII码升序排序,后半部分不变,(如果字符串是奇数则中间的字符不变,)最后再将前后两部分交换,然后将该字符串输出,测试字符串“ADZDDJKJFIEJHGI”32. 找错#define MAX_SRM 256DSN get_SRM_no() static int SRM_no; int I; for(I=0;I=MAX_SRM)return (NULL_SRM);elsereturn SRM_no;简单的阅读一下这个函数,可以大概的可以猜测出这个函数的功能是分配一个空闲的SRAM块。方法:从上次分配的RAM块后的RAM块开始检测SRAM每个RAM块,看是否是IDLE状态,如果是IDLE则返回当前的RAM块的号SRM_no。如果所有的RAM块都不是IDLE状态,则意味着无法分配一个RAM给函数调用者,返回一个表示没有RAM可分配的标志(NULL_SRM)。 经过上面的分析,则这里可以知道,这个函数的错误是for循环里面没有给SRM_no这个变量累加1。34. int func(int a)int b; switch(a) case1:b=30; case2:b=20; case3:b=16; default:b=0;return b;则func(1)= 035:int a3;a0=0; a1=1; a2=2;int *p, *q;p=a;q=&a2;则aq-p=?36. 定义 int *a34, 则变量占有的内存空间为:_48_37.编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。38.写一个函数,判断一个int型的整数是否是2的幂,即是否可以表示成2X的形式(不可以用循环) 我只知道是用递推,大概写了一下,如下:int IsTwoPow(int s) if(s=1)return FALSE; s=s1; if(s1)IsTwoPow(s); return (s=1)?TRUE:FALSE;/大概是这个意思,但是这一句似乎不该这么返回!39 A,B从一堆玻璃球(共100个)里向外拿球,规则如下: (1)A先拿,然后一人一次交替着拿;(2)每次只能拿1个或2个或4个;(3)谁拿最后一个球,谁就是最后的失败者; 问A,B谁将是失败者?写出你的判断步骤。40.已知:无序数组,折半查找,各元素值唯一。函数原型是:Binary_Seach(int array, int iValue, int iCount)array是数组,在里面用折半查找的方法找等于iValue的值,找到返回1否则0,iCount是元素个数41.统计一个字符串中字符出现的次数42.100位以上的超大整数的加法(主要考虑数据结构和加法的实现)43.对如下电文:CASTCASTSATATATASA给出Huffman编码。44.int (* (*f)(int, int)(int)表示什么含义?a function pointer it points to a function that takes two arguments and return another function pointer that is int (*)(int)45.x=x+1,x+=1,x+,为这三个语句的效率排序。并说明为什么。46.中缀表达式 A-(B+C/D)*E的后缀形式是什么?47.struct S1 char c;int i;sizeof(S1) = ?class Xpublic:X();virtual X();void myMemberFunc();static void myStaticFunc();virtual void myVirtualFunc();private:int i;char * pstr;char a;sizeof(X) = ?48.找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet#include stdio.hchar *maxsubstr(char *str1, char *str2) char *p1, *p2, *q1, *q2, *destp; char *substr; int max = 0, len; p1 = str1; while (*p1 != ) q1 = str2; while (*q1 != ) len = 0; p2 = p1; q2 = q1; while (*p2 != ) & (*q2 != ) if (*p2 = *q2) p2+; q2+; len+; else break; if (len max) max = len; destp = p1; q1+; p1+; substr = (char *)malloc(sizeof(char)*max); strncpy(substr,destp,max); return substr;int main() char *s1 = asdfghjkl; char *s2 = asdwfghjews; char *sub; printf( %s %s, s1, s2); sub = maxsubstr(s1, s2); printf( the max sub string is: %s, sub); return 0;49.有一百个整数,其中有负数,找出连续三个数之和最大的部分.void hundurd(int a,int n)long result = 0;int temp1 = a0 + a1 + a2;int temp2;result = temp1;for (int i = 2;i temp1)result = temp2;temp1 = temp2;return result;50.写一程序实现快速排序. 假设数据输入为一文件快速算法描述如下 Algorithm Partition Input: sequence a0, ., an-1 with n elements Output: permutation of the sequence such that all elements a0, ., aj are less than or equal to allelements ai, ., an-1 (i j) Method: choose the element in the middle of the sequence as comparison element x let i = 0 and j = n-1 while ij search the first element ai which is greater than or equal to x search the last element aj which is less than or equal to x if ij exchange ai and aj let i = i+1 and j = j-1 After partitioning the sequence, Quicksort treats the two parts recursively by the same procedure.The recursion ends whenever a part consists of one element only. 51.写一算法检测单向链表中是否存在环(whether there is a loop in a link list),要求算法复杂度(Algorithms complexity是O(n) 并只使用常数空间(space is O(c). 注意,你只知道一个指向单向链表头的指针。链表的长度是不定的,而且环出现的地方也是不定的,环有可能在头,有可能在中间。而且要求是检测, 不能破坏环的结构.(MOTO)答:用两个指针来遍历这个单向链表,第一个指针p1,每次走一步;第二个指针p2,每次走两步; 当p2 指针追上 p1的时候,就表明链表当中有环路了。int testLinkRing(Link *head)Link *t1=head,*t2=head;while( t1-next & t2-next) t1 = t1-;next; if (NULL = (t2 = t2-next-next) return 0; /无环 if (t1 = t2) return 1; return 0;如果要定位环路在链表当中的开始点发现p2和p1重合,确定了单向链表有环路了。接下来,让p2回到链表的头部,重新走,P1也继续走,每次步长都走1,那么当p1和p2再次相遇的时候,就是环路的入口了。52.设下列函数已经通过了调试bool Sort_Array(ArrayType * Pinputarray, ArrayType * Poutarray);该函数在内存中排序,能把字节数最大为100M字节的ArrayType类型的数组排序。其中ArrayType是一个预定义的数组类型(细节无关紧要),Pinputarray,Poutarray分别为排序前的指针和排序后的指针。请用c语言的伪码风格设计一个算法,他调用上面给出的函数完成下列从输入到输出的任务:输入:排序前的大文件,名称为char * pinoutfilename ,其内容为用分号分隔的ArrayType类型的数组元素,可装满4个100M字节的数组。输出:排序后的大文件char * poutoutfilename。53.用最有效率的方法算出2乘以8等於几?移位54.选择题1.错误的转义字符是 (a )A.091 B.C.0 D.String s=; /s= char c=; /c= 是转移字符2.若数组名作实参而指针变量作形参,函数调用实参传给形参的是 ( )A.数组的长度 B.数组第一个元素的值 C.数组所有元素的值 D.数组第一个元素的地址3.变量的指针含意是指变量的 ( )A.值 B.地址 C.存储 D.名字5.某文件中定义的静态全局变量(或称静态外部变量)其作用域是 ( )?A.只限某个函数 B.本文件C.跨文件 D.不限制作用域静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。55.1. 解二次方程:a*x*x+b*x+cint Quadratic( double a,double b,double c,double& x1,double& x2);返回值:解的个数 用求根公式计算2. 最大公约数DWORD Divisor( DWORD dwFirst, DWORD dwSecond );返回值:最大公约数long Divisor( long dwFirst, long dwSecond )if (dwFirst 1,dwSecond 1) 1,dwSecond);elseif (dwSecond % 2 = 0)return Divisor(dwFirst,dwSecond 1);elsereturn Divisor(dwSecond,dwFirst - dwSecond);3. 根据蒙特卡洛算法计算圆周率double PI( DOWRD dwCount/*测试次数*/ );返回值:PI/*/* 利用蒙特卡洛算法近似求圆周率PI VC+6.0 ZZH*/#include#include#include#define COUNT 500000 /循环取样次数using namespace std;bool InCircle(double x,double y)/是否在1/4圆范围之内 if(x*x+y*y)=1)return true; return false;void main() double x,y; int num=0; int i; srand(unsigned)time(NULL); for(i=0;iCOUNT;i+) x=rand()*1.0/RAND_MAX; y=rand()*1.0/RAND_MAX; if(InCircle(x,y) num+; coutPI:(num*4.0)/COUNTendl;结果:测试5次的结果显示:3.13958,3.14041,3.13729,3.13859,3.141864. 无符号整数乘法,乘数为32bit,结果为64bit提示:32bit整数分解为16bit相乘void Multiply( DWORD dwFirst, DWORD dwSecond, DWORD& dwHigh, DWORD& dwLower );5. 链表排序(从小到大)节点定义为:struct Node int nValue; struct Node* pNext;最后一个节点的pNext = NULL.Node* SortChain( Node* pHead );返回值:链表头冒泡排序,插入排序等。为避免繁琐可以不交换指针,只交换值;也可以将值存入数组,对数组排序,再存入链表中。改错并说明原因file: 1.c int a10=0; file: 2.c int main () extern int *a; printf (%dn, a0); return 0; 1 #include “filename.h”和#include 的区别?对于include 编译器从标准库开始搜索filename.h;对于include “filename.h”编译器从用户工作路径开始搜索filename.h2 头文件的作用是什么?一、通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。二、头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。3 C+函数中值的传递方式有哪几种?C+函数的三种传递方式为:值传递、指针传递和引用传递。4 内存的分配方式的分配方式有几种?答:一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。5 实现双向链表删除一个节点P,在节点P后插入一个节点,写出这两个函数;/删除操作StatusListDelete_DuL(DuLinkList&L,inti,ElemType&e)if(!(p=GetElemP_DuL(L,i)/此处得到i位置的节点指针,如果有需要也得写出具体函数实现returnERROR;e=p-data;p-prior-next=p-next;p-next-prior=p-pror;free(p);returnOK;/插入操作StatusListInsert_

温馨提示

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

最新文档

评论

0/150

提交评论