/*** Answer.cpp 单项选择题标准化考试系统设计 ***/ #include <stdio.h> #include <stdlib.h> #include <string.h> #define LEN sizeof(struct test) struct test { char number[10]; char que[81]; char answer1[81]; char answer2[81]; char answer3[81]; char answer4[81]; char ture; struct test *next; }; struct test *head;//全局变量储存第一个结构体的指针 struct test *p_head=NULL;//储存所有的题目 int que_number=-1; char que_number_string[10]; /*** put_all_que() 修改后的试题重新写入 return int 写入是否成功标志 ***/ int put_all_que() { FILE *fp; int n=1; char number[10]; struct test *p; remove("test.txt"); if((fp=fopen("test.txt","a"))==NULL) { printf("文件打开失败请检查当前文件夹下的test.txt文件。\n"); exit(0); } p=p_head->next; do { fputc('\n',fp); itoa(n,number,10); fputs(number,fp); fputc(' ',fp); fputs(p->que,fp); fputc(' ',fp); fputs(p->answer1,fp); fputc(' ',fp); fputs(p->answer2,fp); fputc(' ',fp); fputs(p->answer3,fp); fputc(' ',fp); fputs(p->answer4,fp); fputc(' ',fp); fputc(p->ture,fp); p=p->next; n++; } while (p!=NULL); fclose(fp); return 1; } /*** get_all_que() 获取全部的题目 return void ***/ void get_all_que() { FILE *fp; struct test *p1; struct test *p2; char ch,ch1[5]; int n=1,i,wz,py; if((fp=fopen("test.txt","r"))==NULL)//只读方式打开文件 { printf("文件打开失败请检查当前程序文件夹下的test.txt文件。\n"); exit(0); } do { py=1; ch=fgetc(fp); if (ch==EOF) break; for(i=0;ch!='\n'&&ch!=-1;i++)//循环判断回车符个数 { py++; ch=fgetc(fp); } p1=(struct test *)malloc(LEN); wz=ftell(fp);//记录指针当前位置 fseek(fp,(wz-py-1),0);//调整指针位置到行首 fscanf(fp,"%s%s%s%s%s%s%s",&p1->number,&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1->answer4,&ch1); fseek(fp,wz,0);//调整指针位置到行末 p1->ture=ch1[0]; if (n==1) { p_head=p1; n=0; } else p2->next=p1; p2=p1; }while(!feof(fp));//文件结束跳出循环 p2->next=NULL; fclose(fp); } /*** now_que_number_exe() 检查当前有多少题目 return int 当前题目数 ***/ int now_que_number_exe() //检查当前有多少题目 { FILE *fp; int now_que_number=0; char ch; char cc[810]; if((fp=fopen("test.txt","r"))==NULL)//只读方式打开文件 { printf("文件打开失败请检查当前程序文件夹下的test.txt文件。\n"); exit(0); } ch=fgetc(fp); if (ch!=EOF) { do { now_que_number++; fgets(cc,sizeof(cc),fp); if (cc[0]==EOF) break; } while(!feof(fp)); } fclose(fp); return now_que_number; } int zts(int m)//将第m道题装入内存,输入-1时将返回总题数 { FILE *fp; struct test *p1=NULL; char ch,ch1[5]; char number[10]; int i,n=0,wz,py; if((fp=fopen("test.txt","r"))==NULL)//只读方式打开文件 { printf("文件打开失败请检查当前程序文件夹下的test.txt文件。\n"); exit(0); } do { py=1; ch=fgetc(fp); for(i=0;ch!='\n'&&ch!=-1;i++)//循环判断回车符个数 { py++; ch=fgetc(fp); } n++; //储存行数的变量 if(n==m)//如果当前行数与传入参数相等 { if(p1==NULL)//判断是否是第一次开辟内存空间 { p1=(struct test *)malloc(LEN); head=p1; p1->next=NULL; } else { p1->next=p1; p1=(struct test *)malloc(LEN); p1->next=NULL; } wz=ftell(fp);//记录指针当前位置 fseek(fp,(wz-py-1),0);//调整指针位置到行首 fscanf(fp,"%s%s%s%s%s%s%s",&number,&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1->answer4,&ch1); fseek(fp,wz+1,0);//调整指针位置到行末 p1->ture=ch1[0]; break;//将数据装入内存后跳出循环 } }while(!feof(fp));//文件结束跳出循环 fclose(fp); return n;//返回题目总数n } void exe1() { void main(); void exe2(); int n,m=0,tm,i,t=0,f=0; char ans[2]; struct test *p1; system("cls"); printf("请输入要答题数:"); scanf("%d",&n); tm=zts(-1); if(0>n||n>tm) { printf("答题数应小于总数!"); exe1(); } for(i=0;i<n;i++)//n为用户要答题数 { do { m=rand();//置随机数 }while(!(0<m&&m<=tm));//判断产生的随机数是否符合要求 zts(m); p1=head;//将zts开辟的结构体首地址赋给p1 printf("\n第%d题:\n",i+1); printf("%s\n%s\n%s\n%s\n%s\n请输入答案:",p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4); scanf("%s",&ans); if(toupper(ans[0])==p1->ture)//判断用户输入答案是否正确 { printf("恭喜你答对了!\n\n"); t++;//回答正确统计 } else { printf("对不起,你答错了。。。\n正确答案是:%c\n\n",p1->ture); f++;//回答错误统计 } } p1=head; do { head=p1->next; free(p1); p1=head; }while(p1!=NULL);//释放结构体占用内存 printf("*******************************\n"); printf("\n已完成测试!\n共做%d道题:%d错误,%d正确。\n正确率:%5.2f%%\n\n",n,f,t,(float)t/n*100); printf("*******************************\n"); printf("\n\n1.继续答题;2.添加题目;3.返回主菜单;\n请选择:"); i=0; scanf("%d",&i); if(i==1) exe1();//继续答题 else if(i==2) exe2();//添加题目 else main();//返回主菜单 } void exe2()//实现用户自主输入题目 { void main(); system("cls"); int n; FILE *fp; if((fp=fopen("test.txt","a"))==NULL) { printf("文件打开失败请检查当前文件夹下的test.txt文件。\n"); exit(0); } struct test *p1=NULL; p1=(struct test *)malloc(LEN);//开辟内存空间 do { printf("请输入题目:"); scanf("%s",&p1->que); }while(p1->que[0]=='\0'); do { printf("请输入选项A:"); scanf("%s",&p1->answer1); }while(p1->answer1=='\0'); do { printf("请输入选项B:"); scanf("%s",&p1->answer2); }while(p1->answer2=='\0'); do { printf("请输入选项C:"); scanf("%s",&p1->answer3); }while(p1->answer3=='\0'); do { printf("请输入选项D:"); scanf("%s",&p1->answer4); }while(p1->answer4=='\0'); printf("请输入答案:"); do { scanf("%c",&p1->ture); p1->ture=toupper(p1->ture); }while(p1->ture!='A'&&p1->ture!='B'&&p1->ture!='C'&&p1->ture!='D'); printf("\n确认输入题目?\n1.是。 2.否。\n"); scanf("%d",&n); if(n==1) { fputc('\n',fp); if (que_number==-1) { que_number=now_que_number_exe()+1; itoa(que_number,que_number_string,10); fputs(que_number_string,fp); fputc(' ',fp); } else { que_number++; itoa(que_number,que_number_string,10); fputs(que_number_string,fp); fputc(' ',fp); } fputs(p1->que,fp); fputc(' ',fp); fputs("A.",fp); fputs(p1->answer1,fp); fputc(' ',fp); fputs("B.",fp); fputs(p1->answer2,fp); fputc(' ',fp); fputs("C.",fp); fputs(p1->answer3,fp); fputc(' ',fp); fputs("D.",fp); fputs(p1->answer4,fp); fputc(' ',fp); fputc(p1->ture,fp); fclose(fp); printf("保存成功!"); system("cls"); free(p1); printf("是否继续添加?\n1.继续添加 2.返回主菜单\n"); scanf("%d",&n); if(n==1) exe2(); else main(); } else { free(p1); exe2(); } } void exe3(int change_number) //修改试题 { struct test *p; struct test *pt; int n; int is_changed_choose; char que_content[81]; int number; system("cls"); if (p_head==NULL) get_all_que(); if (p_head!=NULL) { if (change_number==-1) printf("所有题目如下\n"); p=p_head->next; do { number=atoi(p->number); if (number==change_number) { printf("是否修改题目? 是(1) , 否(0)"); do { scanf("%d",&is_changed_choose); }while (is_changed_choose!=1 && is_changed_choose!=0); if (is_changed_choose) { printf("\n你想修改成什么题目:"); scanf("%s",&que_content); strcpy(p->que,que_content); } printf("是否修改选项? 是(1) , 否(0)"); scanf("%d",&is_changed_choose); while (is_changed_choose==1) { } printf("是否修改标准答案? 是(1) , 否(0)"); scanf("%d",&is_changed_choose); if (is_changed_choose) { } break; } if (change_number==-1) printf("%s. %s\n %s %s\n %s %s",p->number,p->que,p->answer1,p->answer2,p->answer3,p->answer4); if (change_number==-1) printf("%c\n",p->ture); p=p->next; } while (p!=NULL); if (change_number==-1) printf("所有题目如上\n输入想要修改题目的编号"); if (change_number==-1) { scanf("%d",&n); exe3(n); } else { if (put_all_que()) { printf("修改成功!"); p_head=NULL; } else printf("修改失败!"); } } } void exe4(int del_number) //删除试题 { struct test *p; struct test *pt; int n; int number; system("cls"); if (p_head==NULL) get_all_que(); if (p_head!=NULL) { if (del_number==-1) printf("所有题目如下\n"); p=p_head->next; do { if (del_number==1) { p_head->next=p->next; break; } number=atoi(p->number); if (number+1==del_number) { pt=p->next; p->next=pt->next; break; } if (del_number==-1) printf("%s. %s\n %s %s\n %s %s",p->number,p->que,p->answer1,p->answer2,p->answer3,p->answer4); if (del_number==-1) printf("%c\n",p->ture); p=p->next; } while (p!=NULL); if (del_number==-1) printf("所有题目如上\n输入想要删除题目的编号"); if (del_number==-1) { scanf("%d",&n); exe4(n); } else { if (put_all_que()) { printf("删除成功!"); p_head=NULL; } else printf("删除失败!"); } } } void exe5() //查看英雄榜 { } void main() { system("cls"); int n; printf("********************************\n"); printf("欢迎使用单项选择题标准化考试系统\n"); printf("********************************\n"); printf("\t1.开始答题。\n"); printf("\t2.添加试题。\n"); printf("\t3.修改试题。\n"); printf("\t4.删除试题。\n"); printf("\t5.查看英雄榜。\n"); printf("\t6.退出系统。\n"); printf("\n请选择:"); scanf("%d",&n); switch(n) { case 1:exe1();break; case 2:exe2();break; case 3:exe3(-1);break; case 4:exe4(-1);break; case 5:exe5();break; case 6:printf("\n^-^,goodbye!\n"); }while(n!=6); }
4点多了,这几天重庆的天气一天比一天凉了,帮同学的同学写课程设计。。。(写完了请我吃饭,真心无所谓了)。写了一点点,上面的代码等到大学毕业的时候看看,会有什么感觉哩(这也挺有意思的!)。
现在晚上基本睡不着了,话说锻炼熬夜编程的能力,尽然搞成了这种状况,黑白颠倒。其实黑白颠倒倒也好,但是我是白天也不怎么睡觉,真成神仙了。就怕万一年纪轻轻怎么了。- -! 诶!现在什么身体亚健康已经不存在了,根本就是不健康。其实现在的状况也要说是我脾气的原因,往往不做完事不罢休。想着今天的事情今天一定要做完(殊不知已经熬夜过了今天,挺搞笑的!)。
4:30,祝福所有人健康。while(1) echo "Happy";