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

下载本文档

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

文档简介

类编程题

1.【题目】试定义一个类NUM,验证下列命题是否成立:任意一

个正整数与其反序数相加,得到一个新的正整数,再对这个新正整数

重复上述步骤,最终一定可以得到一个回文数。例如,正整数350的

反序数为053(即53),350+53=403,403+304=707,707是回文数,

命题成立。又如,正整数2015的反序数为5102,2015+5102=7117,

7117是回文数,命题成立。具体要求如下:

私有数据成员

intnum:存放用于验证命题的正整数。

公有成员函数

NUM(intx):构造函数,用x初始化数据成员num。

voidset(inta):将num的值设置为a。

intyn(intn):判断n是否回文数,若是,返回1;否则返回0。

voidfun():使用num验证命题是否成立,并显示验证过程。

在主函数中对该类进行测试。

输出示例:

num=350的验证过程如下:

350+53=403

403+304=707

命题成立!

num=2015的验证过程如下:

2015+5102=7117

1

命题成立!

2.【题目】试定义一个实现计算学生课程成绩的类STU,对学生

学期总评成绩进行计算并排序。具体要求如下:

(1)私有数据成员

intnorm,ex,final,overalI:分别表示平时成绩、实验成绩、

期末考试和总评成绩。

charname[15]:学生姓名。

(2)公有成员函数

voidinit(char*name1,intnori,intex1,intfin1):用

参数namel,nori,exp1,fird分别初始化成员name,norm,ex,finaIo

voidfun():计算学生的总评成绩。计算方法为:总评成绩二

平时成绩占*20%+实验成绩占*25%+期末成绩占*55%。总评成绩计算时

要求四舍五入,并且期末考试成绩不足50分时,则期末考试成绩即

为总评成绩。

friendvoidsort(STUst[],intn):友元函数,对st按总评

成绩进行从大到小排序。

voidprint():输出该学生信息。

(3)在主函数中先定义一个有5个元素的对象数组,用循环语句

输入学生信息,并根据这些信息利用成员函数init()更新学生信息,

然后使用函数sort。对数组排序,最后输出排序后的学生信息。

输入/输出示例(下划线部分为键盘输入):

请输入姓名、平时成绩、实验成绩、期末成绩:AAA827558

2

请输入姓名、平时成绩、实验成绩、期末成绩:BBB936084

请输入姓名、平时成绩、实验成绩、期末成绩:CCC678281

请输入姓名、平时成绩、实验成绩、期末成绩:DDD547851

请输入姓名、平时成绩、实验成绩、期末成绩:EEE915241

按总评成绩排序后:

姓名平时成绩实验成绩期末成绩总评成绩

BBB93608480

CCC67828178

AAA82755867

DDD54785158

EEE91524141

3.【题目】试定义一个类Array,首先求各列元素中的合数(非

素数)之和,再将数组各列以其合数之和的大小从大到小排序,具体

要求如下:

(1)私有数据成员

inta[4][5]:需要排序的二维数组。

(2)公有成员函数

Array(intt口[5],intn):构造函数,用参数t初始化成员数

组a,n表示数组t的行数。

intcomp(intn):判断整数n是否为合数,如果是合数,返回

值为1,否则返回值为0。

intsum_comp(intj):求数组a第j列元素中所有合数之和。

3

voidexch(intj1,intj2):交换数组a的第J1,J2列元素。

voidfun():根据题意对二维数组进行列排序。

voidprintO:以矩阵的形式输出成员数组。

(3)在主函数中定义一个二维数组,并使用该数组对类Array进

行测试。

输出示例:

原数组:

10125415

161781910

1112131415

1670181920

排序后的数组:

12151054

171016819

1215111314

7020161819

4.【题目】已知切线法求方程f(x)=ax2+bx+c=0在x附近的一

个解的迭代公式为:x=x-f(x)/fJ(x),其中F(x)=2ax+b为函数

f(x)的导数。试定义一个类EQU,用切线法求方程f(x)=ax2+bx+c=0

在x附近的一个解。具体要求如下:

(1)私有数据成员

floata,b,c:保存方程的系数a,b和c。

4

doublex:x为所求得的解。

(2)公有成员函数

EQU(floata1,floatb1,floatc1):构造函数,用参数a1,b1,

d分别初始化成员a,b,Co

voidfun(doublexO,doubIee):求方程在xO附近的一个解,

所采用的算法是:依次计算x1=x0-f(x0)/f,(xO),

x2=x1-f(x1)/f,(x1),…,xn=xn-1-f(xn-1)/f1(xn-1),直到

|f(xn)|<e为止。

voidprint():输出所求得的解。

(3)在主函数中建立EQU对象,并求出方程f(x)=2x2+6x-7=0

在x二附近的一个解,要求最终误差|f(x)|<10七,最后调用printO

函数输出所求得的解。

正确程序的输入/输出结果如下(下划线部分为键盘输入):

请输入方程的系数系,b,c):26-7

请输入预估的初始解xO:5

请输入误差要求(e):

该方程的解是:

5.【题目】试定义一个类Array,将二维数组各行按其各行元素

中所有素数之和从大到小排序,具体要求如下:

(1)私有数据成员

inta[5][4]:待处理的数组。

(2)公有成员函数

5

Array(intt[][4],intn):构造函数,用参数t初始化成员数

组a,n为数组t的行数。

intprime(intn):判断整数n是否为素数,如果是素数,返回

值为1,否则返回值为0。

intsum_prime(inti):求数组a中第i行元素中所有素数之和。

voidexch(inti1,inti2):交换数组a的第i1,i2行元素。

voidfun():根据题意对二维数组进行行排序。要求排序过程

中交换数据时使用成员函数exchOo

voidprint():以矩阵的形式输出成员数组。

(3)在主函数中定义一个二维数组,并使用该数组对类Array进

行测试。

输出示例:

原数组:

101254

1516178

19101112

13141516

70181920

排序后的数组:

19101112

70181920

1516178

6

13141516

101254

6.【题目】判断某人是否为青年的标准是男性不超过35周岁或

女性不超过40周岁。已知身份证号从第7位开始的连续8位表示持

证人的出生年月日,身份证号的第17位为奇数表示持证人为男性,

身份证号第17位数字为偶数表示持证人为女性。例如:身份证号为

3291X的持证人出生年月为1983年1月3日,性别为男性。试定义

一个类ID,根据身份证号判断持证人截止到2015年10月1日是否

为青年。具体要求如下:

(1)私有数据成员

char*id:保存18位身份证号。

inty,m,d,yes:y,m,d分别表示持证人的出生年、月、日。yes

取值为1或0分别表示持证人是青年或不是青年。

char*sex:持证人的性别(“男”或”女")。

(2)公有成员函数

ID(char*s):用参数s初始化成员id(需申请动态内存),并

将V,m,d初始化为0,并为指针sex分配足够的存储空间。

voidfun():根据身份证号计算持证人的出生年月和性别,并

判断其是否为青年。

voidprint():输出持证人的信息。

~ID():析构函数,进行必要的操作。

(3)在主函数中输入一个身份证号,生成相应的对象,判断并输

7

出持证人截止到2015年10月1日是否为青年。可以使用以下身份证

号测试程序:

身份证号1:32201

身份证号2:32213

输入/输出示例(下划线部分为键盘输入):

InputanID:32213

身份证号:32213

出生日期:性别:男

是否青年:是!

,r.11去卬i)2

7.【题目】设数组a派生出数组b的规则为亚方,

其中,u为数组a中n个元素的平均值,为数组a中n个元素的

方差,〃乙,试定义一个类Array,实现上述数组的派

生。具体要求如下:

(1)私有数据成员

doublea[5],b[5]:数组a,派生数组b。

(2)公有成员函数

Array(doublet口,intn):构造函数,用参数t的前n个元素

初始化成员数组a。

doubleave():计算并返回数组a中所有元素的平均值。

doubledat():计算并返回数组a中全部n个元素的方差。

voidfunO:根据题意派生数组b。注:头文件中的函数double

8

pow(doublex,doubIey)返回值为x'。

voidprint():输出成员数组。

(3)在主函数中定义一个数组,并使用该数组对类Array进行测

试,要求输出原数组和派生数组。输出示例:

原数组a:

派生数组b:

8.【题目】用二分法求方程方x)=ax2+bx+c=0在区间区1,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,实现利用二分法求方程ax2+bx+c=0在区间以1,

x2]内的一个解。具体要求如下:

(1)私有数据成员

floata,b,c:存储方程的系数a,b和c。

doublex1,x2,x:x为方程在区间[x1,x2]上的解。

intk:如果在区间[x1,x2]内方程有解,则k值为1,否则k值为

0;

9

(2)公有成员函数

EQU(floata1,floatb1,floatc1):用参数a1,b1,c1分别初

始化成员a,b,Co

voidfun(doubIexx1,doublexx2,doublee):求方程

ax2+bx+c=0在区间[xx1,xx2]内的一个解x,要求最终误差|f(x)|<e。

voidprintO:若方程有解,则输出所求得的解;若无解,则输

出“方程在给定区间内无解工

(3)在主函数中首先输入方程的系数、区间和误差要求,建立

EQU对象并初始化,然后调用fun()函数求出方程的解,最后调用

print。函数输出所求得的解。

正确程序的输入/输出结果如下(下划线部分为键盘输入):

请输入方程的系数系,b,c):15-4

请输入区间([x1,x2])边界:010

请输入误差要求(e):

该方程在区间[0,10]中的解是:

函数编程题

1.定义两个独立函数,voidprint(intb[]);实现将一维数组

元素一行输出,voidsort(intb口,intn);实现将一维数组的元素按

从大到小排序;在主函数中定义一个整型数组a[8],从键盘输入8

个数为数组元素赋值,分别调用两个函数。

2.字符串处理:设计一个通用函数实现在字符串s1中从第m个

字符开始插入字符串s2,在主程序中对该函数进行测试。

10

初始状态:s1:abcdefg

s2:1234

输入插入字符串的位置:3

目标状态:s1:ab1234cdefg

s2:1234

3.编写程序实现的功能是:调整数组中元素的存放顺序,使得

所有正数放置在数组的前部,负数放置在数组的后部(假定数组中所

有元素的值均不为0)。

输出结果如下:

处理前的数组为:

-12-3-45-678-9-101112

处理后的数组为:

12211857-6-4-9-10-3-1

4.编写程序:定义一个函数voiddtor(intn,intr);实现将十

进制整型数转换为r进制数。从键盘输入十进制数和要转换的进制

数,在主函数中调用该函数实现进制转换。(算法介绍:P201)

例如输入82输出结果为1000

输入2016输出结果为14

类编程题答案

1.答案

#incIude<>

11

classNUM{

private:

intnum;

pubIic:

NUM(intx);

voidset(inta);

intyn(intn);

voidfun();

};

NUM::NUM(intx){

num=x;

)

voidNUM::set(inta){

num=a;

)

intNUM::yn(intn){

intt=n,s=0;

whiIe(t){

s=s*10+t%10;

t/=10;

1

if(s=n)return1;

elsereturn0;

)

voidNUM::fun(){

intm;

cout<<"num="<<num<〈”的验证过程如下:"《endI;

while(1){

intn=num,s=0;veralKst[j].overalI){

STUt;t=st[i];st[i]=st[j];st[j]=t;

)

)

voidSTU::print(){

cout«name«'\t'«norm«'\t'«ex«'\t'«final«'\t'«overaIl«endI;

)

voidmainO{

STUs[5];

charname[100];

intnorm,ex,fin;

for(inti=0;i<5;i++){

cout«"请输入姓名、平时成绩、实验成绩、期末成绩:"<<endl;

cin»name»norm»ex»fin;

s[i].init(name,norm,ex,fin);

s[i].fun();

12

1

for(i=0;i<5;i++){

s[i].print();

)

cout<<”按总评成绩排序后:\n姓名平时成绩实验成绩期末成绩总评成绩“<<endI;

sort(s,5);

for(i=0;i<5;i++){

s[i].print();

)

)

3.答案

#incIude<>

classArray{

private:

inta[4][5];

pubIic:

Array(intt[][5],intn);

intcomp(intn);

intsum_comp(intj);

voidexch(intj1,intj2);

voidfun();

voidprint();

};

Array::Array(intt[][5],intn){

for(inti=0;i<n;i++)

for(intj=0;j<5;j++)

a[i][j]=t[i][j];

)

intArray::comp(intn){

for(inti=2;i<n;i++)

if(n%i==0)return1;

return0;

)

intArray::sum_comp(intj){

ints=0;

for(inti=0;i<4;i++)

if(comp(a[i][j])=1)

s+=a[i][j];

returns;

)

voidArray::exch(intj1,intj2){

13

for(inti=0;i<4;i++){

intd=a[i][j1];

a[i][j1]=a[i][j2];

a[i][j2]=d;

voidArray::fun(){

for(inti=0;i<4;i++)

for(intj=i+1;j<5;j++)

if(sum_comp(i)<sum_comp(j))

exch(i,j);

)

voidArray::print(){

for(inti=0;i<4;i++)

(

for(intj=0;j<5;j++)

cout«a[i][j]«,\t';

cout«endI;

)

)

voidmain(void){

intb[4][5]={10,12,5,4,15,16,17,8,19,10,11,12,13,14,15,16,70,18,19,20);

Arrayarr(b,4);

cout<<"原数组:"<<endl;

0;

0;

cout<<"排序后的数组:《endl;

0;

)

4.答案

#incIude<>

#include<>

classEQU(

private:

floata,b,c;

doubIex;

pubIic:

EQU(fIoata1,floatb1,floatc1);

voidfun(doublexO,doublee);

voidprint0;

);

EQU::EQU(floata1,floatbl,floatc1)1

a=a1;b=b1;c=c1;

14

X=;

}

voidEQU::fun(doublexO,doublee){

doublef;

doubIefO=a*xO*xO+b*xO+c;

doubIeff=2*a*x0+b;

whiIe(fabs(fO)>e)

(

xO=xO-fO/ff;

fO=a*xO*xO+b*xO+c;

ff=2*a*x0+b;

)

x=xO;

)

voidEQU::print(){

cout«x«endI;

)

voidmainO{

floata,b,c;

doublexO,e;

cout<<"请输入方程的系数(a,b,c):

cin»a»b»c;

cout<<"请输入预估的初始解xO:";

cin»xO;

cout<<"请输入误差要求(e):

cin»e;

cout<<"该方程的解是:";

EQUt(a,b,c);

(xO.e);

0;

)

5.#incIude<>

cIassArray(

private:

inta[5][4];

pubIic:

Array(intt[][4],intn);

intprime(intn);

intsum_prime(inti);

voidexch(inti1,inti2);

voidfun();

voidprint();

};

Array::Array(intt[][4],intn)(

15

for(inti=0;i<n;i++)

for(intj=0;j<4;j++)

a[i][j]=t[i][j];

)

intArray::prime(intn){

for(inti=2;i<n;i-H-)

if(n%i==0)return0;

return1;

)

intArray::sum_prime(inti){

ints=0;

for(intj=0;j<4;j++)

if(prime(a[i][j]))

s+=a[i][j];

returns;

)

voidArray;;exch(inti1,inti2){

for(intj=0;j<4;j++)

(

intd=a[i1][j];

a[i1][j]=a[i2][j];

a[⑵[j]=d;

)

)

voidArray::fun(){

for(inti=0;i<4;i++)

for(intj=i+1;j<5;j++)

if(sum_prime(i)<sum_prime(j))

exch(i,j);

)

voidArray::print(){

for(inti=0;i<5;ii)

(

for(intj=0;j<4;j++)

cout«a[i][j]«'\t";

cout«endI;

1

)

voidmain()(

int

b[5][4]={10,12,5,4,15,16,17,8,19,10,11,12,13,14,15,16,70,18,19,20);

Arrayarr(b,5);

cout<<"原数组:";

cout«endI;

16

0;

0;

cout<<"排序后的数组:“;

cout«endI;

0;

)

6.#include<>

#include<>

classID{private:

char*id;inty,m,d,yes;char*sex;

pubIic:

ID(char*s);

voidfun();

voidprint();

"IDO;

);

ID::ID(char*s){

id=newchar[strlen(s)+1];

strcpy(id,s);

y=0;m=0;d=0;

sex=newchar[5];

sex[0]='\0';

yes=0:

}

voidID::fun(){

inti=6;

while(i<10)

y=y*1O+id[i++]-'O';

while(i<12)

m=m*10+id[i++]-'0';

while(i<14)

d=d*1O+id[i++]-'O';

if((id[16]-'0')%2=1)

strcpy(sex,"男");

eIse

strcpy(sex,"女");

intage=2015-y;

if(age<=40&&strcmp(sex,"女")=0)

yes=1;

if(age<=35&&strcmp(sex,"男")==0)

yes=1;

}

voidID::print(){

cout«"身份证号:";cout«id«endI;

17

cout«"出生日期:";cout«y«'.'«d«endl;

cout<<"性别:";cout«sex«endI;

cout<<“是否青年:

if(yes==1)cout«"是"«endI;

eIsecout<<"不是"<<endl;

)

ID::~ID(){

if(id)delete[]id;

if(sex)deIete[]sex;

)

voidmainO{

charcardl[100]="32201

include<>

#incIude<>

classArray(private:doubIea[5],b[5];

pubIic:

Array(doublet[],intn);

doubleave();

doubledat();

voidfun();

voidprint();

);

Array::Array(doublet[].intn){

for(inti=0;i<n;i++){

a[i]=t[i];b⑴=0;

)

)

doubleArray::ave(){

doubIes=0;

for(inti=0;i<5;i++)

s+=a[i];

returns/5;

)

doubleArray::dat(){doubles=0;

for(inti=0;i<5;i++)

s+=(a[i]-ave0)*(a[i]-ave());

returns/5;

)

voidArray::fun(){

doubIepi=,e=;

doubIet=sqrt(2*pi*dat()),s;

for(inti=0;i<5;i++){s=-(a[i]-ave0)*(a[i]-ave())/(2*dat());

b[i]=pow(e,s)/t;|]

voidArray::print(){

18

cout<<"原数组a:"«endI;

for(inti=0;i<5;i++)

cout«a[i]«'\t';

cout«endI;cout<<"派生数组b:"«endI;

for(i=0;i<5;i++)

cout«b[i]«'\t';

cout«endI;

)

voidmainO{doublet[5]={,,,,);

Arrayarr(t,5);

0;

0;

)

8.#incIude<>#include<>

classEQU{

private:

floata,b,c;

doubIex1,x2,x;

intk;

pubIic:

EQU(floata1,floatb1,floatc1);

voidfun(doublexx1,doubIexx2,doublee);

voidprint。;

);

EQU::EQU(floata1,floatb1,floatc1){a=a1;b=b1;c=c1;}

voidEQU::fun(doubIexx1,doubIexx2,doubIee){x1=xx1;x2=xx2;

doubIef1=a*x1*x1+b*x1+c,f2=a*x2*x2+b*x2+c;

doubIef;

if(f1*f2>0)k=0;

eIsek=1;

x=(x1+x2)/2;

f=a*x*x+b*x+c;

while(fabs(f)>=e&&k)

1

if(f1*f>0)

19

x1=x;

eIsex2=x;

x=(x1+x2)/2;

f=a*x*x+b*x+c;

)

)

};

voidEQU::print(){if(k)cout«x«endI;

eIsecout«M无解"<<endI;)

voidmain(){

floata,b,c;

doublex1,x2,e;

cout«''请输入方程的系数(a,b,c):";案

#include<>

voidprint(intb[])(

for(inti=0;i<8;i++)

cout«b[i]«'\f;

cout«endI;

1

voidsort(intb[],intn){

for(inti=0;i<n-1;i++)

for(intj=i+1;j<n;j++)

if(b[i]<b[j]){

intt;

t=b[i];

b[i]=b[j];

温馨提示

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

评论

0/150

提交评论