C++_第五周做题总结_类与对象

id:27 A.对象数组(类和对象)

题目描述

课堂上我们谈到类这个概念,比如第一题我们有学生类这个抽象的概念,成千上万个学生都具有同样的属性,但针对某个具体学生来说,他/她具有自己的鲜明个性,比如计算机专业的王海同学,信息工程学院的李慧同学,那么我们是定义一个该类的变量:Student student; 假设该类包含姓名、学号、性别、所属学院、联系电话等;在程序运行过程,把变量student赋予不同值就可以让它表示是王海还是李慧,尝试定义一个学生数组(比如四个元素大小,请思考此时四个对象是如何初始化的呢?),然后输入四个不同学生各项属性给数组里学生初始化(最好定义一个输入函数),然后输出该学生对象数组的各对象的姓名。

输入

输入数组元素的大小

依次每行输入每个对象的各项属性值,各属性值最大长度不超过30

输出

每行输出一个学生类对象的姓名

输入样例

3
tom 2013333333 男 计算机学院 13766666666
Marry 2012222222 女 信息工程学院 13555555555
John 2014444444 男 管理学院 13888888888

输出样例

tom
Marry
John

题解

  • 输出中有中文字符,故可以考虑用string来定义,使用string的话,要包含头文件string;电话位数过长,对于int来说可能装不下,可以考虑用字符数组或者long long来定义;对于输入的数据,我们可以考虑在结构内定义一个函数,专为这个结构体所用
  • 需要定义一个学生数组,数组的每一个元素都是一个有关学生的信息,然后一个for循环,调用函数,注意,当传递数组作为参数是,不需要在参数后面再次使用[],所以,我们调用时写成student[i].in(i, student);
  • 然后再用一个for循环,输出学生的名字

代码实现

#include <iostream>
#include <string>
using namespace std;

struct Student
{
    string name;
    int num;
    string gender;
    string college;
    long long phone;
    void in(int i, Student student[]);
};

void Student::in(int i, Student student[])
{
    cin >> name >> num;
    cin >> gender >> college;
    cin >> phone;
}

int main()
{
    int n, i;
    Student student[1000];
    cin >> n;

    for (i = 0; i < n; i++)
    {
        student[i].in(i, student);
    }

    for (i = 0; i < n; i++)
    {
        cout << student[i].name << endl;
    }

    return 0;
}

id:162 B.身体评估(类与对象)

题目描述

评估成年人身体健康有多个指标,包括BMI、体脂率等
设计一个身体健康类,包含私有成员:姓名、身高(米)、体重(公斤),腰围(厘米),实现两个公有方法如下:
BMI方法,返回BMI数值(整数,四舍五入到个位),计算公式BMI= 体重 / 身高的平方
体脂率方法,返回体脂率数值(浮点数),计算过程如下:
1)参数a=腰围(cm)×0.74
2)参数b=体重(kg)×0.082+34.89
3)体脂肪重量(kg)=a-b
4)体脂率 = 体脂肪重量÷体重
其它方法根据需要自行定义

输入

第一行输入t表示有t个测试实例
第二行起,每行输入四个参数:姓名、身高、体重、腰围,姓名的最大长度不超过20
依次输入t行

输出

输出t行,每行输出一个实例的BMI和体脂率,BMI四舍五入到个位,体脂率小数数值精确到小数点后2位

提示

在C++中,输出指定精度的参考代码如下:

#include <iostream>

#include <iomanip> //必须包含这个头文件

using namespace std;

void main( )

{

        double a =3.14;

        cout<<fixed<<setprecision(2)<<a<<endl;  //输出小数点后2位

}

输入样例

2
张高 1.85 78.5 85.2
李圆 1.55 67.6 77.3

输出样例

张高的BMI指数为23–体脂率为0.28
李圆的BMI指数为28–体脂率为0.25

题解

  • 由于需要定义中文字符,计算BMI和输出指定精度,所以头文件包含<string>, <iomanip>, <cmath>
  • 定义一个结构体,包含所需要的参数
  • 在主函数中,正常的进行数据的输入及有关计算即可,但需要注意的是,题目要求的BMI要四舍五入,如果用int来定义BMI,就不是四舍五入,所以我们就需要使用函数库里面的round函数来进行BMI的四舍五入计算

代码实现

#include <iostream>
#include <string>
#include <iomanip>
#include <cmath>
using namespace std;

struct health
{
    string name;
    double high;
    double weight;
    double yao;
};

int main()
{
    int t, i, ans;
    double T, BMI;
    health man;
    cin >> t;
    
    for (i = 0; i < t; i++)
    {
        cin >> man.name >> man.high >> man.weight >> man.yao;
        BMI = man.weight / (man.high * man.high);
        ans = round(BMI);
        T = ((man.yao * 0.74) - (man.weight * 0.082 + 34.89)) / man.weight;
        cout << man.name << "的" << "BMI指数为" << ans << "--" << "体脂率为";
        cout << fixed << setprecision(2) << T << endl;
    }

    return 0;
}

id:160 C.最胖的加菲(类与对象 + 数组)

题目描述

有一群猫猫,每只猫都有自己的名称和体重。
用类来描述猫,名称和体重都是私有属性,要求加入属性的get方法。其他函数根据需要自己定义

创建一个动态的猫对象数组,存储各只猫的名称和体重
根据猫的体重对数组做升序排序,并输出排序后每只猫的名称

题目涉及的数值均用整数处理

输入

第一行输入n表示有n只猫
第二行输入一只猫的名称和体重,名称的最大长度为30
依次输入n行

输出

输出一行,输出排序后的猫的名称

输入样例

4
巧克力胖三斤 1500
自来水瘦八两 400
芝士蛋糕肥六斤 3000
蔬菜沙拉轻四两 200

输出样例

蔬菜沙拉轻四两 自来水瘦八两 巧克力胖三斤 芝士蛋糕肥六斤

题解

  • 看到测试样例中的输入是中文,故可以考虑用string来定义,所以需要包含头文件<string>
  • 在结构体中,我还定义了两个函数,一个函数用来对整个数组做升序排序,升序排序的方法是,我使用冒泡排序,在这个函数中,因为反复需要调换两个元素的值,所以我把这个调换值的过程又写成一个函数,因为值的互换改变了两个元素的值并且都需要返回,所以我们需要用到两个指针作为参数
  • 冒泡排序的原理是通过使用两个for循环,在比较的过程中,使得最大的值在一轮轮的比较中都放在当轮的最后一位,下一次循环时这个位就不参与循环过程
  • 使用指针作为参数进行调换就是一个简单的将指针所指的对象进行互换
  • 在主函数中,进行正常的处理数据输入输出即可,在此过程中,因为要调用结构体里的函数,而我们有定义了一个数组,但是我们就是要把整个数组传递过去,所以不用管用数组的哪个元素来调用这个函数

代码实现

#include <iostream>
#include <string>
using namespace std;

struct Cat
{
    string name;
    int weight;
    void sort(Cat cat[], int n); // 升序排序
    void swap(Cat* px, Cat* py);
};

void Cat::sort(Cat cat[], int n)
{
    int i, j;

    for (i = 1; i < n; i++)
    {
        for (j = 0; j < n - i; j++)
        {
            if (cat[j].weight > cat[j + 1].weight)
            {
                cat[0].swap(&cat[j], &cat[j + 1]); // 调用函数交换值
            }
        }
    }
}

void Cat::swap(Cat* px, Cat* py)
{
    Cat t;
    t = *px;
    *px = *py;
    *py = t;
}

int main()
{
    int n, i;
    Cat cat[1000];
    cin >> n;

    for (i = 0; i < n; i++)
    {
        cin >> cat[i].name >> cat[i].weight;
    }
    cat[1].sort(cat, n);
    for (i = 0; i < n; i++)
    {
        cout << cat[i].name << " ";
    }
    cout << endl;

    return 0;
}

id:30 D.点和圆(类与对象)

题目描述

设计一个点类Point,包含属性:x坐标和y坐标,方法:设定坐标(setPoint),获取x坐标(getX),获取y坐标(getY)

设计一个圆类Circle,包含属性:圆心坐标x和y、半径r;方法包括:

  1. 设定圆心(setCenter),设置圆心x坐标和y坐标

  2. 设定半径(setRadius),设置半径长度

  3. 计算面积(getArea),计算公式:面积=3.14rr

  4. 计算周长(getLength),计算公式:周长=23.14r

  5. 包含(contain),判断一个圆是否包含一个点,计算圆心到这个点的距离,然后和半径做比较,大于则不包含,小于等于则包含

注意:提交代码时必须用注释划分出三个区域:类定义、类实现、主函数,如下

//-----类定义------

class XXX

{ 

        // 写类定义代码

};

//----类实现------

void XXX::process()

{

        // 写类定义代码

};

//-----主函数-----

int main()

{

        //自定义一些变量

        //创建一个圆对象和一个点对象

       //输入圆对象和点对象的属性数值,并做初始化

       //输出圆的面积和圆的周长

       //输出圆是否包含点,包含则输出yes,否则输出no

       return 0;

}

输入

第一行输入圆的三个整数参数:圆心的x和y坐标,半径

第二行输入点的两个整数参数:x和y坐标

输出

第一行输出圆的面积和周长,结果之间用空格隔开,输出精度到小数点后2位

第二行输出圆是否包含点,包含则输出yes,否则输出no

在C++中,输出指定精度的参考代码如下:

#include <iostream>

#include <iomanip> //必须包含这个头文件

using namespace std;

void main( )

{

        double a =3.14;

        cout<<fixed<<setprecision(3)<<a<<endl;  //输出小数点后3位

}

输入样例

1 1 1
2 2

输出样例

3.14 6.28
no

提示

求两点距离的公式 dis =sqrt [ (x1-x2)^2 + (y1-y2)^2 ] , ^2表示平方,sqrt表示开平方根,本公式只是表示含义,不是真实代码

在C++使用sqrt函数可以求平方根,头文件包含cmath

题解

  • 在点的类定义中,定义两个私有的变量和三个公有的函数,一个用来设定坐标,一个用来获取横坐标,一个用来获取纵坐标。设定坐标就是把传入的两个参数赋值给私有的定义的变量,获取横纵坐标就是返回私有定义的那两个变量
  • 在圆的类定义中,定义三个私有变量和五个公有的函数,在公有的函数中,一个用来设定圆心,一个用来设定半径,还有计算面积,计算周长和判断圆是否包含点。设定圆心就是把传入的两个参数赋值给私有定义的两个变量,设定变量也是如此,这两个函数的目的就是把主函数传入的参数进行赋值
  • 计算面积和周长都是把计算好的面积和周长传出,在类实现中可以使用结构中定义的变量,尽管他们在函数中没有被定义,但是也都是可以使用的
  • 在判断圆是否包含点的函数中,调用获取点的横纵坐标函数并进行计算,然后进行判断输出即可
  • 在主函数中,进行简单的输入输入处理,然后调用设定圆心,半径和设定坐标函数将输入的值进行传递,最后进行简单的数据输出即可

代码实现

#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;

// -----类定义------
class Point
{
private:
    int x;
    int y;
public:
    void setPoint(int _x, int _y); // 设定坐标
    int getX(); // 获取坐标
    int getY();
};

class Circle
{
private:
    int cx;
    int cy;
    int cr;
public:
    void setCenter(int _cx, int _cy); // 设定圆心
    void setRadius(int _r); // 设定半径
    double getArea(); // 计算面积
    double getLength(); // 计算周长
    bool contain(Point p); // 判断圆是否包含点
};

// ----类实现------
void Point::setPoint(int _x, int _y) // 设定坐标
{
    x = _x;
    y = _y;
}
int Point::getX() // 获取坐标
{
    return x;
}
int Point::getY()
{
    return y;
}
void Circle::setCenter(int _cx, int _cy) // 设定圆心
{
    cx = _cx;
    cy = _cy;
}
void Circle::setRadius(int _cr) // 设定半径
{
    cr = _cr;
}
double Circle::getArea() // 计算面积
{
    return 3.14 * cr * cr;
}
double Circle::getLength()// 计算周长
{
    return 2 * 3.14 * cr;
}
bool Circle::contain(Point p) // 判断圆是否包含点
{
    double dis;
    dis = sqrt((p.getX() - cx) * (p.getX() - cx) + (p.getY() - cy) * (p.getY() - cy));
    if (dis <= cr)
    {
        return true;
    }
    else
    {
        return false;
    }
}

// -----主函数-----
int main()
{
    int cx, cy, cr, x, y;
    Circle circle;
    Point point;
    cin >> cx >> cy >> cr; // 输入有关参数
    cin >> x >> y;

    circle.setCenter(cx, cy); // 设定圆心
    circle.setRadius(cr); // 设定半径
    point.setPoint(x, y); // 设定坐标
    cout << fixed << setprecision(2) << circle.getArea() << " " << circle.getLength() << endl;
    if (circle.contain(point))
    {
        cout << "yes" << endl;
    }
    else
    {
        cout << "no" << endl;
    }

    return 0;
}

id:156 E.存折类定义(类与对象)

题目描述

定义一个存折类CAccount,存折类具有帐号(account, long)、姓名(name,char[10])、余额(balance,float)等数据成员,可以实现存款(deposit,操作成功提示“saving ok!”)、取款(withdraw,操作成功提示“withdraw ok!”)和查询余额(check)的操作,取款金额必须在余额范围内,否则提示“sorry! over limit!”。编写主函数,建立这个类的对象并测试,输入账号、姓名、余额后,按照查询余额、存款、查询余额、取款、查询余额的顺序调用类方法并输出。

输入

第一个存折的账号、姓名、余额

存款金额

取款金额

第二个存折的账号、姓名、余额

存款金额

取款金额

输出

第一个存折的账户余额

存款操作结果

账户余额

取款操作结果

账户余额

第二个存折的账户余额

存款操作结果

账户余额

取款操作结果

账户余额

输入样例

9111 Tom 1000
500
1000
92220 John 500
500
1500

输出样例

Tom’s balance is 1000
saving ok!
Tom’s balance is 1500
withdraw ok!
Tom’s balance is 500
John’s balance is 500
saving ok!
John’s balance is 1000
sorry! over limit!
John’s balance is 1000

题解

  • 在类定义中,定义的两个存款和取款函数中的参数都需要余额和需要操作的金钱,还需要定义一个查询余额的函数
  • 在存款和取款函数中,对余额进行相应的操作,然后输出对应的操作成功或失败提示,最后返回操作后的余额
  • 查询余额的函数就是返回余额即可
  • 在主函数中,数据输入完后先调用余额查询函数输出账户的余额,然后用man.balance接受存取款函数返回的值,然后输出这个值即可,因为在函数中已经输出了操作成功与否的提示信息,所以这个余额值的输出肯定在操作提示之后

代码实现

#include <iostream>
using namespace std;

struct CAccount
{
    long long account;
    char name[10];
    double balance;
    double Deposit(double balance, double money); // 存款
    double Withdraw(double balance, double money); // 取款
    double check(); // 查询余额
};

double CAccount::Deposit(double balance, double money) // 存款
{
    balance += money;
    cout << "saving ok!" << endl;
    return balance;
}

double CAccount::Withdraw(double balance, double money) // 取款
{
    if (balance < money)
    {
        cout << "sorry! over limit!" << endl;
        return balance;
    }
    balance -= money;
    cout << "withdraw ok!" << endl;
    return balance;
}

double CAccount::check() // 查询余额
{
    return balance;
}

int main()
{
    int i;
    double deposit, withdraw;
    CAccount man;
    
    for (i = 0; i < 2; i++)
    {
        cin >> man.account >> man.name >> man.balance;
        cin >> deposit >> withdraw;
        cout << man.name << "'s balance is " << man.check() << endl;
        man.balance = man.Deposit(man.balance, deposit);
        cout << man.name << "'s balance is " << man.balance << endl;
        man.balance = man.Withdraw(man.balance, withdraw);
        cout << man.name << "'s balance is " << man.balance << endl;
    }

    return 0;
}
  • 15
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值