单位名 | 怀化学院计算机科学与工程学院 |
---|---|
课程名称 | 高级语言程序设计 |
班级 小组序号 | 1901班 第1组 |
团队名称 | Power组 |
课程设计题目 | 随机答题程序 |
一、课程设计题目基本要求介绍
功能模块1:登录
(1)限制账号要以10位学号+姓名的方式登录,否则重新登录
(2)登录成功后将基本信息(账号,IP地址)发送给服务器
(3)登录成功后窗口标题应该修改为该账号名
功能模块2:测验前预备工作
(1)输出倒计时,1000ms一次,输出倒计时剩余时间,倒计时结束后输出“开始答题”(新模式可自行输入倒计时时间)
功能模块3:正式开始答题
(1)随机导入一道不重复的题
(2)开始答题限时计时,每答一道题输出一次时间(新模式可自行输入答题限时)
(3)考生输入答案,大小写,输入答案前的空格回车,答案中的空格均被自动删除
(4)考生输入的答案与题库答案对比,输出回答正确/错误,答对题数,已答题数
(5)判断时长与答题数,达到限定时间或做满题目后进行下一模块,否则调回模块3(1)
功能模块4:对答题结果进行判定
(1)输出考试的正确率,以正确率为准输出不同梯度等级(90%以上为S,80%以上90%以下为A,70%分以上80%以下为B,60%以上70%以下为C,60%以下为D)和不同的鼓励语
功能模块5:答题日志
(1)设置语句达到与建立的txt文件能相联系,以达到后续记录步骤的稳定执行
(2)将编译开始后在程序上所显示的全部内容打印至上述txt文件中
(3)若进行多次编译同样地将每一次所显示的编译内容保存在同一个txt文件中,每次编译的结果用换行的方式相隔开以供查阅
功能模块6:网络程序
(1)考生完成答题程序后将答题记录自动上传到服务端电脑文件中
(2)如果考生成绩达到某个级别,考生文件自动发送到服务端保存下来
版本发布:发布Release版,不再使用默认的Dubug版本
二、流程图
三、项目目前的进展
主要写已实现的功能,功能完成的具体程度。
1.限制账号要以10位学号+姓名的方式登录,否则重新登录
通过循环和if语句,判断10位数的学号以及第11位的字符
核心代码
void islogin()//输入学号
{
printf("请输入学号+姓名:");
do{
gets(account);
if(account[0]!='1'||account[1]<'6'||account[1]>'9'||account[2]!='0'||account[3]!='0'||account[4]!='1'||account[5]!='3'||account[6]!='0'||account[7]<'0'||account[7]>'9'||account[8]<'0'||account[8]>'9'||account[9]<'0'||account[9]>'9'||account[10]<'A'||account[10]>'z')
printf("输入错误请重新输入:");
//fprintf(file,);
}while(account[0]!='1'||account[1]<'6'||account[1]>'9'||account[2]!='0'||account[3]!='0'||account[4]!='1'||account[5]!='3'||account[6]!='0'||account[7]<'0'||account[7]>'9'||account[8]<'0'||account[8]>'9'||account[9]<'0'||account[9]>'9'||account[10]<'A'||account[10]>'z');
printf("输入正确\n");
}
效果图
2.输出考试信息(测试考试马上开始,你的学号和姓名)
核心代码
printf("测试考试马上开始,你的学号姓名:%s\n",account);
效果图
3.开始可自行输入的倒计时
核心代码
for(k=j;k>0;k--)
{
printf("测试即将开始,倒计时:%d秒\n",k);
Sleep(1000);
}
**效果图**
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191124214520858.png)
4.随机不重复抽取答案
核心代码
srand((int)time(0));
while(1)
{
k=rand()%math;
for(j=0;j<math;j++)
if(b[j]==k) break;
if(j==math){
b[c]=k;
//printf("%d\n",b[c]);
c++;
}
if(c==math) break;
}
5.开始答题限时计时,每答一道题输出一次时间
核心代码
ts=time(NULL);
te=time(NULL);
T=te-ts;
效果图
6.考生输入答案,输入答案前的空格回车,答案中的空格均被自动删除
核心代码
for(l=0;l<M;l++)
{
scanf("%c",&a[l]);
if(a[l]!=' '&&a[l]!='\n')
{
count++;
}
if(a[l]==' '&&a[l]!='\n')
continue;
b[j]=a[l];
j++;
if(a[l]=='\n'&&count>0)
break;
}
for(l=0;l<j;l++)
{
if(b[l]!='\n'&&b[l]!='\r')
{
c[k]=b[l];
k++;
}
}
效果图
7,考生输入的答案与题库答案对比
核心代码
if(strcmp(strlwr(myanswer),answer[random_index])==0)
8.判断时长
核心代码
if(te-ts<=60)
9.输出考试的正确率,以正确率为准输出不同梯度等级和不同的鼓励语
核心代码
printf("正确%d道题,你已完成%d道题,正确率%.2f%%,你已经用时%ds,总时间120s\n",count,i,(float)count/i*100,te-ts);
switch(count)
{
case 5:printf("你的等级:S,NB\n");break;
case 4:printf("你的等级:A,优秀\n")break;
case 3:printf("你的等级:B,很强\n");break;
case 2:printf("你的等级:C,还可以\n");break;
case 1:printf("你的等级:D,及格了\n");break;
case 0:printf("你的等级:E,未及格,多加努力\n");break;
default:printf("数据错误!\n");break;
}
10.答题日志
核心代码
FILE*file;
file=fopen("TEST4.txt","a+");
fprintf(file,"%s%d%s%d%s%.2f%%\n","你已正确",count,"道题,完成",i,"道题",(float)count/i*100);
11.网络程序客户端
核心代码
if (WSAStartup(MAKEWORD(2 , 2) , &wsd) != 0) {
printf("Winsock 初始化失败!\n");
return 1;
}
/*创建Socket*/
sClient = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP);
if (sClient == INVALID_SOCKET) {
printf("socket() 失败: %d\n" , WSAGetLastError());
return 1;
}
/*指定服务器地址*/
server.sin_family = AF_INET;
port = atoi(getparameter[PORT]);
server.sin_port = htons(port);
server.sin_addr.s_addr = inet_addr(getparameter[IP]);
if (server.sin_addr.s_addr == INADDR_NONE) {
host = gethostbyname(getparameter[IP]); //输入的地址可能是域名等
if (host == NULL) {
printf("无法解析服务端地址: %s\n" , getparameter[IP]);
return 1;
}
CopyMemory(&server.sin_addr ,
host->h_addr_list[0] ,
host->h_length);
}
/*与服务器建立连接*/
if (connect(sClient , (struct sockaddr*)&server ,
sizeof(server)) == SOCKET_ERROR) {
printf("connect() 失败: %d\n" , WSAGetLastError());
return 1;
}
memset(Buffer,0,sizeof(Buffer));
sprintf(Buffer,"学号姓名:%s,正确%d道题,完成%d道题,用时%d秒",account,count,i,te-ts);
printf("%s",Buffer);
//向服务器发送消息
ret = send(sClient , Buffer , strlen(Buffer) , 0);
printf("已发送字符 %d bytes\n" , ret);
//接收从服务器来的消息
ret = recv(sClient , Buffer , BUFSIZE , 0);
Buffer[ret] = '\0';
printf("已接收字符 %d bytes:\n\t%s\n" , ret , Buffer);
//用完了,关闭socket句柄(文件描述符)
closesocket(sClient);
WSACleanup();
11,窗口修改为学号和姓名
核心代码
sprintf(s,"title 学号,姓名:%s",account);
system(s);
13.网络程序服务端文件的创建与保存
核心代码
FILE*file;
fprintf(file,"%s\n",Buffer);
fclose(file);
四、项目未完成的功能
正在实现的功能有哪些(觉得能做出来的,技术层面已经没什么问题了,只是时间问题)
1,题库按难易比例输出
今后打算实现的功能哪些(觉得现阶段自己无法完成的功能)
客户端自动输入服务器IP地址
五、每日项目进度表及版本更新日志说明
编号 | 功能 | 负责人姓名 | 完成日期 | 该功能的工作量占总工作量的比例 |
---|---|---|---|---|
V1.0 | 1,倒数5s2,随机出题3,比较输入的答案与标准答案,输出不同语句4,输出正确数,答题数,正确率 | 阮涛(5%),余勇(15%) | 11.15 | 20% |
V1.1 | 1.加入学号姓名的输入以及学号纠错功能2.加入答案公布的颜色评定3,加入120s限时功能4,加入成绩等级 | 阮涛(10%),刘晓鹏 (5%) | 11.16 | 15% |
V1.2 | 1,加入对错的颜色 | 余勇 | 11.17 | 5% |
V1.3 | 1,加入考生答案输入自动删除字符前空格回车换行以及字符中的空格 | 阮涛 | 11.18 | 10% |
V1.4 | 1,加入文件的输入与输出 | 刘晓鹏(5%),蒋歆銮(5%) | 11.19 | 10% |
V1.5 | 1,修改主函数内一部分为自定义函数 | 阮涛 | 11.20 | 5% |
V1.6 | 1,加入网络客户端功能 | 阮涛 | 11.21 | 5% |
V2.0 | 1,加入随机不重复出题2,加入自动修改为学号姓名的窗口 | 刘晓鹏(5%),阮涛(5%) | 11.24 | 10% |
服务器模块 | 服务器自动保存文件 | 刘晓鹏(5%),蒋歆銮(5%) | 11.25 | 10% |
其他 | 参与代码的修改 | 刘晓鹏(5%),蒋歆銮(5%) | 11.25 | 10% |
总计 | 阮涛(40%),刘晓鹏(25%),余勇(20%),蒋歆銮(15%) | 100% |
六、相关文档地址
七、每位成员的过程体会
组长:阮涛
这是我第一次当一个项目的组长,在分配任务时我觉得我还是差了一点经验。在这次的项目作业中我学到了如何去主动学习新的知识,我知道我们组的程序不会是最好的,但我能感觉到我们每一个人的努力,我希望接下来的大学生活里我能和大家一起去解决更多的难题。
组员1:刘晓鹏
学习C语言来的第一次大作业,需要用到许多未学甚至没见过的知识与方法,而这次任务的完成同时也说明的大学与高中学习方法的区别不仅要用已知解决未知,同时也需将未知转为已知,而后者的方法便是自学,“有问题上百度”就可以解决许多问题,虽是如此但要用到更简便的方法化难为易则需要更多的思考与经验的积累,此次学习收获了许多同时也巩固了许多知识,但不能满足,每一门行业都有卓越的人才,计算机更是如此,日后的学习中需要思考地更多,用到不同的方法,待到回头望向身后时
能看到一个个脚印.
组员2:余勇
这次课程项目的设计让我学到了很多新的东西,也意识到自身能力的不足,还有很多东西没有学会,并且也意识到团队合作的重要性,只有团结合作、同心协力才能把一个个难题克服,并圆满的完成任务。
组员3:蒋歆銮
这次的小组合作让我学习到了许多知识,其实我是一直在学习(基本是对友打的代码。。)。
不过正是一次一次的代码错误让我认识到了自己,使我愈发努力起来,队友之间的差距让我有了更强的斗志。这次的学习中我也认识到了团结的力量,团结起来的小组是强大的,我们也是坚持不懈的(3点还在快乐的学习,,)。其实,学习的过程还是蛮有味道到(v),希望以后更强大吧。
八、组长想说的话
自我批评篇
在分配任务时我觉得我还是差了一点经验,任务分配不均就是我的锅。有一些基础知识不是很牢固,学过的一些东西还要去查才能记得起来。
自夸篇
虽然编辑程序遇到了很多难题,但是我们通过百度等一些途径学习,一个一个地去解决了问题。还有一次,我、刘晓鹏、蒋歆銮一起码字通宵到凌晨3点,把程序功能全做出来的时候还是有成就感的。我有点喜欢做一些比较灵活的东西,觉得能做出来就很好玩。