单项选择题系统

#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;
}
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值