Java教程

湖南大学结对编程——结对编程项目经验总结

本文主要是介绍湖南大学结对编程——结对编程项目经验总结,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、 任务简介

实现带UI的小初高数学学习软件

 

二、 功能需求

  1. 所有功能通过图形化界面操作,可以是桌面应用,可以是网站(编程语言和技术不限);
  2. 用户注册功能。用户提供手机号码,点击注册将收到一个注册码,用户可使用该注册码完成注册;
  3. 用户完成注册后,界面提示设置密码,用户输入两次密码匹配后设置密码成功。密码6-10位,必须含大小写字母和数字。用户在登录状态下可修改密码,输入正确的原密码,再输入两次相同的新密码后修改密码成功;
  4. 密码设置成功后,跳转到选择界面,界面显示小学、初中和高中三个选项,用户点击其中之一后,提示用户输入需要生成的题目数量;
  5. 用户输入题目数量后,生成一张试卷(同一张卷子不能有相同题目,题目全部为选择题),界面显示第一题的题干和四个选项,用户选择四个选项中的一个后提交,界面显示第二题,...,直至最后一题;
  6. 最后一题提交后,界面显示分数,分数根据答对的百分比计算;
  7. 用户在分数界面可选择退出或继续做题;
  8. 小初高数学题目要求见个人项目。

 

三、 功能实现

1.UI界面

因为个人项目我和搭档都是用C++,为了更好地重用个人项目代码,所以采用QT编写UI界面。界面分为6种:注册界面,登录界面,挑选难度界面,更换密码界面,答题界面,分数界面,如下图。

基本框架:

每个界面写一个类,封装在XXXwindow.h中,需要使用时头文件处include,然后调用类的构造函数生成对象即可实现对应的UI界面。

 

 

qt信号与槽机制:

因为我和搭档从来没接触过C++的图形化编程,也从来没有接触过qt,是完全从小白慢慢摸索出来的。信号和槽机制是Qt的核心特征,是Qt不同于其他开发框架的最突出的特征,信号和槽用于两个对象直接的通信。如当按钮被单击,我们希望有响应,Qt在发生如单击的事件时发送信号,用槽也就是函数在信号发出后响应信号以实现按钮单击事件的响应,注意需要用connect语句关联信号和槽函数,否则没法如愿响应。

 

 

如分数界面退出登录需要显示登录界面重新登录,两个界面的切换就需要使用信号和槽机制:

分数界面定义退出信号exitsignals(),登录界面定义槽函数login()响应分数界面的退出信号。

登录界面声明

 

 

分数界面声明

 

 

 

分数界面在退出按钮的槽函数中发送exitsignals()。

void ScoreWindow::on_exitBtn_clicked()//退出按钮
{
    QMessageBox::information(NULL,tr("信息提示"),tr("退出成功"));
    this->hide();
    //退出信号
    emit exitsignals();
}

登录界面的login函数调用show()显示界面,关联登录界面login槽函数和分数界面产生的退出信号exitsignals即可实现分数界面按退出按钮切换登录界面。

//关联退出登录信号和登录界面显示
  QObject::connect(&q.s,&ScoreWindow::exitsignals,&w,&MainWindow::login);
//显示登录界面
void MainWindow::login()
{
    this->show();
}

2.题目答案计算

之前的个人项目没有要求计算答案,因为这次需要统计分数,所以需要实现答案计算。算法思想史初中和高中的根号和三角先计算,然后采用中缀表达式的四则运算算法:定义两个栈分别保存操作数和操作符,从左往右读题目字符串,如果是操作数直接入栈,如果是操作符先和栈顶操作符比较,栈顶操作符优先级低直接入栈,栈顶优先级高则弹出栈顶操作符和两个栈顶操作数运算后再循环判断操作符和当前栈顶优先级直至操作数栈只有一个元素即结果。

举例如下:

 

代码实现:

//表达式计算的过程
//中缀表达式使用栈计算
void tcal::process(){
    symbol.push('#');
    uint i=0;
    double num = 0.0;
    char *c;
    QByteArray ba = str.toLatin1();
    c = ba.data();//得到字符
    int ff = 0;
    while(symbol.top()!='#'||i<str.size()){
        if(c[i]>='0'&&c[i]<='9'){
            //为操作数
            num=0;
            int f = 0;
            while((c[i]>='0')&&(c[i]<='9')||(c[i]=='.')){
                if((i == 0)&&c[i]=='-')
                {
                    ff = 1;
                }
                else if((c[i]=='.')||(f != 0))
                {
                    if(c[i]!='.')
                    {
                        num*=10;
                        num+=c[i]-'0';
                        f++;
                        ++i;
                    }
                    else
                    {
                        ++i;
                        f++;
                    }
                }
                else
                {
                    num*=10;
                    num+=c[i]-'0';
                    ++i;
                }
            }
            ff = 0;
            if(f!=0)
            num = num/pow(10,f-1);
            val.push(num);
        }
        else  //操作符
        {
            switch(cmp(symbol.top(),c[i])){
                case '<':
                    symbol.push(c[i]);
                    ++i;
                    break;
                case '=':
                    symbol.pop();
                    ++i;
                    break;
                case '>':
                    double a=val.top();
                    val.pop();
                    double b=val.top();
                    val.pop();
                    val.push(cal_t(b,a,symbol.top()));
                    symbol.pop();
                    break;
            }
        }
    }
    double res=val.top();
    val.pop();
    realresult = res;
    return;
}

3.短信验证 

 

 

C++可依赖libcurl库发送http请求到第三方平台,接入第三方平台的短信接口以实现短信发送。

注意windows上是没有curl库的,需要添加外部包进qt才能成功编译调用curl.h的函数实现请求发送。

LIBS += "E:\qt\qt01\lib\libcurldll.a"
LIBS += "E:\qt\qt01\lib\libcurl.a"

INCLUDEPATH +=$$PWD/include
DEPENDPATH +=$$PWD/include 

 

四、 经验教训总结

经验:

1.这次结对编程主要编写代码由我编写,搭档主要负责代码测试和bug修改,搭档看完我编写代码后能够很快指出我的不规范的编写之处,像多打了分号,括号不匹配问题及时发现,避免很多不必要的bug的出现。

2.搭档从另一个视角能很快发现我的bug来源,原本高中题目答题时有闪退bug,我看了很久没有找到解决方法,搭档重审我的代码后,提出了修改三角后的操作数的方案,改为更符合高中生水平的15的倍数且把单位改为度,解决了bug闪退,且找到了闪退原因是非特殊度数的三角函数值有小数不符合中缀表达式计算四则运算算法,计算结果出错程序非正常关闭从而发生闪退。

教训:

1.因为国庆放假,我和搭档分隔两地,没法并排坐在一起编程,只能我写完一部分发给搭档,没法及时发现我的bug。如果我编写代码时搭档坐旁边,我相信我会听取搭档意见三角操作数取特殊值且用度为单位,一方面符合现实情况,一方面三角函数值数值范围合法,就能够避免困扰我数天的高中答题闪退问题。

2.因为是Qt小白,对Qt缺乏了解,非常单纯地用代码干完整个界面的设计和布局,后来才发现Qt Creator有自带的界面设计器可以通过拖拽控件设计界面,设计更便捷,且更方便控制空间布局使界面更加美观。但是纯代码写Qt界面也有一个很大的好处就是充分地了解Qt框架,对Qt界面设计更加熟练,自己手敲的代码更加熟悉,哪里出了问题可以很快定位到出问题的地方。

 

这篇关于湖南大学结对编程——结对编程项目经验总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!