2007春VC++上机考试.doc_第1页
2007春VC++上机考试.doc_第2页
2007春VC++上机考试.doc_第3页
2007春VC++上机考试.doc_第4页
2007春VC++上机考试.doc_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

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

文档简介

VC01一、改错题一个二维数组的每列元素的逆序操作是指将该二维数组每列元素的次序颠倒,例如:1 2 3 4 9 10 11 12二维数组5 6 7 8经过每列元素逆序操作后变为 5 6 7 89 10 11 12 1 2 3 4下列程序实现二维数组每列元素的逆序操作。在该程序中,二维数组以一维数组的形式传递给函数inverse的参数p,其中参数m,n分别为所传递的二维数组的列数和行数。含错误的源程序如下:#includevoid inverse(int *p,int m,int n)for(int k=0;kp2)int t=p1;*p1=*p2;*p2=t;p1+=m;p2-=m;void main()int a34;for(int i=0;i3;i+)for(int j=0;j4;j+)aij=i*4+j+1;coutendl;inverse(a,4,3);for(i=0;i3;i+)for(int j=0;j4;j+)coutaijt;coutendl;正确的源程序如下:#includevoid inverse(int *p,int m,int n)for(int k=0;km;k+)int *p1=p+k,*p2=p+k+(n-1)*m;while(p1p2)int t=*p1;*p1=*p2;*p2=t;p1+=m;p2-=m;void main()int a34;for(int i=0;i3;i+)for(int j=0;j4;j+)aij=i*4+j+1;coutendl;inverse(*a,4,3);for(i=0;i3;i+)for(int j=0;j4;j+)coutaijt;coutendl;二、编程题定义一个求两个集合交集的类DataSet,并在主函数中用两个字符串进行测试。具体要求如下:(1)私有数据成员:char p1,p2;指向存放两个原始集合的存储空间的指针char *p;指向存放上述两个集合的交集的存储空间的指针(2)公有成员函数DataSet(char a,char b);初始化两个原始集合,同时为指针p动态分配内存空间,大小为数组a和b中较大的尺寸void compress(char *p);消除指针p所指向的数组中的重复元素void setcompress();通过分别调用compress函数,消除p1和p2所指向数据中的重复元素。由于集合没有重复的元素,因此在创建DataSet对象后,必须调用setcompress函数void intersection();求指针p1和p2所指向集合的交集,结果存放在指针p所指向的存储空间中void print();输出两个原始集合及它们的交集DataSet();实现必要的功能(3)在主函数中,创建一个DataSet类型的对象,在消除该对象中每个原始集合的重复元素之后,求它们的交集,并输出。VC02一、改错题下列程序的功能是:查询一个带通配符”?”的字符串sub在另一个字符串str中出现的次数,其中通配符”?”可以代替任何一个字符。例如,字符串”a?c”在”abcdabceascac”中出现了3次(下划线部分),”a?a”在”abacadca”中出现了2次,”a?”在”abaca”出现了2次。含错误的源程序如下:#includevoid fun(char *str,char *sub)int n=0;while(*str)char *p1=str,*p2=sub;while(*p1=*p2 & *p2=?)if(*(p2+1)=0 & *p1)n+;continue;p1+;p2+;str+;return n;void main()char str80,sub10;cout请输入被查询的字符:n;cin.getline(str,79);cout请输入要查询的字符:n;cin.getline(sub,9);int k=fun(&str,&sub);if(k)cout出现了k次。n;elsecout没有出现n;正确的源程序如下:#includeint fun(char *str,char *sub)int n=0;while(*str)char *p1=str,*p2=sub;while(*p1=*p2 | *p2=?)if(*(p2+1)=0 & *p1)n+;break;p1+;p2+;str+;return n;void main()char str80,sub10;cout请输入被查询的字符:n;cin.getline(str,80);cout请输入要查询的字符:n;cin.getline(sub,10);int k=fun(str,sub);if(k)cout出现了k次。n;elsecout没有出现n;二、编程题编程实现对大于1的整数进行质因数分解。所谓整数的质因数分解是指将整数分解为其所有质数(素数)因数的积,例如,602*2*3*5。定义一个类Decompose实现上述功能。具体要求如下:(1)私有数据成员int *a;指向存放质因数的动态存储空间int num;待分解质因数的整数int n;质因数的个数(2)公有成员函数Decompose(int m);用m初始化num,并将n初始化为0,a初始化为空指针void print();输出整数num的质因数void primenum();求整数num的所有质因数(保留重复部分,例如60的质因数为2,2,3,5),并将这些质因数存放到指针a所指向的存储空间中Decompose();释放动态分配的存储空间(3)在主函数中完成对该类的测试。从键盘输入一个大于1的整数number,定义类Decomose的对象d,并用number初始化d,调用函数primenum()求number的所有质因数,最后输出number的质因数分解结果。VC03一、改错题折半查找的基本思想为:假设一数据集是按升序排列的,如果要查找的数小于该数据集第一个元素或大于该数据集的最后一个元素,则查找失败;否则,计算数据集的中间元素(如果元素个数为偶数2n,则中间元素约定为第n个元素),如果中间元素正好等于要查找的数,则查找成功;如果中间元素小于要查找的数,则从中间元素往后查找,否则从中间元素往前查找;在缩小了的范围内重复应用上述方法既可。下列程序中的函数search用递归方法实现在数组a中查找key的功能,如果查找成功,返回数组a中相应元素的下标值,否则返回-1,其中n1和n2分别为当前查找的数组下标范围。主函数首先随机生成15个整数,然后用折半查找法在其中查找某一个键盘输入的数,并输出查找结果。含错误的源程序如下:#include#includeint search(int a,int key,int n1,int n2)if(an1key & an2key)return -1;if(key=an2)return n2;if(key=an1)return n1;int n=(n2-n1)/2;if(n=n1 | n=n2)return n;if(an=key)return n;if(ankey)return search(a,key,n1,n);elsereturn search(a,key,n,n2);void sort(int *p,int n) /对数组排序for(int i=0;in-1;i+)for(int j=i+1;j*(p+j)int t=*(p+i);*(p+i)=*(p+j);*(p+j)=t;void main()int data15,k,index;for(int i=0;i15;i+)datai=rand()%100; /系统函数rand的功能是产生一个随机整数sort(data,15);for(i=0;i15;i+)coutdatait;coutn;coutk;index=search(data,k,0,14);if(index=-1)coutThe number k isnt in this array!n;elsecoutindex=indexendl;coutdataindex=dataindexendl;正确的源程序如下:#include#includeint search(int a,int key,int n1,int n2)if(an1key | an2key)return -1;if(key=an2)return n2;if(key=an1)return n1;int n=(n2+n1)/2;if(n=n1 & n=n2)return n;if(an=key)return n;if(ankey)return search(a,key,n+1,n2);elsereturn search(a,key,n1,n-1);void sort(int *p,int n) /对数组排序for(int i=0;in-1;i+)for(int j=i+1;j*(p+j)int t=*(p+i);*(p+i)=*(p+j);*(p+j)=t;void main()int data15,k,index;for(int i=0;i15;i+)datai=rand()%100; /系统函数rand的功能是产生一个随机整数sort(data,15);for(i=0;i15;i+)coutdatait;coutn;coutk;index=search(data,k,0,14);if(index=-1)coutThe number k isnt in this array!n;elsecoutindex=indexendl;coutdataindex=dataindexendl;二、编程题定义一个类Array,求一个二维数组所有元素的平均值(精确到小数点后3位数),并将该平均值的整数和小数部分分别逆序后输出(如平均值为342.083,则将其整数和小数部分分别逆序后变为243.380)。类Array的具体要求如下:(1)私有数据成员int a34;float ave1,ave2;ave1,ave2分别存放数组a中所有元素的平均值及其逆序值(2)公有成员函数Array(int t4,int n);对私有成员a初始化void average();计算ave1的值void invert();按题目要求对ave1进行逆序处理,得到ave2void print();输出所有成员数据(3)在主函数中对该类进行测试。使用如下二维数组作为测试数据:1122116302005243626513222696071054代码如下:#include#include class Arrayprivate:int a34;float ave1,ave2;public:Array(int t4,int n)for(int i=0;in;i+)for(int j=0;j4;j+)aij=tij;void average()float s=0;for(int i=0;i3;i+)for(int j=0;j0)s1=s1*10+a1%10;a1=a1/10;int a2,s2=0,n=0;a2=int(ave1*1000+0.5)%1000;while(+n=3)s2=s2*10+a2%10;a2=a2/10;ave2=s1+s2/1000.0;void print()for(int i=0;i3;i+)for(int j=0;j4;j+)coutaijt;coutendl;coutave1=ave1endl;cout.setf(ios:fixed);coutave2=setprecision(3)ave2endl;void main()int t34=112,211,630,200,524,362,651,322,269,60,710,54;Array s(t,3);s.average();s.invert();s.print();VC04一、改错题一个二维数组的每行元素的逆序变换是指将该二维数组每行元素的次序颠倒。例如,二维数组1, 2, 3, 4,5, 6, 7, 8,9,10,11,12, 经过每行元素逆序变换后的数组为4,3,2,1,8,7,6,5,12,11,10,9 。下列程序实现了二维数组每行元素的逆序变换。在该程序中,将二维数组首行地址传递给函数inverse的参数p,其中参数n为所传递的二维数组的列数。函数print可以打印二维数组,其中二维数组以一维数组的形式传递给指针p,m和n分别表示二维数组的行数和列数。含错误的源程序如下:#include void inverse(int *p, int n)int *p1=p, *p2=p1+n;while(p1 p2)int t = *p1;*p1 = *p2;*p2 = t;p1+; p2-;void print(int *p, int m, int n)int *p1 = p, *p2 = p1 + m*n - 1;while(p1 = p2)int count;while(count+n)cout *p1+ t;cout endl;void main()int a34;for(int i = 0; i 3; i+)for(int j = 0; j 4; j+)aij = i * 4 + j + 1;for(i = 0; i 3; i+)inverse(a, 4);print(a, 3, 4);正确的源程序如下:#include void inverse(int (*p)4, int n)int *p1=*p, *p2=p1+n-1;while(p1 p2)int t = *p1;*p1 = *p2;*p2 = t;p1+; p2-;void print(int *p, int m, int n)int *p1 = p, *p2 = p1 + m*n - 1;while(p1 = p2)int count=0;while(count+n)cout *p1+ t;cout endl;void main()int a34;for(int i = 0; i 3; i+)for(int j = 0; j 4; j+)aij = i * 4 + j + 1;for(i = 0; i 3; i+)inverse(a+i, 4);print(*a, 3, 4);二、编程题编写一个程序求直角坐标系中点到直线的距离。具体要求如下:(1)定义一个点的类Point,含有:私有数据成员:float x,y;分别代表点的横坐标和纵坐标公有成员函数:Point(float a,float b);分别对x和y初始化float getX(),float getY();分别返回横坐标和纵坐标void print();以(x,y)的形式输出点(2)定义一个直线类Line,含有:私有数据成员:Point p1,p2;分别表示直线的两个端点公有成员函数:Line(Point &,Point &);分别对p1和p2初始化友元函数float distance(Line &p,Point &q);计算并输出点到直线的距离点(x,y)到由(x1,y1)和(x2,y2)两点确定的直线的距离公式为:(3)在主函数中利用上述类定义一个点和一条直线,计算并输出点到直线间的距离。VC05一、改错题用二分法解方程f(x)=0的具体算法如下:(1)输入x1、x2,直至f(x1)与f(x2)异号,说明方程在x1、x2之间有解(2)求x1和x2的中点x0(3)如果f(x0)与f(x1)同号,表明方程的解在x0与x2之间,用x0取代x1;否则方程的解在x0与x1之间,用x0取代x2(4)如果f(x0)的值足够小,则方程的近似解为x0;否则重复执行步骤(2)、(3)、(4),直至f(x0)足够小(5)输出方程的解x0要求用二分法解方程x2+4x-4=0和x3+2x2+3x-15=0。含错误的源程序如下:#include#includedouble f1(double x) return x*x+4*x-4; double f2(double x) return x*x*x+2*x*x+3*x-15; void xx(double (*fp)(double), double &a,double &b)docoutab;while(fp(a)*fp(b)0);void fun(double (*fp)(double)double x0,x1,x2;xx(fp,&x1,&x2);dox0=(x2-x1)/2;coutx1,x2,x00)x2=x0;elsex1=x0;while(fabs(fp(x0)1e-5);cout方程的解为:x0endl;void main()cout解第一个方程:n;fun(f1);cout解第二个方程:n;fun(f2);正确的源程序如下:#include#includedouble f1(double x) return x*x+4*x-4; double f2(double x) return x*x*x+2*x*x+3*x-15; void xx(double (*fp)(double), double &a,double &b)docoutab;while(fp(a)*fp(b)=0);void fun(double (*fp)(double)double x0,x1,x2;xx(fp,x1,x2);dox0=(x2+x1)/2;coutx1,x2,x00)x1=x0;elsex2=x0;while(fabs(fp(x0)1e-5);cout方程的解为:x0endl;void main()cout解第一个方程:n;fun(f1);cout解第二个方程:n;fun(f2);二、编程题具体要求如下:(1)私有数据成员(2)公有成员函数(3)VC06一、改错题设有两个整型数组a和b,其中数组a的前n个元素中存放着0,1,2,n-1(次序打乱)。现要求以数组a中0n-1个元素的值为序号重新调整数组b的前n个元素的存储顺序,使调整后的bi存放调整前的bai。例如:a=5,3,0,6,2,4,1,b=10,11,12,13

温馨提示

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

最新文档

评论

0/150

提交评论