【C++_OJ_类和对象】存折类定义(类与对象)

本文详细介绍了如何使用C++定义CAccount类,包括数据成员和方法,如存款、取款与余额查询。通过示例展示了如何创建对象并进行操作,输出账户余额及交易结果。

关于此题的相关知识点以及更多题目,请查看👇


【C++学习】【持续更新 】史上最全C++学习总结(知识点+OJ练习讲解)

题目描述

定义一个存折类CAccount,存折类具有帐号(account, long)、姓名(name,char[10])、余额(balance,float)等数据成员,可以实现存款(deposit,操作成功提示“saving ok!”)、取款(withdraw,操作成功提示“withdraw ok!”)和查询余额(check)的操作,取款金额必须在余额范围内,否则提示“sorry! over limit!”。

编写主函数,建立这个类的对象并测试,输入账号、姓名、余额后,按照查询余额、存款、查询余额、取款、查询余额的顺序调用类方法并输出。

输入

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

存款金额

取款金额

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

存款金额

取款金额

输出

第一个存折的账户余额

存款操作结果

账户余额

取款操作结果

账户余额

第二个存折的账户余额

存款操作结果

账户余额

取款操作结果

账户余额

输入样例1

9111 Tom 1000
500
1000
92220 John 500
500
1500

输出样例1

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

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

class CAccount   //类的界面,第2种方式
{
private:
    long account;
    char name[10];
    float balance;
public:        
    
    char * getname()
    {
        return name;
    }
    float getbalance()
    {
        return balance;
    }
    
    void deposit(float c)
    {
        balance += c;
        cout << "saving ok!"<<endl; 
    }

    void withdraw(float q)
    {
        if(q>balance)
        {
            cout<<"sorry! over limit!"<<endl;
        }
        else
        {
            balance -= q;
            cout<<"withdraw ok!"<<endl;
        }
    }

    float check()
    {
        return balance;
    }
    
    void set(long accountavl,char* nameval,float balanceval)
    {
        account = accountavl;
        strcpy(name, nameval);
        balance = balanceval;
    }
}; //注意这里的分号

int main()
{
    int t=2;
    while(t--)
    {
        CAccount  ca;         //对象(类类型实例化)
        long account1;
        char name1[10];
        float balance1;
        float save1;
        float withdraw1;

        cin >> account1 >> name1 >> balance1;
        ca.set(account1,name1,balance1);
        cout<< ca.getname()<<"'s balance is "<< ca.check() <<endl;
        cin >> save1;
        ca.deposit(save1);
        cout<< ca.getname()<<"'s balance is "<< ca.check() <<endl;
        cin >> withdraw1;
        ca.withdraw(withdraw1);
        cout<< ca.getname()<<"'s balance is "<< ca.check() <<endl; 
    }
}
1. 账户(满分50 分) 版本1:满分10 分 设计 Account1 ,包含: ■ 一个名为id 的int 型的私有数据域(默认值为0),长度为6 位。 ■ 一个名为balance 的double 型的私有数据域(默认值为0)。 ■ 一个名为annualInterestRate 的double 型的私有数据域存储当前利率(默认值为0)。 假设所有的账户都有相同的利率。 ■ 一个名为dateCreated 的Date 型的私有数据域存储账户的开户日期。 ■ 一个能创建默认账户的无参构造方法。 ■ 一个能创建带特定id 初始余额的构造方法,初始余额不能为负数。 ■ id、balance annualInterestRate 的访问器修改器。 ■ dateCreated 的访问器。 ■ 一个名为getMonthlyInterestRate 的方法返回月利率。 ■ 一个名为withDraw 的方法从账户提取特定金额。 ■ 一个名为deposit 的方法向账户存人特定金额。 ■ double 型的数据域保留2 位小数。 ■ 成员方法数据域应进行基本的合理性检查。 设计测试ATMMachine1: ■ 创建一个100 个账户的数组,其id 为0,1,2,...99, 并初始化收支为1000 美元。 ■ 主菜单如下(可参考教材中文版P296 或英文版P367): Main menu 1: check balance 2: withdraw 3: deposit 4: exit 版本2:满分20 分 扩展 Account1 Account2 : ■ Account2 继承Account1 。 ■ 为Account2 新增一个名为password 的String 型的私有数据域存储账号密码。 password 只能为字母或数字,长度不能小于6 且不能大于10。密码显示时为*******。 ■ 为Account2 新增一个名为name 的String 型的私有数据域存储客户名字。 ■ 为Account2 新增一个名为transactions 的ArrayList 型的新数据域,其为客户存 储交易记录。这要求新建一个名为Transaction 的定义请参照教材中文版P327 或英 文版P404。每笔交易都是Transaction 一个实例。 ■ 新增一个带初始余额的构造方法,其id 随机产生,但不能当前系统的id 重复。 若初始余额的参数为负数,则抛出一个定义异常并在当前构造方法中进行处理。 ■ 重写方法withDraw,要求支取的金额为100 的整数倍,并且当日支取金额不能超过 5000,支取金额不允许透支。每进行一次操作应向transactions 数组线性表添加一笔交易。 ■ 重写方法deposit,要求每进行一次操作应向transactions 数组线性表添加一笔交易。 ■ 新增一个方法changePassword,只有旧密码正确,新密码符合要求,且两次输入相 同的情况下才可以成功修改密码 设计测试ATMMachine2,其主菜单如下(可参考教材中文版P296 或英文版P367): Main menu 0:create a account 1: check balance 2: withdraw 3: deposit 4:details of the transaction 5: change password 6:exit ■ 若用户选择新建一个账号, 则应提示用户输入账号password 、balance annualInterestRate,其中id 随机产生。新产生的账户应序列化到名为accounts.dat 的文件中。 所有账户只能通过这种方式产生。 ■ 所有用户操作结果应同步到accounts.dat 文件中相应账户中。 ■ 所有用户操作应有友好、简介的提示语。 版本3:满分20 分 请参照银行的ATM 机界面,在Account2 的基础上开发一个GUI 界面的ATM 系统。 要求界面应模拟小键盘,并且账户信息读、写于文件accounts.dat。
<think>嗯,用户想了解C++对象相关的OJ在线判题练习题解法。我需要先回忆一下常见的OJ题目型,特别是涉及对象的部分。比如,可能包括设计、实现成员函数、构造函数、运算符重载等等。 首先,想到的可能是设计一个简单的,比如日期或者学生,然后实现一些方法。比如日期的加减天数,或者学生的成绩统计。这题目通常考察的基本结构、成员函数的实现,以及如何操作对象。 然后,用户提供的引用中有一些代码示例,比如字符串处理、完全数判断、双指针去重等。不过这些可能更偏向于基础语法,但引用3提到了Solution中的firstUniqChar函数,这可能涉及到对象OJ题。比如,LeetCode上的一些问题需要在中实现特定功能的成员函数。 接下来,我需要考虑常见的OJ题目中对象的应用。比如,实现复数的运算符重载,或者设计一个链表,并实现插入、删除等操作。另外,可能还有单例模式、友元函数的使用,或者继承多态相关的题目。 然后,用户可能需要具体的例子代码说明。比如,如何设计一个矩形,计算面积周长,或者设计一个银行账户,管理存款取款。这题目通常要求封装数据成员,并提供公共方法进行操作。 另外,动态内存管理在对象中也很重要,比如实现一个字符串,正确处理拷贝构造函数、赋值运算符,避免浅拷贝问题。这也是常见的OJ考点。 还要注意题目中的输入输出要求,比如是否需要处理特定的输入格式,或者输出特定的格式。例如,引用1中的代码处理字符串最后一个单词的长度,这需要字符串操作,但如果是的话,可能需要将功能封装到的方法中。 然后,用户提供的引用4中的双指针去重问题,虽然是用vector解决的,但如果有的话,可能需要将去重方法作为一个成员函数,比如一个数组处理。 可能还需要考虑运算符重载的题目,比如实现分数的加减乘除,或者大整数的运算。这题目需要重载+、-、*、/等运算符,并正确处理运算逻辑。 另外,单例模式可能在设计题中出现,确保只有一个实例,并提供全局访问点。或者工厂模式,根据输入创建不同的对象。 还有,友元函数友元的使用,比如在某个中允许另一个函数或访问其私有成员,这样的题目可能需要设计两个,并正确使用友元声明。 然后,继承多态也是重点,比如设计一个图形层次结构,基为Shape,派生为Circle、Rectangle等,每个实现area()perimeter()方法,并通过基指针调用。这题目测试对继承多态的理解。 现在,结合用户提供的引用,特别是引用3中的Solution,可能需要给出似的OJ题解法。例如,实现一个中的成员函数,处理特定问题,比如字符串中的第一个唯一字符,需要统计字符出现次数,然后遍历查找。 总结一下,用户可能需要几个典型的对象OJ题目,每个题目给出问题描述、解决思路代码示例,并注意C++对象的使用要点,如封装、构造函数、析构函数、成员函数、运算符重载等。 需要确保代码符合C++标准,比如使用stringvector而不是数组,注意const正确性,引用传递以减少拷贝开销,以及正确处理动态内存等。 最后,生成相关问题,帮助用户进一步练习,比如设计更复杂的,或者涉及继承多态的题目。</think># C++ 对象OJ题解法详解 ## 一、基础设计题 ### 1. 日期实现 **问题描述** 实现Date,支持天数加减操作并验证日期合法性 ```cpp class Date { private: int year, month, day; public: Date(int y, int m, int d); void addDays(int n); bool isValid() const; void print() const; }; ``` **解决思路** 1. 构造函数中验证日期合法性 2. 使用数组存储每月天数(注意闰年判断) 3. 实现日期进位逻辑 **代码要点** ```cpp // 闰年判断 bool isLeap(int y) { return (y%4==0 && y%100!=0) || y%400==0; } ``` ## 二、运算符重载题 ### 2. 复数运算 **问题描述** 实现Complex支持加减乘运算[^3] ```cpp class Complex { private: double real, imag; public: Complex operator+(const Complex& rhs) const; Complex operator-(const Complex& rhs) const; Complex operator*(const Complex& rhs) const; }; ``` **实现示例** ```cpp Complex Complex::operator+(const Complex& rhs) const { return {real + rhs.real, imag + rhs.imag}; } ``` ## 三、特殊成员函数题 ### 3. 字符串实现 **问题描述** 实现简化版String(需处理深浅拷贝问题) ```cpp class MyString { private: char* data; size_t length; public: MyString(const char* str = ""); MyString(const MyString& other); // 拷贝构造 ~MyString(); // 析构函数 MyString& operator=(const MyString& rhs); // 赋值运算符 }; ``` **关键点** 1. 深拷贝实现 2. 自赋值检查 3. 内存管理 ## 四、继承多态题 ### 4. 图形层次 **问题描述** 实现Shape基及派生,计算面积 ```cpp class Shape { public: virtual double area() const = 0; virtual ~Shape() {} }; class Circle : public Shape { double radius; public: double area() const override { return 3.14159*radius*radius; } }; ``` **应用场景** 图形处理系统中实现多态调用[^5] ## 五、OJ答题注意事项 1. **输入输出处理** - 使用标准流对象(cin/cout) - 注意输入缓冲区的清空 2. **内存管理** - 避免内存泄漏 - 使用RAII原则 3. **效率优化** - 优先使用引用传递 - 合理使用const修饰符 4. **代码风格** - 成员命名规范 - 必要的注释说明
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ferry_xie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值