C++第3次上机题目答案
- 格式:doc
- 大小:40.50 KB
- 文档页数:5
全国计算机等级考试三级C语言程序设计南开100题上机考试题库【终极无错版】【注:三级除PC技术考汇编外,其它均考C语言,其上机题库是一样的】【这是最经典的04版,我仔细比照了所谓的06版题库及08版上机模拟软件中的题,其实都是04版的。
09年笔试大纲有变动,但是机试题库应该不会换,因为再编个南开100题〔库〕没有必要,也很累,还不能保证正确性〔起码要经过多番验证才能投入使用〕。
参加09年三级考试的朋友请放心使用。
就算变动也不过是把改一下个别数组名、把“升序排列〞改为“降序排列〞、把“从小到大〞改为“从大到小〞等,所以请大家消除疑虑,放心使用】资料收集整理:(以后该网站将发布〔收集和原创〕计算机二三级资源、电脑常见问题的解决视频教程、网络相关问题文章,如果你遇到了电脑、网络方面的问题可以到这来查找视频和图文教程或咨询,也欢送高手来此帮助他人解决问题)下载地址:〔有自带VC++的上机系统下载〕题目前带★号的是在2004年4月份考试被考生们所确定了的上机题。
题目前带☆号的是在2004年9月份考试被考生们所确定了的上机题。
05年后抽到的题没作标识。
题目中所提示的“无忧id xx〞指的是2004年上半年版无忧模拟系统中的固定抽题序号题目中所提示的“捷成id xx〞指的是2004年上半年版捷成模拟系统中的固定抽题序号********************************题目1〔无忧id 14、id 27(提供isP()函数;捷成id 23题)请编写一个函数jsValue(int m,int k,intxx[]),该函数的功能是:将大于整数m且紧靠m的k个素数存入数组xx传回。
最后调用函数writeDat()读取10组数据,分别得出结果且把结果输出到文件中。
局部源程序存在文件中。
例如:假设输入17 5 那么应输出:19,23,29,31,37。
请勿改动主函数main()和写函数writeDat()的内容。
全国计算机等级考试三级C语言上机100题一.排序类:1.已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。
最后main( )函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt请勿改动数据文件IN.DA T中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>#define MAX 200int a[MAX], b[MAX], cnt = 0 ;void jsVal(){int i,j,t;for(i=0;i<MAX;i++){t=a[i];if(t%2+t/10%2+t/100%2+t/1000%2==0)b[cnt++]=t;}for(i=0;i<cnt-1;i++)for(j=i+1;j<cnt;j++)if(b[i]<b[j]){t=b[i];b[i]=b[j];b[j]=t;}} void readDat(){int i ;FILE *fp ;fp = fopen("in.dat", "r") ;for(i = 0 ; i < MAX ; i++) fscanf(fp, "%d", &a[i]) ; fclose(fp) ;}void main(){int i ;readDat() ;jsVal() ;printf("满足条件的数=%d\n", cnt) ;for(i = 0 ; i < cnt ; i++) printf("%d ", b[i]) ;printf("\n") ;writeDat() ;}writeDat(){FILE *fp ;int i ;fp = fopen("out.dat", "w") ;fprintf(fp, "%d\n", cnt) ;for(i = 0 ; i < cnt ; i++) fprintf(fp, "%d\n", b[i]) ; fclose(fp) ;}2. 已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是奇数,则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b 中。
1输入三个整数x,y,z,把这三个数由小到大输出。
# include <stdio、h>void main(){int x,y,z,a;scanf ("%d,%d,%d",&x,&y,&z);if(x>y) {a=x; x=y;y=a;}if(x>z) { a=x; x=z; z=a;}if(y>z) {a=y; y=z; z=a;}printf("%d,%d,%d\n",x,y,z);}2输入圆得半径,输出圆得周长与面积。
# include<stdio、h># define PI 3、1415926# define S ==PI*r*r# define V (4、0/3)*PI*r*r*rvoid main(){double r;printf("please input r:");scanf("%lf",&r);printf("area is %、4lf\n",S);printf("volume is %、4lf\n",V);}输入正方形得边长,输出正方形得周长与面积。
# include<stdio、h>void main(){float c,zc,mj;printf("输入您得正方形");scanf("%f\n",&c);zc=4*c;mj=c*c;printf("周长%f,面积%f,边长%f",zc,mj,c);}3用格式输入函数输入3个字符,并用输出函数反向输出3个字符与她们得ASCII 码。
# include<stdio、h>int main(){char-ch1,ch2,ch3;printf("please input three characters:\n");scanf("%C%C%c",&ch1,&ch2,&ch3);printf("%c\n%d\n",ch3,ch3);printf("%c\n%d\n",ch2,ch2);printf("%c\n%d\n",ch1,ch1);}输入一个摄氏温度,要求输出华氏温度。
C语言上机练习题及答案1输入三个整数x,y,z,把这三个数由小到大输出。
# includevoid main(){int x,y,z,a;scanf ("%d,%d,%d",&x,&y,&z);if(x>y) {a=x; x=y;y=a;}if(x>z) { a=x; x=z; z=a;}if(y>z) {a=y; y=z; z=a;}printf("%d,%d,%d\n",x,y,z);}2输入圆的半径,输出圆的周长和面积。
# include# define PI 3.1415926# define S ==PI*r*r# define V (4.0/3)*PI*r*r*rvoid main(){double r;printf("please input r:");scanf("%lf",&r);printf("area is %.4lf\n",S);printf("volume is %.4lf\n",V);}输入正方形的边长,输出正方形的周长和面积。
# includevoid main(){float c,zc,mj;printf("输入你的正方形");scanf("%f\n",&c);zc=4*c;mj=c*c;printf("周长%f,面积%f,边长%f",zc,mj,c);}3用格式输入函数输入3个字符,并用输出函数反向输出3个字符和他们的ASCII 码。
# includeint main(){char-ch1,ch2,ch3;printf("please input three characters:\n");scanf("%C%C%c",&ch1,&ch2,&ch3);printf("%c\n%d\n",ch3,ch3);printf("%c\n%d\n",ch2,ch2);printf("%c\n%d\n",ch1,ch1);}输入一个摄氏温度,要求输出华氏温度。
1【审题关键句】将大于整数m且紧靠m的k个素数存入数组。
【解题思路】①首先定义一个计数变量cnt并赋初值为0。
②利用while循环统计大于整数m且紧靠m的k个素数,当计数变量cnt的值与变量k的值相等的时候,则退出while循环。
每执行一次循环时,变量m的值加1,然后调用函数isP()判断当前的m值是否为素数,如果是素数,则将m的值赋给数组xx[cnt],同时计算变量cnt的值加1,即当数组xx[0]中保存了一个素数之后,在下一次素数判断成立时将保存到xx[1]的位置上,依次类推。
【参考答案】int cnt = 0; //定义变量cnt并初值等于0while(cnt < k) //当cnt的值小于k时{m++; //变量m加1if(isP(m)) xx[cnt++] = m; //如果m为素数,则把其赋给数组元素xx[cnt],并且数组的下标cnt加1}2【审题关键句】求素数的个数及平均值,并计算非素数的平均值。
【解题思路】①首先定义循环变量i,然后通过for循环对数组a[300]中的每个元素a[i]调用函数isP(a[i])判断a[i]是否是素数(素数的算法已在isP()函数中给出,此处直接调用即可),如果是素数,则把其加到变量pjz1上,同时计数变量cnt加1,否则a[i]值加到变量pjz2上。
直到判断完数组a[300]中的所有数据后退出循环。
②求出pjz1、pjz2和cnt的值之后,再用变量pjz1的值除以cnt的值就得到素数的平均值,同时把这个值赋给变量pjz1,最后用变量pjz2的值除以300-cnt的值就得到非素数的平均值,并把这个值赋给变量pjz2。
【参考答案】int i; //定义变量ifor(i = 0; i < 300; i++) //循环变量i从0依次递增到299{if(isP(a[i])) //判断数组元素a[i]是否素数{pjz1 += a[i]; //把a[i]累加到变量pjz1cnt++; //变量cnt加1}else pjz2 += a[i]; //否则,把数组元素a[i]累加到变量pjz2 }pjz1 /= cnt; //所有素数的和pjz1除以素数的个数cnt,得到素数的平均值并赋给变量pjz1pjz2 /= (300 - cnt); //所有非素数的和pjz2除以非素数的个数300-cnt,得到非素数的平均值并赋给变量pjz23【审题关键句】100以内(含100)满足i、i+4、i+10都是素数的整数的个数以及这些i之和。
第3次上机作业参考答案3-1.c程序1#include<stdio.h>#include<conio.h>int main(void){printf("1: %c\n",’E’);printf("2: %c\n",’\105’);printf("3: %c\n",’\x45’);getch();return 0;}程序2#include<stdio.h>#include<conio.h>int main(void){putchar(’E’);putchar(’\105’);putchar(’\x45’);getch();return 0;}3-3.c程序1(转换后的二进制数小于等于8位)#include<math.h>main(){ int a1,a2, a3, a4, a5, a6, a7, a8;unsigned int p;scanf("%d",&p);if(p<256){ a1=p%2; p=p/2;a2=p%2; p=p/2;a3=p%2; p=p/2;a4=p%2; p=p/2;a5=p%2; p=p/2;a6=p%2; p=p/2;a7=p%2; p=p/2;a8=p%2; p=p/2;printf("%d%d%d%d%d%d%d%d",a8,a7,a6,a5,a4,a3,a2,a1);}}程序2(转换后的二进制数小于等于8位)#include<stdio.h>ain(){ int a1,a2, a3, a4, a5, a6, a7, a8;unsigned int n;scanf("%d",&n);if(p<256){ a1=n/128; n=n%128;a2=n/64; n=n%64;a3=n/32; n=n%32;a4=n/16; n=n%16;a5=n/8; n=n%8;a6=n/4; n=n%4;a7=n/2;a8=n%2;printf("%d%d%d%d%d%d%d%d", a8,a7,a6,a5,a4,a3,a2,a1);}}•程序3 (转换后的二进制数小于等于8位) 推荐算法#include <stdio.h>main(){ int b=0x80, c=0;unsigned int p;scanf("%u",&p);if(p<256){ while(c<8){ printf("%d", p/b);p=p%b;b=b/2;c++;}}}程序4 (教材提供,转换后的二进制数小于等于16位)#include<stdio.h>#include<conio.h>int main(void){unsigned int a,b,n,mode;scanf("%u",&a);n=16; b=a; mode=0x8000;printf("%u in binary format is:",a);while(n>0){printf("%d",b/mode); /*输出一位*/b=b%mode;mode=mode/2;n=n-1;}printf("\n");return 0;}程序5(转换后的二进制数小于等于100位)#include<stdio.h>#include <conio.h>main(){long int n;int a[100],i=0; /*a是数组,有100个元素*/ printf("Input a integer number");scanf("%ld",&n);while(n>0){ a[i]=n%2;n=n/2;i++;}i--;putchar('\n');while(i>=0){printf("%d",a[i]);i--;}getch();}3-4.c#include<stdio.h>#include<conio.h>#include<math.h>int main(void){float num,,sign,deci;int inte;printf("please input a real number:");scanf("%f",&num);if(num>0)printf("sign:+\n");else if(num<0)printf("sign:-\n");else printf("sign:0\n");inte=num;deci=num-inte;printf("integral part: %d\n",abs(inte));printf("decimal fraction part: %f\n",fabs(deci));return 0;}3-5a.c程序1#include<stdio.h>#include<math.h>#include <conio.h>main(){ int n,a,b,c,d,e;printf("intput a number:");scanf("%d",&n);if(n>1000 && n<10000){ a=n/1000;b=(n-1000*a)/100;c=(n-1000*a-100*b)/10;d=n%10;e=1000*d+100*c+10*b+a;printf("%d",e);}elseprintf("n is too large!");getch();}程序2#include<stdio.h>#include <conio.h>main(){ int x,a,b,c,d;printf("input a integer number:");scanf("%d",&x);if(n>1000 && n<10000){d=x%10; x=x/10;c=x%10; x=x/10;b=x%10; x=x/10;a=x;x=d*1000+c*100+b*10+a;printf("%d",x);}elseprintf("too large!");getch();}3-5b.c推荐算法(生成一个整数n的反序数,n<1000000000)#include<stdio.h>#include <conio.h>main(){long x,y;printf("input a integer number, not larger than 1000000000:"); scanf("%ld",&x);if(x>0&&x<1000000000){ y=0;while(x>0){y=y*10+x%10;x=x/10;}printf("%ld",y);}elseprintf("too large!");getch();}3-6.c#include<stdio.h>#include<conio.h>#include<math.h>int main(void){double x,y,a,b,c,d,e;clrscr();printf("input two numbers:");scanf("%lf,%lf",&x,&y);a=sin(x);b=cos(x);c=fabs(x);d=exp(x);e=pow(x,y);printf("sin(%f)=%f\n",x,a);printf("cos(%f)=%f\n",x,b);printf("|%f|=%f\n",x,c);printf("exp(%f)=%f\n",x,d);printf("pow(%f,%f)=%f\n",x,y,e);return 0;}3-7.c#include <stdio.h>#include <math.h>#include <conio.h>main(){int a,b,c;float s,area;printf("\n Input a,b,c:");scanf("%d,%d,%d",&a,&b,&c);if(a+b>c&& a+c>b && b+c>a){ s=(a+b+c)/2.0;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("\n area=%f",area);}else printf(“can’t calculate”); getch();}3-8c#include<stdio.h>#include<conio.h>int main(void){float num=100.453627;clrscr();printf("%f->%10.1f\n",num,num);printf("%f->%10.2f\n",num,num);printf("%f->%10.3f\n",num,num);printf("%f->%10.4f\n",num,num);return 0;}3-9.c#include<stdio.h>#include <conio.h>void main(){ int n;printf("Input n:\n");scanf("%d",&n);if(n%2==0)printf("%d is a even number!",n);elseprintf("%d is a odd number!",n);getch();}。
*******************************************************************************☆题目1请编写一个函数jsValue(int m,int k,int xx[]),该函数的功能是:将大于整数m且紧靠m的k 个素数存入数组xx传回。
最后调用函数writeDat()读取10组数据,分别得出结果且把结果输出到文件out.dat中。
部分源程序存在文件prog1.c中。
例如:若输入17 5 则应输出:19,23,29,31,37。
请勿改动主函数main()和写函数writeDat()的内容。
int isP(int m){int i;for(i=2;i<m;i++)if(m % i==0)return 0;return 1;}void num(int m,int k,int xx[]){ int s=0;for(m=m+1;k>0;m++)if(isP(m)) { xx[s++]=m; k--;}}☆题目2已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a 中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。
最后main( )函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
void jsVal(){ int i,j,qw,bw,sw,gw;for(i=0;i<MAX;i++){ qw=a[i]/1000; bw=a[i]/100%10;sw=a[i]%100/10; gw=a[i]%10;if(qw&&qw%2==0&&bw%2==0&&sw%2==0&&gw%2==0) b[cnt++]=a[i];}for(i=0;i<cnt-1;i++)for(j=i+1;j<cnt;j++)if(b[i]<b[j]) { qw=b[i]; b[i]=b[j]; b[j]=qw;}}******************************************************************************★题目3(字符型题)函数ReadDat( )实现从文件IN.DAT中读取一篇英文文章存入到字符串数组xx中;请编制函数StrOR( ),其函数的功能是:以行为单位依次把字符串中所有小写字母o左边的字符串内容移到该串的右边存放,然后把小写字母o删除,余下的字符串内容移到已处理字符串的左边存放,之后把已处理的字符串仍按行重新存入字符串数组xx中。
答案见后面1.已知在文件IN.DA T中存在有100个产品销售记录,请编制函数SortDat(),其功能:按产品名称从小到大进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果存入结构数组sell中。
最后main()函数调用函数WriteDat()把结果输出到文件OUT.DAT中。
2.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按产品名称从大到小进行排列,若产品名称相同,则按金额从大到小进行排列。
3.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按产品代码从小到大进行排列,若产品代码相同,则按金额从小到大进行排列。
4.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按金额从大到小进行排列,若金额相同,则按产品代码从大到小进行排列。
5.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列。
6.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按金额从大到小进行排列,若金额相同,则按产品名称从小到大进行排列。
7.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列。
8.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按产品名称从小到大进行排列,若产品名称相同,则按金额从大到小进行排列。
9.已知在文件IN.DA T中存在有100个产品销售记录,其功能:按金额从小到大进行排列,若金额相等,则按产品代码从大到小进行排列。
10. 已知在文件IN.DAT中存在有100个产品销售记录,其功能:按金额从小到大进行排列,若金额相等,则按产品代码从小到大进行排列。
11. 已知数据文件IN.DAT中存有300个四位数,并以调用读函数readDat()把这些数存入数组a中,请编制一函数jsValue(),其功能是:求出千位数上的数加个位数上的数等于百位数上的数加十位数上的数的个数cnt,再把所有满足此条件的四位数依次存入数组b中,然后对数组b的四位数按从小到大的顺序进行排列。
计算机等级考试三级(C语言)上机考试试题总结第一种:产品销售记录问题:??/*已知在文件in.dat中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位),产品名称mc(字符型10位),单价dj(整型),数量sl(整型),金额je(长整型)五部分组成。
其中:??金额=单价*数量计算得出。
函数readdat()读取这100个销售记录并存入结构数组sell中。
请编制函数sortdat(),其功能要求:按金额从小到大进行排列,若金额相等,则按产品代码从小到大进行排列,最终排列结果仍存入结构数组sell中。
最后main()函数调用函数writedat()把结果输出到文件out1.dat中。
注意:部分源程序存放在prog1.c中。
??#definemax100??typedefstruct{??chardm[5];/*产品代码*/??charmc[11];/*产品名称*/??intdj;/*单价*/??intsl;/*数量*/??longje;/*金额*/??}pro;??函数解析://if((sell[i].je>sell[j].je)||(sell[i].je==sell[j].je)&& (strcmp(sell[i].dm,??sell[j].dm)>0))是此题的精华所在理解它就理解了这道题的编程道理??首先sell[i].je>sell[j].je如果金额大小成立的话,就条件成立,把两个数据换位置,如果前者不成立,就判定金额是否相等,如果相等的话,代码还有大小的话,按从小到大的顺序排列。
??这种函数的编程方法,适用于有一定基础的编程者,如果是初学者的话建议用以下函数来表达,此方法是按照题意一部一部来分析的,是比较保守的编程方法。
??voidsortdat()??{inti,j;??proswap;??for(i=0;isell[j].je)??{swap=sell[i];sell[i]=sell[j];sell[j]=swap;}??elseif((s ell[i].je==sell[j].je)&&(strcmp(sell[i].dm,sell[j].dm)>0))? ?{swap=sell[i];sell[i]=sell[j];sell[j]=swap;}??}??100个产品销售记录排序其余9题说明??1)in.dat内容完全相同。
请编制程序,其功能是:将内存中由SOURCE指示的10个字节有符号数组成的数组分成正数和负数两个数组,并求这两个数组的数据个数,结果存放在RESULT指示的内存区域。
存放形式为正数个数在前,其后跟正数数组元素,然后是负数个数及负数数组元素。
例如:内存中有:1EH,91H,74H,91H,42H,30H,81H,F3H,18H,25H结果为:06H,1EH,74H,42H,30H,18H,25H,04H,91H,91H,81H,F3H部分程序已经给出,其中原始数据由过程LOAD从文件INPUT1.DAT中读入SOURCE开始的内存单元中,转换结果要求从RESULT开始存放,由过程SAVE保存到文件OUTPUT1.DAT中。
请填空BEGIN和END之间已经给出的一段原程序使其完整,需填空处已经用横线标出,每个空白一般只需要填一条指令或指令的一部分(指令助记符或操作数),也可以填入功能相当的多条指令,或删去BEGIN和END之间原有的代码并自行编程来完成所要求的功能。
对程序必须进行汇编,并与IO.OBJ连接产生可执行文件,最终运行程序产生结果。
调试中若发现整个程序中存在错误之处,请加以修改。
EXTRN LOAD:FAR,SAVE:FARN EQU 10;;;;;;;;;;;;;;;;;;;;;;;;;;;堆栈段;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;STAC SEGMENT STACKDB 128 DUP (?) ;定义128字节的堆栈区STAC ENDS;;;;;;;;;;;;;;;;;;;;;;;;;;;;数据段;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DATA SEGMENT ;定义了六个字节型变量SOURCE DB N DUP(0) ;原始数据区RESULT DB N+2 DUP(0) ;结果数据区NAME0 DB 'INPUT1.DAT',0 ;原始数据文件名NAME1 DB 'OUTPUT1.DAT',0 ;结果数据文件名NDATA DB N DUP(0) ;正数数组存放缓冲区PDATA DB N DUP(0) ;负数数组存放缓冲区DATA ENDS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;代码段;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CODE SEGMENT ;段定义伪操作命令ASSUME CS:CODE, DS:DATA, SS:STAC ;段寻址伪操作指令,CS代码段,DS数据段,SS堆栈段;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;初始化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START PROC FAR ;过程定义伪指令,类型属性FARPUSH DS ;保护PSP段地址XOR AX,AX ;置AX为0PUSH AX ;保护PSP偏移地址MOV AX,DATAMOV DS,AX ;设置DSMOV ES,AX ;置附加段寄存器LEA DX,SOURCE ;数据区起始地址LEA SI,NAME0 ;原始数据文件名MOV CX,N ;字节数CALL LOAD ;从'INPUT1.DAT'中读取数据;;;;;;;;;;;;;;;;;;;;;;;;;;;; 开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;LEA SI, SOURCE ;将原始数据偏移地址装入到SI中MOV DI,OFFSET PDATA ;PDATA为正数数组存放缓冲区首址MOV BX,OFFSET NDATA ;NDATA为负数数组存放缓冲区首址XOR DX,DX ;置DX为0MOV CX,NCLDMAIN1: LODSB ;将[SI]所指向的地址单元(SOURCE)中内容装入到AL中TEST AL,80H ;判断AL的正负性,逻辑与操作JZ MAIN2 ;若逻辑与的结果为全0,则ZF=1,说明为正数,跳转INC DH ;若逻辑与的结果不为全0,则ZF=0,说明为负数,存放负数个数的DH加1 MOV [BX],AL ;将AL的内容存入负数数组缓冲区BXINC BX ;BX加1,指向下一单元JMP MAIN3MAIN2: INC DL ;为正数,存放正数个数的DL加1MOV [DI],AL ;将AL的内容存入正数数组缓冲区DIINC DI ;DI加1,指向下一单元MAIN3: LOOP MAIN1 ;继续判断下一个数AL的正负性LEA SI,PDATA ;负数数组存放缓冲区首址LEA DI,RESULT ;结果数据区首址MOV [DI],DL ;正数个数存入INC DI ;结果数据区偏移地址加1XOR CX,CXMOV CL,DL ;将DL的个数送CL,用于控制循环次数MAIN4: MOV AL,[SI];依次将DL个正数存入到DI当前所指向的地址单元DI中MOV [DI],ALINC DIINC SILOOP MAIN4MOV [DI],DHINC DIXOR CX,CXMOV CL,DHMOV BX,OFFSET NDATAMAIN5: MOV AL,[BX] ;依次将负数存放到DI中MOV [DI],ALINC DIINC BXLOOP MAIN5; **** END ****LEA DX,RESULT ;结果数据区首址LEA SI,NAME1 ;结果文件名起始地址MOV CX,N+2 ;字节数CALL SAVE ;保存结果到'OUTPUT1.DAT'文件RETSTART ENDPCODE ENDSEND START【参考答案】(1)MOV(2)80H(3)JMP MAIN3(4)LOOP(5)[SI](6)MAIN4(7)INC BX请编制程序,其功能是:内存中连续存放着16个二进制字节数,在原16个数的第4和第5个数之间插入00H,在原16个数的第8和第9个数之间插入55H,在原16个数的第12和第13个数之间插入AAH,在原16个数的最后加入FFH。
XX年计算机等级考试三级上机题库练习及答案(5)第9题:在文件in9.dat中存在假设干个(<200)四位数字的正整数,函数readDat()读取这假设干个正整数并存入数组xx中。
请编制函数CalValue(),其功能要求:(1)求出这个文件中共有多少个正整数totNum;(2)求这些数右移1位后,产生的新数是偶数的数的个数totCnt,以及满足此条件的这些数(右移前的值)的算术平均值totPjz,最后调用函数writeDat()把所求的结果输出到文件out9.dat中。
局部程序已经给出。
请勿改动主函数main()、读函数readDat()和写函数writeDat()的内容。
#include#include#define MAXNUM 200int xx[MAXNUM];int totNum=0;int totCnt=0;double totPjz=0.0;int readDat(void);void writeDat(void);void CalValue(void){}void main()int i;clrscr();for(i=0;iif(readDat()){printf("数据文件in9.dat不能翻开!007n");return;}CalValue();printf("文件in9.dat中共有正整数=%d个n",totNum); printf("符合条件的正整数的个数=%d个n",totCnt); printf("平均值=%.2fn",totPjz);writeDat();}int readDat(void){FILE *fp;int i=0;if((fp=fopen("in9.dat","r"))==NULL)return 1; while(!feof(fp)){fscanf(fp,"%d,",&xx[i++]);}fclose(fp);return 0;void writeDat(void){FILE *fp;fp=fopen("out9.dat","w");fprintf(fp,"%dn%dn%6.2fn",totNum,totCnt,totPjz); fclose(fp);}【答案】void CalValue(void){int i,data;for(i=0;i{if(!xx[i]) break;if(xx[i]>0) totNum++;data=xx[i]>>1;if(data%2==0){totCnt++;totPjz+=xx[i];}}totPjz/=totCnt;} /。
3月计算机二级考试C++上机试题及答案(3) 2018年3月计算机二级考试C++上机试题及答案(3)
程序改错题
使用VC++6.0打开考生文件夹下的源程序文件1.cpp,使其输出结果为:
n=0
注意:不要改动main函数,不能增加或删除行,也不能更改程序的结构,错误的语句在//******error******的下面。
试题程序:
#include
//********error*******。
classTC()
{
public:
//********error********
void~TC(){}
TC(intn)
{
cout’n’’=’};
//********error********
}
voidmain()
{
TCtest(0);
return;
}
参考答案
程序改错题
(1)应改为“classTC”。
(2)应改为“~TC(){}”。
(3)应改为“};”。
本题第1处的“classTC()”为类的定义,根据C++中类的定义格式,类名后面是没有括号的,所以第1处应为“classTC”。
第2处的“void~TC(){}”是析构函数,C++中析构函数的格式中是没有函数类型说明的,所以修改为“~TC(){}”。
根据C++中类的定义,第3个标识下类结束的“}”缺少分号,即修改为“};”。
《C语言》上机实验题及参考答案2017《C语言》上机实验题及参考答案为了帮助大家备考接下来的计算机二级考试,应届毕业生店铺整理了2017《C语言》上机实验题及参考答案,希望能帮助大家备考计算机二级考试。
1、编程实现对键盘输入的英文名句子进行加密。
用加密方法为,当内容为英文字母时其在26字母中的其后三个字母代替该字母,若为其它字符时不变:2、编程实现将任意的十进制整数转换成R进制数(R在2-16之间)。
3、从键盘输入一指定金额(以元为单位,如345.78),然后显示支付该金额的各种面额人民币数量,要求显示100元、50元、10元、5元、2元、1元、1角、5分、1分各多少张。
4、随机产生20个[10,50]的正整数存放到数组中,并求数组中的所有元素最大值、最小值、平均值及各元素之和。
5、编程在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
6、模拟n个人参加选举的过程,并输出选举结果:假设候选人有四人,分别用A、B、C、D表示,当选某候选人时直接输入其编号(编号由计算机随机产生),若输入的不是A、B、C、D则视为无效票,选举结束后按得票数从高到低输出候选人编号和所得票数。
7、任何一个自然数m的立方均可写成m个连续奇数之和。
例如:1^3=12^3=3+53^3=7+9+114^3=13+15+17+19编程实现:输入一自然数n,求组成n3的n个连续奇数。
8、已知abc+cba=1333,其中a,b,c均为一位数,编程求出满足条件的a,b,c所有组合。
9、编制一个完成两个数的四则运算程序。
如:用户输入34+56则输出结果90.00。
要求运算结果保留两位小数,用户输入时一次将两个数和*作符输入。
10、输入一个五位以内的正整数,(1)判断它是一个几位数;(2)请按序输出其各位数字;(3)逆序输出其各位数字。
如输入:56439,输出:5位数5,6,4,3,99,3,4,6,511、编写子函数:(1)用冒泡法将一个数组排成升序的函数---SUB1;(2)在升序数组中插入一个数,并且保持该数组仍为升序数组的函数---SUB2。
全国计算机等级考试三级C语言上机100题一.排序类:1.已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是0或2或4或6或8,则统计出满足此条件的个数cnt,并把这些四位数按从大到小的顺序存入数组b中。
最后main( )函数调用写函数writeDat()把结果cnt以及数组b中符合条件的四位数输出到OUT.DAT文件中。
注意:部分源程序存在文件prog1.c中。
程序中已定义数组:a[200],b[200],已定义变量:cnt请勿改动数据文件IN.DA T中的任何数据、主函数main()、读函数readDat()和写函数writeDat()的内容。
#include <stdio.h>#define MAX 200int a[MAX], b[MAX], cnt = 0 ;void jsVal(){int i,j,t;for(i=0;i<MAX;i++){t=a[i];if(t%2+t/10%2+t/100%2+t/1000%2==0)b[cnt++]=t;}for(i=0;i<cnt-1;i++)for(j=i+1;j<cnt;j++)if(b[i]<b[j]){t=b[i];b[i]=b[j];b[j]=t;}}void readDat(){int i ;FILE *fp ;fp = fopen("in.dat", "r") ;fclose(fp) ;}void main(){int i ;readDat() ;jsVal() ;printf("满足条件的数=%d\n", cnt) ;for(i = 0 ; i < cnt ; i++) printf("%d ", b[i]) ;printf("\n") ;writeDat() ;}writeDat(){FILE *fp ;int i ;fp = fopen("out.dat", "w") ;fprintf(fp, "%d\n", cnt) ;for(i = 0 ; i < cnt ; i++) fprintf(fp, "%d\n", b[i]) ; fclose(fp) ;}2. 已知数据文件IN.DAT中存有200个四位数,并已调用读函数readDat()把这些数存入数组a中,请考生编制一函数jsVal(),其功能是:如果四位数各位上的数字均是奇数,则统计出满足此条件的个数cnt并把这些四位数按从大到小的顺序存入数组b 中。
1、40个字节,有符号,数组,分成正、负两数组,并求个数(1)MOV (2)80H (3)JMP MAIN3(4)LOOP (5)[SI] (6)MAIN4(7)INC BX2、10个无符号8位格雷码,转成二进制(1)PUSH CX (2)RCL (3)BH(4)JNE SET ONE (5)BH (6)AND BH,01H(7)POP CX3、16位无符号数,排成升序(1)2 (2)ADD DI,2 (3)NEXT0(4)BX (5)SW (6)AX(7)NEXT (8)DEC BX (9)JNZ4、(x1+x2+x3+x4+x5)/5代替原数(1)5 (2)CX (3)4(4)MOV DX,0 (5)INC DI (6)INC SI5、21个8位二有符号数,相邻之间差值不超过-8至7。
进行压缩(1)AL,[SI-2] (2)XOR BX,0FFH (3)Z(4)SHL (5)AND AL,0FH (6)DEC DX6、将0~9的ASCII码转成二进制,并将SP转成$(1)MOV SI,0 (2)MOV CX,N (3)MOV AL,SOURCE[SI](4)30H (5)INC DI (6)INC SI(7)CHAN7、对#和*之间的7个ASC码进行异或操作......(1)JNZ (2)'*' (3)SEARCH1(4)JNZ (5)13 (6)DEC BX8、10个16位二进制,统计每个数中0的个数(1)16 (2)SHL AX,1 (3)JB(4)COUNT (5)BX,2 (6)[DI],DH9、L做逻辑尺(1)LEA DI,RESULT (2)1 (3)TEST(4)JP (5)SHL DX,110、求10个有符号字节的绝对值之和(字型),并到最大的数和地址(1)NEG AL (2)ADC BH (3)ADC BH(4)NEXT (5)0FFH11、对压缩BCD进行编码,是!则加BEH,CCH.....(1)AND AH,0FH (2)PUSH CX (3)SHR AL,CL(4)AL,9 (5)BYTE PTR[DI],0BEH (6)LOOP CLP112、自动抄表,Y=X*70 X<=5.....(1)MOV AL,[SI] (2)A (3)MUL BL(4)A (5)MUL BH (6)MUL DL(7)INC SI (8)ADD SI,213、Y=X*70 X<=10...(1)MOV AL,[SI] (2)A (3)SUB AL,10(4)ADD AX,10*70 (5)MOV [DI],AX (6)ADD DI,2 14、字符出现N次就用ESC,N,原字符三个字节来代替,压缩(1)MOV AL,[DI] (2)AL,[DI] (3)A(4)L0 (5)ADD SI,315、对上题进行解压(1)E (2)STOSB (3)CLD(4)MOV CX,[SI] (5)MOV AL,[SI+1] (6)REP STOSB(7)ADD SI,216、记录峰值(1)XOR DX,AX (2)AND DH,80H (3)Z(4)MOV AL,[SI-2] (5)MOV DX,AX17、取出负数并计算绝对值之和(1)CMP AL,0 (2)NEXT (3)NEG AL(4)ADC DH,0 (5)REP STOSB18、ASCII字符和汉字内码(1)TEST (2)INC DI (3)REST11(4)LASCⅡ(5)INC DL (6)[DI](7)DH19、故障报警,找0,有0则统计个数(1)MOV AL,[SI] (2)8 (3)SHL(4)LP3 (5)LOOP (6)DH(7)INC SI (8)DEC DL (9)LP120、窃水(1)4 (2)INC DI (3)LP0(4)0E1H (5)INC DI (6)JNZ21、对非空格数据最高位清0(1)AGN11 (2)ˊ#ˊ(3)INC DI(4)JMP AGN1 (5)20H (6)[DI]22、ASCII转成偶校验码,累加码(1)PUSH (2)ROL (3)ADC(4)BL, AL (5)POP (6)DX(7)MOV [DI],AL23、红外通讯数据,BCD码AACC,DDEE(1)N (2)[SI] (3)JNZ NEXTD(4)CMP AL,DH (5)ADD BL,DL (6)LOOP MCLP124、80个无符号字节,每8个求平均值(1)DI,OFFSET RESULT (2)8 (3)AL(4)LOOP MAGN2 (5)MOV CL,8 (6)DIV CL(7)MOV [DI],AL (8)INC DI (9)JNZ25、在第4和5之间插00H,8和9之间插55H....(1)MOV SI,0 (2)MOV AH,SOURCE[SI] (3)INC SI(4)AH (5)EXIT (6)POP SI(7)CHAN26、在第4和5之间插00FFH.....(1)MOV DI,0 (2)MOV RESULT[DI],AX (3)INC SI(4)INC DI (5)AX (6)DEC BX(7)4 (8)INC DI27、在0~9的二进制转成ASCII,在1,5...插"$"(1)MOV SI,0 (2)5 (3)INC DI(4)ADD AL,30H (5)INC SI (6)INSER1 28、ASCII转成BCD...奇数(1)AL (2)AL (3)4(4)CL (5)OR29、ASCII转成个位二进制,最后存和(1)0 (2)SUB (3)INC DI(4)DAA (5)DEC CX (6)MOV [DI],DL 30、小写转成大写,并统计'z'的个数(1)JB (2)NINC (3)20H(4)JUMP (5)INC DI (6)MOV [DI],DL31、16位二进制,对高位和低位进行逻辑与及或运算(1)SOURCE[BX] (2)DL (3)OR(4)AL (5)MOV [DI],AX (6)DEC CX32、16进制数转成ASCCII,先高4位...LEA SI,SOURCELEA DI,RESULTMOV CX,NLOOP2: MOV BL,2MOV AL,[SI]MOV AH,ALPUSH CXMOV CL,4SHR AL,CLPOP CXEXCH: CMP AL,9JNA CHARADD AL,07HCHAR: ADD AL,30HMOV [DI],ALINC DIDEC BLJZ LOOP1AND AH,OFHMOV AL,AHJMP EXCHLOOP1: INC SILOOP LOOP233、在ASCII串的每个字符在最高位加上奇校验位LEA SI,SOURCELEA DI,RESULTLOOP2: MOV AL,[SI]CMP AL,00HJE EXITADD AL,0JNP LOOP1OR AL,80HLOOP1: MOV [DI],ALINC DIINC SIJMP LOOP2EXIT: MOV [DI],AL34、大写全变成小写LEA SI,SOURCELEA DI,RESULTLOOP1: MOV AL,[SI]CMP AL,00HJE EXITCMP AL,41HJB KEEPCMP AL,5AHJNBE KEEPADD AL,20HKEEP: MOV [DI],ALINC DIINC SIJMP LOOP1EXIT: MOV [DI],AL35、去掉为负的奇数LEA SI,SOURCELEA DI,RESULTMOV CX,LENLOOP1:MOV AL,[SI]MOV AH,ALSHR AH,1JNC KEEPCMP AL,0JNL KEEPJMP EXITKEEP:MOV [DI],ALINC DIEXIT:INC SILOOP LOOP136、串有连续的字符仅用一个字符代替LEA SI,SOURCELEA DI,RESULTLOOP1:MOV AL,[SI]CMP AL,00HJE EXITNEXT:INC SIMOV AH,[SI]CMP AL,AHJE NEXTMOV [DI],ALINC DIJMP LOOP1EXIT: MOV [DI],AL37、对每个数进行右移,直到最低位为1(1)0 (2)TEST (3)JNZ(4)SHR (5)LOOP NEXT38、统计每个数中二进制数中1的个数(1)W (2)MOV BX,0 (3)NC(4)LOOP1 (5)INC DI39、BCD码转成ASCII,并在最高位加偶校验位(1)AL,[SI] (2)SHR AL,CL (3)POP CX(4)JP SERCH2 (5)ADD AH,30H (6)LOOP 40、无符号Ck=Ak除Bk(1)MOV CX,N (2)DL,SOURCE[BX+N] (3)MOV AL(4)DL (5)AX (6)INC BX(7)JNZ??41、16个10位二进制,DB9~DB0 000000 转成DB7~DB0 000000 DB9 DB8(1)BYTE PTR SOURCE[BX+1](2)CL (3)CL(4)AH (5)AL42、无符号字节,排成升序(1)INC DI (2)NEXT0 (3)N-1(4)SB (5)NEXT3 (6)AL(7)NEXT2 (8)BX (9)NEXT143、ASCII转成压缩BCD码(1)B (2)0FH (3)B(4)CX (5)4 (6)CX(7)BL44、BCD转成ASCII,高位BCD放高地址(1)B (2)0FH(3)BL (4)CX (5)4(6)CX45、无符号Ck=Ak+Bk(1)OFFSET RESULT (2)0 (3)MOV CX,N(4)ADD AL,SOURCE[BX] (5)ADC AH,0 (6)ADD DI,246、有符号Ck=Ak-Bk(1)SUB AL,SOURCE[BX+N] (2)JNS (3)0FFH(4)JUMP1 (5)JUMP1 (6)CBW47、无符号Ck=Ak*Bk(1)MOV DI (2)MOV CX,N (3)MOV AL(4)MUL SOURCE[BX] (5)DEC CX48、摇号机,统计0~9出现的次数(1)MOV AL,AH (2)AND AH,0F0H (3)SHR(4)INC RESULT[BX] (5)INC RESULT[BX]49、摇号机,两号码相加为2,3,4,5,6,7,8的次数(1)BX (2)SHR (3)AH(4)BL (5) AL (6)SUB (7)INC RESULT[BX]50、有符号Ck=Ak+Bk(1)SOURCE[BX+N] (2)ADD (3)0FFH(4)JUMP (5)CBW51、16个12位二进制DB11~DB0 0000转成DB7~DB0 0000 DB11~DB8(1)4 (2)SOURCE[BX] (3)CL(4)CL (5)CL (6)AH,AL(7)AL (8)AH52、10个无符号,近似法求近似平方根(1)INC BX (2)JBE (3)INC BX(4)SHR BX,1 (5)INC DI (6)INC SI53、有符号8位二进制,排成正负相间,负数排第一个(1)80H (2)AL (3) BL (4) BL(5)DEC54、对内存中7个ASCII字符组成的字符串进行如下操作,在源串前加#,后加*,再放原异或的结果....(1)'#' (2)00H (3)CHAR(4)'*' (5)0DH (6)0AH(7)EXIT55、无符号Ck=Ak-Bk(1)MOV CX,N (2)SOURCE[BX+N] (3)JNC(4)0FFH (5)[DI]56、I*J矩阵转置,并计算每一行元素之和(1)ADC CH,0 (2)CMP DX,I (3)ADD DI,2(4)INC BX (5)LPJ57、Y[n]=Y[n-1]+delta if X[n]>Y[n-1]+delta......(1)[DI-1] (2)NA (3)MOV [DI],BX(4)NAE (5)MOV [DI],AX (6)MOV [DI],DX58、说明已过峰值,记录当前值(1)XOR DX,AX (2)AND DH,80H (3)Z(4)STOSB (5)MOV DX,AX59、ASCII,如果是0~9或A~F之间转成二进制(1)MOV (2)MOV CX,N (3)’9’(4)STRIP (5)’F’ (6)INV ALID(7)NEXT60、20个无符号数,求它们的和(字型)(1)MOV AH,0 (2)ADD BX,AX (3)AL(4)INC SI (5)INC DI (6)BX61、有符号字节Ck=Ak*Bk,Ck按有符号字的型式(1)OFFSET RESULT (2)MOV BX,0 (3)SOURCE[BX+N](4)IMUL (5)DI,2 (6)DEC CX62、DB11~DB0 0000 判别是否大于800H,若大于,存入01H,否则存00H,最后存放大于的个数(1)OFFSET RESULT (2)8000H (3)C_0(4)CL63、大写转小写统计A的个数(1)JB (2)’Z’ (3)NINC(4)20H (5)INC DI (6)MOV [DI],DL64、ASCII转成无符号二进制再统计大于等于5的个数(1)00H (2)30H (3)JB(4)DL (5)MOV [DI],DL65、统计成绩,100~90...69~60以及低于60的人数,并计算30个学生的平均成绩(1)CLD (2)MOV AH,0 (3)CMP AL,90(4)BYTE PTR[DI+4] (5)JMP NEXT (6)BX(7)N66、删除10个无符号字节跌最大值和最小值,并计算算术平均值(1)[SI] (2)[SI] (3)NEXT(4)JL NEXT (5) 8 (6)INC AL67、20个16位有符号,求出最小值和最大值(1)MOV DX,[SI] (2)MOV CX,N-1 (3)CHKMIN(4)JGE (5)MOV [DI],DX (6)MOV [DI],BX68、大字转小写,其它转'SP'(1)LEA DI,RESULT (2)[SI] (3)’Z’(4)JA (5)20H (6)INC SI(7)DI (8)LOOP69、8位有符号,Ci=|Ai+Bi|(1)N (2)SOURCE[BX+N] (3)SOURCE[BX](4)0FFH (5)JUMP (6)CBW(7)JNS70、取出N阶矩阵对角线上的元素,并计算累加值(1)DH (2)MOV AH,0 (3)SOURCE(4)ADC CH,0 (5)N71、判断前9个字节是否为偶校验码,若是则转ASCII,否07H.再计算累加码并比较,相等存06H,否07H(1)PUSH (2)JZ (3)BL(4)7FH (5)POP (6)CMP [SI],AL72、无符号8位二进制转格雷码(1)PUSH CX (2)ROL (3)ADC AH,0(4)JNE (5)BH (6)POP CX73、Yk=[(Y|n+3 - Y|n)/3]*(k-n) +Yn,k=n+1、n+2.n=0,3,6,9 非线性温度传感器分段线性插值法。
第三次上机答案(课内上机)1. 定义一个复数类Complex,重载运算符“+”、“-”、“*”、“/”,使之能用于复数的加、减、乘、除。
要求:将“+”和“-”的运算符重载函数作为Complex的成员函数;将“*”和“/”的运算符重载函数作为友元函数。
编写程序,分别求两个复数之和、差、积、商。
提示:若已知c1=a+bi,c2=c+di,则:c1+c2=(a+c)+(b+d)ic1-c2=(a-c)+(b-d)ic1*c2=(ac-bd)+(ad+bc)ic1/c2=(ac+bd)/(c*c+d*d)+((bc-ad)/( c*c+d*d))i运行结果参考如下:#include <iostream.h>class Complex{public:Complex( ){ real=0; imag=0; }Complex(double r, double i){ real=r; imag=i; }//上述两个构造函数可合并为Complex(double r=0,double i=0)void display( );//声明运算符重载函数Complex operator+(Complex &c2);Complex operator-(Complex &c2);friend Complex operator*(Complex &c1,Complex &c2);friend Complex operator/(Complex &c1,Complex &c2);private:double real; //实部double imag; //虚部};//定义重载运算符的函数Complex Complex::operator+(Complex &c2){return Complex( real+c2.real, imag+c2.imag );}Complex Complex::operator-(Complex &c2){return Complex( real-c2.real, imag-c2.imag );}Complex operator*(Complex &c1,Complex &c2){ //公式c1*c2=(ac-bd)+(ad+bc)iComplex c;c.real = c1.real*c2.real-c1.imag*c2.imag;c.imag = c1.real*c2.imag+c1.imag*c2.real;return c;//也可以return Complex( c1.real*c2.real-c1.imag*c2.imag, c1.real*c2.imag+c1.imag*c2.real ); }Complex operator/(Complex &c1,Complex &c2){ //公式c1/c2=(ac+bd)/(c*c+d*d) + ((bc-ad)/( c*c+d*d))iComplex c;c.real = (c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);c.imag = (c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);return c;}void Complex::display( ){cout<<"("<<real<<","<<imag<<"i)"<<endl;}void main( ){Complex c1(3,4), c2(5,-10), c3;cout<<"c1="; c1.display( );cout<<"c2="; c2.display( );c3=c1+c2;cout<<"c1+c2="; c3.display( );c3=c1-c2;cout<<"c1-c2="; c3.display( );c3=c1*c2;cout<<"c1*c2="; c3.display( );c3=c1/c2;cout<<"c1/c2="; c3.display( );}(课内上机)2. 有两个矩阵a和b,均为2行3列。
求两个矩阵之和。
重载运算符“+”,使之能用于矩阵相加,如c=a+b。
重载流插入运算符“<<”和流提取运算符“>>”,使之能用于该矩阵的输入和输出。
#include <iostream.h>//using namespace std;class MatrixMatrix(); //不是必须的friend Matrix operator+(Matrix &, Matrix &); //友元函数friend ostream& operator<<(ostream&, Matrix&); //友元函数friend istream& operator>>(istream&, Matrix&); //友元函数private:int mat[2][3]; //存放矩阵};Matrix::Matrix(){for(int i=0;i<2;i++) //控制行for(int j=0;j<3;j++) //控制列mat[i][j]=0;}Matrix operator+(Matrix &a, Matrix &b){Matrix c;for(int i=0; i<2; i++)for(int j=0; j<3; j++){c.mat[i][j]=a.mat[i][j]+b.mat[i][j];}return c;}istream& operator>>(istream &in, Matrix &m){cout<<"input value of matrix:"<<endl;for(int i=0; i<2; i++)for(int j=0; j<3; j++)in>>m.mat[i][j];return in;//若返回类型为istream,则调用拷贝构造函数生成临时对象,将in拷贝给临时对象后返回}ostream& operator<<(ostream &out, Matrix &m){for (int i=0;i<2;i++){for(int j=0;j<3;j++){out<<m.mat[i][j]<<" ";out<<endl; //每输出3个数据换行}return out;}int main(){Matrix a, b, c;cin>>a; //调用operator>>cin>>b; //调用operator>>cout<<endl<<"Matrix a:"<<endl<<a<<endl; //调用operator<<cout<<endl<<"Matrix b:"<<endl<<b<<endl; //调用operator<<c=a+b; //调用operator+cout<<endl<<"Matrix c = Matrix a + Matrix b :"<<endl<<c<<endl; //调用operator<<return 0;}(课外上机)第五章习题2:将例5.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。
在程序中应包括输入数据的函数,在程序运行时输入num, name, sex, age, addr的值,程序应输出以上5个数据的值。
#include <iostream>using namespace std;class Student{public:void get_value() //输入数据{ cin>>num>>name>>sex; }void display( ) //输出数据{cout<<"num: "<<num<<endl;cout<<"name: "<<name<<endl;cout<<"sex: "<<sex<<endl;}private :int num; //学号char name[10]; //姓名char sex; //性别};class Student1: private Student //派生类私有继承基类(数据为私私有){public:void get_value_1() //输入数据{get_value(); //调用基类的函数为私私有数据成员输入数据cin>>age>>addr;}void display_1() //输出数据{display(); //调用基类的函数输出私私有数据cout<<"age: "<<age<<endl; //引用派生类的私有成员,正确。
cout<<"address: "<<addr<<endl; //引用派生类的私有成员,正确。
}private:int age;char addr[30];};int main(){Student1 stud1; //定义派生类对象stud1.get_value_1(); //输入数据stud1.display_1(); //输出数据return 0;}。