【模拟上机——继承和多态】

题目描述

请定义一个文件File类,并派生出TextFile(文本文件)类,要求如下。

(一) 基类File类: 有成员变量filename,filesize分别表示文件名(字符串类型),文件大小(长整数类型)。

(二) 派生类TextFile类: 新增成员变量fileEncoder(文件编码方式)。常见的编码方式有四种(“ASCII”,“Unicode”,“UTF8”和“ANSI”)。可以是字符串类型char[]或者数值类型0,1,2,3分别作为“ASCII”,“UNICODE”,“UTF8”和“ANSI”的标记。

  1. 自行添加构造函数。
  2. 新增成员函数UpdateFilesize(long size),来修改文件大小。
  3. 新增多态函数UpdateFile()来更新文件信息。多态函数有下面两种形式:
  - 仅更新文件编码方式。
  UpdateFile(char[] encode, int encodeLength)
  UpdateFile(int encodeFlag)
  - 更新文件编码方式并更新文件名。
  UpdateFile(char[] encode, int encodeLength, char[] name int nameLength)
  UpdateFile(int encodeFlag, char[] name, int nameLength) 
  1. 新增成员函数Show()来展示文件信息。展示的文件信息格式像这样“文件名 文件大小 文件编码方式”用空格隔开,如: Main.cpp 32 ASCII

输入

第一行为三个初始字段,文件名,文件大小,文件编码方式。其中文件名为字符串(长度不超过256),文件大小为整数,文件编码方式为数字0(表示ASCII编码),1(表示Unicode编码),2(表示UTF8编码)或3(表示ANSI编码)。

第二行首先输入整数n(0<n<10),表示接下来要测试n个函数,接下来每输入一个函数操作(符号表示,参看下表),便执行一个函数,执行过程中可能涉及读取下一行的数据作为参数。若输入的函数符号没有对应函数,则输出“No such function!”(全英文,有叹号无引号)。

符号函数说明
SShow打印信息
sUpdateFilesize更新文件大小,需读取下一行数据作为参数
EUpdateFile仅更新文件编码方式,需读取下一行数据作为参数
eUpdateFile更新文件编码方式并更新文件名, 需读取下一行数据作为参数

输出:

对应函数的执行结果。

样例输入:

NKU_nice_every_day.txt 4321 0
7
S
s
54321
E
1
S
e
2 NKU_happy_every_day.md
n
S

样例输出:

NKU_nice_every_day.txt 4321 ASCII
NKU_nice_every_day.txt 54321 Unicode
No such function!
NKU_happy_every_day.md 54321 UTF8
#include <iostream>
#include <string>
using namespace std;

class File{
protected:
    string filename; // 成员变量:文件名
    long filesize; // 成员变量:文件大小
public:
    // 构造函数,初始化filename和filesize成员
    File(string name, long size) : filename(name), filesize(size){}
};

class TextFile : public File{ // 定义TextFile类,继承File类
private:
    int fileEncoder; // 成员变量:文件编码方式标记
    string encodeStr[4] = {"ASCII", "Unicode", "UTF8", "ANSI"}; // 定义常量数组,存储四种编码方式的字符串表示
public:
    // 构造函数,初始化filename、filesize和fileEncoder成员
    TextFile(string name, long size, int encoder) : File(name, size), fileEncoder(encoder){}
    
    void UpdateFilesize(long size){ // 成员函数,用于修改文件大小
        filesize = size;
    }
    
    void UpdateFile(int encodeFlag){ // 成员函数,用于更新文件的编码方式
        fileEncoder = encodeFlag;
    }
    
    void UpdateFile(int encodeFlag, string name){ // 成员函数,用于同时修改文件的编码方式和文件名
        fileEncoder = encodeFlag;
        filename = name;
    }
    
    void Show(){ // 成员函数,用于展示文件信息
        cout << filename << " " << filesize << " " << encodeStr[fileEncoder] << endl;
    }
};

int main() {
    string name;
    long size;
    int encode, n;
    char op;
    cin >> name >> size >> encode; // 读取文件名、文件大小和文件编码方式标记
    TextFile f1(name, size, encode); // 创建TextFile对象f1
    
    cin >> n; // 读取操作命令的数量
    for (int i = 0; i < n; i++){ // 循环执行操作命令
        cin >> op; // 读取操作命令的符号
        switch (op) { // 根据符号执行相应的操作
            case 'S':
                f1.Show(); // 展示文件信息
                break;
            case 's':
                cin >> size; // 读取需要修改的文件大小
                f1.UpdateFilesize(size); // 更新文件大小
                break;
            case 'E':
                cin >> encode; // 读取需要修改的文件编码方式标记
                f1.UpdateFile(encode); // 更新文件编码方式
                break;
            case 'e':
                cin >> encode >> name; // 读取需要修改的文件编码方式标记和文件名
                f1.UpdateFile(encode, name); // 更新文件编码方式和文件名
                break;
            default:
                cout << "No such function!" << endl; // 错误提示
                break;
        }
    }
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

纳皮尔的骨头

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

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

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

打赏作者

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

抵扣说明:

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

余额充值