肿瘤康复网,内容丰富有趣,生活中的好帮手!
肿瘤康复网 > 单项选择题系统

单项选择题系统

时间:2022-08-15 06:23:25

相关推荐

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<math.h>

#define LEN sizeof(struct XZT)

int tishu=0;//每次进行答题 的题号

//所用的结构体

struct XZT

{

char que[100];//储存选择题的题干

char ans[4][100];//储存选择题的答案

char r_ans;//储存选择题的正确答案

int hard;//选择题的难度,难度分1,2,3,

char knowledge[100];//储存题目涉及到的知识点

struct XZT *next;//链表

};

//程序所用的界面

void jiemian()//主界面

{

system("cls");

printf("\t********************************\n");

printf("\t欢迎使用单项选择题标准化考试系统\n");

printf("\t********************************\n");

printf("\t*1.开始答题。 *\n");

printf("\t*2.添加试题。 *\n");

printf("\t*3.修改试题。 *\n");

printf("\t*4.删除试题。 *\n");

printf("\t*0.退出系统。 *\n");

printf("\t********************************\n");

}

void jiemian_1()

{

printf("\t********************************\n");

printf("\t欢迎使用单项选择题标准化考试系统\n");

printf("\t********************************\n");

printf("\t>>>>>>>>。请先添加试题。<<<<<<<<<\n");

}

void jiemian_2()

{

system("cls");

printf("\n");

printf("\n");

printf("\n");

printf("\n");

printf("已找到要改变的题目,请选择要改变的内容:\n");

printf("1,改变题目 !\n");

printf("2,改变选项A !\n");

printf("3,改变选项B !\n");

printf("4,改变选项C !\n");

printf("5,改变选项D !\n");

printf("6,改变正确答案!\n");

printf("7,改变题目难度!\n");

printf("8,改变知识点 !\n");

printf("0, 不做改变! !\n");

}

void jiemian_3()

{

printf("\t********************************\n");

printf("\t>>>>>>>>>>。谢谢使用。<<<<<<<<<<\n");

printf("\t********************************\n");

}

//创建结构体链表

struct XZT *creat(void)//此函数还可以再优化

{

struct XZT *head;

struct XZT *p1,*p2;

int i=0,n=0;

p1=p2=(struct XZT *)malloc(LEN);

printf("请输入第1题的题干:输入EOF结束!谢谢!\n");

gets(p1->que);

if(strcmp(p1->que,"EOF")!=0 )

{

printf("请输入第1题的选项:\n");

for(i=0;i<4;i++)

{

printf("请输入%c选项:",i+65);

gets(p1->ans[i]);

}

printf("请输入正确答案:");

p1->r_ans=getchar();

getchar();//接收回车的

printf("请确定的试题的难度(用数字1,2,3表示):");

scanf("%d",&p1->hard);

getchar();//接收回车的

printf("请输入试题考试的知识点(小于100字符)\n");

gets(p1->knowledge);

}

head=NULL;

while(strcmp(p1->que,"EOF")!=0 )

{

n++;

if(n == 1)head = p1;

else p2->next = p1;

p2=p1;

p1=(struct XZT *)malloc(LEN);

printf("请输入第%d题的题干:输入EOF结束!谢谢!\n",n+1);

gets(p1->que);

if(strcmp(p1->que,"EOF")!=0 )

{

printf("请输入第%d题的选项:\n",n+1);

for(i=0;i<4;i++)

{

printf("请输入%c选项:",i+65);

gets(p1->ans[i]);

}

printf("请输入正确答案:");

p1->r_ans=getchar();

getchar();//接收回车的

printf("请确定的试题的难度(用数字1,2,3表示):");

scanf("%d",&p1->hard);

getchar();//接收回车的

printf("请输入试题考试的知识点(小于100字符)\n");

gets(p1->knowledge);

}

}

p2->next=NULL;

return (head);

}

//增加题目函数

void add(struct XZT *head)//增加新的试题

{

struct XZT *p1,*p2;

system("cls");

printf("已下是新增加的题目:\n");

if(head==NULL)//如果原来是空链表,这重新创建一个链表

head=creat();

else

{

p1=head;//此三行循环到链表尾部

while(p1->next!=NULL)

p1=p1->next;

getchar();

p2=creat();//创建新的链表的,然后接在第一个后边。

p1->next=p2;

}

}

//查找题目

struct XZT *find(struct XZT *head)

{

char timu[100];

char flag;

struct XZT *p1;

p1=head;

if(head==NULL)

return head;

printf("请输入要查找的题目:\n");

getchar();

gets(timu);

while(1)

{

if(strcmp(p1->que,timu)==0)

break;

else

p1=p1->next;

if(p1==NULL)

{

printf("输入的题目有误!是否要重新输入,Y或N:");

scanf("%c",&flag);

getchar();

if(flag=='Y')

{

printf("请输入要查找的题目:\n");

gets(timu);

p1=head;

}

else

return NULL;

}

}

return p1;

}

//修改题目

void change(struct XZT *head)//改变原有的试题。

{

int temp;

struct XZT *p1;

char temp_1;

system("cls");

p1=find(head);

if(head==NULL)

return ;

//以下是选择要改变的内容

while(p1)

{

jiemian_2();

scanf("%d",&temp);

getchar();

switch(temp)

{

case 1:printf("请输入新的题目:\n"),

gets(p1->que);

break;

case 2:printf("请输入新的选项A:\n"),

gets(p1->ans[temp-2]);

break;

case 3:printf("请输入新的选项B:\n"),

gets(p1->ans[temp-2]);

break;

case 4:printf("请输入新的选项C:\n"),

gets(p1->ans[temp-2]);

break;

case 5:printf("请输入新的选项D:\n"),

gets(p1->ans[temp-2]);

break;

case 6:printf("请输入新的正确答案:\n"),

p1->r_ans=getchar();

break;

case 7:printf("请重新定义题目难度:\n"),

scanf("%d",&p1->hard);

getchar();

break;

case 8:printf("请重新定义知识点:\n"),

gets(p1->knowledge);

break;

default :printf("将不做任何改变:\n");

break;

}

printf("是否还要改变该题目其他部分 Y 或 N :");

scanf("%c",&temp_1);

getchar();

if(temp_1=='N'||temp==0)

break;

}

}

//删除题目

struct XZT *del(struct XZT *head)//删除某道题目。

{

struct XZT *p1,*p2;

char timu[100];

char flag;

system("cls");

getchar();

printf("请输入要删除的题目\n");

gets(timu);

p2=head;

p1=p2->next;

while(1)

{

if(strcmp(timu,head->que)==0)

{

head=p1;

printf("以成功删除该题目!");

break;

}

else if(strcmp(p1->que,timu)==0)

{

p2->next=p1->next;

printf("以成功删除该题目!");

break;

}

else

{

p2=p2->next;

p1=p1->next;

}

if(p1==NULL)

{

printf("输入的题目有误!是否要重新输入,Y或N:");

scanf("%c",&flag);

getchar();

if(flag=='Y')

{

printf("请输入要删除的题目:\n");

gets(timu);

p2=head;

p1=p2->next;

}

else

return head;

}

}

return head;

}

//保存题目的函数

void save(struct XZT *head)

{

struct XZT *p1;

int i=0,j=0;

FILE* fp;

p1=head;

fp=fopen("选择题保存.txt","w+");

fputs("以下是选择题的保存:\n",fp);

//开始保存选择题

while(p1)

{

j++;

fprintf(fp,"第%d题:\n",j);

fputs("题目:",fp);

fprintf(fp,"%s\n",p1->que);

for(i=0;i<4;i++)

{

fprintf(fp,"选项 %c:",i+65);

fprintf(fp,"%s\n",p1->ans[i]);

}

fprintf(fp,"正确答案:%c\n",p1->r_ans);

fprintf(fp,"试题难度:%d \n",p1->hard);

fprintf(fp,"涉及到的知识点:%s\n",p1->knowledge);

p1=p1->next;//移动到下个节点

}

fclose(fp);

}

//保存用户答案

void save_1(char da)

{

static int cishu=0;

FILE* fp;

fp=fopen("答案保存.txt","a");

if(tishu==1)

fprintf(fp,"\n下面第%d次答题的答案:\n",++cishu);

fprintf(fp,"%c\t",da);

fclose(fp);

}

//题库添加函数,首先要调用这个函数输入题库。

struct XZT *tiku(void)

{

struct XZT *ti;

jiemian_1();

ti=creat();

save(ti);

return ti;

}

//遍历链表

int bianli(struct XZT *head)

{

struct XZT *p1=head;

int i=0;

while(p1!=NULL)

{

i++;

p1=p1->next;

}

return i;

}

//输出题目的函数

void *prf(struct XZT *p)

{

int i=0;

printf("下面是第%d道题目:\n",++tishu);

puts(p->que);

for(i=0;i<4;i++)

printf("选项%c:%s\n",i+65,p->ans[i]);

}

//随机取题目

void getti(struct XZT *head)

{

struct XZT *p1=head;

int i=0,j=0,k=1,m=0;

int flag=1;//判断重复节点;

int jdshu=0;//接收遍历链表之后的节点数

int bc[100];//保存找到的节点数

int right=0;//保存答对的题目数

char da;//用户输入的答案

char zsd[100];//用户输入要考查的知识点;

int nandu=0;//用户输入要考察的难度;

int zsd_tishu=0,nandu_tishu=0;//题目数;

int *p2;

system("cls");//清屏

jdshu=bianli(p1);

getchar();//回车

printf("请输入要考查的知识点:\n");

gets(zsd);

printf("请输入要考查的知识点的题数:\n");

scanf("%d",&zsd_tishu);

getchar();//回车

printf("请输入要考查的难度级数及其题数,并用用逗号隔开。\n难度级数用数字1,2,3代替:\n");

scanf("%d,%d",&nandu,&nandu_tishu);

getchar();

for(i=0;i<(nandu_tishu+zsd_tishu);i++)//控制一共要输出的题数。

{

while(flag)//控制取得的随机数是有效的

{

flag=0;

while(flag==0)//控制取得的随机数是未取过的

{

int ran =rand();

j=ran%jdshu;

flag=1;

for(k=0;k<i;k++)//和以前取过的随机数进行对比

{

if(bc[k]==j)

{

flag=0;

break;

}

}

}

//寻找第j个节点;

p1=head;

for(m=0;m<j;m++)//寻找该节点

p1=p1->next;

if(flag==1)

{ //如果该节点是符合要求的,把其位置保存,防止重复取得

if(p1->hard==nandu||(strcmp(p1->knowledge,zsd)==0))

{

bc[k]=j;

break;

}

}

}

prf(p1);//输出符合该条件的题目

printf("请输入你的答案:");

da=getche();

printf("\n");

system("pause");

save_1(da);//保存用户答案

//一下是判断用户是否答对的

if(da==p1->r_ans)

right++;

flag=1;//返回原先的值

}

printf("答对题目%d,正确率%d\n",right,(right*100)/(nandu_tishu+zsd_tishu));

system("pause");

tishu=0;

}

int main()

{

struct XZT *ti;

int flag;

ti=tiku();

while(1)

{

jiemian();

scanf("%d",&flag);

switch(flag)

{

case 1:getti(ti);break;

case 2:add(ti),save(ti);break;

case 3:change(ti),save(ti);break;

case 4:ti=del(ti),save(ti);break;

case 0:break;

default:break;

}

if(flag==0)

{

jiemian_3();

save(ti);

break;

}

}

return 0;

}

如果觉得《单项选择题系统》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。