第八章 类(I)

2019-11-07  本文已影响0人  Redcarp

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; 
} 
上一篇 下一篇

猜你喜欢

热点阅读