ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

结对编程队友代码分析

2022-09-14 02:00:08  阅读:266  来源: 互联网

标签:结对 题目 name 编程 switch 队友 user type User


结对编程队友代码分析

项目需求分析

1.用户登录:通过命令行输入用户名和密码,并能够判断用户名和密码都正确,如果都正确,实现登录。

2.类型转化:能够实现用户类型切换,共三种类型:小学、初中、高中。

3.试卷生成:实现试卷自动生成,不同类型难度不同,具体见下表。试卷题目数量范围为10-30,每个题目操作数为1-5,且题目不能重复。

小学 初中 高中
难度要求 +,-,*./ 平方,开根号 sin,cos,tan
备注 只能有+,-,*./和() 题目中至少有一个平方或开根号的运算符 题目中至少有一个sin,cos或tan的运算符

4.试卷保存:生成的题目将以“年-月-日-时-分-秒.txt”的形式保存,每个账号一个文件夹。每道题目有题号,每题之间空一行。

功能实现

1.用户登录

void User::SignIn() { //用户登录函数
    while(1){
        cout << "请输入用户名和密码:";
        cin >> user_name_ >> user_pswd_;
        string user_name = user_name_.substr(0,user_name_.length()-1); 
        if(user_name == "张三") {
            user_type_ = "小学";
        } else if(user_name == "李四") {
            user_type_ = "初中";
        } else if(user_name == "王五") {
            user_type_ = "高中";
        } else {
            cout << "请输入正确的用户名、密码!" << endl << endl;
            continue;
        }
        if(user_pswd_ == "123"){
            break;
        } else {
            cout << "请输入正确的用户名、密码!" << endl << endl;
        }
    }
    cout << endl << "*****当前选择为" << user_type_ << "出题*****" << endl << endl;
    folder_path_ = user_name_;
    if (0 != access(folder_path_.c_str(), 0)) {
        mkdir(folder_path_.c_str());   // 返回 0 表示创建成功,-1 表示失败
    }
    User::CreateFile();
    User::CreatePaper();
}

2.类型转化

void User::SwitchType() {   // 切换类型选项
	while(1) {
		cout << endl << "以下为类型切换选项";
        cout << "(若需要切换类型,请输入\"切换为XX\",若不需要,输入\"否\",若退出登录请输入\"-1\")";
		cout << endl << "请输入:";

        string type_switch; // 存储转化类型
		cin >> type_switch;

		if(type_switch == "否" || type_switch == "") {
			User::CreateFile();
			User::CreatePaper();    // 生出符合输入的数学试卷
			continue;
		} else if(type_switch == "-1") {
            break;   // 退出操作
        }
		if(type_switch.substr(0,6)=="切换为") {
			user_type_ = type_switch.erase(0,6);
			User::CreateFile();
			User::CreatePaper();
            continue;      
		} else {
			while(1) {
				cout<<"请输入小学、初中和高中三个选项中的一个:";
				cin>>type_switch;
				if(type_switch=="小学"||type_switch=="初中"||type_switch=="高中") {
					user_type_ = type_switch;
					User::CreateFile();
					User::CreatePaper();
					break;
				} else if(type_switch=="-1") {
                    break;
                }
			}
		}
		if(type_switch=="-1")  break;
	}
	cout << "您已退出本次登录!" << endl << endl;
    User::SignIn();
}

3.试卷生成

void User::CreatePaper() {
    cout << "准备生成" << user_type_ << "数学题目..." << endl;
    cout << "请输入生成题目数量(输入-1将退出当前用户,重新登录):";
    cin >> exa_numb_;
    while(exa_numb_ < 10 || exa_numb_ > 30) {
        if(exa_numb_ == -1) {
            cout << "您已退出,请重新登录!" << endl;
            cout << endl;
            User::SignIn();
			break;
        } 
        cout << endl << "输入的题目数量无效,请重新输入:";
        cin >> exa_numb_;
    }
	
    paper_.open(file_path_.c_str(), ios::out);

    string check_path = folder_path_+"\\Check.txt";
    check_.open(check_path.c_str(), ios::out|ios::app);

	cout << "这是一张" << user_type_ << "卷子,共有" << exa_numb_ << "道题目。" << endl << endl;

    int number = exa_numb_;
    string symbol[] = {"+", "-", "*", "/", "√", "^2", "sin", "cos", "tan"};
    while(number--) {
        int operand_number = rand() % 4 + 2;            // 随机生成2-4个操作数
        int bracket_number = operand_number / 2 - 1;    // 括号生成数量
        int bracket_index = -1;

        for(int i = 0; i < (operand_number * 2 - 1); i++) {
            if(i % 2 == 0) {
                if(i < operand_number && bracket_number != 0 && rand() % 2 == 1) {
                    question << "(";
                    bracket_index = i + 3;
                    bracket_number --;
                }
                question << (rand() % 100 + 1);
            } else {
                if(i == bracket_index) {
                    question << ")";
                }
                question << symbol[rand() % 4];
            }
        }
        if(user_type_ == "初中") {
            int junior = rand() % 2 + 4;
            if(junior != 4) {
                question << symbol[junior];
            } else {
                question << symbol[rand() % 4];
                question << symbol[junior];
                question << (rand() % 100 + 1);
            }
        } else if(user_type_ == "高中") {
            int senior = rand() % 3 + 6;
            question << symbol[rand() % 4];
            question << symbol[senior];
            question << (rand() % 100 + 1);
        }
        cout << exa_numb_ - number << "、" << question.str()<<endl;
        bool check_flag = User::Check();
        if(check_flag = true) {
            paper_ << exa_numb_ - number << "、" << question.str() << '=' <<endl;
            check_ << question.str() << '=' << endl;
            question.str("");
        }
    }
    paper_.close();
    check_.close();
}

4.试卷保存

void User::CreateFile() {     // 给文件命名的函数
	char file_name[100];
	struct tm *ptr;
	time_t It=time(NULL);
	ptr=localtime(&It);
	strftime(file_name,30,"%y-%m-%d-%H-%M-%S.txt",ptr);     // 以年月日时分秒对输出文件命名
	file_path_ = folder_path_ +"\\"+file_name;
}

5.代码测试

优点

1.功能实现完全

项目需求的所有功能基本完全实现,且除编码外,基本符合Google代码编写规范。

2.可读性强

代码简洁,注释较多,变量命名规范,因此可读性较强

3.能自动生成文件夹

能自动生成用户文件夹保存用户试卷,同时每个文件夹内都有Check.txt,方便之后题目查重。

缺点

1.未使用utf-8编码方式

未使用utf-8编码方式,不符合题目要求。队友utf-8编码不能实现字符输出,输入字符也不能匹配,原因未知。

2.题目创建不随机

题目创建操作数只能为2-5个,一个操作数的题目不能创建。初中、高中题目仅仅是题目最后随机生成对应难度的操作符,高中题目也不会生成根号和平方根,不够随机。

3.题目查重效率不高

题目查重是通过遍历每一条题目,随着题目数量的增加,难免会影响性能。

4.数据和代码未实现分离

用户名和密码是通过代码写死的,保存在代码内,之后用户的增加和删减都不能方便实现。

5.可扩展性弱

所有功能仅用一个类实现,可扩展性弱。

标签:结对,题目,name,编程,switch,队友,user,type,User
来源: https://www.cnblogs.com/awenggg/p/16691597.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有