week 6 C++ 结构体与类
练习
2.1 日期结构体用法
定义一个日期结构体,该结构体成员有年、月、日3个数据。要求从键盘输入年月日,判断该年是否闰年(函数调用)并以年-月-日格式输出日期以及是否闰年(函数调用)。
#include<iostream>
using namespace std;
class Date //使用类,声明为public
{
public:
int year;
int month;
int day;
int whichleaps(int n); //定义识别闰年的函数,n=year
void Print(struct Date x); //打印结果
};
int Date::whichleaps(int n)//调用类中的函数识别闰年
//n=year
{
return((n%4==0&&n%100!=0)||(n%400==0)); //判断语句,返回0或1
}
void Date::Print(struct Date x)
{
cout<<"日期是"<<x.year<<"-"<<x.month<<"-"<<x.day<<endl;
int flag=x.whichleaps(x.year); //1为真,0为假
if(flag==1)
cout<<"该年是闰年"<<endl;
else
cout<<"该年不是闰年"<<endl;
}
int main()
{
struct Date x;//定义一个日期结构体变量
cin>>x.year>>x.month>>x.day;//从键盘输入年月日
x.Print(x);//输出日期以及是否闰年
return 0;
}
3.1 日期类用法
定义一个日期类,该类数据成员有年、月、日3个私有数据。私有成员函数有判断闰年,公有成员函数有设置年月日数据成员的值、按指定格式输出日期。要求从键盘输入年月日,判断该年是否闰年并以年-月-日格式输出日期以及是否闰年。
#include<iostream>
using namespace std;
class Date
{
private:
int year;
int month;
int day; //私有数据
int whichleaps(int n); //私有成员函数();
//判断闰年的成员函数,类中只有声明,其定义在类外,权限是私有,只能被类中其他成员函数调用
public: //公有成员函数
void Print(); //按指定格式输出日期
//输出成员函数,类中只有声明,其定义在类外,权限是公有
void reset(int a,int b,int c)
{
year=a;
month=b;
day=c;
} //修改私有数据成员年月日的值,需要参数,类内定义,即类中给出函数体,是内联函数。权限是公有
};
int Date::whichleaps(int n) //n=year=a
{
return((n%4==0&&n%100!=0)||(n%400==0));
}
void Date::Print() //成员函数类外定义,需要类名::函数名形式,数据成员year可以直接用,所以该函数无参,返回值为空
{
cout<<"日期是"<<year<<"-"<<month<<"-"<<day<<endl;
int flag=whichleaps(year);//可以在函数内部直接调用成员函数
if(flag==1)
cout<<"该年是闰年"<<endl;
else
cout<<"该年不是闰年"<<endl;
}
int main()
{
Date x; ;//定义一个日期类对象,其数据成员没有被赋初值
int a,b,c;
cin>>a>>b>>c;
x.reset(a,b,c); );//通过公有成员函数调用,修改私有数据成员的值
x.Print();
return 0;
}
2.2 长方形结构体用法
要求定义一个长方形结构体,有长和宽2个数据。要求从键盘输入长和宽,计算周长(用函数调用)和面积(用函数调用)并输出(用函数调用)。
#include<iostream>
using namespace std;
class acre
{
public:
int length;
int width;
int around(int a,int b);
int area(int a,int b);
void print(acre x); //括号内变量为类(acre)x
};
int acre::around(int a,int b) //a=length, b=width
{
return 2*(a+b);
}
int acre::area(int a,int b)
{
return a*b;
}
void acre::print(acre x)
{
cout<<"面积是"<<area(x.length,x.width)<<endl;
cout<<"周长是"<<around(x.length,x.width)<<endl;
}
int main()
{
class acre x; ;//定义一个长方体类变量
cin>>x.length>>x.width; //a,b
x.print(x); //括号中变量为类x
return 0;
}
2.3 时间结构体的用法
定义一个时间结构体,包括时、分、秒3个数据。要求时间从键盘输入,然后将时间以时:分:秒的格式输出(用函数调用)并将时间转换为以秒为单位的数输出(用函数调用)。
此题可以参考2.1题日期结构体用法来实现。
#include<iostream>
using namespace std;
struct time//结构体,默认公有(public:)
{
int hr;
int min;
int sed;
int whichleaps(int hr,int min,int sed); //括号内输入三个变量
void Print(time x); //结构体(time)x
};
int time::whichleaps(int hr,int min,int sed)
{
return(hr*3600+min*60+sed);
}
void time::Print(time x)
{
cout<<"时间为"<<x.hr<<":"<<x.min<<":"<<x.sed<<endl;
cout<<"转为"<<x.whichleaps(x.hr,x.min,x.sed)<<"秒"<<endl;
} //使用结构体x中的成员函数x.whichleaps,x.whichleaps调用结构体x中的数据x.hr, x.min, x.sed
int main()
{
struct time x;
cin>>x.hr>>x.min>>x.sed;
x.Print(x); //括号中变量为结构体x
return 0;
}
2.4 圆结构体用法
要求定义一个圆结构体,包括半径和圆心坐标数据。要求从键盘输入半径和圆心坐标,圆周率用3.14计算圆面积和周长。输出圆心坐标位置以及圆的面积和周长。
此题可以参考2.2题。
#include<iostream>
#define pi = 3.14; //定义常量
using namespace std;
struct circle
{
float r;
float b,c; //圆心坐标
float around(float a);
float area(float a);
void print(circle x); //结构体(circle)x
};
float circle::around(float a)
{
return 2*3.14*a; //无法使用pi?
}
float circle::area(float a)
{
return 3.14*a*a;
}
void circle::print(circle x)
{
cout<<"圆心坐标是"<<x.b<<","<<x.c<<endl;
cout<<"面积是"<<area(x.r)<<endl;
cout<<"周长是"<<around(x.r)<<endl;
}
int main()
{
struct circle x;
float a;
cin>>x.r>>x.b>>x.c>>a;
x.print(x);
return 0;
}
2.5 学生结构体用法
定义一个学生结构体,包括3个数据:英语成绩、计算机成绩以及这2门课的总成绩。要求从键盘输入5个学生的英语与计算机成绩信息,然后按这两门课的总成绩进行升序排序(用函数调用),并输出这5个学生排序后的成绩信息(用函数调用)。
#include <iostream>
using namespace std;
struct stu
{
int en;
int pc;
int all;
};
void print(struct stu x[],int n)//输出学生信息
//括号内变量为空
{
int i;
for(i=0;i<n;i++)
{
cout<<"英语"<<x[i].en<<",计算机"<<x[i].pc<<",总成绩"<<x[i].all<<endl;
}
}
void LineAll(struct stu x[],int n) //结构体不包括加总函数LineAll()
//不返回
{
int i,j;
struct stu tmp;
for(i=0;i<n;i++)
for(j=n-1;j>i;j--)
if(x[j-1].all >x[j].all) //用冒泡法对数组元素进行升序排序
{
tmp=x[j-1];
x[j-1]=x[j];
x[j]=tmp;
}
}
int main()
{
struct stu x[5]; //定义一个学生结构体数组,大小为5
for(int i=0;i<5;i++) //给5个结构体数组的元素进行赋值
{
cin>>x[i].en>>x[i].pc;
x[i].all = x[i].en + x[i].pc;
}
LineAll(x,5); //x结构体总称,n=5
print(x,5);
return 0;
}
3.5 学生类用法
定义一个学生类,包括3个数据:英语成绩、计算机成绩以及这2门课的总成绩,自行分析成员函数。要求从键盘输入5个学生的英语与计算机成绩信息,然后按这两门课的总成绩进行升序排序,并输出这5个学生排序后的成绩信息。
提示:本题涉及对象数组用法
#include <iostream>
using namespace std;
class stu
{
private: //
int en;
int pc;
int all;
public:
void print() //输出学生信息,无参,类中定义
{
cout<<"英语"<<en<<",计算机"<<pc<<",总成绩"<<all<<endl;
}
void reset(int e,int p)
{
en=e;
pc=p;
all=e+p;
}
int lineall() //获取私有成员总成绩,无参,有返回值,类中定义
{
return all;
}
};
void Line(stu x[],int n)
{
int i,j,a,b;
struct stu tmp;
for(i=0;i<n;i++)
for(j=n-1;j>i;j--)
{
a=x[j-1].lineall();
b=x[j].lineall(); //私有成员不能类外访问,所以通过公有函数获取私有数据值
if(a > b)
{
tmp=x[j-1];
x[j-1]=x[j];
x[j]=tmp; //对象之间赋值,隐含调用拷贝构造函数
}
}
}
void Print(stu x[ ],int a) //输出所有学生信息,对象数组作参数,普通函数
{
for(int i=0;i<5;i++)
x[i].print(); //每个对象数组的元素,相当于对象
}
int main()
{
stu x[5]; //定义一个学生对象数组,大小为5
int a,b;
for(int i=0;i<5;i++) //给对象数组的5个元素进行赋值
{
cin>>a>>b;
x[i].reset(a,b); //通过调用成员函数对私有数据成员赋值
}
Line(x,5); // 按总成绩对学生对象数组进行升序排序 ,普通函数调用
Print(x,5); //输出全部学生信息,普通函数调用
return 0;
}