1、春VC+上机考试VC01一、改错题 一个二维数组的每列元素的逆序操作是指将该二维数组每列元素的次序颠倒,例如:1 2 3 4 9 10 11 12二维数组5 6 7 8经过每列元素逆序操作后变为 5 6 7 8 9 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; p
2、1+=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
3、; 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)公有成员函数 Da
4、taSet(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();实现必要
5、的功能(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,*p
6、2=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; else cout没有出现n;正确的源程序如下:#includeint fun(char *str,char *sub) int n
7、=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; else cout没有出现n;二、编程题 编程实现对大于1的整数进行质因数分解
8、。所谓整数的质因数分解是指将整数分解为其所有质数(素数)因数的积,例如,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所指向的存储空间中 Decompos
9、e();释放动态分配的存储空间(3)在主函数中完成对该类的测试。从键盘输入一个大于1的整数number,定义类Decomose的对象d,并用number初始化d,调用函数primenum()求number的所有质因数,最后输出number的质因数分解结果。VC03一、改错题 折半查找的基本思想为:假设一数据集是按升序排列的,如果要查找的数小于该数据集第一个元素或大于该数据集的最后一个元素,则查找失败;否则,计算数据集的中间元素(如果元素个数为偶数2n,则中间元素约定为第n个元素),如果中间元素正好等于要查找的数,则查找成功;如果中间元素小于要查找的数,则从中间元素往后查找,否则从中间元素往前查
10、找;在缩小了的范围内重复应用上述方法既可。 下列程序中的函数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; in
11、t n=(n2-n1)/2; if(n=n1 | n=n2) return n; if(an=key) return n; if(ankey) return search(a,key,n1,n); else return 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=r
12、and()%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; else coutindex=indexendl; coutdataindex=dataindexendl; 正确的源程序如下:#include#includeint search(int a,int key,int n1,int n2) if(an1key |
13、 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); else return 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+
14、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; else coutindex=indexendl; coutdataindex=dataindexendl; 二、编程
15、题 定义一个类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进行逆序处理,得到ave2 void print();输出所有成
16、员数据(3)在主函数中对该类进行测试。使用如下二维数组作为测试数据:112 211 630 200524 362 651 322269 60 710 54代码如下:#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=a
17、1/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,6
18、51,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可以打印二维数组,其中二维数组以一维数组的形式传
19、递给指针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;
20、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 =
21、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;分别代表点
22、的横坐标和纵坐标公有成员函数: 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)在主函数中利用上
23、述类定义一个点和一条直线,计算并输出点到直线间的距离。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#in
24、cludedouble 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) do coutab; while(fp(a)*fp(b)0);void fun(double (*fp)(double) double x0,x1,x2; xx(fp,&x1,&x2); do x0=(x2-x1)/2; coutx1,x2,x00) x2=x0; else x1=x0; while(fabs(fp(
25、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) do coutab; while(fp(a)*fp(b)=0);void fun(double (*fp)(double) double x0,x1,x2; xx(fp,x1,x2); do
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1