【项目共享】用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;
}
相关推荐
九圣残炎4 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
童先生8 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu10 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
丫头,冲鸭!!!29 分钟前
B树(B-Tree)和B+树(B+ Tree)
笔记·算法
Re.不晚33 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会36 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香38 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??42 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言