




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
程序设计报告( 2012 / 2013 学年 第 二 学期)题 目:C 试题库的管理与维护专 业 理工强化班 学 生 姓 名 班 级 学 号 指 导 教 师 指 导 单 位 计算机软件教学中心 日 期 20XX 年 XX 月 评 评分项 优秀 良好 中等 差遵守机房规章制度上机时的表现学习态度程序准备情况程序设计能力团队合作精神课题功能实现情况算法设计合理性用户界面设计报告书写认真程度内容详实程度文字表达熟练程度分 细 则回答问题准确度简 短 评 语教师签名: XX 2013 年 5 月 日评分等级备注评分等级有五种:优秀、良好、中等、及格、不及格C 试题库的管理与维护一、 课题内容和要求C 试题库的管理与维护系统,主要是实现对试题库的管理与维护。本系统具备对库中的试题进行浏览,查询,添加,修改,删除的功能,同时还可用于生成试卷。这些功能模块的实现是系统需要解决的主要问题。开发时运用“模块化程序设计”的思想,将主系统分为几个功能子系统,再根据实际需要对各子系统进行进一步的划分,再进行开发。通过对此系统的开发,可以熟练掌握单链表结构、文件读写、函数调用等知识,以及查找等法的设计与应用。二、 需求分析查询试题添加试题修改试题删除试题生成试卷按章节C 试题库电脑随机人工制定按难度图 1 功能框架图(1)提供可供选择操作的主菜单:输出的菜单用于显示以从文件中加载的试题信息及若干个可以选择的功能选项。根据试题输入的选项来运行不同的功能,运行不同的函数。保存退出(2)进行文本信息的载入:从指定的文件中以链表的形式加载所需的试题信息建立链表。这里的文件是在编译时就已经指定好的存在的文本,需要设计者预先自己建立好。(3)查找试题功能:以试题输入的章节题号或难度进行查找对应的试题信息并将它们输出。通过所建立的链表进行对应的查找。(4)添加一道新的试题的功能:将管理员希望添加的试题信息添加到指定的试题信息之前,并提示管理员按正确的格式输入,并建立添加链表节点的函数将试题加入,若是插入题目,则更改该题目编号后的编号保证题库连续完整性。(5)删除一道试题的功能:将管理员希望删除的某道试题信息删除。 (这里的删除只是才内存中建立的链表中删除,在保存之前待删试题的信息还储存在原文本只中的) 。同时修改该题之后题目编号,保证题目完整连续性。(6)进行试题信息的修改:根据试题的名称,找到对应的链表(题目) ,将链表中的信息重置。内容应由管理员输入,由一系列读写函数实现。(7)从试题库中抽取题目生成试卷:按管理员的需求,输入题目存储路径后,可以选择机器生成试卷(默认难度为 3.5) ,也可以指定题目总数,自行决定题目难度、指定每章题目数量等,最后生成试卷并保存至用户指定的路径。(8)对现有信息的保存并退出程序:保存内存中的最新的记录输出到磁盘文件中,这里默认的是保存到原读取文件中并覆盖原来的信息。 三、概要设计 1 主要结构体struct questionchar id256; /题目编号char intro256; /题目简介char level256; /题目难度 :1 2 3 4 5/ 最简单 简单 普通 困难 超难char title256; /题干char choice256; /选项char answer256; /答案int count; /该题被选中次数struct question *next; /指向下一道题;2 主要函数流程图:(1)主菜单函数:用于从文本中载入信息并建立链表,此处用链表方式读入,用(struct question*)malloc(sizeof(struct question)来动态建立链表结点树目,此处以一个结构体内容作为一个结点, 加载函数流程图如图 2 所示。 开始加载输入选择54321 0查询试题生成试卷修改试 题添加试题删除试题保存退出图 2 加载函数图 (2)查询函数:登陆用户输入需要查询的试题信息,并输入查询类型,系统判断查询的试题是否存在,通过流程图如图 3 所示。开始查询按题号查询按章节查询按难度查询判断试题是否存在输出结果 退出是 否图 3 查询函数图(3)添加函数:如图 4。 开始添加输入章节号试题描述试题难度试题内容选项答案完成,退出图 4 添加函数图(4)修改函数:修改试题的编号、难度、题干、选项、答案等信息。如图 5。开始修改输入试题编号判断是否存在是 否试题不存在退出输出原题输入修改后的试题图 5 修改函数图(5)删除函数:用户输入需要删除的试题编号流程图如图 6.输入要删除的题目信息开始删除否是判断是否存在输出原题 原题不存在是否确认 修改 是否删除退出图 6 删除函数图(6)生成试卷函数:创建新文件,由管理员或系统给定试题总数目、难度,通过产生的伪随机数实现各章题目随机选择,将选择的题目文本输入到新文件中,达到自动成卷功能。并生成对应答案文件,保存其他相关试卷信息。如图 7。生成试卷人工指定试题 电脑随机生成输入试题保存位置输入试题总数量输入试卷难度输入每章题数全部随机生成完成,退出图 7 生成试卷函数图(7)退出函数:保存链表信息,并退出。如图 8。选择退出保存文件退出图 8 退出函数图四、源程序代码 #include#include#include#include#includeint count=0; /定义一个全局变量存放总题数/*定义结构体*struct questionchar id256; /题目编号 /*将题目信息统一定义成字符串是为了读写操作方便*/char intro256; /题目简介char level256; /题目难度 :1 2 3 4 5/ 最简单 简单 普通 困难 超难char title256; /题干char choice256; /选项char answer256; /答案int count; /该题被选中次数struct question *next; /指向下一道题;/*主要函数声明*void pchapter(struct question * head,int * /统计每章题数void menu(struct question * head); /菜单函数,显示题库信息和操作void printQuestion(struct question * head); /输出一道题目void inputQuestion(struct question * head); /输入一道题目struct question * searchQuestion1(struct question * head,char *s ); /按编号查询一道题目并返回节点指针void searchQuestion2(struct question * head ); /查询题目void addQuestion(struct question * head) ; /增加题目void modifyQuestion(struct question * head); /修改题目void deleteQuestion(struct question * head); /删除题目void saveQuestion(struct question * head); /保存题目void createQuestion(struct question * head,int *pcount); /生成试卷struct question * Read(); /读入题目void random(double hard,int * chapter,int*pcount,struct question * p,FILE *fp1,FILE *fp2) ;/抽取试题/*main 函数*int main()int c,i;struct question *head;/定义一个头指针head=Read() ; /从文件读取题目至链表int pcount7=0; /定义一个数组存放每章题数int *q;q=pcount;pchapter(head,q); /调用函数统计每章题数for(i=1;ic;switch (c) case 1: /查询试题searchQuestion2(head);system(“pause“);/暂停输出屏幕break;case 2:/增加试题addQuestion(head);break;case 3: /修改试题modifyQuestion(head);break;case 4: /删除试题deleteQuestion(head);break;case 5: /生成试卷createQuestion(head,pcount);system(“pause“);break;case 0:saveQuestion(head); /保存对题库的操作coutnext)/单链表的遍历if(int(q-id1)=i+48)/字符型转变为整型比较,判断题目章节是否为当前章节ai-1+;/菜单函数void menu(struct question * head)int pcount7=0;int *q;q=pcount;pchapter(head,q);/调用函数统计每章题数int i;coutid);printf(“ 题目简介:%sn“,head-intro);printf(“ 题目难度:%sn“,head-level);printf(“ 题目: %sn“,head-title);printf(“ 选项:%sn“,head-choice);printf(“ 答案:%sn“,head-answer);printf(“ 题目被选次数:%dnn“,head-count);printf(“*nn“);/输入一题void inputQuestion(struct question * q)int i;coutq-intro;for(i=0;q-introi!=0;)i+;for(int a=i;aintroa= ;q-intro255=0;coutq-level;for(i=0;q-leveli!=0;)i+;for(int b=i;blevelb= ;q-level255=0;coutq-title;for(i=0;q-titlei!=0;)i+;for(int c=i;ctitlec= ;q-title255=0;coutq-choice;for(i=0;q-choicei!=0;)i+;for(int d=i;dchoiced= ;q-choice255=0;coutq-answer;for(i=0;q-answeri!=0;)i+;for(int e=i;eanswere= ;q-answer255=0;q-count=0;/按编号找到一题并返回结点指针,用于删除,修改时先查询是否存在struct question * searchQuestion1(struct question * head,char *s)for(;head;head=head-next)if(head-id0=s0)return head;/如果没有此题,指针移动到链表尾, head=NULL/查询并输出题目信息void searchQuestion2(struct question * head )char s256;int ok=0,choice;coutchoice;switch (choice)case 1:couts;for(;head;head=head-next)if(head-id0=s0)ok=1;if(!ok) couts;if(searchQuestion1( head,s)printQuestion(searchQuestion1(head,s );elsecouts;for(;head;head=head-next)if(head-level0=s0) printQuestion(head);ok=1;if(!ok) couts;struct question * q=(struct question*)malloc(sizeof(struct question); /插入新的结点for(;head;head=head-next)if(head-id1=s1)break; else continue;/找到每章最后一题的指针if(!ok)coutid,head-id);inputQuestion(q);/输入增加题目的信息q-next=head-next;head-next=q; /新的链表coutid4+;if(q-id49)q-id4=0;q-id3+;/改变增加后题目的编号 /修改题目void modifyQuestion(struct question * head) char s256;int ok=0;couts;if(!searchQuestion1( head,s)couts;if(!searchQuestion1( head,s)coutch;if(ch=y)if(s4=0)for(;head;head=head-next)if(head-id1=s1if(s4=1head;head=head-next)if(head-id1=s1-1 for(;head;head=head-next)if(head-id1=s1/找到前一题的指针struct question * p=(struct question *)malloc(sizeof(struct question *);struct question * q=(struct question *)malloc(sizeof(struct question *);temp=head-next-id1;/temp 存放被删除题目的章节p=head-next;q=p-next;head-next=q;/删除此题节点for(;qq=q-next)if(q-id1=temp)q-id4-;if(q-id4id4=9;q-id3-; /改变删除后的题号coutnext) fprintf(fp1,“%s“,p-id);fprintf(fp1,“%s“,p-intro);fprintf(fp1,“%s“,p-level);fprintf(fp1,“%s“,p-title);fprintf(fp1,“%s“,p-choice);fprintf(fp1,“%s“,p-answer);fprintf(fp1,“%dnn“,p-count);fclose(fp1);/生成试卷void createQuestion(struct question * head,int *pcount) /用 pcount 获得题库中每章题数srand(time(NULL);int number=0,num=0,chapter7,choice,i;/number 记录总题数,chapter 记录每章题数double hard;char s100;couts;FILE *fp1,*fp2;if( (fp1=fopen(s,“w“) = NULL )printf(“生成试卷失败!“);exit(-1);if( (fp2=fopen(“答案.txt“,“w“) = NULL )printf(“ 生成试卷失败!“);exit(-1);coutchoice;switch (choice)case 1: coutnumber;couthard;printf(“ 请输入试卷组成(请合理输入以免产生错误!):n“);for(i=1;ichapteri-1;num+=chapteri-1;/输入每章题数if(num!=number)printf(“题目数量不正确!n“);return ;/判断每章题数之和是否等于总题数random(hard,chapter,pcount,head,fp1,fp2);/调用随机抽题函数printf(“ 试题生成成功!n 答案保存在当前路径下:答案.txt n“);break;case 2:for(i=1;inext=p;headtail=p;struct question * headtail=NULL;p=p-next;while(p);headtail-next=NULL;struct question * phead=NULL;struct question * ptail=NULL;int z;for( z=1;znext=NULL;for(int m=0; ;m+ ) /找到该章节int n=(head-id1-j-49); /字符转换为整形比较if(n=0)break;head=head-next;for(int y=0; ylevel0-48;if(xhard-2)struct question * pnew2=(struct question*)malloc(sizeof(struct question);head-count+;/题目被抽到的次数加 1strcpy(pnew2-id,head-id);strcpy(pnew2-title,head-title);strcpy(pnew2-choice,head-choice);strcpy(pnew2-answer,head-answer);fprintf(fp1,“%s“,pnew2-id);fprintf(fp1,“%s“,pnew2-title);fprintf(fp1,“%sn“,pnew2-choice);fprintf(fp2,“%s“,pnew2-answer);count+;head=head-next;/ /读入题目struct question * Read() /读入题目struct question *head,*tail,*pnew;/定义一个头指针,尾指针,结点指针FILE *fp;char string256;int size;head=NULL;tail=NULL;pnew=NULL;size=sizeof(struct question);fp=fopen(“TIKU.txt“,“r“);if(fp=NULL)printf(“打开题库失败!n“);exit(-1);fgets(string,256,fp);while(!feof(fp)pnew=(struct question*)malloc(size);pnew-next=NULL;strcpy(pnew-id,string);fgets(string,256,fp);strcpy(pnew-intro,string);fgets(string,256,fp);strcpy(pnew-level,string);fgets(string,256,fp);strcpy(pnew-title,string);fgets(string,256,fp);strcpy(pnew-choice,string);fgets(string,256,fp);strcpy(pnew-answer,string);fgets(string,256,fp);pnew-count=atoi(string);/把字符串转换为整型数fgets(string,256,fp);fgets(string,256,fp);if(head=NULL)head=pnew;elsetail-next=pnew;tail=pnew;/依次将题目读入结点并连接成链表fclose(fp);return head;五、测试数据及其结果分析(1)显示的主菜单界面:图 1(2)查询试题测试(按题号查询):图 2(3)添加试题测试:图 3(4)修改试题测试:未修改前的试题:图 4修改后的试题:图 5(5) 删除试题测试:图 6(6)生成试卷测试:图 7生成的试卷:图 8生成试卷前: 生成试卷后:生成试卷后,题目被抽到的次数发生改变。结果分析:(1)在输入菜单选项时如果输入的内容不是 1-6 之间的数字,而是其他数字、字母或符号,系统将继续执行等待下次正确的输入。(2)在需要输入所须查找或者删除、修改的试题信息处,如输入的试题信息不在系统中、或是选项不符,系统提示输入错误并返回菜单。(3)在需要输入所需添加的试题信息,如果添加的试题编号已经存在,系统会将之后相应的题目序号更改,然后返回菜单。(4)生成试卷时,可选择机器自动生成,只需指定题目数量后,机器会在每章抽取相同数目的题目,并保持难度在 3.5 左右。(5)人工指定生成试卷,可指定每章题目数量、难度,系统会在链表中随机抽取题目,选取题目难度相近的题目生成试卷(会有一定误差,也可以修改代码来保证精确性) 。(6)生成试卷时,由于试题库题目有限,所以如果输入题目数量过大,可能导致链表访问非法空间,所以输入时系统会给出提示,否则程序可能会崩溃。(7)在输入 6 选择退出主菜单的情况下,系统会先保存试题再退出,否则进行的修改、添加、删除等操作将无法写入文件。六、调试过程中的问题1. 从试题库中载入信息时注意用链表方式读入,要知道用(struct question_type *)malloc(sizeof(struct question_type)来动态建立链表结点树目 ,如何建立链表来储存文件信息是关键,也是第一步。2. 由于题目、选项长度的不确定性,我们将每道题所以信息都写在一行。并且用长度为 256 的字符数组存储,这样既控制了格式也方便读取。3. 在文件的读写的编译过程中,要注意,需要加上 if( (fp1=fopen(“D:TIKU.txt“,“r“) = NULL ) printf(“无法打开试题库!“); exit(-1); 这类的判断语句,这样如果文件没有打开,系统会给出提示,文件不存在。否则将会产生不可预料的错误4. 添加、修改题目后,写入文件,会由于数组长度不符而导致文件格式与规定格式不符,通过查找字符串尾0 ,修改字符串,保证每个数据长度保持不变,以便下次读取文件错乱。5. 插入、删除题目后可能会使是题库中有相同的题目编号,通过链表查找原题号,并找到该章节,一次修改编号,保证题目完整连续。6. 生成试卷中的问题较为复杂,因为控制每章节题目数量、难度比较困难,最后通过生成随机数,移动链表,比较题目难度(有 0.5 的误差,可调节)是否符合要求,最后生成试卷。7. 一些细节应该注意,比如 system(“pause“)和 system(“cls“)等的使 用,要考虑到程序运行的时候需要清除屏幕,或者实
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 购买液压拖车合同范本
- 帮带宠物出境合同范本
- 合伙开火锅店合作协议书2篇
- 高压注水泵房配电设备维修技术协议3篇
- 考勤工作心得体会怎么写(范文10篇)
- 指导性案例的题目及答案
- 八月一日讲话参考
- 旅游行业活动策划攻略
- 2025年事业单位工勤技能考试考试题库及参考答案
- CN222980410U 一种静簧与线圈架装配结构及拍合式继电器 (四川宏发电声有限公司)
- 2025年威海桃威铁路有限公司招聘笔试参考题库含答案解析
- 妊娠期高血压疾病的观察及护理
- 医院DIP支付方式改革工作实施方案
- 完成筹备申请正式设立高等职业学校的审批办理流程
- 手足显微外科护理常规
- 《开关培训》课件
- 俄乌冲突课件初中生
- 【初中英语】15天背完英语3500词
- 2024上海中考考纲单词
- 《激光原理及应用》全套课件
- 成人高考成考大学语文(专升本)试题及答案指导(2025年)
评论
0/150
提交评论