1.创建一个对象数组,数组的元素是学生对象,学生的信息包括学号、姓名和成绩(一门课成绩),在main函数中将数组元素按学生成绩从小到大的顺序排序并显示出来。(学生对象不得少于5个,显示定义构造函数和析构函数,并在里面加上测试语句)
#include<iostream>
#include<string>
using namespace std;
class student{
private:
string xuehao;
string xingming;
double fenshu;//三个数据成员 ,学号和姓名都做成字符串类型
public:
student(string xh=" ",string xm=" ",double fs=0)
//构造函数,学号名字和成绩,且都设置了默认值
//设置默认值的好处就是在创建对象时可以实现形式多元
//即在调用(创建对象)的时候形式可以有多种
//此处给了三个默认值,可以做无参使用,也可以给一个给两个值
{
xuehao=xh;
xingming=xm;//创建对象的时候会调用一个构造函数来对它做初始化
//此时就是将xm赋值给姓名完成初始化
fenshu=fs;
cout<<xingming<<"的析构函数被调用!"<<endl;}//提示某一个函数被调用了
//此时输出的就是哪一个名字的对象的构造函数被调用了
//比如输出:张三的析构函数被调用
void show()//构造函数show,显示三个数据成员,依次按照以下格式的字符串进行显示
{
cout <<"学号"<<xuehao
<<"姓名"<<xingming
<<"分数"<<fenshu<<endl;
}
double get_fenshu(){//为了支持私有成员的分数的访问
//因为fenshu是私有成员在类的外部,无法通过对象.的方式这种操作来进行访问
//所以要加一个公有接口get_fenshu来返回当前fenshu的值
return fenshu;
}
Student(){//此处的Student是一个包含在类里面的成员函数
//函数名不能和类的命名相同,最好以不同命名来以示区分
cout <<xingming<<"的析构函数被调用!"<<endl;//析构函数,作用一个输出
}
};
int main(){
student stemp;//放此处属于main函数,属于一个局部变量,也是一个无参对象
//由于在类定义最开始的时候设置了三个默认值,所以是支持无参函数的初始化的
student st[5]={//创建一个对象数组,此处的student调用的是定义的类的那个student
//创建的时候用构造函数, 结束的时候用析构函数,可以参考出栈和入栈
student("180001","张三",78),
student("180002","李四",89),
student("180003","小王",92),
student("180004","小李",58),
student("180005","小白",66)//完成数组的初始化,注意不能只写数据信息
//此处看起来像构造函数的调用
};//对象数组创建好了
cout<<"原始信息如下:"<<endl;//输出没排序之前的信息
for (int i=0;i<5;i++)//用循环对数组的五个元素进行输出
{
st[i].show();//输出st[i]这个数组元素不能直接使用cout
//cout<<st[i]的写法是错的,c++不认可这个,没有提前预设这种类型的输出方式
//所以需要调用这个对象自身的输出的成员函数 来完成对它自身的一个输出
}
for(int j=0;j<4;j++) //冒泡排序:外循环n-1,所以说j<4,而不是j<5,n是看有多少个元素
{
for(int i=0;i<4-j;i++)//内循环n-1-i所以此处是i<4-j,由i<5-1-j演变而来
if(st[i].get_fenshu()>=st[i+1].get_fenshu()){//里面的循环体是两两比较小靠前
//此处是st[i]和st[i+1]作比较,升序的话就是小的在前面
//student stemp;创建一个stemp临时对象作为交换,放到此处属于一个块变量,
//只属于它所处的这个大括号所在的这一小部分,
stemp=st[i];
st[i]=st[i+1];
st[i+1]=stemp;
}//用循环对数组的五个元素进行输出
}
cout<<"按成绩从低到高排列如下:"<<endl;
for(int i=0;i<5;i++)
{
st[i].show();
}
return 0;
}
运行结果:
注:运行结果中的“的析构函数被调用”其实就是stemp的调用,因为它在设置的时候就是无参的
2.使用C++的string类,将5个字符串按逆转后的顺序展示出来。测试数据,键盘输入: Germany Japan America Britain France ,控制台显示:France Britain America Japan Germany;
#include<iostream>
#include<string>
using namespace std;
void zhuanhuan(string s[],int n)//完成反向的转置,
//用数组可以利用循环,更方便
{
for (int i=0;i<n/2;i++)//此时n为5,5/2是2,i<2说明i只能取0和1
{
string stemp;
stemp=s[i];
s[i]=s[n-1-i];//当i为0时,第一个位置的字符串会在5-1-0=4的位置出现,
//即实现0和4的交换,i为1时就是1和3的交换
s[n-1-i]=stemp;
}
}
int main()
{
const int shuchu =5;//const只能对len进行读操作不能进行改写操作
string str[shuchu];//长度为5的一个数组存储字符串
cout<<"从键盘输入"<<shuchu<<"个字符串:"<<endl;
for(int i=0;i<shuchu;i++)//做循环
cin>>str[i];//循环了五次送到数组str[i]当中
cout<<"将5个字符串逆转输出:"<<endl;
zhuanhuan(str,shuchu);//逆转要用到zhuanhuan这个方法
//该方法将数组的首地址str和数组元素shuchu的个数传过去
for(int i=0;i<shuchu;i++)
cout<<str[i]<<endl; //输出
return 0;
}
运行结果:
3.设计个用来表示直角坐标系的Location类,在主函数中新建两个对象A、B,要求A在第3象限,B在第2象限,用成员函数计算2个坐标之间的距离。
#include<iostream>
#include<cmath>
using namespace std;
class Location//题目要算两点之间的距离,一个Location只能描述一个点的距离
{ private:
double x,y;//坐标,可以写出第一象限和第二象限
public:
Location(int a=0,int b=0):x(a),y(b){}//构造函数,考虑到无参的构造情况,先做好初始化
//冒号:后面的内容是用的初始化列表的方式
//x用a做初始化,y用b做初始化
double dist(const Location &t){
//返回值用double,用引用类型,不用调用析构函数和构造函数
//利用const让值只读不写
//一个点为(x,y),另一个点t为(t.x,t.y)
double d;
d=sqrt((x-t.x)*(x-t.x)+(y-t.y)*(y-t.y));//求两点间距离公式
return d;
}
};
int main (){
Location A(-2,-2),B(-2,2);//创建Location的对象,
double b;//两点间的距离
b=A.dist(B);//写B.dist(A);也是可以的,这种方式才叫做用成员函数做
//dist这个函数需要两个点,有一个点已经给出来了
//即对象调用它,那么它就作为其中的一个点,另外一个点以参数的形式交给dist,
//然后把它放参数里,即()里
cout <<"b="<<b<<endl;
return 0;
}
运行结果: