Giskard

OOP上机

2019-01-27

求2个或3个正整数中的最大数,用带有默认参数的函数实现。

#include<iostream>
using namespace std;

int max(int a,int b,int c)
{
    if(b>a)
    {
        a=b;
    }
    if(c>a)
    {
        a=c;
    }
    return a;
}

int main()
{
    int max(int a,int b,int c=0);
    {
        int a,b,c;
        cin>>a>>b>>c;
        cout<<"max_3="<<max(a,b,c)<<endl;
        cout<<"max_2="<<max(a,b)<<endl;
        return 0;
    }
}

输入三个整数,将它们按由小到大的顺序输出,要求使用变量的引用。

#include<iostream>
using namespace std;

void swap(int &a,int &b)
{
    int x;
    x=a;
    a=b;
    b=x;
}

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    if(a>b)
        swap(a,b);
    if(b>c)
        swap(b,c);
    if(a>b)
        swap(a,b);
    cout<<a<<" "<<b<<" "<<c<<endl;
    return 0;
}

编写一个程序,用同一个函数名对几个数据进行从小到大排序,数据类型可以是整型、浮点型。用重载函数实现。

#include<iostream>
using namespace std;

void sort (int *arr,int len)
{
    int i,j,t;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}

void sort(double *arr,int len)
{
    double t;
    int i,j;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}

int main()
{
    cout<<"请输入要排序的类型:1代表整型,2代表浮点型"<<endl;
    int n;
    cin>>n;

    if(n==1)
    {
        cout<<"请输入要排序的个数"<<endl;
        int m;
        cin>>m;
        int* a = new int[m];

        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        sort(a,m);
        for(int i=0; i<m;i++)
        {
            cout<<a[i]<<" ";
        }
        delete[] a;
    }
    if(n==2)
    {
        cout<<"请输入要排序的个数"<<endl;
        int m;
        cin>>m;
        double* a = new double[m];

        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        sort(a,m);
        for(int i=0; i<m;i++)
        {
            cout<<a[i]<<" ";
        }
        delete[] a;
    }
    return 0;
}

重做上题,用函数模板实现

#include<iostream>
using namespace std;
template <typename T>

void sort (T *arr,int len)
{
    T t;
    int i,j;
    for(i=0;i<len-1;i++)
    {
        for(j=0;j<len-i-1;j++)
        {
            if(arr[j]>arr[j+1])
            {
                t=arr[j];
                arr[j]=arr[j+1];
                arr[j+1]=t;
            }
        }
    }
}

int main()
{
    cout<<"请输入要排序的类型:1代表整型,2代表浮点型"<<endl;
    int n;
    cin>>n;

    if(n==1)
    {
        cout<<"请输入要排序的个数"<<endl;
        int m;
        cin>>m;
        int* a = new int[m];

        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        sort(a,m);
        for(int i=0; i<m;i++)
        {
            cout<<a[i]<<" ";
        }
        delete[] a;
    }
    if(n==2)
    {
        cout<<"请输入要排序的个数"<<endl;
        int m;
        cin>>m;
        double* a = new double[m];

        for(int i=0;i<m;i++)
        {
            cin>>a[i];
        }
        sort(a,m);
        for(int i=0; i<m;i++)
        {
            cout<<a[i]<<" ";
        }
        delete[] a;
    }
    return 0;
}

设计一个日期Date类,它能实现年月日的输入和输出,要求分别将成员函数定义在类体内和类体外。

//类体内
#include<iostream>
using namespace std;

class Date
{
private:
    int year;
    int month;
    int day;
public:
    void set_date()
    {
        cin>>year>>month>>day;
    }
    void show_date()
    {
        cout<<year<<" "<<month<<" "<<day<<endl;
    }
};

int main()
{
    Date a;
    a.set_date();
    a.show_date();
    return 0;
}
//类体外
#include<iostream>
using namespace std;

class Date
{
private:
    int year;
    int month;
    int day;
public:
    void set_date();
    void show_date();
};

void Date::set_date()
{
    cin>>year>>month>>day;
}
void Date::show_date()
{
    cout<<year<<" "<<month<<" "<<day<<endl;
}

int main()
{
    Date a;
    a.set_date();
    a.show_date();
    return 0;
}

声明一个Circle类,有数据成员Radius(半径)、成员函数GetArea()计算圆的面积,构造一个Circle的对象进行测试。

#include<iostream>
using namespace std;

class Circle
{
private:
    double Radius;
public:
    Circle(double r)
    {
        this->Radius = r;
    }
    void GetArea()
    {
        cout<<(3.14*Radius*Radius)<<endl;
    }
};

int main()
{
    double r;
    cin>>r;
    Circle c(r);
    c.GetArea();
    return 0;
}

编写一个基于对象的程序,求出3个长方柱的体积。

数据成员包括length(长)、width(宽)、height(高)。要求用成员函数实现以下功能:
(1)由键盘分别输入3个长方柱的长、宽、高;
(2)计算长方柱的体积;
(3)输出3个长方柱的体积。

#include<iostream>
using namespace std;

class Cube
{
private:
    double length;
    double width;
    double height;
    double volume;
public:
    void SetData();
    void CalVolume();
    void ShowVolume();
};

void Cube::SetData()
{
    cin>>length>>width>>height;
}

void Cube::CalVolume()
{
    volume = length*width*height;
}

void Cube::ShowVolume()
{
    cout<<volume<<" ";
}

int main()
{
    Cube a[3];
    for(int i=0;i<3;i++)
    {
        a[i].SetData();
        a[i].CalVolume();
    }
    for(int i=0;i<3;i++)
    {
        a[i].ShowVolume();
    }
    return 0;
}

编写设计一个People(人)类。

该类的数据成员有年龄(age)、身高(height)、体重(weight)和人数(num),
其中人数为静态数据成员,成员函数有构造函数(People)、进食(Eating)、运动(Sporting)、睡眠(Sleeping)、显示(Show)和显示人数(ShowNum)。
其中构造函数由已知参数年龄(a)、身高(h)和体重(w)构造对象,进食函数使体重加1,运动函数使身高加1,睡眠函数使年龄、身高、体重各加1,
显示函数用于显示人的年龄、身高、体重,显示人数函数为静态成员函数,用于显示人的个数。假设年龄的单位为岁,身高的单位为厘米,体重的单位为市斤,
要求所有数据成员为protected访问权限,所有成员函数为public访问权限,在主函数中通过对象直接访问类的所有成员函数。

#include<iostream>
using namespace std;

class People
{
protected:
    int age;
    int height;
    int weight;
    static int num; 
public:
    People(int a,int h,int w) : age(a),height(h),weight(w)
    {
        num++;
    }

    void Eating()
    {
        weight++;
    }
    void Sporting()
    {
        height++;
    }
    void Sleeping()
    {
        age++;
        height++;
        weight++;
    }
    void Show()
    {
        cout << age << " " << height << " " << weight << endl;
    }

    static int ShowNum()
    {
        return num;
    }
};

int People::num=0;

int main()
{
    People a(10,150,100);
    People b(20,180,150);
    a.Eating();
    a.Sporting();
    a.Sleeping();
    a.Show();
    b.Eating();
    b.Sporting();
    b.Sleeping();
    b.Show();
    cout << People::ShowNum() << endl ;
    return 0;
}

定义一个描述学生(Student)基本情况的类。

数据成员包括姓名(name)、学号(num)、数学成绩(mathScore)、英语成绩(englishScore)、人数(count)、数学总成绩(mathTotalScore)和英语总成绩(englishTotalScore)。
其中姓名定义为长度为18的字符数组,其他数据成员类型为整型,数学总成绩、英语总成绩和人数为静态数据成员,
函数成员包括构造函数、显示基本数据函数(ShowBase)和显示静态数据函数(showStatic),其中构造函数由已知参数姓名(nm)、学号(nu)、数学成绩(math)和英语成绩(english)构造对象,
显示基本数据函数用于显示学生的姓名、学号、数学成绩、英语成绩,显示静态数据函数为静态成员函数,用于显示人数、数学总成绩、英语总成绩;
要求所有数据成员为private访问权限,所有成员函数为public访问权限,在主函数中定义若干个学生对象,分别显示学生基本信息,以及显示学生人数,数学总成绩与英语总成绩。

#include<iostream>
using namespace std;

class Student
{
private:
    char name[18];
    int num;
    int mathScore;
    int englishScore;
    static int count;
    static int mathTotalScore;
    static int englishTotalScore;
public:
    Student(char* nm,int nu,int math,int english) : num(nu),mathScore(math),englishScore(english)
    {
        strcpy(name,nm);
        count++;
        mathTotalScore+=math;
        englishTotalScore+=english;
    }

    void showBase()
    {
        cout << name << " " << num << " " << mathScore << " " << englishScore << endl;
    }

    static void showStatic()
    {
        cout << count << " " << mathTotalScore << " " << englishTotalScore << endl;
    }
};

int Student::count = 0;
int Student::mathTotalScore = 0;
int Student::englishTotalScore = 0;

int main()
{
    Student a("ZhangSan",10,100,90);
    Student b("LiSi",20,60,85);
    a.showBase();
    b.showBase();

    Student::showStatic();
    return 0;
}

定义一个Dog类

包含name、age、sex和weight等属性以及对这些属性操作的方法。要求用字符指针描述name,并且用对象指针来测试这个类。

#include<iostream>
using namespace std;

class Dog
{
private:
    char* name;
    int age;
    char* sex;
    int weight;
    static int count;
public:
    void Set(char* nm,int a,char* s,int w)
    {
        name = nm;
        age = a;
        sex = s;
        weight = w;
    }

    void Show()
    {
        cout << name << " " << age << " " << sex << " " << weight << endl;
    }
};

int main()
{
    Dog* d1 = new Dog;
    Dog* d2 = new Dog;
    d1->Set("Tom",1,"Male",10);
    d2->Set("Kittty",2,"Female",15);
    d1->Show();
    d2->Show();
    return 0;
}

管理个人活期账户

个人储蓄活期账户包括账号、户名、密码、余额、活期年利率等信息。
要求能够对个人账户进行存钱、取钱、计算年利息、打印账户相关信息等操作。编写主函数测试账户相关功能。

#include<iostream>
using namespace std;

class Account
{
private:
    char* id;
    char* name;
    char* passwd;
    double balance;
    static double rate;
    double interest;
public:
    Account(char* i,char* n,char* p,double b) : id(i),name(n),passwd(p),balance(b)
    {

    }

    void Save(double money)
    {
        balance+=money;
    }

    void withDraw(double money)
    {
        balance-=money;
    }

    void Show()
    {
        interest = (balance*(1+rate));
        cout << id << " " << name << " " << balance << " " << interest << endl;
    }
};

double Account::rate = 0.023;

int main()
{
    Account a("0123456789","ZhangSan","123456",1000);
    a.Show();
    a.Save(100);
    a.withDraw(200);
    a.Show();
    return 0;
}

定义一个复数类Complex

重载运算符“+”,“-”,“*”,“/”,使之能用于复数的加、减、乘、除。运算符重载函数作为Complex类的成员函数。编程序,分别求两个复数之和、差、积和商。

#include<iostream>
using namespace std;

class Complex
{
private:
    double real;
    double vir;
public:
    Complex(double r,double v);
    Complex operator + (const Complex& c);
    Complex operator - (const Complex& c);
    Complex operator * (const Complex& c);
    Complex operator / (const Complex& c);
    void print();
};

Complex::Complex(double r,double v)
{
    real = r;
    vir = v;
}

Complex Complex::operator + (const Complex& c)
{
    double r = real + c.real;
    double v = vir + c.vir;
    return Complex(r,v);
}

Complex Complex::operator - (const Complex& c)
{
    double r = real - c.real;
    double v = vir - c.vir;
    return Complex(r,v);
}

Complex Complex::operator * (const Complex& c)
{
    double r=real * c.real - vir * c.vir;
    double i=real * c.vir + vir * c.real;
    return Complex(r,i);
}

Complex Complex::operator / (const Complex& c)
{
    double t = pow(c.vir,2) + pow(c.real,2);
    double r=real * c.real + vir * c.vir;
    double i=vir * c.real -real * c.vir;
    return Complex(r/t,i/t);
}


void Complex::print()
{
    cout<<real<<','<<vir<<endl;
}

int main()
{
    Complex a(3.0,2.0),b(1.0,3.0),c(0.0,0.0);
    c = a + b;
    c.print();
    c = a - b;
    c.print();
    c = a * b;
    c.print();
    c = a / b;
    c.print();
    return 0;
}

对于2行3列矩阵,重载流插入运算符“<<”和流提取运算符“>>”,使之能用于矩阵的输入和输出。

#include<iostream>
using namespace std;

class Complex
{
public:
    int arr[2][3];
public:
    Complex();
    friend istream& operator >> (istream&in,Complex &c);
    friend ostream& operator << (ostream&out,Complex &c);
};

Complex::Complex()
{
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            arr[i][j]=0;
        }
    }
}

istream& operator >> (istream&in,Complex&c)
{
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            in>>c.arr[i][j];
        }
    }
    return in;
}

ostream& operator << (ostream&out,Complex&c)
{
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
        {
            out<<c.arr[i][j]<<" ";
        }
        out<<endl;
    }
    return out;
}

int main()
{
    Complex c;
    cin>>c;
    cout<<c;
    return 0;
}

定义Time类和Date类,Time类为Date类的友元类,通过Time类中的display函数引用Date类对象的私有数据,输出年、月、日和时、分、秒。

#include <iostream>
using namespace std;

class Date;

class Time
{
public:
    Time(int h, int m, int s) : hour(h), minute(m), sec(s){};
    void display(Date &d);
private:
    int hour;
    int minute;
    int sec;
};

class Date
{
public:
    friend Time;
    Date(int m, int d, int y): month(m), day(d), year(y){};
private:
    int month;
    int day;
    int year;
};

void Time::display(Date &d)
{
    cout<<d.month<<"/"<<d.day<<"/"<<d.year<<endl;
    cout<<hour<<":"<<minute<<":"<<sec<<endl;
}

int main()
{
    Time t1(21, 21, 21);
    Date d1(12, 10, 2018);
    t1.display(d1);
    return 0;
}

Tags: C/C++