#include #include #include #include #include typedef struct exam_system //定义链表 { char problem[150]; char answer[4][20]; char right; char input; struct exam_system *next; }EXAM; //类型名自定义 void Createlink(); //创建链表函数 void exam(); //考试初始界面函数 void management(); //题目管理函数 void preservation(); //保存文档函数 void experience(); //遍历题库函数 void add(); //添加题目函数 void modification(); //修改题目函数 void Answer(); //答题函数 FILE *fp; int sum; //题目总数 struct exam_system *p1,*p2,*head; int main() { Createlink(); system("color 75"); //自定义background exam(); return 0; } void Createlink() //创建链表 { head=(EXAM *)malloc(sizeof(EXAM)); //创建头节点,并给予一个动态内存 p2=p1=head; //连续赋值 p1->next=NULL; //令p1指向末尾 if((fp=fopen("D:\\exam.txt","r+"))==NULL) { printf("文件打开失败!!"); exit(0); } while(1) { p1=(EXAM*)malloc(sizeof(EXAM)); if(fread(p1,sizeof(EXAM),1,fp)==0) //读取信息 break; //否则退出 p2->next=p1; //与第一个节点连接 p2=p1; //p1与p2同时指向新开辟的节点 sum++; p2->next=NULL; //另p2指向末尾 } fclose(fp); } void exam() //考试界面函数 { int x; system("cls"); printf("\t\t*********欢迎来到单项选择题考试系统*********\n"); printf("\t\t* *\n"); printf("\t\t* 1.题目管理 *\n"); printf("\t\t* *\n"); printf("\t\t* 2.开始考试 *\n"); printf("\t\t* *\n"); printf("\t\t* 3.退出 *\n"); printf("\t\t* *\n"); printf("\t\t********************************************\n"); printf("\n"); printf("请选择:"); scanf("%d",&x); switch(x) { case 1:management();break; case 2:Answer();break; case 3:exit(0);break; default :printf("输入有误!\n");break; } } void management() //题目管理函数 { int x; system("cls"); printf("\t\t************欢迎来到题目管理系统************\n"); printf("\t\t* *\n"); printf("\t\t* 1.新增题目 *\n"); printf("\t\t* *\n"); printf("\t\t* 2.遍历题库 *\n"); printf("\t\t* *\n"); printf("\t\t* 3.修改题目 *\n"); printf("\t\t* *\n"); printf("\t\t* 4.返回上一级 *\n"); printf("\t\t* *\n"); printf("\t\t********************************************\n"); printf("\n"); printf("请选择:"); scanf("%d",&x); switch(x) { case 1:add();management();break; case 2:experience();management();break; case 3:modification();management();break; case 4:;exam();break; default :printf("输入有误!\n");break; } } void preservation() //保存文档函数 { EXAM *current=NULL; current=head->next; fp=fopen("D:\\exam.txt","w+"); do { fwrite(current,sizeof(EXAM),1,fp); //逐个存储 current=current->next; //当前指针指向下一个 }while(current!=NULL); //直到指向末尾 fclose(fp); printf("\n保存成功!!"); getch(); } void experience() //遍历题库函数 { int c,i; EXAM *p=NULL; system("cls"); if(sum==0) { printf("题库中没有题目!\n"); printf("按任意键继续!"); getch(); } else { p=head; i=0; do { p=p->next; printf("%d.%s\n",i+1,p->problem); c=0; while(c<4) { printf("%c:",c+'A'); printf("%s\n",p->answer[c++] ); } printf("正确答案:"); printf("%c\n",p->right); i=i+1; printf("\n-------------------------------------------------------------\n"); }while(p->next!=NULL); p=NULL; printf("按任意键继续!\n"); getch(); } } void add() //题目添加函数 { int n,i; system("cls"); printf("\t\t**************欢迎来到题目管理系统****************\n"); do { p1=(EXAM *)malloc(sizeof(EXAM)); p2->next=p1; //相连p1、p2 p2=p1; //指向相同 printf("请输入第%d个题目:",sum+1); scanf("%s",p1->problem); printf("请输入备选答案:\n"); for(i=0;i<4;i) { printf("%c)",i+'A'); scanf("%s",p1->answer[i++] ); } printf("输入正确答案:"); p1->right =getchar(); scanf("%c",&p1->right ); sum+=1; printf("\n"); printf("\n继续添加下一题?\n1.是\n2.否\n你的选择是:"); scanf("%d",&n); if(n==2) { p2->next=NULL; break; } system("cls"); }while(n==1); preservation(); } void modification() //修改题目函数 { int i,num; EXAM *p1=NULL; EXAM *p2=NULL; experience(); if(sum>=1) { p1=(EXAM *)malloc(sizeof(EXAM)); //为P1分配一个动态内存 p2=head; printf("请选择修改的题目序号:"); scanf("%d",&num); for(i=0;inext; //此时p2终于依次挪到num-1处 printf("请输入题目:"); scanf("%s",p1->problem); printf("请输入备选答案:\n"); for(i=0;i<4;) { printf("%c)",i+'A'); scanf("%s",p1->answer[i++] ); } printf("输入正确答案:"); p1->right=getchar(); scanf("%c",&p1->right); p1->next=p2->next->next; //节点替换连接成功 p2->next=p1; //p1、p2连接 p1=NULL; p2=NULL; //最后都置为末尾 preservation(); } } void Answer() //答题函数 { int i,j,c; int n; char write; int score=0; EXAM *p=NULL; printf("祝你考试顺利!!\n"); system("cls"); if(sum=0) printf("题库中没有题目!\n"); else { i=0; p=head; printf("请输入你需要的题量:"); scanf("%d",&n); do { p=p->next; //更新指针,输出下一个结构体的数据 printf("%d.%s\n",i+1,p->problem); c=0; while(c<4) { printf("%c)",c+'A'); printf("%s\n",p->answer[c++] ); } printf("请输入你的答案:"); getchar(); scanf("%c",&write); if(p->right==write) { printf("\n恭喜!!你的答案是 %c ,正确答案是 %c ",write,p->right); score+=1; } else { printf("\n太可惜了~你的答案是 %c ,正确答案是 %c ",write,p->right); } i=i+1; printf("\n----------------------------------------------------------\n"); if(i==n) //满足用户要求 break; }while(p->next!=NULL); printf("考试结束!\n"); printf("总题数:%d\n正确数:%d\n",n,score); getch(); ; } printf("按任意键继续!\n"); getchar(); }