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需要做前向声明。
此外,友元机制的使用需要注意:
由于友元机制在一定程度上破坏了类的封装性,应对程序的执行效率以及程序结构设计的合理性进行折中,正确地使用友元机制