课程报告课程名称:程序设计实践专业班级:学生姓名:学号:任课教师:唐建国学期:2013-2014学年第二学期成绩评定教师:目录目录 (1)1 需求分析 (2)2 系统设计 (2)2.1.数据结构设计 (2)2.2.功能模块设计 (3)2.2.1:主菜单模块 (3)2.2.2:教师菜单模块 (4)2.2.3:学生菜单模块 (5)3 系统实现及关键代码 (5)3.1基本功能 (5)3.1.1菜单设计 (5)3.1.2文件读写 (7)3.1.3删除题目信息 (8)3.2拓展功能 (9)3.2.1密码设计 (9)3.2.2考试函数 (10)4系统演示 (11)4.1基本功能 (11)4.1.1文件读写功能 (11)4.1.2插入题目功能 (11)4.2拓展功能 (12)4.2.1密码功能 (12)4.2.2考试功能 (13)5总结 (13)5.1系统缺陷与不足 (13)5.2系统可扩展功能 (13)6课程心得总结 (14)参考书籍: (15)1 需求分析根据程序要求分析,我们认为整个程序应该分为4个大块,其中包括主函数以及其他功能函数:注册登录模块,学生操作模块,教师操作模块。
各个模块又利用小模块实现小功能划分,教师操作模块由创建题库、插入题目、修改题目、删除题目、显示题目、题目排序、查询题目这7个模块组成,而其中查询题目又包含了题号查询、题目查询和模糊查询3个小模块;注册登录模块由4个函数完成对学生教师不同身份的注册及登录,学生登录后可以选择答题数量组成试卷考试并得到成绩。
通过这些模块的组合连接,就可以实现一个完整的标准化考试系统。
2 系统设计2.1.数据结构设计void Student_login();/*学生登录*/void Teacher_login();/*教师登录*/void denglu();/*主菜单*/void Addstudent(char id[],char password[]);/*将学生账号密码存入文件*/void Addteacher(char id[],char password[]);/*将教师账号密码存入文件*/void Teachermenu();/*教师菜单*/void Studentmenu();/*学生菜单*/void PrintDoc(struct text * head);/*从文件中读取题库信息并输出*/void NameQueDoc(struct text * head);/*按照题目查询信息*/void NumberQueDoc(struct text * head);/*按照题号查询信息*/void NameVagueDoc(struct text * head);/*按照题目模糊查询信息*/void kaoshi(struct text *head,int sum,int k);/*学生考试菜单*/void fprint(struct text *head);/*将链表写入文件*/struct text * CreateDoc();/*创建试题库并通过链表存入文件*/struct text *load();/*从文件读取题库信息并存入链表*/struct text * DeleteDoc(struct text * head);/*删除题库题目信息*/struct text * ReviseDoc(struct text * head);/*修改题库题目信息*/struct text * InsertDoc(struct text * head,struct text * book);/*插入题目*/struct text * SortDoc(struct text * head);/*对题库题目进行排序*/struct text * QueDoc(struct text * head);/*题库查询菜单*/int count(struct text *head);/*统计题库中题目总数*/int yanzheng(struct text *head,int m);/*验证题号是否重复*/ char *Getpasswd(void);/*将注册登录的密码转为星号*/ struct text{int number;char que[81];char answer1[81];char answer2[81];char answer3[81];char answer4[81];char ture[81];struct text *next;};/*定义text 结构*/2.2.功能模块设计2.2.1:主菜单模块2.2.2:教师菜单模块2.2.3:学生菜单模块3 系统实现及关键代码3.1基本功能3.1.1菜单设计void denglu(){char id[81],password1[81]={NULL},password2[81]={NULL};int choice,choi;printf("\n");printf(" 〒〒〒〒〒欢迎进入标准化考试系统:〒〒〒〒〒\n");printf(" ★★★★★★★welcome★★★★★★★\n");printf("\t *【1】注册账户*\n");printf("\t *【2】登陆账户*\n");printf("\t *【0】退出系统*\n");printf("\n");printf("请输入你的选择:");scanf("%d",&choice);system("cls");//清屏switch(choice){case 1:printf("\n");printf(" 〒〒〒〒欢迎进入标准化考试系统注册账户界面:〒〒〒〒\n");printf(" ★★★★★★★★★welcome★★★★★★★★★\n");printf(" 1-----学生注册2-----教师注册\n");printf(" 3-----返回上一级0-----退出系统\n");printf("\n");printf("请选择注册模式:");scanf("%d",&choi);system("cls");//清屏switch(choi){case 1:printf("\n");printf(" 〒〒〒〒欢迎进入标准化考试系统学生注册界面:〒〒〒〒\n");printf(" ★★★★★★★★★welcome★★★★★★★★★\n");printf("请输入学生姓名:");scanf("%s",&id);printf("请输入密码,密码长度最大为6:");strcpy(password1,GetPasswd());printf("\n请再次输入密码:");strcpy(password2,GetPasswd());if(strcmp(password1,password2)==0)Addstudent(id,password1);elseprintf("\n两次密码不一致,返回主菜单!\n");denglu();case 2:printf("\n");printf(" 〒〒〒〒欢迎进入标准化考试系统教师注册界面:〒〒〒〒\n");printf(" ★★★★★★★★★welcome★★★★★★★★★\n");printf("请输入教师姓名:");scanf("%s",&id);printf("请输入密码,密码长度最大为6:");strcpy(password1,GetPasswd());printf("\n请再次输入密码:");strcpy(password2,GetPasswd());if(strcmp(password1,password2)==0)Addteacher(id,password1);elseprintf("\n两次密码不一致,返回主菜单!\n");denglu();case 3:denglu();case 0:printf("系统即将关闭!\n");exit(0);default :printf("无效选项!\n");denglu();}case 2:printf("\n");printf(" 〒〒〒〒欢迎进入标准化考试系统注册账户界面:〒〒〒〒\n");printf(" ★★★★★★★★★welcome★★★★★★★★★\n");printf(" 1-----学生登录2-----教师登录\n");printf(" 3-----返回上一级0-----退出系统\n");printf("\n");printf("请选择登录模式:");scanf("%d",&choi);system("cls");//清屏switch(choi){case 1:Student_login();case 2:Teacher_login();case 3:denglu();case 0:printf("系统即将关闭!\n");exit(0);default :printf("无效选项\n");denglu();}case 0:printf("系统即将关闭!\n");exit(0);default :printf("无效选项!\n");denglu();}}3.1.2文件读写/*-----------------------------------------------将链表写入文件--------------------------------------*/void fprint(struct text *head){FILE *fp;struct text *p1;if((fp=fopen("G:\\试题库.txt","w"))==NULL){printf("Can not open the file!\n");exit(0);}for(p1=head;p1;p1=p1->next){fprintf(fp,"%d %s %s %s %s %s %s\n",p1->number,p1->que,p1->answer1,p1->answer2,p1->answer3,p1->a nswer4,p1->ture);}fclose(fp);}/*------------------------------------------从文件读取题库信息--------------------------*/ struct text *load(){FILE *fp;struct text *head,*tail,*p1;head=tail=NULL;if((fp=fopen("G:\\试题库.txt","r"))==NULL){printf("文件输入错误!\n");exit(0);}if(!feof(fp)){while(!feof(fp)){p1=(struct text *)malloc(sizeof(struct text));fscanf(fp,"%d%s%s%s%s%s%s\n",&p1->number,p1->que,p1->answer1,p1->answer2,p1->answer3,&p1->a nswer4,&p1->ture);if(head==NULL)head=p1;elsetail->next=p1;tail=p1;}tail->next=NULL;fclose(fp);return head;}elsereturn NULL;}3.1.3删除题目信息struct text * DeleteDoc(struct text * head){int a;struct text *p1,*p2;printf("请输入要删除题目的题号:");scanf("%d",&a);while(head!=NULL&&head->number==a){p2=head;head=head->next;free(p2);}if(head==NULL){return NULL;}p1=head;p2=head->next;while(p2!=NULL){if(p2->number==a){p1->next=p2->next;free(p2);}elsep1=p2;p2=p1->next;}fprint(head);return head;}3.2拓展功能3.2.1密码设计char *GetPasswd(void){char c;int i=0;char passwd[6]={NULL};while ((c=getch())!='\r'){passwd[i]=c;putchar('*');i++;if (i>=6){break;}}return passwd;}3.2.2考试函数void kaoshi(struct text *head,int sum,int k)/*随机抽题考试*/{int score=0,a[1000],i,j;char answer[81],answer1[81];srand((unsigned)time(NULL)); /*保证随机出来不重复的数字*/ for(i=0;i<sum;i++){a[i]=rand()%k+1; /*随机产生1~k之间一个整数*/ for(j=0;j<i;j++)if(a[i]==a[j])i--;}for(i=0;i<sum;i++){struct text*p;p=head;while(p!=NULL){if(p->number==a[i])break;p=p->next;}printf("题号:%d\n",p->number);printf("题目:%s\n",p->que);printf("选项A:%s 选项B:%s\n",p->answer1,p->answer2);printf("选项C:%s 选项D:%s\n",p->answer3,p->answer4);strcpy(answer,p->ture);printf("\n");printf("请输入答案:");scanf("%s",answer1);if(strcmp(answer,answer1)==0){printf("回答正确!\n");printf("\n");score++;}else{printf("答案错误!\n");printf("正确答案为:%s\n",answer);printf("\n");}}printf("您的总成绩为:%d",score);}/*学生通过此函数对随机的试题进行答题并得到自己的成绩*/ 4系统演示4.1基本功能4.1.1文件读写功能4.1.2插入题目功能4.2拓展功能4.2.1密码功能4.2.2考试功能5总结5.1系统缺陷与不足这个考试系统里面的学生界面功能还待加强,可以给学生更多的组卷方式,例如老师创建题库时可以给题目信息增加一个章节的信息,然后学生可以根据章节来组卷考试。