一、课程设计题目基本要求介绍
简单介绍要做一个什么软件,大概有什么功能,要用到哪些知识。(相当于简单的需求分析)
我们小组准备制作一个网络版的学生答题程序。
该程序需要有以下功能:
1.
(1)该函数判断账号是否由10位学号+姓名构成,10位学号的格式应该是1(【6-9】表示6-9中的1个数,13表示计算机学院)
(2)如果判断不合法就返回0,否则就返回1
(需要掌握数组,条件函数,c语言的基础知识)
2.
(1)该函数直接修改CMD的窗口标题,标题应该为账号名
3.
(1)创建一个TXT文本
(2)文本的名称为:学号+姓名
(3)向这个TXT文本中输入用户的答题信息
(需要掌握怎样设置文件指针对文本文件进行操作)
4.
(1)在程序的开始界面显示学生拥有的答题时间,学号,姓名
(需要掌握printf的基本用法)
5.
(1)在开始答题前先倒计时5秒,每倒计时1s显示倒计时的时间
(2)倒计时的5秒不计入答题时间
6.
(1)当学生开始答题时开始计时
7.
(1)随机抽取题库中的题目
(2)抽取的题目不重复
(3)难易比例为1:2
8.
(1)学生可以输入答案
9.
(1)开头的回车,空格不影响答案(该程序可以把学生误输入的空格、回车忽略)
(2)中间的空格不影响答案(该程序可以把学生误输入的空格忽略)
(3)大小写不影响答案(该程序可以把学生输入的大写答案全部改成小写)
9.
(1)将用户输入的答案与题库中对应的题目进行对比
(2)如果正确返回1,否则返回0
(3)后台的答题总数+1,如果正确,正确数+1
10.
(1)如果用户的答题数已达到上限(50题)则终止程序
(2)如果用户的答题时间已达到上限(120S)则终止程序
(3)如果以上均未达到上限则继续答题
11.
(1)输出语句,用户的答题数,正确数,正确率,耗时
(2)输出语句,按照用户的成绩输出不同的温馨语句
(3)输出语句,按照用户的成绩输出不同颜色的等级(S,A,B,C,D,E)
12.
(1)将TXT文件发送至服务端
13.
(1)发布软件的release版本
二、流程图
三、项目目前的进展
*主要写已实现的功能,功能完成的具体程度。
1.判断账号是否正确,不正确重复。
2.修改窗口标题为账号名
3.创建TXT文本并且将用户信息放入(不能讲全部放入)
4.显示用户有的答题时间,学号和姓名
5.倒计时
6.计时功能
7.随机抽取题目(难易比例,题目不重复没有完成)
8.处理用户输入的答案(开头的回车、空格,和中间的空格)
9.检查答案是否正确
10.输出语句,用户的答题数,正确数正确率,耗时,等级,温馨语句
11.如果超时或者完成题目数量了结束程序,否则继续抽题
12.release版本(未完成)
13.网络版可以讲TXT文件发送至服务端(未完成)
3.核心功能讲解
(1)检查账号功能
- 实现该功能的思想
利用ASCII码来排除不需要的数字和确定汉字- 核心代码
-
{else if((int)account[i] > 0 && (int)i < 13) //判断汉字
return 1;
} - 效果图
(2)随机抽题功能
- 实现该功能的思想
将已经抽过的题目排除在抽题范围之外- 核心代码
- 效果图
四、项目未完成的功能
正在实现的功能有哪些(觉得能做出来的,技术层面已经没什么问题了,只是时间问题)
- Release版本
今后打算实现的功能哪些(觉得现阶段自己无法完成的功能) - 网络版本有服务器和客户端
- TXT文件中记录全部的答题信息
- 随机抽题不重复,难易比1:2
- 发送TXT文件至服务端
五、每日项目进度表及版本更新日志说明(注意:用表格填空)
六、相关文档地址
1.【PPT链接,点击直接下载PPT】关于技术层面的核心、特色功能的报告PPT(要封面,有主讲人,有目录,每个功能先讲思想,后讲少许核心代码)
2.【视频链接,点击直接下载视频】项目演示视频(视频需要附讲、有声音,讲到一个点的时候提示观众是什么功能了)
七、每位成员的过程体会
组长姓名:孔宏剑
这次的课程设计,我感觉我学到了很多东西,比如如何与组员们一起工作一起讨论问题。而且在完成我自己负责的这块功能时,遇到很多不会的东西,但是都通过我自己各方面的查找资料,解决了这些问题,提高了我的自信心以及专业能力。然后在过程当中,一开始我感觉十分的焦灼,一下子接触看上去这么高大上的东西,想着我真的完成的了吗?万幸的是,我完成了,虽然完成度不高,但是还是感觉非常棒的。在中期的时候,感觉走上正轨了,开始慢慢敲代码,慢慢解决难题。到了后期整合代码的时候,就又感觉非常头疼,有些东西就是不知道哪里错误,但是不找出来又不行,一个问题需要想几个小时。以上就是我的体会。
组员1姓名:倪鸿荣
这一次的课程对我本身也是一个挑战吧,刚开始就觉得很难吧,可是做起来更难,需要做的和考虑的很多很多,也发现了自己很多考虑不周到的地方,而且这一次编程用到了很多很多自己没学的地方,我只能在收集资料自己去学习,去应用,虽然这一次的编程不算成功,但是我在其中学习到了做一名优秀的程序员应有的品质,我也会向其靠齐
组员2姓名:阳睿
在为期一周的课程设计里,我们组三位成员从构思到实践,初步的完成了一次程序设计。在这其中,深刻的认识到自己在设计中,构思能力、动手实践能力有待加强。我们三个算是一个小小的团队,做好程序不是某一个人的事,个人觉得我们组在沟通交流方面比较密切,尽管没能完成每一个加分项,但是还是收获到了很多,非常感谢并且珍惜这样的一次机会。
八、组长想说的话
自我批评篇
对于这次课程设计,我们组还是存在很多问题的,首先是因为组内成员有女生,所以组员在线下很少在一起敲代码沟通,更多的是在线上沟通。其次,因为组员实力差距比较明显,所以分工有些不大合理,能者多劳,有能力的把大多数的难题解决了而能力偏弱的则没在此次编程中获得什么。第三,因为第一次接触这种形式的编程,所以我们组一开始有很长一段时间的迷茫期,不知道自己要干什么,也不知道自己要从何下手。最后,因为组员实力总体偏弱,所以我们做课程的时候大多数是在截止前几天,做工比较赶,程序也比较粗糙。
自夸篇
我们组的成员有不耻下问的好品行,没当遇到不懂得,就会面向百度,学长学姐以及老师进行编程。我们组的成员也是十分的扎实,负责的任务没有怨言,甚至在自己那块完成后会主动帮其他成员完成任务,大家一起完成课程。每当遇到难题的时候会一起想办法想思路,不会甩锅给负责的那个人。面对加分项,就算实力不够,我们也尽力去完成,不会直接放弃。
九、源码
#include<stdio.h>
#include<string.h>
#include<time.h>
clock_t start, stop; //clock_t为clock()函数返回的变量类型
#include<windows.h>
double duration;
int islogin(char account[]);
void color(short x);
void remove1 (char a[]);
int main()
{
char question[][100] =
{
"2^16的次方是多少?",
"2^15的次方是多少?",
"2^12的次方是多少?",
"2^11的次方是多少?",
"2^10的次方是多少?",
"2^9的次方是多少?",
"2^8的次方是多少?",
"2^6的次方是多少?",
"-1的补码是多少?",
"28的十六进制补码",
"32的十六进制补码",
"75的十六进制补码",
"60的十六进制补码",
"42的十六进制补码",
"48的十六进制补码",
"65的十六进制补码",
"97的十六进制补码",
"10(十进制转二进制)",
"12(十进制转二进制)",
"14(十进制转二进制)",
"6(十进制转二进制)",
"8(十进制转二进制)",
"内存的英文单词",
"数组的英文单词",
"语法的英文单词",
"交换的英文单词",
"变量的英文单词",
"参数的英文单词",
"0的ASCII值",
"A的ASCII值",
"a的ASCII值",
};
char answer[][100] =
{
"65536",
"32768",
"4096",
"2048",
"1024",
"512",
"256",
"64",
"ff",
"1c",
"20",
"4b",
"3c",
"2a",
"30",
"41",
"61",
"1010",
"1100",
"1110",
"110",
"1000",
"memory",
"array",
"syntax",
"swap",
"variable",
"parameter",
"48",
"65",
"97",
};
//题库
char account[30];
int i,d;//duo i
int Countdown=5;
char myanswer[100];
int questionnum;
int count = 0;
int random_index;
double a,b,c;
int correct;//正确率
FILE * file;
char filename[20] = "input.txt";
char ch ;
srand((unsigned int)time(NULL));
printf("请输入用户名:学号+姓名\n");
gets(account);
remove1(account);
printf("%s\n",account);
while(islogin(account))
{
printf("请输入正确的用户名:学号+姓名\n");
memset(account,'\0',sizeof(account));
gets(account);
remove1(account);
printf("%s\n",account);
}
SetConsoleTitle(account);//窗口改名
printf("生成文件:%s\n",account);
file = fopen(account,"w+");//以写入模式生成文件,并将文件地址赋给文件指针变量
if( file == NULL) //生成文件失败,指针为空
{
printf("打开文件失败");
}
printf("%s\n",account);//将文件名_FLAG输出到屏幕
fprintf(file,"%s\n",account); //将filename以%s的形式写入文件file中,在%s后面增加“_FLAG1”字符串作为标记
//指定倒计时在运行时的颜色
while(Countdown>=0)
{
printf("距离开始答题还有%d秒\n",Countdown);
Sleep(1000);
Countdown=Countdown-1;
}
//以上为倒计时代码
questionnum = sizeof(question)/sizeof(question[0]);
printf("---------------------\n");
a=clock();
fprintf(file,"你的成绩如下\n");
for( i = 0 ; i < questionnum ; i++)
{
random_index=rand()% questionnum ;//random_index表示随机产生的下标,范围0~4
d=random_index;
color (15) ;printf("第%d题:%s\n",i+1,question[d]);//question[0],question[1] 教材P146页
fprintf(file,"请输入第%d题的答案\n",i+1);
gets(myanswer);
fprintf(file,"%s\n",question[d]);
fprintf(file,"%s\n",myanswer);
remove1(myanswer);
if( strcmp(strlwr(myanswer),answer[random_index]) == 0 )
{
count++;
color(10); printf("^_^恭喜你,回答正确你已经答对%d题\n",count);
}
else
{
color(12); printf(">_<你回答错误!\n");
}
printf("\n");
b = clock();
printf("您已耗时%.2lf秒\n",(b-a)/1000.0);
if(((b-a)/1000)>=120){break;}//120秒限时
}
c = clock();
correct = (float)count / 5 * 100;
printf("你一共正确%d道题,你答题的正确率为%.2f%%\n",count,(float)count/(i+1)*100);//%f ieee754标准
printf("您耗时%.2f秒\n",(c-a)/1000.0);//输出计时的时间
if(correct==100)
color(14); printf("您的等级是S,你是最棒的\n");
if(correct>89&&correct<100)
color(10); printf("您的等级是A,你好棒\n");
if(79<correct&&correct<90)
color(7); printf("您的等级是B,加油,你离成功还差那么一点\n");
if(69<correct&&correct<80)
color(8); printf("您的等级是C,你还需努力\n");
if(59<correct&&correct<70)
printf("您的等级是D,小心了,马上就不及格了\n");
if(0<=correct&&correct<60)
printf("您的等级是E,同学,上课少睡觉,少玩手机,多听老师,多学习!\n");
//以上为计时代码
return 0;
}
fclose(file); //关闭文件指针变量
//——————自定义函数--------------------
int islogin(char account[])//10位数字加汉字功能
{
int i;
if(strlen(account) < 11){return 1;}
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')
{
return 1;
}
for(i = 7; i < strlen(account); i++)
{
if(i<10)
{
if(account[i]<'0' || account[i]>'9')
{
return 1;
}
}
else if((int)account[i] > 0 && (int)i < 13) //判断汉字
{
return 1;
}
}
return 0;
}
void color(short x)//颜色
{
if(x>=0 && x<=15)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7);
}
}
void remove1 (char a[])
{
int i,k;
char c[100];
for(i = 0,k=0; i<strlen(a);i++)
{
if(a[i]!=' '||a[i]!='\0')
{
c[k]=a[i];
k++;
}
}
c[k]='\0';
strcpy(a,c);
}
//————————————————
//版权声明:本文为CSDN博主「viafcccy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
//原文链接:https://blog.csdn.net/viafcccy/article/details/85255754
//————————————————
//版权声明:本文为CSDN博主「comoca」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
//原文链接:https://blog.csdn.net/jmj18756235518/article/details/79888206
十、组员分数分配
倪鸿荣(45%)
阳睿(25%)
孔宏剑(30%)