【项目共享】用c++开发选择题管理作答系统

项目介绍:

我们可以开发一个系统,利用这个系统实现设置题目设置答案 和用户作答的功能

运行成果:

注意:由于设置题目设置答案的过程封装在类的内部,所以不会再运行时设置(在代码内部)

项目源码(无注释):

cpp 复制代码
#include<iostream>
#include<string>
class ChoiceQ {
	std::string choice[4]={""};
	int answer;
public:
	ChoiceQ() {
		
	}
	~ChoiceQ() {
		
	}
	void setChoice(int i,std::string choice_){
		this->choice[i]=choice_;
	}
	void showSubject() {
		for(int i=0;i<4;i++){
			std::cout<<(char)(i+97)<<"."<< this->choice[i]<<std::endl;
		}
	}
	void setAnswer(int ans){
		this->answer=ans;
	}
	void judge(int user){
		if(user==this->answer){
			std::cout<<"回答正确"<<std::endl;
		}else{
			
			std::cout<<"回答错误"<<std::endl;
		}
	}
};
int main(){
	
	ChoiceQ q;
	//设置选项
	q.setChoice(0,"tom");
	q.setChoice(1,"peter");
	q.setChoice(2,"koko");
	q.setChoice(3,"keke");
	//设置答案
	q.setAnswer(2);
	//展示题目
	q.showSubject();
	std::cout<<"请输入你的选择"<<std::endl;
	int user;
	std::cin>>user;
	q.judge(user);
	
	return 0;
}

项目源码(含注释):

cpp 复制代码
#include<iostream> // 引入输入输出流库
#include<string>   // 引入字符串库

// 定义一个类ChoiceQ,用于表示一个选择题
class ChoiceQ {
private: // 私有成员,外部无法直接访问
	std::string choice[4]={""}; // 存储四个选项的字符串数组
	int answer; // 存储正确答案的整数
public:
	ChoiceQ() { // 构造函数,初始化时什么都不做
		
	}
	~ChoiceQ() { // 析构函数,同样什么都不做,因为这里没有动态分配的内存
		
	}
	void setChoice(int i,std::string choice_){ // 设置选项的函数
		this->choice[i]=choice_; // 将参数中的字符串赋值给choice数组的相应位置
	}
	void showSubject() { // 展示题目的函数
		for(int i=0;i<4;i++){ // 遍历choice数组
			std::cout<<(char)(i+97)<<"."<< this->choice[i]<<std::endl; // 打印选项编号和选项内容
		}
	}
	void setAnswer(int ans){ // 设置答案的函数
		this->answer=ans; // 将参数中的整数赋值给answer
	}
	void judge(int user){ // 判断用户答案的函数
		if(user==this->answer){ // 如果用户答案等于正确答案
			std::cout<<"回答正确"<<std::endl; // 输出回答正确
		}else{
			std::cout<<"回答错误"<<std::endl; // 否则输出回答错误
		}
	}
};

int main(){
	ChoiceQ q; // 创建一个ChoiceQ类的实例q
	// 设置选项
	q.setChoice(0,"tom");
	q.setChoice(1,"peter");
	q.setChoice(2,"koko");
	q.setChoice(3,"keke");
	// 设置答案
	q.setAnswer(2); // 正确答案设置为2,即"koko"
	// 展示题目
	q.showSubject();
	std::cout<<"请输入你的选择"<<std::endl;
	int user;
	std::cin>>user; // 读取用户输入的选择
	q.judge(user); // 调用judge函数判断用户答案
	
	return 0; // 程序正常结束
}

项目不足:

  1. 输入验证 :在 main 函数中,用户输入的是一个整数,但没有验证这个整数是否在有效范围内(即0到3之间)。如果用户输入了无效的数字(如负数、4或更大的数),程序可能会表现出不期望的行为(如访问数组越界)。

  2. 错误处理 :虽然程序对于错误的选择给出了"回答错误"的提示,但对于非数字输入(如字母或特殊字符),程序将无法正确读取 std::cin 中的输入,并可能进入无限循环或产生不可预测的行为。

  3. 代码组织:虽然你的代码功能齐全,但增加一些注释和文档可以使其他开发者更容易理解和维护。

  4. 使用构造函数初始化 :可以在 ChoiceQ 类的构造函数中直接初始化选项和答案,这样可以避免在 main 函数中单独调用 setChoicesetAnswer

改进后源码:

cpp 复制代码
#include<iostream>
#include<string>
#include<limits> // 用于 std::numeric_limits<int>::min() 和 std::numeric_limits<int>::max()

class ChoiceQ {
    std::string choice[4];
    int answer;

public:
    ChoiceQ() : answer(-1) { // 初始化answer为-1,表示未设置答案
    }

    void setChoice(int i, std::string choice_) {
        if (i >= 0 && i < 4) { // 验证i是否在有效范围内
            this->choice[i] = choice_;
        }
    }

    void showSubject() const { // 使用const表示此方法不修改对象状态
        for (int i = 0; i < 4; i++) {
            std::cout << (char)(i + 'a') << "." << this->choice[i] << std::endl; // 使用'a'代替97
        }
    }

    void setAnswer(int ans) {
        if (ans >= 0 && ans < 4) { // 验证答案是否在有效范围内
            this->answer = ans;
        }
    }

    void judge(int user) const {
        if (user == this->answer && this->answer != -1) { // 确保答案已设置
            std::cout << "回答正确" << std::endl;
        } else {
            std::cout << "回答错误" << std::endl;
        }
    }
};

int main() {
    ChoiceQ q;
    // 设置选项和答案
    for (int i = 0; i < 4; i++) {
        std::string name;
        std::cout << "请输入第" << (i + 1) << "个选项: ";
        std::cin >> name;
        q.setChoice(i, name);
    }
    std::cout << "请输入正确答案(0-3): ";
    int answer;
    std::cin >> answer;
    q.setAnswer(answer);

    // 展示题目并获取用户输入
    q.showSubject();
    std::cout << "请输入你的选择(0-3): ";
    int user;
    std::cin >> user;

    // 验证用户输入
    if (user < 0 || user > 3) {
        std::cout << "无效输入,请输入0到3之间的数字。" << std::endl;
    } else {
        q.judge(user);
    }

    return 0;
}

拓展版本:

把设置答案和出题的那个环节给他封装起来,只给用户呈现作答的功能

cpp 复制代码
#include<iostream>
#include<string>
#include<vector>

class ChoiceQ {
    std::vector<std::string> choices;
    int answer;

public:
    ChoiceQ(const std::vector<std::string>& choices, int answer)
        : choices(choices), answer(answer) {}

    void showSubject() const {
        for (size_t i = 0; i < choices.size(); i++) {
            std::cout << static_cast<char>('a' + i) << "." << choices[i] << std::endl;
        }
    }

    void judge(int userAnswer) const {
        if (userAnswer == answer) {
            std::cout << "回答正确" << std::endl;
        } else {
            std::cout << "回答错误" << std::endl;
        }
    }

    // 可以添加一个静态方法来创建题目和答案
    static ChoiceQ createQuestion() {
        std::vector<std::string> choices = {"Tom", "Peter", "Koko", "Keke"};
        int answer = 2; // 假设正确答案是Koko
        return ChoiceQ(choices, answer);
    }
};

int main() {
    // 使用静态方法创建题目和答案
    ChoiceQ q = ChoiceQ::createQuestion();

    // 只给用户呈现作答的功能
    q.showSubject();
    std::cout << "请输入你的选择(a-d): ";

    char userChoice;
    std::cin >> userChoice;

    // 注意:这里需要将用户输入的字符转换为整数
    if (userChoice >= 'a' && userChoice <= 'd') {
        q.judge(userChoice - 'a'); // 将字符转换为对应的索引(0-3)
    } else {
        std::cout << "无效输入" << std::endl;
    }

    return 0;
}
相关推荐
Bucai_不才4 分钟前
【C++】初识C++之C语言加入光荣的进化(上)
c语言·c++·面向对象
木向6 分钟前
leetcode22:括号问题
开发语言·c++·leetcode
comli_cn8 分钟前
使用清华源安装python包
开发语言·python
筑基.14 分钟前
basic_ios及其衍生库(附 GCC libstdc++源代码)
开发语言·c++
蹉跎x20 分钟前
力扣1358. 包含所有三种字符的子字符串数目
数据结构·算法·leetcode·职场和发展
yuyanjingtao26 分钟前
CCF-GESP 等级考试 2023年12月认证C++三级真题解析
c++·青少年编程·gesp·csp-j/s·编程等级考试
雨颜纸伞(hzs)28 分钟前
C语言介绍
c语言·开发语言·软件工程
J总裁的小芒果30 分钟前
THREE.js 入门(六) 纹理、uv坐标
开发语言·javascript·uv
坊钰1 小时前
【Java 数据结构】移除链表元素
java·开发语言·数据结构·学习·链表
chenziang11 小时前
leetcode hot100 LRU缓存
java·开发语言