第八章 类(I)

1.日期类
【问题描述】
设计一个日期类(Date),用来实现日期的操作。包括一个空构造函数,三个成员函数,其余所需自行决定。
用成员函数setDate()用来给Date类设置日期。
用成员函数isLeapYear()用来判断是否是闰年。
用成员函数getSkip(Date o)用来计算两个日期之间相差的天数。
【输入形式】
输入两个日期,输入格式参考样例。
【输出形式】
判断两个日期是否是闰年,以及两个日期的间隔天数,输出格式参考样例。
【样例输入】

        2012 10 20
        2017 11 07

【样例输出】

        2012 is leap year.
        2017 is not leap year.
        The skip of two date is 1844.
        注意:时间差始终为正数。
#include<iostream>
using namespace std;
class Date
{
    public:
        int a,b,c;//变量 
        int s=0;//与该年第一天差多少天    
    public:
    Date()
    {
        a=0;
        b=0;
        c=0;
    }
    void setDate(int A,int B,int C)//形参 
    {
        a=A;
        b=B;
        c=C;
    }
    bool isLeapYear()
    {
        while(a%400==0||a%4==0&&a%100!=0)
        {
            cout<<a<<" is leap year."<<endl;
            int yuefen[13]={0,31,29,31,30,31,30,31,31,30,31,30,31};
            for(int i=0;i<b;i++)
            {
                s+=yuefen[i];
            }
            s=s+c;
            return 1;   
        }
        cout<<a<<" is not leap year."<<endl;
        int yuefen[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
        for(int i=0;i<b;i++)
        {
            s+=yuefen[i];
        }
        s=s+c;
        return 0;
    }
    void getSkip(Date m)
    {
        int ans=0;
        if(m.a==a)
        {
            ans=s-m.s;//s是上一次(较大的年份)调用isLeapYear的距离该年1.1的天数 
        }
        else
        {
            for(int j=a-1;j>=m.a;j--)//a,是上一次的(较大的)年份                                       
            {
                if(j%400==0||j%4==0&&j%100!=0)
                {
                    ans+=366;
                    //cout<<ans<<endl; 
                }
                else//不加else的话,执行完if会继续执行下面的语句 
                {
                    ans+=365;
                    //cout<<ans<<endl;
                }
                  
            }
            ans=ans+s-m.s;
            //cout<<ans<<endl;
        }
        cout<<"The skip of two date is "<<ans<<'.';
    }   
};
int main()
{
    int i;
    Date dat[2];
    for(i=0;i<2;i++)
    {
        int A,B,C;
        cin>>A>>B>>C;
        dat[i].setDate(A,B,C);
    }
    dat[0].isLeapYear();
    dat[1].isLeapYear();
    if(dat[0].a>dat[1].a)//dat[0]的年份月份日期小 
    {
        swap(dat[0],dat[1]);
        if(dat[0].b>dat[1].b)
        {
            swap(dat[0],dat[1]);
            if(dat[0].c>dat[1].c)
            {
                swap(dat[0],dat[1]);
            }
        }
    }
    dat[1].getSkip(dat[0]);//这个操作好高端,dat[1]是最后调用的,所以里面的数据都是它的 
    return 0;
}

2.三角形类
【问题描述】
先定义一个能描述平面上一条线段的类Beeline,包含私有数据成员为线段两个端点的坐标(X1,Y1,X2,Y2),在类中定义形参默认值为0的构造函数,计算线段长度的公有成员函数Length(),显示线段两个端点坐标的公有成员函数show()。然后再定义一个能描述平面上三角形的类Triangle,其数据成员为用Beeline定义的对象line1,line2,line3。在类中定义的构造函数要能对对象成员进行初始化。再定义计算三角形面积的函数Area()及显示三条边端点坐标及面积的函数Print(),Print()函数中可调用show()函数显示三条边两端点坐标。
【输入形式】
输入三角形三个顶点的坐标(x1,y1)、(x2,y2)、(x3,y3)。
其中 -100 <= x1,x2,x3,y1,y2,y3 <= 100,且为整数。
在主函数中创建类对象tri(x1,y1,x2,y2,x3,y3),对应line1(x1,y1,x2,y2),line2(x2,y2,x3,y3),line3(x3,y3,x1,y1)。
【输出形式】
调用Print()函数,将三角形三条边的端点坐标及面积。面积保留两位小数。
具体格式见样例。
【样例输入】

                0 0
                0 4
                3 0

【样例输出】

            Three edges' points are listed as follows:
            (0, 0),(0, 4)
            (0, 4),(3, 0)
            (3, 0),(0, 0)
            The area of this triangle is: 6.00.

【提示】
1.严格按照输出样例输出,建议复制。
2.计算面积建议用海伦公式。
3.严格控制保留2位小数。
4.如果没有严格使用类,得分为0。

#include<iostream>
#include<cmath>
#include <iomanip>
using namespace std;
class Beeline
{
    private:
        double X1,Y1,X2,Y2;
    public:
        Beeline(double x1=0,double y1=0,double x2=0,double y2=0):X1(x1),Y1(y1),X2(x2),Y2(y2)
        {}
        double Length()//勾股定理算长度 
        {
            return sqrt((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2));
        }
        void Show()//显示三条边的两端点的坐标
        {
            cout<<'('<<X1<<", "<<Y1<<"),("<<X2<<", "<<Y2<<')'<<endl;
        }
        
};
class Triangle//数据成员为用Beeline定义的对象line1,line2,line3
{
    private:
        Beeline line1,line2,line3; 
    public:
        //friend class Beeline;//Beeline类是三角形类的友元
        Triangle(double x1,double y1,double x2,double y2,double x3,double y3):line1(x1,y1,x2,y2),line2(x2,y2,x3,y3),line3(x3,y3,x1,y1)//能对对象成员进行初始化
        {}
        double Area()//海伦公式计算三角形面积
        {
            //不需要强制转换类型double c1=line1.Length(),c2=line2.Length(),c3=line3.Length();//强制转换类型 
            double c=(line1.Length()+line2.Length()+line3.Length())/2;//c代表周长的一半
            return sqrt(c*(c-line1.Length())*(c-line2.Length())*(c-line3.Length()));
        }
        void Print()//显示三条边端点坐标及面积
        {
            cout<<"Three edges' points are listed as follows:"<<endl;
            line1.Show();
            line2.Show();
            line3.Show();
            cout<<fixed<<setprecision(2)<<"The area of this triangle is: "<<Area()<<'.';
        }
};
int main()
{
    double x1,x2,x3,y1,y2,y3;
    cin>>x1>>y1>>x2>>y2>>x3>>y3;    
    Triangle tri(x1,y1,x2,y2,x3,y3);
    tri.Print();
    return 0;
}

3.学生成绩类
【问题描述】定义学生成绩类Score,其私有数据成员有学号、姓名、物理、数学、外语、平均成绩。补全Score类及主函数,使得程序能在一行中一次输出该生的学号、姓名、物理、数学、外语、平均成绩。
【输入形式】学生的学号、姓名、物理成绩、数学成绩、外语成绩。
【输出形式】除了输入的所有基本信息,还应包括计算的平均成绩。
【样例输入】

    081531 WangXiaoming 100 82 99

【样例输出】

        081531 WangXiaoming 100 82 99 93.6667

【样例说明】输出数据间使用空格。
【评分标准】 注意补全相关的内容,使程序输出正确。

#include<iostream> 
#include<string> 
using namespace std; 
class Score 
{ 
private: 
    string id,name;
    int phy, math,eng;
    float aver;
public: 
    Score(string i,string n,int p, int m,int e)
    {
        id=i;
        name=n;
        phy=p;
        math=m;
        eng=e;
    }
    void Average()//必须加void 
    {
        aver=float(phy+math+eng)/3;//int类型强制转换为float 
    }
    void Print()//必须加void
    {
        cout<<id<<' '<<name<<' '<<phy<<' '<<math<<' '<<eng<<' '<<aver;
    }
}; 
int main()
{ 
    string id, name; 
    int phy, math, eng; 
    cin >> id >> name >> phy >> math >> eng; 
    Score sco(id, name, phy, math, eng); 
    sco.Average(); 
    sco.Print(); 
    return 0; 
}

4.学生成绩类2
【问题描述】设计学生成绩类Score。在主函数中定义学生成绩对象数组s[]。用Sum()计算每个学生的总成绩、用Show()显示每个学生的成绩。增加静态成员函数getAvg(),用于返回学生的总平均分。通过增加合适的成员、修改成员函数等完成这一功能。
【输入形式】
包含一组测试数据。第一行输入一个整数n(1<=n<=100)。
接下来n行。每行先输入一个整数op:
当op==1时,输入x, y, z。代表输入一位新同学i(i从1开始编号)的语文、数学、英语成绩,无需输出。
当op==2时,输入i,输出第i同学的总成绩。数据保证这位同学的成绩已经录入。
当op==3时,输入i,依次输出第i同学的语文数学英语成绩,成绩之间用空格隔开。
当op==4时,输出当前已经录入学生的总平均分,结果保留两位小数。
(1<=n<=100, 1<=id<=10, 1<=op<=3, 0<=x,y,z<=100,全部输入都为整型数)
【输出形式】
当op==2,3,4时,输出所求答案,每个答案占一行。
【样例输入】 【对应样例输出】

10
1 90 85 90
1 80 90 75
2 1                                                 265
3 2                                                 80 90 75
4                                                    255.00
1 80 80 85
1 50 60 65
1 30 90 75
3 5                                                 30 90 75
4                                                    225.00

注意输入之间会有一些输出,但测试只看cout结果。
#include<iostream> 
#include<cstdio> 
#include<cstdlib> 
#include<iomanip> 
using namespace std; 
class Score 
{ 
private: 
    int Chinese, Math, English;//通过增加合适的成员、修改成员函数等完成这一功能
    static int TotalScore; 
    static int TotalStudent; 
public: 
    Score() {} 
    void setScore (int c, int m, int e) 
    { 
        Chinese=c;
        Math=m;
        English=e;
        TotalScore+=c+m+e;
        TotalStudent++;
    } 
    int Sum()//计算每个学生的总成绩sum
    { 
        int sum=Chinese+Math+English;
        return sum;
    } 
    void Show()//显示每个学生的成绩
    { 
        cout<<Chinese<<' '<<Math<<' '<<English<<endl;
    } 
    double static getAve()//静态成员函数getAvg(),用于返回学生的总平均分
    { 
       double ave;
       ave=(double)TotalScore/TotalStudent;//double (TotalScore/TotalStudent)输出除后取小数的数,(double)TotalScore/TotalStudent是将两个值先变为double型 
       return ave;
    } 
};
int Score::TotalScore=0;//不能static int TotalScore;
int Score::TotalStudent=0; 
int main() 
{ 
    int n, op, i, c, m, e; 
    cin >> n; 
    int id = 1; 
    Score sco[11];//主函数中定义学生成绩对象数组s[] 
    while(n--) 
    { 
        cin >> op; 
        if(op == 1) 
        { 
            cin >> c >> m >> e; 
            sco[id].setScore(c,m,e);
            id++;
        } 
        else if(op == 2) 
        { 
            cin >> i; 
            cout<<sco[i].Sum()<<endl;
        } 
        else if(op == 3) 
        { 
            cin >> i; 
            sco[i].Show();//不能endl 
        } 
        else 
        { 
            cout<<fixed<<setprecision(2)<<Score::getAve()<<endl;//是Score::getAve()不是sco.getAve()
        } 
    } 
    return 0; 
} 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,084评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,623评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,450评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,322评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,370评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,274评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,126评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,980评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,414评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,599评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,773评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,470评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,080评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,713评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,852评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,865评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,689评论 2 354

推荐阅读更多精彩内容

  • //出自51博客:www.Amanda0928.51.com 第一章 一、选择题 1.B; (typedef ,t...
    Damongggggg阅读 11,130评论 0 1
  • 来源: http://www.douban.com/group/topic/14820131/ 调整变量格式: f...
    MC1229阅读 6,917评论 0 5
  • 题目描述: 一群蜜蜂离开蜂巢采蜜,要连续采集5片花丛后归巢。已知5片花丛相对蜂巢的坐标,请你帮忙规划一下到访花丛的...
    楚天i阅读 3,076评论 0 1
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,718评论 0 11
  • 这两天公司活动满满当当,旗袍摄影颁奖典礼、党务工作者学习和拓展训练,需要提起百倍精神和精力去参与。 在这过程中,确...
    鹰飞飞阅读 95评论 2 2