E27 [第9章:类成员,类成员的构造(冒号语法)]下面的一段程序中的Cline类中缺少了部分成员函数,该程序的运行结果如下:
Point 1 is:(0,0) Point 2 is:(0,0) Length=0 Point 1 is:(1,1) Point 2 is:(5,5) Length=5.65685
请为Cline函数补充必要的成员函数与实现代码,使得程序正确运行。
#include <iostream> #include <cmath> using namespace std; class CPoint { int m_x; //点的X坐标 int m_y; //点的Y坐标º public: CPoint() { m_x=0; m_y=0; } CPoint (int x,int y) { m_x=x; m_y=y; } int getx() { return m_x; } int gety() { return m_y; } void showPoint() { cout<<"("<<this->m_x<<","<<this->m_y<<")"<<endl; } }; class CLine { CPoint m_point1; CPoint m_point2; }; void main() { CLine line1; line1.ShowLine(); cout<<"Length="<<line1.distance()<<endl; CLine line2(1,1,5,5); line2.ShowLine(); cout<<"Length="<<line2.distance()<<endl; }
以下是答案,超级简单
#include <iostream> #include <cmath> using namespace std; class CPoint { int m_x; //点的X坐标 int m_y; //点的Y坐标? public: CPoint() { m_x=0; m_y=0; } CPoint (int x,int y) { m_x=x; m_y=y; } int getx() { return m_x; } int gety() { return m_y; } void showPoint() { cout<<"("<<this->m_x<<","<<this->m_y<<")"<<endl; } }; class CLine { private: CPoint m_point1; CPoint m_point2; public: void ShowLine() { cout<<"Point1 is :";m_point1.showPoint(); cout<<"Point2 is :";m_point2.showPoint(); } double distance() { return sqrt((m_point1.getx()-m_point2.getx())*(m_point1.getx()-m_point2.getx())+(m_point1.gety()-m_point2.gety())*(m_point1.gety()-m_point2.gety())); } CLine(int a=0,int b=0,int c=0,int d=0):m_point1(a,b),m_point2(c,d) { } }; int main() { CLine line1; line1.ShowLine(); cout<<"Length="<<line1.distance()<<endl; CLine line2(1,1,5,5); line2.ShowLine(); cout<<"Length="<<line2.distance()<<endl; return 0; }
E28 [第9章:类成员,类成员的构造(冒号语法)]设有类CTime和CDate分别用于描述时间和日期,另外有CDateTime类描日期和时间,请为三个类给出具体的实现代码,并在main函数中测试。
#include <iostream> #include <cmath> #include <iomanip> using namespace std; //原来题目里面基本只有定义,就是一个比较简单的填充过程 class CTime { int m_hour,m_minute,m_second; public: CTime(int hour=0,int minute=0,int second=0) //如果时间合法,则赋值,否则赋值0时0分0秒 { if(hour<0||hour>23||minute>=60||minute<0||second<0||second>=60) { hour=0; minute=0; second=0; } m_hour=hour; m_minute=minute; m_second=second; } int SetTime(int hour=0,int minute=0,int second=0) //如果时间合法,则赋值并返回1,否则不赋值,并返回0 { if(hour<0||hour>23||minute>=60||minute<0||second<0||second>=60) { hour=0; minute=0; second=0; return 0; } m_hour=hour; m_minute=minute; m_second=second; return 1; } int getHour() { return m_hour; } int getMinute() { return m_minute; } int getSecond() { return m_second; } void ShowTime(bool flag) //flag为True则以24小时制显示时间,否则以 AM PM的方式显示 { if(flag) { cout<<setw(2)<<m_hour<<":" <<setw(2)<<m_minute<<":" <<setw(2)<<m_second<<endl; } else { if(m_hour>12) { cout<<setw(2)<<setfill('0')<<m_hour-12<<":" <<setw(2)<<setfill('0')<<m_minute<<":" <<setw(2)<<setfill('0')<<m_second<<".PM"<<endl; } else { cout<<setw(2)<<setfill('0')<<m_hour<<":" <<setw(2)<<setfill('0')<<m_minute<<":" <<setw(2)<<setfill('0')<<m_second<<".AM"<<endl; } } } //自己考虑是否需要添加其他成员函数 }; class CDate { int m_year,m_month,m_day; public: CDate(int year=2000,int month=1,int day=1) //如果日期合法,则赋值,否则赋值2000年1月1日 { int temp[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(month>12) { year=2000; month=1; day=1; } if(year%400==0||(year%4==0&&year%100!=0)) { temp[1]++; } if(day>temp[month-1]) { year=2000; month=1; day=1; } m_year=year; m_month=month; m_day=day; } int SetDate(int year=2000,int month=1,int day=1) //如果日期合法,则赋值并返回1,否则不赋值,并返回0 { int temp[12]={31,28,31,30,31,30,31,31,30,31,30,31}; if(month>12) { year=2000; month=1; day=1; return 0; } if(year%400==0||(year%4==0&&year%100!=0)) { temp[1]++; } if(day>temp[month-1]) { year=2000; month=1; day=1; return 0; } m_year=year; m_month=month; m_day=day; return 1 ; } int GetYear() { return m_year; } int GetMonth() { return m_month; } int GetDay() { return m_day; } void ShowDate(bool flag) //flag为TRUE,则以中文的方式显示日期,否则以MM/DD/YYYY的方式显示日期 { if(flag) { cout<<m_year<<"年"<<m_month<<"月"<<m_day<<"日"<<endl; } else { cout<<setw(2)<<setfill('0')<<m_month<<"/"<<setw(2)<<setfill('0')<<m_day<<"/"<<setw(4)<<setfill('0')<<m_year<<endl; } } //自己考虑是否需要添加其他成员函数 }; class CDateTime { CTime m_time; CDate m_date; public: //添加必要的构造函数 CDateTime(int a=2000,int b=1,int c=1,int d=0,int e=0,int f=0):m_time(d,e,f),m_date(a,b,c) { } int SetDateTime(int a,int b,int c,int d,int e,int f) //自己设计参数,考虑该函数的返回值加以表示全部正确、日期不对、时间不对等情况 { if(m_date.SetDate(a,b,c)==1&&m_time.SetTime(d,e,f)==1) { return 1; } if(m_date.SetDate(a,b,c)==0&&m_time.SetTime(d,e,f)==1) { return -1; } if(m_date.SetDate(a,b,c)==1&&m_time.SetTime(d,e,f)==0) { return -1; } } void ShowDateTime(bool a,bool b) // 自己设计参数,考虑可以中文日期和西文日期格式,以及24小时和AM PM都可以控制 { m_date.ShowDate(a); m_time.ShowTime(b); } //添加自己认为必要的其他成员函数 int GetMonth() { return m_date.GetMonth(); } int GetMinute() { return m_time.getMinute(); } }; int main() { CDateTime d1(2014, 5, 2, 27, 12, 5); d1.ShowDateTime(false, true); //第1个参数表示以英文方式显示日期, 第2个参数表示以24小时制方式显示时间 CDateTime d2; d2.ShowDateTime(true, false); //第1个参数表示以中文方式显示日期, 第2个参数表示以AM PM的方式显示时间 int iStatus; iStatus=d2.SetDateTime(2014, 5, 2, 21, 55, 5); switch(iStatus)//吐槽一下,万一两个都不正确呢~233 { case 1: cout<<"日期和时间数据设置正确!"<<endl; break; case -1: cout<<"日期数据设置不正确!"<<endl; break; case -2: cout<<"时间数据设置不正确!"<<endl; break; } d2.ShowDateTime(false, false); //第1个参数表示以英文方式显示日期, 第2个参数表示以AM PM的方式显示时间 cout<<"月="<<d2.GetMonth()<<endl; //认真考虑一下如何实现此操作? cout<<"分钟="<<d2.GetMinute()<<endl; //认真考虑一下如何实现此操作? return 0; }
E29有一个person类定义如下:
class CPerson { private: string m_name; // 姓名 int m_age; // 年龄 char m_sex; // 性别 public: CPerson(const string& name, int age, char sex) { m_name = name; m_age = age; m_sex = sex; } CPerson() { m_name = "无名"; m_age = 0; m_sex = 'M'; } void print() const { cout<<"姓名:"<<m_name<<"\n年龄:"<<m_age<<"\n"; if (m_sex == 'M') cout<<"性别:男"<<endl; else cout<<"性别:女"<<endl; } };
请以CPerson类为基类定义一个派生类CStudent,要求该类具有以下属性成员和成员函数:
学生所属大学名称,string类型表示
学生所在年级,int类型表示
CStudent(); // 以{”无名”、18岁、男性、“苏州大学”、1年级}为默认值的无参构造函数;
CStudent(string name, int , char, string collageName, int grade); // 带参数的构造函数
void print(); // 显示学生类对象的所有信息
编写对CStudent类的测试程序,要求如下:
(1) 定义一个学生类student1,属性值为默认属性值,并输出其信息
(2) 定义一个学生类student2,其属性为:
姓名:“Liming”
年龄:21
性别:男
大学:苏州大学
年级:1
测试程序如下:
int main() { CStudent st1,st2("Liming",21,'M',"苏州大学",1); cout<<"学生1的信息:"<<endl; st1.print(); cout<<"\n学生2的信息:"<<endl; st2.print(); return 0; }
答案
//author CN.TTDragon #include<bits/stdc++.h> typedef long long ll; const ll mod=1e9+7; const ll maxn=1e5+7; const double pi=acos(-1); using namespace std; class CPerson { private: string m_name; // 姓名 int m_age; // 年龄 char m_sex; // 性别 public: CPerson(const string& name, int age, char sex) { m_name = name; m_age = age; m_sex = sex; } CPerson() { m_name = "无名"; m_age = 0; m_sex = 'M'; } void print() const { cout<<"姓名:"<<m_name<<"\n年龄:"<<m_age<<"\n"; if (m_sex == 'M') cout<<"性别:男"<<endl; else cout<<"性别:女"<<endl; } }; class CStudent : public CPerson { private: string cname; int grade; public: CStudent(const string &name = "无名",int age=0,char sex='M',const string &cna="苏州大学",int g=1):CPerson(name,age,sex) { cname=cna; grade=g; } void print() { CPerson::print(); cout<<"大学:"<<cname<<endl; cout<<"年级:"<<grade<<endl; } }; int main() { CStudent st1,st2("Liming",21,'M',"苏州大学",1); cout<<"学生1的信息:"<<endl; st1.print(); cout<<"\n学生2的信息:"<<endl; st2.print(); return 0; }
写在最后:
完结撒花!有个文件操作的实验五,鸽了鸽了,有机会再说吧(说鸽就鸽,也是一种不鸽!)
TT珑,考试加油!