Java教程

结对编程队友代码分析

本文主要是介绍结对编程队友代码分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

结对编程队友代码分析

项目需求分析

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.可扩展性弱

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

这篇关于结对编程队友代码分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!