项目介绍:
我们可以开发一个系统,利用这个系统实现设置题目设置答案 和用户作答的功能
运行成果:
注意:由于设置题目设置答案的过程封装在类的内部,所以不会再运行时设置(在代码内部)
项目源码(无注释):
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; // 程序正常结束
}
项目不足:
-
输入验证 :在
main
函数中,用户输入的是一个整数,但没有验证这个整数是否在有效范围内(即0到3之间)。如果用户输入了无效的数字(如负数、4或更大的数),程序可能会表现出不期望的行为(如访问数组越界)。 -
错误处理 :虽然程序对于错误的选择给出了"回答错误"的提示,但对于非数字输入(如字母或特殊字符),程序将无法正确读取
std::cin
中的输入,并可能进入无限循环或产生不可预测的行为。 -
代码组织:虽然你的代码功能齐全,但增加一些注释和文档可以使其他开发者更容易理解和维护。
-
使用构造函数初始化 :可以在
ChoiceQ
类的构造函数中直接初始化选项和答案,这样可以避免在main
函数中单独调用setChoice
和setAnswer
。
改进后源码:
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;
}