C++上机实验报告.docx

上传人:b****6 文档编号:7968872 上传时间:2023-01-27 格式:DOCX 页数:12 大小:18.64KB
下载 相关 举报
C++上机实验报告.docx_第1页
第1页 / 共12页
C++上机实验报告.docx_第2页
第2页 / 共12页
C++上机实验报告.docx_第3页
第3页 / 共12页
C++上机实验报告.docx_第4页
第4页 / 共12页
C++上机实验报告.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

C++上机实验报告.docx

《C++上机实验报告.docx》由会员分享,可在线阅读,更多相关《C++上机实验报告.docx(12页珍藏版)》请在冰豆网上搜索。

C++上机实验报告.docx

C++上机实验报告

第一次上机

1.1

题目:

一个首项大于0且等差大于0的等差数列前四项和为26,前四项积为880。

请编写函数计算该数列的第20项的值。

  

提示:

如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列就叫做等差数列,这个常数叫做等差数列的公差。

如等差数列:

1,3, 5,7,9,11。

公差是2,该数列的第5项值是9。

分析:

根据等差数列的特征,估算项数和首项的范围;再利用已知条件以及等差数列求和的公式,在估算出的项数和首项范围内建立循环,依次求和、积,并与已知和、积对比,找到满足已知的首项、公差;最后利用等差数列求末项公式,计算出第20项的值。

程序:

#include

usingnamespacestd;

intget(inta,intd,intn)//等差数列求末项公式

{

intan;

an=a+(n-1)*d;

returnan;

}

intmain()

{

intan,sum,mul,a,d,k=0;

for(a=1;a<10;a++)

{

for(d=4;d>0;d--)

{

mul=a*(a+d)*(a+2*d)*(a+3*d);

sum=4*a+6*d;

if(mul==880&&sum==26)

{k=1;break;}

}

if(k==1)//标记k的使用可以使循环提前结束

break;

}

an=get(a,d,20);

cout<

return0;

}

结果:

59

小结:

估算范围是本题一大难点,估算精确度越高越能提高程序运行效率;此外,设置标志值使循环提前结束也可以提高效率。

1.2

题目:

编写函数,实现下面功能:

读入两个字符串,比较其是否相等,如果不相等,输出较大的那个。

例如:

“word”与“world”,第4个字母不同,"l"的ASCII码比"d"大,则输出world

输入:

word

   world

输出:

world

分析:

比较两个字符串的大小,可以依次对比对应位置的字符,建立循环依次对比,一旦某位置处字符不等,进入比大小流程,输出该位置处字符较大的字符串即可。

程序:

#include

usingnamespacestd;

voidcompare(chara[10],charb[10])

{

char*p1,*p2;

p1=a;

p2=b;

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

{

if(*(p1+i)!

=*(p2+i))

if(*(p1+i)>*(p2+i))

{cout<

else

{cout<

}

}

intmain()

{

chara[10],b[10];

//cin>>a;//不能收空格

//cin>>b;

cin.getline(a,10);

cin.getline(b,10);//可以收空格

compare(a,b);

return0;

}

结果:

输入:

word

   world

输出:

world

小结:

输入字符串的小技巧:

cin函数不能接收空格,遇到空格或许回车都会自动判断字符串输入结束;cin.getline(a,n)函数可以接收空格,遇到回车才会判定输入结束。

第二次上机:

2.1

题目:

编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。

输入第一行为学生个数,接下来输入N个学生的数据。

输出时,先输出N个学生,再输出平均分数(保留小数点后两位)。

样例输入:

3

test110190

test210287

tets310383

样例输出:

test110190

test210287

tets310383

86.67

分析:

建立类Student来存放学生的数据,类中除了成员函数外,还需要构造函数和显示数据的函数;使用对象数组来存放定义的n个学生对象;由于学生信息是手动输入的,类中便不需要获得score的成员函数,直接在输入时累加即可获得sum进而取得平均值

程序:

#include

#include//因为用到了printf

#include

usingnamespacestd;

classStudent

{

private:

stringname;

intnum;

intscore;

public:

Student(stringx="",inty=0,floatz=0)//string类型的使用极大简化了程序

//必须给出默认参数,否则定义对象函数(不设初始值)时会出错

{

name=x;//string类型可以以赋值的方式进行字符串的复制

num=y;

score=z;

}

//intGetscore()

//{returnscore;}

voidshow()

{

cout<

}

};

intmain()

{

Studentst[10];

intn,Num;

stringName;

intScore;

floatsum=0;//sum不能用整型,因为最后规定格式输出

cin>>n;

for(inti=0;i

{

cin>>Name>>Num>>Score;

st[i]=Student(Name,Num,Score);//赋值法调用默认拷贝构造函数

sum+=Score;//st[i].Getscore();

}

for(inti=0;i

{

st[i].show();

}

printf("%.2lf",sum/n);

return0;

}

结果:

样例输入:

3

test110190

test210287

tets310383

样例输出:

test110190

test210287

tets310383

86.67

小结:

No.1.若只有带参数(非默认参数)的构造函数,创建对象Studentzhang/Studenta[10]会出错:

方法1:

带默认参数的构造函数;

方法2:

不带参数的空构造函数+带参数构造函数。

No.2.string类型较字符数组而言更加方便,至少不需要程序员自定义析构函数。

No.3.规定输出格式时,可以添加#include头文件,便可以使用C语言的printf输出。

2.2

题目:

设计一个矩形类(Rectangle),属性为矩形的左下和右上角的坐标,矩形水平放置。

计算并输入矩形的周长和面积。

输入第一行为左下坐标,第二行为右上坐标。

输出第一行为周长,第二行为面积。

样例输入:

00

55

样例输出:

20

25

分析:

建立一个Rectangle类,数据成员为两个顶点的左标,成员函数包括根据面积和周长公式分别求面积和周长的函数。

程序:

#include

usingnamespacestd;

classRectangle

{

private:

inta1,a2,b1,b2;

public:

Rectangle(intx,inty,intm,intn)

{

a1=x;a2=y;b1=m;b2=n;

}

intper()

{

intc;

c=2*(b1-a1)+2*(b2-a2);

returnc;

}

intarea()

{

ints;

s=(b1-a1)*(b2-a2);

returns;

}

};

intmain()

{

intx1,y1,x2,y2,c,s;

cin>>x1>>y1>>x2>>y2;

RectangleA(x1,y1,x2,y2);

c=A.per();

s=A.area();

cout<

cout<

return0;

}

结果:

样例输入:

00

55

样例输出:

20

25

小结:

本题除了上述程序外还有一种更优思路,建立两个类,一个点类,一个矩形类,在矩形类中使用点类的对象,这样矩形属性的表达会更加明朗。

类中包含了数据和对数据操作的定义,并进行封装使数据类型本身能够控制外界对其成员的访问。

封装性、多态性、继承性是opp语言的三大特征。

第三次上机

3.1

题目:

设计一个学生类student,数据成员除学号(no)姓名(name)和成绩(deg)外,还包含两个静态变量num和sum分别存放学生总数和总成绩,另外编写一个静态成员函数avg(),用于计算平均分。

在主函数中,定义若干学生对象并初始化,要求输出这些学生信息并计算平均分。

注:

所有学生信息在主函数中进行初始化(无需手动输入)

分析:

建立一个student类,数据成员包括普通私有成员:

学号、姓名、成绩、还有静态数据成员:

总人数、总分,成员函数包括带默认参数的构造函数、计算平均分的静态函数。

考虑到总分是每个人分数的叠加、每调用一次构造函数就等效于总人数+1,故可以将总人数和总分的变动写入构造函数中。

程序:

#include

#include

#include

usingnamespacestd;

classStudent{

private:

intno;

stringname;

floatdeg;

staticintnum;

staticfloatsum;

public:

staticfloatavg();

Student(int,string,float);

};

intStudent:

:

num=0;

floatStudent:

:

sum=0;

Student:

:

Student(intx=0,stringy="",floatz=0)

{

no=x;

name=y;

deg=z;

++num;

sum+=deg;

cout<

cout<

}

floatStudent:

:

avg()

{

return(sum/num);

}

intmain()

{

Studentp1(1000,"Bob",90);

Studentp2(1001,"Alice",80);

Studentp3(1002,"Anna",75);

cout<

:

avg();//使用精度函数来控制输出格式

return0;

}

结果:

1000 Bob90

1001 Alice80

1002 Anna75

81.7

小结:

本题使用了静态数据成员和静态成员函数,类的所有对象共享类的静态成员拥有的存储区域,其中静态数据成员要注意:

静态数据成员同样遵守private/public/protected的访问规则;静态数据成员的初始化要在类的外部完成。

类的静态成员函数要注意:

没有this指针,只能访问静态成员;其定义可以在类内部也可以在类的外部。

3.2

题目:

设计一个类Sample,它有两个private成员:

name和数组A。

设计一个友元类Process对类Sample的对象的数组A进行排序,并输出排序结果。

要求手动输入数组A的每个元素(数组长度为5)。

输入样例:

12543

输出样例:

12345

分析:

建立一个类Sample,数据成员为name和数组A;再建立一个Sample类的友元类Process,类Process可以访问类Sample的所有成员,类Process的成员函数为数组排序函数,可以使用冒泡排序算法。

程序:

#include

#include

usingnamespacestd;

classProcess;

classSample

{

private:

intname;

intA[5];

public:

Sample(intx[5]);

friendclassProcess;

};

classProcess{

public:

voidsort(Sampleobj);

};

Sample:

:

Sample(intx[5])

{

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

A[i]=x[i];

}

voidProcess:

:

sort(Sampleobj)

{

intt;

for(inti=0;i<4;i++)//冒泡排序

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

if(obj.A[j]>obj.A[j+1])

{t=obj.A[j];obj.A[j]=obj.A[j+1];obj.A[j+1]=t;}

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

cout<

}

intmain()

{

inta[5];

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

cin>>a[i];

Samples(a);

Processp;

p.sort(s);

return0;

}

结果:

输入样例:

12543

输出样例:

12345

小结:

本题使用了友元类,一个类作为另一个类的友元,表示这个类的所有成员函数都是另一个类的友元函数,即友元类的所有成员函数都可以访问另一个类的包括私有成员在内的所有成员。

类A向自己的友元类B开放,friendclassB的声明写在类A中,注意:

这里的类B需要做前向声明。

此外,友元机制的使用需要注意:

由于友元机制在一定程度上破坏了类的封装性,应对程序的执行效率以及程序结构设计的合理性进行折中,正确地使用友元机制

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1