2008春二级VC上机1 |
2008年(春)上机试卷【01) (本试卷上机时间为70分钟) 一、改错题(20分) 【题目】 以下程序的功能是:将一个字符串中介于两个不同子串之间的字符逆序处理。如果一 个子串在字符串中出现多次,则以第一次出现的位置为准;如果某一个子串不在字符串中出 现,则将另一个子串之后的所有字符逆序处理。 例如,将字符串"mmabcl23456000dd"中介于字符串"000"与字符串"abe"之间的 字符逆序后变为"mmabe654321000dd"。 又如,将字符串"mmabcl23456000dd"中介于字符串"012"(在原字符串中不存在)与 字符串"abc"之间的字符逆序后变为"mmabcdd000654321"。 含错误的源程序如下: #include <iostream.h> #include <string.h> int at(char *s1,char *s2) //求s2在s1中第一次出现的位置(序号从0开始) { for(int i=0;s1[i];i++){ for(int j=0;s2[j];j++){ if(s1[i+j])break; if(s1[i+j]!=s2[j])break; } if(!s2[j]) return j; } return strlen(s1); } void invert(char str[],int n1,int n2) { char *p1=str+n1, *p2=str+n2-1; while( *p1<*p2){ char t=*p1; *p1=*p2; *p2=t; p1++; p2--; } } char *process(char:l:S,char *s1,char:lc s2) //将s中介于s1和s2之间的子串逆序 { int n1=at(s,s1),n2=at(s,s2); int max,min; if(nl>n2) max=n1,min=n2+strlen(s2) else max=n2,min=n1+strlen(s1); invert(s,min,max); return *s; } void main() { char p[]="mmabc123456000dd",*p1="000",*p2="abe"; cout<<p<<endl; cout<<p1<<endl; cout<<p2<<endl; cout<<process(p,p1,p2)<<endl; } } 【要求】 1.把上述程序录入到文件myfa.cpp中,根据题目要求及程序中语句之间的逻辑关系 对程序中的错误进行修改。程序中的注解可以不输入。 2.改错时,可以修改语句中的一部分内容,增加少量的变量说明、函数原型说明或 编译预处理命令,但不能增加其他语句,也不能删去整条语句。 3.改正后的源程序文件m)如.cpp必须放在T:盘的根目录下,供阅卷用。 二、编程题(20分) 【题目】 试定义一个类LARRAY,将一维数组a中的数据线性变换成指定的数值范围内的数据, 并存放到一维数组b中。假设一维数组a中元素的最大值为max,最小值为min。当指定b中数 据的取值范围为[new_min,new_max]时,将数组a中的元素a[j]线性变换为数组b中的元 素b[j]的变换公式为: b[j]=new min+(a[j]-min)× 具体要求如下: (1)私有数据成员。 •double a[10],b[10]:a存放原始数据,b存放线性变换后的数据。 •double new_max,new_min:分别为线性变换结果的上、下限。 (2)公有成员函数。 •LARRAY(double a1[],double x,double y):构造函数,用a1初始化数组a;数组b中 的元素都初始化为0;用x和y分别初始化new_min和new_max。 •double getMax():返回数组a中值最大的元素值。 •double getMin():返回数组a中值最小的元素值。 •void fun():按给定的变换公式求出数组b的每一个元素值,要求利用函数getMax() 和getMin()。 •void print():输出数组b的所有元素。 (3)在主函数中完成对该类的测试。 输入/输出示例(下划线部分为键盘输入): 请输入10个数:0 1 2 3 4 5 6 7 8 9 请输入变换后数据的下限和上限:0 1 变换后的数据为:0 0.111111 0.222222 0.333333 0.444444 0.555556 0.666667 0.777778 0.888889 1 【要求】 源程序文件名必须为myfb.epp,并放在T:盘的根目录下,供阅卷用。 |