应用实践VC++编程题及答案_第1页
应用实践VC++编程题及答案_第2页
应用实践VC++编程题及答案_第3页
应用实践VC++编程题及答案_第4页
应用实践VC++编程题及答案_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

1、类编程题1 【题目】试定义一个类NUM,验证下列命题是否成立:任意一个正整数与其反序数相加,得到一个新的正整数,再对这个新正整数重复上述步骤,最终一定可以得到一个回文数。例如,正整数350 的反序数为 053(即 53), 350+53=403, 403+304=707, 707是回文数,命题成立。又如,正整数2015 的反序数为5102, 2015+5102 =7117, 7117是回文数,命题成立。具体要求如下:私有数据成员int num :存放用于验证命题的正整数。公有成员函数NUM(int x) :构造函数,用x初始化数据成员num。void set(int a) :将 num的值设置

2、为a。int yn(int n) :判断 n 是否回文数,若是,返回1;否则返回0。void fun() :使用num验证命题是否成立,并显示验证过程。在主函数中对该类进行测试。输出示例:num=350的验证过程如下:350+53=403403+304=707命题成立!num=2015的验证过程如下: 2015+5102=7117命题成立!#include <iostream.h>class NUMprivate:int num;public:NUM(int x);void set(int a);int yn(int n);void fun();NUM:NUM(int x) num

3、=x;void NUM:set(int a) num=a;int NUM:yn(int n)int t=n,s=0;while(t)s=s*10+t%10;t/=10;if(s=n) return 1;else return 0;void NUM:fun()int m;cout<<"num="<<num<<" 的验证过程如下:"<<endl;while(1)int n=num,s=0; /350dos=s*10+n%10;/ 053n/=10;while(n);m=s+num; /403if(yn(m)=1

4、)cout<<num<<'+'<<s<<'='<<m<<"n命 题 成 立 !"<<endl;break;else cout<<num<<'+'<<s<<'='<<m<<endl;num=m;void main()NUM arr(350);arr.fun();arr.set(2015);arr.fun ();2 【题目】试定义一个实现计算学生课程成绩的类ST

5、U,对学生学期总评成绩进行计算并排序。具体要求如下:(1) 私有数据成员int norm, ex, final,overall :分别表示平时成绩、实验成绩、期末考试和总评成绩。char name15 :学生姓名。(2) 公有成员函数void init(char *name1, int nor1, int ex1, int fin1):用参数name1,nor1,exp1,fin1 分别初始化成员name, norm, ex, final 。void fun( ):计算学生的总评成绩。计算方法为:总评成绩=平时成绩占*20%+实验成绩占*25%+期末成绩占*55%。 总评成绩计算时要求四舍五入

6、,并且期末考试成绩不足50 分时,则期末考试成绩即为总评成绩。st 按总评成绩friend void sort(STU st, int n)进行从大到小排序。void print( ) :输出该学生信息。(3) 在主函数中先定义一个有5 个元素的对象数组,用循环语句输入学生信息,并根据这些信息利用成员函数init() 更新学生信息,然后使用函数sort() 对数组排序,最后输出排序后的学生信息。输入 /输出示例 (下划线部分为键盘输入):请输入姓名、平时成绩、实验成绩、期末成绩:AAA 82 7558请输入姓名、平时成绩、实验成绩、期末成绩:BBB 93 6084请输入姓名、平时成绩、实验成绩

7、、期末成绩:CCC 67 8281请输入姓名、平时成绩、实验成绩、期末成绩:DDD 54 7851请输入姓名、平时成绩、实验成绩、期末成绩:EEE 91 5241按总评成绩排序后:姓名平时成绩实验成绩期末成绩总评成绩BBB93608480CCC67828178AAA82755867DDD54785158EEE91524141#include<iostream.h>#include <string.h>class STU private:int norm,ex,final,overall;char name15;public:void init(char *name1,i

8、nt norm1,int ex1,int fin1);void fun();friend void sort(STU st,int n);void print();void STU:init(char *name1,int norm1,int ex1,int fin1)strcpy(name,name1);norm=norm1;ex=ex1;final=fin1;overall=0;void STU:fun()if(final>=50)overall=int(norm*0.2+ex*0.25+final*0.55+0.5);else overall=int(final+0.5);void

9、 sort(STU st,int n)for(int i=0;i<n-1;i+)for(int j=i+1;j<n;j+)if(sti.overall<stj.overall)int t; t=sti.overall;sti.overall=stj.overall;stj.overall=t;void STU:print()cout<<name<<'t'<<norm<<'t'<<ex<<'t'<<final<<'t'&

10、lt;<overall<<endl;void main()STU s3;char name100;int norm,ex,fin;for(int i=0;i<3;i+) cout<<"请输入姓名、平时成绩、实验成绩、期末成绩:"<<endl;cin>>name>>norm>>ex>>fin;si.init(name,norm,ex,fin);si.fun();"<<endl;cout<<"按总评成绩排序后:n 姓名平时成绩实验成绩期末成

11、绩总评成绩sort(s,3);for(i=0;i<3;i+)si.print();3【题目】试定义一个类Array, 首先求各列元素中的合数(非素数)之和, 再将数组各列以其合数之和的大小从大到小排序,具体要求如下:(1) 私有数据成员int a45 :需要排序的二维数组。(2) 公有成员函数Array(int t5, int n): 构造函数,用参数 t 初始化成员数组a,n 表示数组t 的行数。int comp(int n) :判断整数n 是否为合数,如果是合数,返回值为1,否则返回值为0。int sum_comp(int j) :求数组a第 j 列元素中所有合数之和。void ex

12、ch(int j1, int j2) :交换数组a 的第 j1, j2 列元素。void fun() :根据题意对二维数组进行列排序。void print() :以矩阵的形式输出成员数组。(3) 在主函数中定义一个二维数组,并使用该数组对类Array 进行测试。输出示例:原数组:1012541516178191011121314151670181920排序后的数组:12151054171016819121511131470201618193答案#include <iostream.h>class Array private:int a45;public:Array(int t5,i

13、nt n);int comp(int n);int sum_comp(int j);void exch(int j1,int j2);void fun();void print();Array:Array(int t5,int n)for(int i=0;i<n;i+)for(int j=0;j<5;j+) aij=tij;int Array:comp(int n)int flag=0;for(int i=2;i<n;i+)if(n%i=0) flag=1; return flag;int Array:sum_comp(int j)int s=0;for(int i=0;i&

14、lt;4;i+)if(comp(aij)=1) s+=aij;cout<<"&"<<s<<endl;return s;void Array:exch(int j1,int j2)for(int i=0;i<4;i+)int d=aij1;aij1=aij2;aij2=d;void Array:fun()for(int i=0;i<4;i+)for(int j=i+1;j<5;j+)if(sum_comp(i)<sum_comp(j)exch(i,j);void Array:print()for(int i=

15、0;i<4;i+)for(int j=0;j<5;j+)cout<<aij<<'t'cout<<endl;void main(void)int b45=10,12,5, 4,15,16,17,8,19,10,11,12,13,14,15,16,70,18,19,20;Array arr(b,4);cout<<"原数组:"<<endl;arr.print();arr.fun();cout<<"排序后的数组:"<<endl;arr.print();

16、4 【题目】已知切线法求方程f(x)=ax2+bx+c=0 在 x 附近的一个解的迭代公式为:x=x- f(x)/f (x) ,其中 f (x)=2ax+b 为函数 f(x)的导数。 试定义一个类EQU, 用切线法求方程f(x)=ax2+bx+c=0 在 x附近的一个解。具体要求如下:(1) 私有数据成员float a,b,c :保存方程的系数a,b 和c。double x : x为所求得的解。(2) 公有成员函数EQU(float a1, float b1, float c1) :构造函数,用参数a1, b1, c1分别初始化成员a,b,c 。void fun(double x0, doub

17、le e ) :求方程在x0 附近的一个解,所采 用 的 算 法 是 : 依 次 计 算 x1=x0- f(x0)/f (x0), x2=x1- f(x1)/f (x1) , , xn=xn-1-f(xn- 1)/f (xn -1), 直 到|f(xn)|<e 为止。void print( ) :输出所求得的解。(3) 在主函数中建立EQU对象,并求出方程f(x)=2x2+6x-7=0 在x=5.0 附近的一个解,要求最终误差|f(x)|<10-5 , 最后调用print()函数输出所求得的解。正确程序的输入/输出结果如下(下划线部分为键盘输入):请输入方程的系数(a,b,c) :

18、 2 6 -7请输入预估的初始解x0: 5请输入误差要求(e) : 0.00001该方程的解是:0.8979164答案#include <iostream.h>class EQUprivate:float a,b,c;double x;public:EQU(float a1,float b1,float c1);void fun(double x0,double e);void print();EQU:EQU(float a1,float b1,float c1)a=a1;b=b1;c=c1;x=0.0;void EQU:fun (double x0,double e) doubl

19、e f;dodouble f0=a*x0*x0+b*x0+c;double ff=2*a*x0+b;x=x0-f0/ff;f=a*x*x+b*x+c;double f1=2*a*x+b;x0=x-f/f1;while(f>e);void EQU:print () cout<<x<<endl;void main()float a,b,c;double x0,e;cout<<" 请输入方程的系数(a, b, c) : "cin>>a>>b>>c;cout<<" 请输入预估的初始解

20、x0: "cin>>x0;cout<<" 请输入误差要求(e) : "cin>>e;cout<<" 该方程的解是:"EQU t(a,b,c);t.fun (x0,e);t.print();5 【题目】试定义一个类Array ,将二维数组各行按其各行元素中所有素数之和从大到小排序,具体要求如下:(1) 私有数据成员int a54 :待处理的数组。(2) 公有成员函数Array(int t4, int n): 构造函数,用参数 t 初始化成员数组a, n 为数组 t 的行数。int prime(int

21、 n) :判断整数n 是否为素数,如果是素数,返回值为1,否则返回值为0。int sum_prime(int i) :求数组a中第 i 行元素中所有素数之和。void exch(int i1, int i2) :交换数组a 的第 i1, i2 行元素。void fun( ) :根据题意对二维数组进行行排序。要求排序过程中交换数据时使用成员函数exch() 。void print( ) :以矩阵的形式输出成员数组。(3) 在主函数中定义一个二维数组,并使用该数组对类Array 进行测试。输出示例:原数组:1012541516178191011121314151670181920排序后的数组:19

22、101112701819201516178131415161012545 答案 #include <iostream.h>class Arrayprivate:int a54;public:Array(int t4,int n);int prime(int n);int sum_prime(int i);void exch(int i1,int i2);void fun();void print();Array:Array(int t4,int n)for(int i=0;i<n;i+)for(int j=0;j<4;j+) aij=tij;int Array:prim

23、e (int n)for(int i=2;i<n;i+)if(n%i=0) return 0;return 1;int Array:sum_prime (int i)int s=0;for(int j=0;j<4;j+) if(prime(aij) s+=aij;return s;void Array:exch(int i1,int i2) for(int j=0;j<4;j+) int d=ai1j;ai1j=ai2j;ai2j=d;void Array:fun ()for(int i=0;i<4;i+)for(int j=i+1;j<5;j+)if(sum_p

24、rime(i)<sum_prime(j) exch(i,j);void Array:print()for(int i=0;i<5;i+)for(int j=0;j<4;j+) cout<<aij<<'t'cout<<endl;void main()int b54=10,12,5,4,15,16,17,8,19,10,11,12,13,14,15,16,70,18,19,20;Array arr(b,5);cout<<" 原数组:"cout<<endl;arr.print();arr

25、.fun();cout<<"排序后的数组:"cout<<endl;arr.print();6. 【题目】判断某人是否为青年的标准是男性不超过35 周岁或女性不超过 40 周岁。已知身份证号从第7 位开始的连续8 位表示持证人的出生年月日,身份证号的第17 位为奇数表示持证人为男性,身份证号第 17 位数字为偶数表示持证人为女性。例如:身份证号为32110219830103191 X的持证人出生年月为1983年 1 月 3 日,性别为男性。试定义一个类ID,根据身份证号判断持证人截止到2015年10月 1 日是否为青年。具体要求如下:(1) 私有数据成

26、员char * id :保存 18位身份证号。int y,m,d, yes: y,m,d 分别表示持证人的出生年、月、日。yes 取值为 1 或 0 分别表示持证人是青年或不是青年。char *sex :持证人的性别(”男”或”女”) 。(2) 公有成员函数ID(char * s): 用参数 s 初始化成员id( 需申请动态内存), 并将 y,m,d初始化为0,并为指针sex 分配足够的存储空间。void fun( ): 根据身份证号计算持证人的出生年月和性别,并判断其是否为青年。void print( ):输出持证人的信息。ID(): 析构函数,进行必要的操作。(3) 在主函数中输入一个身份

27、证号,生成相应的对象,判断并输出持证人截止到2015 年 10 月 1 日是否为青年。可以使用以下身份证号测试程序:身份证号1:份证号2:入 /输出示例 (下划线部分为键盘输入):Input an ID:份证号生日期:1981.3.1性别 : 男是否青年:是 !6 #include <iostream.h>#include <string.h>class IDprivate:char * id; int y,m,

28、d, yes; char *sex;public:ID(char * s);void fun();void print();ID();ID:ID(char * s)id=new char100;strcpy(id,s);y=0; m=0;d=0;sex=new char5;sex0='0'yes=0;void ID:fun( )int i=6;while(i<10)y=y*10+idi+-'0'while(i<12)m=m*10+idi+-'0'while(i<14)d=d*10+idi+-'0'if(id16-

29、'0')%2=1) strcpy(sex,"男 ");elsestrcpy(sex,"女 ");int age=2016-y;if(age<=40&&strcmp(sex," 女 ")=0)yes=1;if(age<=35&&strcmp(sex," 男 ")=0) yes=1;void ID:print( )cout<<"身份证号:"cout<<id<<endl;cout<<"

30、出生日期:"cout<<y<<'.'<<m<<'.'<<d<<endl;cout<<"性别: "cout<<sex<<endl;cout<<"是否青年:"if(yes=1)cout<<" 是 "<<endl;elsecout<<" 不是 "<<endl;ID:ID()if(id) delete id;if(s

31、ex) delete sex;void main()char card1100="quot;/char card2100; cout<<"Input an ID : "/ cin>>card2;ID person(card1);person.fun();person.print();7.a 派生出数组b 的规则为其中, 为数组 a中 n 个元素的平均值,为数组 a中 n个元素的方差,21221(ai)2n。试定义一个类Array ,实现上述数组的派生。具体要求如下

32、:(1) 私有数据成员double a5,b5 :数组a,派生数组b。(2) 公有成员函数Array(double t, int n) :构造函数,用参数t 的前 n 个元素初始化成员数组a。double ave() :计算并返回数组a 中所有元素的平均值。double dat() :计算并返回数组a 中全部n 个元素的方差。void fun() : 根据题意派生数组b。 注: 头文件 math.h 中的函数doublepow(double x, double y) 返回值为xy。void print() :输出成员数组。(3) 在主函数中定义一个数组,并使用该数组对类Array 进行测试,要

33、求输出原数组和派生数组。输出示例: 原数组 a:6.12.615.8 4.31.72派生数组b:0.07861350.06483450.01797530.07469890.05814217.#include <iostream.h>#include <math.h>class Arrayprivate: double a5,b5;public:Array(double t, int n);double ave();double dat();void fun();void print();Array:Array(double t, int n)for(int i=0;i&

34、lt;n;i+)ai=ti; bi=0;double Array:ave()double s=0;for(int i=0;i<5;i+)s+=ai;return s/5;double Array:dat() double s=0;for(int i=0;i<5;i+)s+=(ai-ave()*(ai-ave();return s/5;void Array:fun()double pi=3.1415926,e=2.71828;double t=sqrt(2*pi*dat(),s;for(int i=0;i<5;i+)s=-(ai-ave()*(ai-ave()/(2*dat()

35、;bi=pow(e,s)/t; void Array:print()cout<<"原数组 a:"<<endl;for(int i=0;i<5;i+)cout<<ai<<'t'cout<<endl; cout<<" 派生数组b:"<<endl;for(i=0;i<5;i+)cout<<bi<<'t'cout<<endl;void main() double t5=6.1,2.6,15.8,4.3

36、,1.72;Array arr(t,5); arr.fun(); arr.print();8 【题目】用二分法求方程f(x)=ax2+bx+c=0 在区间 x1, x2 内的一个解的迭代算法如下( 假设 f(x) 在区间 x1, x2 内单调 ) :(1) 如果 f(x1)*f(x2)>0, 则方程在区间x1, x2 上无解;(2) 令 x=(x1+x2)/2 ;(3) 如果 f(x)*f(x1)>0 ,方程的解在区间x, x2 上,则令x1=x;否则,解在区间x1, x ,令x2=x;(4) 重复步聚(2) 、 ( 3)直到f(x) 满足精度要求。试定义一个类EQU, 实现利用二

37、分法求方程ax2+bx+c=0在区间x1,x2 内的一个解。具体要求如下:(1) 私有数据成员float a,b,c :存储方程的系数a, b和 c。double x1, x2, x : x为方程在区间x1, x2 上的解。int k :如果在区间x1, x2 内方程有解,则k值为1,否则k值为0;(2) 公有成员函数EQU(float a1, float b1, float c1) :用参数a1,b1,c1 分别初始化成员 a,b,c 。void fun(double xx1, double xx2, double e) :求方程ax2+bx+c=0在区间 xx1, xx2 内的一个解x,要

38、求最终误差|f(x)|<evoid print() : 若方程有解,则输出所求得的解;若无解, 则输出“方程在给定区间内无解”。(3) 在主函数中首先输入方程的系数、区间和误差要求,建立EQU对象并初始化,然后调用 fun() 函数求出方程的解,最后调用 print()函数输出所求得的解。正确程序的输入/ 输出结果如下(下划线部分为键盘输入):请输入方程的系数(a,b,c) : 1 5 -4请输入区间(x1,x2) 边界: 0 10请输入误差要求(e) : 0.00001该方程在区间0,10 中的解是:0.7015618 #include <iostream.h>#inclu

39、de <math.h>class EQUprivate: float a,b,c; double x1,x2,x; int k;public:EQU(float a1,float b1,float c1);void fun(double xx1,double xx2,double e);void print();EQU:EQU(float a1,float b1,float c1)a=a1;b=b1;c=c1; void EQU:fun(double xx1,double xx2,double e) x1=xx1;x2=xx2;double f1=a*x1*x1+b*x1+c,f2

40、=a*x2*x2+b*x2+c;double f; dox=(x1+x2)/2;f=a*x*x+b*x+c;if(f1*f>0)x1=x;else x2=x;while(fabs(f)>=e);void EQU:print() cout<<x<<endl;void main() double a,b,c; double x1,x2,e;cout<<" 请输入方程的系数(a,b,c): "/1 5 -4cin>>a>>b>>c;cout<<"请输入区间(x1,x2)边界:

41、 "/0 10cin>>x1>>x2;cout<<"请输入误差要求(e): "/0.00001cin>>e;EQU s(a,b,c);s .fun(x1,x2,e);cout<<"该方程在区间0,10中的解是:"/0.701561s.print ();函数编程题1. 定义两个独立函数,void print(int b); 实现将一维数组元素一行输出,void sort(int b,int n);实现将一维数组的元素按从大到小排序;在主函数中定义一个整型数组a8 ,从键盘输入8 个数为数

42、组元素赋值,分别调用两个函数。1 答案#include <iostream.h>void print(int b)for(int i=0;i<8;i+)cout<<bi<<'t'cout<<endl;void sort(int b,int n)for(int i=0;i<n-1;i+)for(int j=i+1;j<n;j+)if(bi<bj)int t;t=bi;bi=bj;bj=t;void main()int a8;cout<<"请输入 8 个数存放到一维数组a: "&

43、lt;<endl;for(int i=0;i<8;i+)cin>>ai;print(a);sort(a,8);print(a);2 字符串处理:设计一个通用函数实现在字符串s1 中从第m个字符开始插入字符串s2,在主程序中对该函数进行测试。初始状态:s1: abcdefgs2:1234输入插入字符串的位置:3目标状态:s1: ab1234cdefgs2:12343 答案#include <iostream.h>#include <string.h>void insert(char s1,char s2,int m)char *p=s1+m-1,*q=s2;char *r=s1+strlen(s1)-1;int a=strlen(s2)-1;while(p<r)*(r+a)

温馨提示

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

评论

0/150

提交评论