福大软工1816 · 团队现场编程实战(抽奖系统)

队名:起床一起肝活队
组长博客:博客链接
作业博客:班级博客本次作业的链接

一、组员职责分工

组员职责
白晨曦任务分配,过滤算法
乐忠豪完成抽奖功能
蔡子阳完成文案生成与qqbot
黄培鑫完成抽奖结果图片生成
李麒完成界面制作与功能对接
王焕仁协助完成过滤算法
陈德斌协助完成界面的制作,博客书写
林志华过滤算法设计
何裕捷抽奖结果的图片显示

二、github 的提交日志截图

1474404-20181118224248700-1303707729.png

三、程序运行截图

1.程序界面

1474404-20181118224335964-839129984.jpg

2.抽奖系统

输入文本:

1474404-20181118224357419-260498719.png

输出结果:

1474404-20181118224409774-2128094766.png

3.高级过滤功能

image

4.发送通知

1474404-20181118224546237-749479166.png

四、程序运行环境

环境名称
操作系统windows10
编译器visual studio

五、GUI界面

1474404-20181118224558596-730408671.jpg

六、基础功能实现

抽奖系统

基本思路:

对每条记录进行词条化处理,赋予每个参与抽奖的人一定范围的中奖码(如:10-20是张三中奖),通过控制范围改变一些参与者的中奖概率,再通过产生随机数的方式获得中奖号码,输出相应参与者的信息

代码实现:

// Dll1.cpp: 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"

#include <stdexcept>
#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<fstream>
#include <cstdlib>
#include<string>
#include <sstream>
#include<vector>
#include "DLL1.h"
using namespace std;
class people1 {
public:
    string name;
    string QQ;
    int cs;
    int zongzishu;
    int zhongjiangdown;
    int zhongjiangup;
};
people1 p[2000];
void choujiang(string filename,int pnum)
{
    char word[1000];
    
    string a;

    ifstream in(filename);

    int num = 0;
    int k = 0;
    while (in.getline(word, 1000))
    {
        a = word;
        string b = "";
        vector<string> res;
        //暂存从word中读取的字符串 
        string result;
        //将字符串读到input中 
        stringstream input(a);
        //依次输出到result中,并存入res中 
        while (input >> result)
            res.push_back(result);
        //输出res 
        p[k].name = res[0];
        p[k].QQ = res[1];
        if (k <= 30 && k != 0)
        {
            p[k].zhongjiangdown = p[k - 1].zhongjiangup + 1;
            p[k].zhongjiangup = p[k].zhongjiangdown + 9;
        }
        else if (k == 0)
        {
            p[k].zhongjiangdown = 0;
            p[k].zhongjiangup = p[k].zhongjiangdown + 9;
        }
        else {
            p[k].zhongjiangdown = p[k - 1].zhongjiangup + 1;
            p[k].zhongjiangup = p[k].zhongjiangdown + 1;
        }
        k++;

    }
    int jieguo = 0;
    int ss = 0;
    srand(time(0));
    ofstream fout("final.txt");
    for (int s = 0; s < pnum; )
    {
        if (k <= 30)
            jieguo = rand() % (k * 10 - 1);
        else
            jieguo = rand() % (k + 269);
        
        for (int i = 0; i < k; i++)
        {
            if (jieguo <= p[i].zhongjiangup && jieguo >= p[i].zhongjiangdown)
            {
                fout << "恭喜 " << p[i].name << " (" << p[i].QQ << ") " << "中奖!" << endl;
                p[i].zhongjiangup = 65535;
                p[i].zhongjiangdown = 65535;
                s++;
            }
        }
        
    }
    fout.close();
    
}

过滤系统

代码实现:

#include "pch.h"


 bool QWE_fenxi::cmp(qwe a,qwe b){
    return a.zs>b.zs;
}
string QWE_fenxi::UTF8ToGB(const char* str) {
    string result;
    WCHAR *strSrc;
    LPSTR szRes;
    int i = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    strSrc = new WCHAR[i + 1];
    MultiByteToWideChar(CP_UTF8, 0, str, -1, strSrc, i);
    i = WideCharToMultiByte(CP_ACP, 0, strSrc, -1, NULL, 0, NULL, NULL);
    szRes = new CHAR[i + 1];
    WideCharToMultiByte(CP_ACP, 0, strSrc, -1, szRes, i, NULL, NULL);
    result = szRes;
    delete[]strSrc;
    delete[]szRes;
    return result;
}
bool QWE_fenxi::qgetline(char s[]){
    if( fgets(s,1024,fp) ){
        return true;
    }
    return false;
}
void QWE_fenxi::getfayan(int i){
    string name="",qq="";
    int zs=0,len=strlen(qLine[1]);
    for(int j=len-1;j>=0&&qLine[1][j]!='#';j--){
        zs++;
    }
    for(i=i+1;qLine[0][i]!='('&&qLine[0][i]!='<';i++){
        name+=qLine[0][i];
    }
    for(i=i+1;qLine[0][i]!=')'&&qLine[0][i]!='>';i++){
        qq+=qLine[0][i];
    }
    if (name == "系统消息")return;
    qq_name[qq]=name;
    qq_cs[qq]++;
    qq_zs[qq]+=zs;
}

bool QWE_fenxi::chanyucoujiang( char s[],string gjc){
    int i=0,j,len=strlen(s);
    string tmp;
    while(i<len){
        if(s[i]=='#'){
            tmp="";
            for( j=i+1;s[j]!='#';j++){
                tmp+=s[j];
            }
            if(tmp==gjc){
                return true;
            }i=j+1;
        }else i++;
    }
    return false;
}

bool QWE_fenxi::between_time(char s[]) {
    int len = strlen(s);
    if (len < 19)return false;
    for (int i = 0; i < 19;i++) {
        if ( s[i]!=' '&& s[i] != '-'&&s[i] != ':' && !(s[i] >= '0'&&s[i] <= '9'))return false;
    }
    for (int i = 0;i < 19;i++) {
        if (s[i] < time1[i])return false;
        else if (s[i] > time1[i])break;
    }
    for (int i = 0;i < 19;i++) {
        if (s[i] > time2[i])return false;
        else if (s[i] < time2[i])break;
    }
    return true;
}
bool QWE_fenxi::getperson(string gjc){
    gjc=UTF8ToGB(gjc.c_str());
    string str;
    if(!qgetline(qLine[0]) )return false;
    if (!between_time(qLine[0])) {
        return true;
    }
    if(!qgetline(qLine[1]) )return false;
    str=UTF8ToGB(qLine[1]);
    int j;
    for( j=0;j<str.size();j++){
        qLine[1][j]=str[j];
    }
    qLine[1][j]='\0';
    //de(qLine[1]);
    
    if(!qgetline(qLine[2]) )return false;
    

    
    if( !chanyucoujiang(qLine[1],gjc) ){
        return true;
    }
    int i,t=0;
    for(i=0;;i++){
        if(qLine[0][i]==' '){
            t++;
            if(t==2)break;
        }
    }
    getfayan(i);
    return true;
}

void QWE_fenxi::getresult(string mgjc,string time11,string time22){
    de("begin");
    time1 = time11;
    time2 = time22;
    FILE *ffp;
    fopen_s(&fp,"record.txt","rt");
    fopen_s(&ffp,"gjc.txt","rt");
    string gjc;
    char ss[1024];
    fgets(ss,1024,ffp);
    gjc=ss;
    gjc = mgjc;
    gjc=UTF8ToGB(gjc.c_str());
    while(getperson(gjc) ){
    }
    //de("-----------------------");
    int cnt=0;
    
    int zs,cs;
    for( it1=qq_name.begin();it1!=qq_name.end();it1++){
        a[cnt].name=it1->second;
        a[cnt].qq=it1->first;
        a[cnt].zs=qq_zs[ a[cnt].qq ];
        a[cnt].cs=qq_cs[a[cnt].qq];
        cnt++;
    }
    sort(a,a+cnt, & cmp );
    freopen("result.txt","w",stdout);
    for(int j=0;j<cnt;j++){
        cout<<a[j].name<<" "<<a[j].qq<<" "<<a[j].cs<<" "<<a[j].zs<<endl;
    }
}

七、附加功能实现

附加功能方面只制作了抽奖结果的海报,还没有连接上前面的代码。所以只贴出海报截图。1474404-20181118224645696-1829395224.jpg

八、遇到的困难及解决方法

1.乐忠豪

遇到困难:
封装Dll
解决办法:
疯狂百度!

2.林志华

遇到困难:
1.遇到最烦的就是当时读取record文件当中的汉字会产生乱码,以前没有遇到过这种情况,还以为是因为读取的方式错了,弄了一个上午。
2.作业提供的record文件里面关于聊天记录的爬取很令人不满,人发的内容爬取的时候并没有压缩成一行,很乱。
解决方法:
1.当时百度了好久,用了很多方法都没用,最后灵机一动,发现可能是txt编码错了,果然,把utf-8改成ANSI就不会出现乱码了。
2.自己的事情自己做。

吐槽:要不是作业提供的文件编码格式不对,内容格式不整齐,那就不用花费怎么多时间浪费在这里了,还能多做一些其他东西,晦气。

3.李麒

遇到困难:
1.界面要调用其他组员的DLL,需要等待其他组员封装,并且每次出问题都需要重新来过。
2.使用C#制作界面并调用C++的DLL,没有经验
3.成功接入,但在内存上报错,无法确定是DLL的问题还是C#的问题
解决方法:
1.及时的沟通、调试
2.不断的摸索,看其他优秀博客的教程等
3.尝试过各种方法,均失败,造成界面的制作失败。

4.黄培鑫

遇到困难:
C++实现获奖名单生成海报存在困难,没有取得成功。
解决方法:
转而使用C#

吐槽:如果可以重来,那么我不会选软工实践(哭)

5.蔡子阳

遇到的困难:如何自动生成一个优美的文案
解决方法:暂时没有解决方法(可以等京东的莎士比亚系统正式出后再试试)

6.王焕仁

遇到的困难:汉字在c++编程中的处理,编码之前没有清晰思路。
解决方法:多亏了有人帮忙和百度搜索引擎的帮忙。

7.陈德斌

遇到的困难:一开始大家为了统一语言选择软件讨论了很久。
解决方法:大家统一选择c++实现。

8.何裕捷

遇到的困难:
1.没接触过生成图片的知识,需要百度很多知识,百度到的知识很多又是用不上的。
2.网上代码copy下来会有很多bug。
解决方法:百度解决。

九、评估每位组员的贡献比例

组员得分
白晨曦5
乐忠豪15
蔡子阳10
黄培鑫10
李麒10
王焕仁10
陈德斌10
林志华20
何裕捷10

PSP表格

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划180190
· Estimate· 估计这个任务需要多少时间55
Development开发90120
· Analysis· 需求分析 (包括学习新技术)6060
· Design Spec· 生成设计文档3060
· Design Review· 设计复审 (和同事审核设计文档)00
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)00
· Design· 具体设计6070
· Coding· 具体编码6080
· Code Review· 代码复审1010
· Test· 测试(自我测试,修改代码,提交修改)1010
Reporting报告3030
· Test Report· 测试报告00
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3030
合计300330

学习进度表

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
3001717Axure up;NABCD模型
4100010002340八爪鱼采集器;字符统计
5-901000100140团队合作开发项目;java学习
10010008148java学习,jdk,eclipse
11100110030178Android Studio

转载于:https://www.cnblogs.com/Huangpx/p/9980193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值