1、C+上机实验报告第一次上机1.1题目:一个首项大于0且等差大于0的等差数列前四项和为26,前四项积为880。请编写函数计算该数列的第20项的值。提示:如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列就叫做等差数列,这个常数叫做等差数列的公差。如等差数列:1,3,5,7,9,11。公差是2,该数列的第5项值是9。分析:根据等差数列的特征,估算项数和首项的范围;再利用已知条件以及等差数列求和的公式,在估算出的项数和首项范围内建立循环,依次求和、积,并与已知和、积对比,找到满足已知的首项、公差;最后利用等差数列求末项公式,计算出第20项的值。程序:#includeusing n
2、amespace std;int get(int a,int d,int n) /等差数列求末项公式 int an; an=a+(n-1)*d; return an;int main() int an,sum,mul,a,d,k=0; for(a=1;a0;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); coutan; return 0;结果:59小结:估算范围是本题一大难点,估算精确度越高越能提
3、高程序运行效率;此外,设置标志值使循环提前结束也可以提高效率。1.2题目:编写函数,实现下面功能:读入两个字符串,比较其是否相等,如果不相等,输出较大的那个。例如:“word”与“world”,第4个字母不同,l的ASCII码比d大,则输出world输入:wordworld输出:world分析:比较两个字符串的大小,可以依次对比对应位置的字符,建立循环依次对比,一旦某位置处字符不等,进入比大小流程,输出该位置处字符较大的字符串即可。程序:#includeusing namespace std;void compare(char a10,char b10) char *p1,*p2; p1=a;
4、 p2=b; for(int i=0;i*(p2+i) couta;break; else couta; /不能收空格 /cinb; cin.getline(a,10); cin.getline(b,10); /可以收空格 compare(a,b); return 0;结果:输入:wordworld输出:world小结:输入字符串的小技巧:cin函数不能接收空格,遇到空格或许回车都会自动判断字符串输入结束;cin.getline(a,n)函数可以接收空格,遇到回车才会判定输入结束。第二次上机:2.1题目:编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。
5、输入第一行为学生个数,接下来输入N个学生的数据。输出时,先输出N个学生,再输出平均分数(保留小数点后两位)。样例输入:3test1 101 90test2 102 87tets3 103 83样例输出:test1 101 90test2 102 87tets3 103 8386.67分析:建立类Student来存放学生的数据,类中除了成员函数外,还需要构造函数和显示数据的函数;使用对象数组来存放定义的n个学生对象;由于学生信息是手动输入的,类中便不需要获得score的成员函数,直接在输入时累加即可获得sum进而取得平均值程序:#include#include /因为用到了printf#incl
6、ude using namespace std;class Student private: string name; int num; int score; public: Student(string x=,int y=0,float z=0) /string类型的使用极大简化了程序 /必须给出默认参数,否则定义对象函数(不设初始值)时会出错 name=x; /string类型可以以赋值的方式进行字符串的复制 num=y; score=z; /int Getscore() /return score; void show() coutname num scoren; for(int i=0
7、;iNameNumScore; sti=Student(Name,Num,Score); /赋值法调用默认拷贝构造函数 sum+=Score;/sti.Getscore(); for(int i=0;in;i+) sti.show(); printf(%.2lf, sum/n); return 0;结果:样例输入:3test1 101 90test2 102 87tets3 103 83样例输出:test1 101 90test2 102 87tets3 103 8386.67小结:No.1. 若只有带参数(非默认参数)的构造函数,创建对象Student zhang/Student a10会
8、出错:方法1:带默认参数的构造函数;方法2:不带参数的空构造函数+带参数构造函数。No.2. string类型较字符数组而言更加方便,至少不需要程序员自定义析构函数。No.3. 规定输出格式时,可以添加#include 头文件,便可以使用C语言的printf输出。 2.2题目:设计一个矩形类(Rectangle),属性为矩形的左下和右上角的坐标,矩形水平放置。计算并输入矩形的周长和面积。输入第一行为左下坐标,第二行为右上坐标。输出第一行为周长,第二行为面积。样例输入:0 05 5样例输出:2025分析:建立一个Rectangle类,数据成员为两个顶点的左标,成员函数包括根据面积和周长公式分别求
9、面积和周长的函数。程序:#includeusing namespace std;class Rectangleprivate: int a1,a2,b1,b2;public: Rectangle(int x,int y,int m,int n) a1=x;a2=y;b1=m;b2=n; int per() int c; c=2*(b1-a1)+2*(b2-a2); return c; int area() int s; s=(b1-a1)*(b2-a2); return s; ;int main() int x1,y1,x2,y2,c,s; cinx1y1x2y2; Rectangle A(x
10、1,y1,x2,y2); c=A.per(); s=A.area(); coutcendl; coutsendl; return 0;结果:样例输入:0 05 5样例输出:2025小结:本题除了上述程序外还有一种更优思路,建立两个类,一个点类,一个矩形类,在矩形类中使用点类的对象,这样矩形属性的表达会更加明朗。类中包含了数据和对数据操作的定义,并进行封装使数据类型本身能够控制外界对其成员的访问。封装性、多态性、继承性是opp语言的三大特征。第三次上机3.1题目:设计一个学生类student,数据成员除学号(no)姓名(name)和成绩(deg)外,还包含两个静态变量num和sum分别存放学生总
11、数和总成绩,另外编写一个静态成员函数avg(),用于计算平均分。在主函数中,定义若干学生对象并初始化,要求输出这些学生信息并计算平均分。注:所有学生信息在主函数中进行初始化(无需手动输入)分析:建立一个student类,数据成员包括普通私有成员:学号、姓名、成绩、还有静态数据成员:总人数、总分,成员函数包括带默认参数的构造函数、计算平均分的静态函数。考虑到总分是每个人分数的叠加、每调用一次构造函数就等效于总人数+1,故可以将总人数和总分的变动写入构造函数中。程序:#include#include#includeusing namespace std;class Studentprivate:
12、int no; string name; float deg; static int num; static float sum;public: static float avg(); Student(int,string,float);int Student:num=0;float Student:sum=0;Student:Student(int x=0,string y=,float z=0) no=x; name=y; deg=z; +num; sum+=deg; coutno name degendl; coutendl;float Student:avg() return (sum
13、/num);int main() Student p1(1000,Bob,90); Student p2(1001,Alice,80); Student p3(1002,Anna,75); coutsetprecision(3)Student:avg(); /使用精度函数来控制输出格式 return 0;结果:1000Bob 901001Alice 801002Anna 7581.7小结:本题使用了静态数据成员和静态成员函数,类的所有对象共享类的静态成员拥有的存储区域,其中静态数据成员要注意:静态数据成员同样遵守private/public/protected的访问规则;静态数据成员的初始化要
14、在类的外部完成。类的静态成员函数要注意:没有this指针,只能访问静态成员;其定义可以在类内部也可以在类的外部。3.2题目:设计一个类Sample,它有两个private成员:name和数组A。设计一个友元类Process对类Sample的对象的数组A进行排序,并输出排序结果。要求手动输入数组A的每个元素(数组长度为5)。输入样例:1 2 5 4 3输出样例:1 2 3 4 5分析:建立一个类Sample,数据成员为name和数组A;再建立一个Sample类的友元类Process,类Process可以访问类Sample的所有成员,类Process的成员函数为数组排序函数,可以使用冒泡排序算法。
15、程序:#include#includeusing namespace std;class Process;class Sampleprivate: int name; int A5;public: Sample(int x5); friend class Process;class Processpublic: void sort(Sample obj);Sample:Sample(int x5) for(int i=0;i5;i+) Ai=xi; void Process:sort(Sample obj) int t; for(int i=0;i4;i+) /冒泡排序 for(int j=0
16、;jobj.Aj+1) t=obj.Aj;obj.Aj=obj.Aj+1;obj.Aj+1=t; for(int i=0;i5;i+) coutobj.Ai ;int main() int a5; for(int i=0;iai; Sample s(a); Process p; p.sort(s); return 0;结果:输入样例:1 2 5 4 3输出样例:1 2 3 4 5小结:本题使用了友元类,一个类作为另一个类的友元,表示这个类的所有成员函数都是另一个类的友元函数,即友元类的所有成员函数都可以访问另一个类的包括私有成员在内的所有成员。类A向自己的友元类B开放,friend class B的声明写在类A中,注意:这里的类B需要做前向声明。此外,友元机制的使用需要注意:由于友元机制在一定程度上破坏了类的封装性,应对程序的执行效率以及程序结构设计的合理性进行折中,正确地使用友元机制
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1