记录日志

题目描述

ILogger 接口提供 log “记录日志”成员函数。

给出三个实现 ILogger 接口的类:TermLoggerStrLoggerSumLogger

  • TermLogger 在记录日志时,直接将值打印到标准输出,并尾随一个换行;
  • StrLogger 可通过 print 方法,将所有已经记录下来的值拼接为一个字符串,然后输出;
  • SumLogger 可通过 print 方法,将所有已经记录下来的值加起来的和输出。

关于输入

共一行,为若干个空格分隔的整数 {ai}n。0 ≤ ai < 100,n < 1000。

关于输出

共 n + 2 行。

对于前 n 行,第 i 行即为 ai

第 n + 1 行为 {ai} 所有数按序排列,无分隔符;

第 n + 2 行为 {ai} 所有数的和,保证结果在 int 范围内。

代码说明

StrLogger 可以有多个不同实现:

  • 每次 log 时,将数值存放在 std::vector 内,最后在 print 方法中逐个输出;
  • 每次 log 时,调用 std::to_string 转换为字符串,增加到内部成员结尾;
  • 同上,但是使用 std::stringstream 做转换。

参考答案

#include <iostream>
#include <string>

class ILogger {
public:
    virtual void log(int) = 0;
};

#include <vector>

class TermLogger : public ILogger {
public:
    void log(int i) override {
        std::cout << i << std::endl;
    }
};

class StrLogger : public ILogger {
    std::vector<int> nums;

public:
    void log(int i) override {
        nums.push_back(i);
    }
    void print() {
        for (auto i : nums) {
            std::cout << i;
        }
        std::cout << std::endl;
    }
};

class SumLogger : public ILogger {
    int sum{};

public:
    void log(int i) override {
        sum += i;
    }
    void print() {
        std::cout << sum << std::endl;
    }
};

int main() {
    TermLogger termLog;
    StrLogger strLog;
    SumLogger sumLog;
    ILogger* loggers[]{&termLog, &strLog, &sumLog};
    int num;
    while (std::cin >> num) {
        for (auto logger : loggers) {
            logger->log(num);
        }
    }
    strLog.print();
    sumLog.print();
}







 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 














#include <iostream>
#include <string>

class ILogger {
public:
    virtual void log(int) = 0;
};

class TermLogger : public ILogger {
public:
    void log(int i) override {
        std::cout << i << std::endl;
    }
};

class StrLogger : public ILogger {
    std::string str;

public:
    void log(int i) override {
        str += std::to_string(i);
    }
    void print() {
        std::cout << str << std::endl;
    }
};

class SumLogger : public ILogger {
    int sum{};

public:
    void log(int i) override {
        sum += i;
    }
    void print() {
        std::cout << sum << std::endl;
    }
};

int main() {
    TermLogger termLog;
    StrLogger strLog;
    SumLogger sumLog;
    ILogger* loggers[]{&termLog, &strLog, &sumLog};
    int num;
    while (std::cin >> num) {
        for (auto logger : loggers) {
            logger->log(num);
        }
    }
    strLog.print();
    sumLog.print();
}







 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 














#include <iostream>
#include <string>

class ILogger {
public:
    virtual void log(int) = 0;
};

#include <sstream>

class TermLogger : public ILogger {
public:
    void log(int i) override {
        std::cout << i << std::endl;
    }
};

class StrLogger : public ILogger {
    std::string str;

public:
    void log(int i) override {
        std::stringstream ss;
        ss << i;
        str += ss.str();
    }
    void print() {
        std::cout << str << std::endl;
    }
};

class SumLogger : public ILogger {
    int sum{};

public:
    void log(int i) override {
        sum += i;
    }
    void print() {
        std::cout << sum << std::endl;
    }
};

int main() {
    TermLogger termLog;
    StrLogger strLog;
    SumLogger sumLog;
    ILogger* loggers[]{&termLog, &strLog, &sumLog};
    int num;
    while (std::cin >> num) {
        for (auto logger : loggers) {
            logger->log(num);
        }
    }
    strLog.print();
    sumLog.print();
}