#include<stdlib.h>
#include<stdio.h>
#include <string.h>
struct Student //题目信息结构体
{
int nNum;
char maintest[500];
char a[30];
char b[30];
char c[30];
char d[30];
char ans[30];
struct Student*next;
};
struct Node //链表结点
{
struct Student data; //结点数据
struct Node*next; //指向下个结点的指针
};
int init(); //初始化链表函数
int nCount=0;
int addNode(struct Student* pStu); //添加结点
int deleteNode(int nNum); //删除结点
struct Node* stuList=NULL; //定义一个链表结点指针
struct Student* pStu=NULL; //定义一个结构体指针
void addStu(); //添加题目函数
void deleteStu(); //删除题目函数
void displayStu(); //显示题目函数
void save(Node *stuList); //保存链表的数据到文件
void showChildNenu(); //题目管理页面
void beginExam(); //开始考试
void release(); //释放链表函数
void showMenu(); //主菜单函数
int main()
{
showMenu();
return 1;
}
void showMenu() //主菜单
{
int choose=0;
do
{
system("cls");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t\t\t欢迎进入考试系统\n");
printf("\t\t\t1:题目管理\n");
printf("\t\t\t2:开始考试\n");
printf("\t\t\t3:退出\n");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
showChildNenu();
break;
case 2:
char str[2];
beginExam();
printf("输入任意字符退出考试\n");
scanf("%s",str);
break;
case 3:
release();
break;
default:
system("cls");
printf("输入错误\n");
printf("回车键返回\n");
getchar();
break;
}
}while(choose!=3);
}
void showChildNenu() //题目管理页面
{
int choose=-1;
do
{
system("cls");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t\t\t1:新增题目\n");
printf("\t\t\t2:删除题目\n");
printf("\t\t\t3:修改题目(没有选此项目)\n");
printf("\t\t\t4:查看题目\n");
printf("\t\t\t5:保存\n");
printf("\t\t\t6:返回上一级\n");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
fflush(stdin);
scanf("%d",&choose);
switch(choose)
{
case 1:
{
char str[2];
system("cls");
while(stricmp(str,"n")!=0)
{
addStu();
printf("是否继续添加题目y/n\n");
scanf("%s",str);
}
break;
}
case 2:
{
char str[2];
while(stricmp(str,"n")!=0)
{
deleteStu();
printf("是否继续删除题目y/n\n");
scanf("%s",str);
}
break;
}
case 3:
{
char str[2];
while(stricmp(str,"n")!=0)
{
//correctQuestion();
printf("是否继续修改题目y/n\n");
scanf("%s",str);
}
break;
}
case 4:
{
system("cls");
char str[2];
displayStu();
printf("输入任意字符退出查看\n");
scanf("%s",str);
break;
}
case 5:
{
system("cls");
char str[2];
save(stuList);
printf("输入任意字符退出保存\n");
scanf("%s",str);
break;
}
}
}while(choose!=6);
}
void addStu() //添加题目
{
struct Student stu;
printf("添加题目\n");
printf("请输入题目编号:\n");
scanf("%d",&stu.nNum);
printf("请输入题目:\n");
scanf("%s",stu.maintest);
printf("请输入A:");
scanf("%s",stu.a);
printf("请输入B:");
scanf("%s",stu.b);
printf("请输入C:");
scanf("%s",stu.c);
printf("请输入D:");
scanf("%s",stu.d);
printf("请输入答案:");
scanf("%s",stu.ans);
if(0==addNode(&stu))
{
printf("添加失败\n");
}
else
{
printf("添加成功\n");
}
}
int init() //初始化链表
{
struct Node * head=NULL;
if(stuList==NULL)
{
head=(struct Node*)malloc(sizeof(struct Node));
if(head==NULL)
{
return 0;
}
head->next=NULL;
stuList=head;
return 1;
}
return 0;
}
int addNode(struct Student* pStu) //添加结点
{
struct Node*node=NULL;
struct Node*cur=NULL;
if(stuList==NULL)
{
if(0==init())
{
return 0;
}
}
cur=(struct Node*)malloc(sizeof(struct Node)); ///为添加的结点分配内存
if(cur==NULL)
{
return 0;
}
cur->data=*pStu; //将添加的学生信息保存到结点中
cur->next=NULL;
node=stuList; //遍历链表,将结点添加到链表尾部
while(node->next!=NULL)
{
node=node->next;
}
node->next=cur;
return 1;
}
void release() //释放链表
{
struct Node *cur=stuList;
struct Node* next=NULL;
while(cur!=NULL)
{
next=cur->next; //结点内存释放前,next保存其后继
free(cur); //释放结点内存
cur=next;
}
stuList=NULL;
}
struct Student*traverseList(int* pCount) //遍历链表
{
struct Node*node=NULL;
int i=0;
Student*pStu=NULL;
node=stuList->next;
if(node==NULL) //获取结点个数
{
return NULL;
}
node=stuList->next;
do
{
(*pCount)++;
node=node->next;
}
while(node!=NULL);
pStu=(struct Student*)malloc(sizeof(struct Student)*(*pCount)); //动态内存分配
node=stuList->next; //取出链表中结点的数据
while(node!=NULL)
{
pStu[i]=node->data ;
node=node->next ;
i++;
}
return pStu;
}
void displayStu() //显示题目
{
int i=0;
int nCount=0;
printf("题目\n");
pStu=traverseList(&nCount); //获取学生信息和个数
if(pStu==NULL)
{
printf("显示失败");
return;
}
for(i=0;i<nCount;i++) //显示学生信息
{
printf("%d%s\n",pStu[i].nNum ,pStu[i].maintest);
printf("选项A\n");
printf("%s\n",pStu[i].a );
printf("选项B\n");
printf("%s\n",pStu[i].b);
printf("选项C\n");
printf("%s\n",pStu[i].c);
printf("选项D\n");
printf("%s\n",pStu[i].d);
printf("答案\n");
printf("%s\n",pStu[i].ans );
}
free(pStu); //释放动态分配的内存
pStu=NULL;
}
void deleteStu() //删除题目
{
int nNum=0;
printf("请输入删除的题目号:");
scanf("%d",&nNum);
if(0==deleteNode(nNum))
{
printf("删除失败\n");
return;
}
else
{
printf("删除成功\n");
return;
}
}
int deleteNode(int nNum) //删除结点
{
struct Node*node=stuList;
struct Node*pTemp=NULL;
if(node==NULL)
{
return 0;
}
while(node->next!=NULL) //从链表的第一个结点开始遍历
{
if(node->next->data.nNum==nNum) //如果遍历到的结点的学号与删除的学号相同
{
pTemp=node->next;
node->next=pTemp->next; //将当前结点的上一个结点,指向当前结点的下一个结点
free(pTemp); //释放当前结点
pTemp=NULL;
return 1;
}
node=node->next;
}
return 0;
}
void save(Node *stuList) //将链表的数据保存到文件中
{
FILE *w=fopen("student.txt","a+");
int i=0;
int nCount=0;
pStu=traverseList(&nCount); //获取学生信息和个数
if(pStu==NULL)
{
printf("保存失败!\n");
return;
}
for(i=0;i<nCount;i++) //保存数据
{
fprintf(w,"第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n答案:%s\n",pStu[i].nNum,pStu[i].maintest,pStu[i].a,pStu[i].b,pStu[i].c,pStu[i].d,pStu[i].ans);
}
printf("保存成功!");
fclose(w);
free(pStu);
pStu=NULL; //关闭文件
}
void beginExam() //开始考试
{
system("cls");
struct Student* pTemp;
struct Student* pNew=NULL;
pNew=(struct Student*)malloc(sizeof(struct Student));
pTemp=(struct Student*)malloc(sizeof(struct Student));
FILE *p=NULL;
char aim[50];
int num=0;
int j=0;
double score=0;
if((p=fopen("student.txt","r"))==NULL)
{
printf("不能打开文件或者是文件内无题目\n");
exit(0); //停止程序
}
while(!feof(p))
{
fscanf(p,"第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n答案:%s\n",&pNew->nNum,&pNew->maintest ,&pNew->a ,&pNew->b ,&pNew->c,&pNew->d,&pNew->ans);
printf("第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n",pNew->nNum,pNew->maintest,pNew->a ,pNew->b ,pNew->c ,pNew->d);
fflush(stdin);
printf("请输入所选答案:");
scanf("%s",aim);
if(aim==pNew->ans)
{
printf("答案正确!\n");
j++;
}
else
{
printf("答案错误!\n");
printf("正确答案是:%s\n",pNew->ans);
} num++;
fflush(stdin);
pNew->next=NULL;
pTemp->next=pNew;
pTemp=pTemp->next;
}
fclose(p);
score=100/num*j;
printf("总成绩:%d\n",score);
}
#include<stdio.h>
#include <string.h>
struct Student //题目信息结构体
{
int nNum;
char maintest[500];
char a[30];
char b[30];
char c[30];
char d[30];
char ans[30];
struct Student*next;
};
struct Node //链表结点
{
struct Student data; //结点数据
struct Node*next; //指向下个结点的指针
};
int init(); //初始化链表函数
int nCount=0;
int addNode(struct Student* pStu); //添加结点
int deleteNode(int nNum); //删除结点
struct Node* stuList=NULL; //定义一个链表结点指针
struct Student* pStu=NULL; //定义一个结构体指针
void addStu(); //添加题目函数
void deleteStu(); //删除题目函数
void displayStu(); //显示题目函数
void save(Node *stuList); //保存链表的数据到文件
void showChildNenu(); //题目管理页面
void beginExam(); //开始考试
void release(); //释放链表函数
void showMenu(); //主菜单函数
int main()
{
showMenu();
return 1;
}
void showMenu() //主菜单
{
int choose=0;
do
{
system("cls");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t\t\t欢迎进入考试系统\n");
printf("\t\t\t1:题目管理\n");
printf("\t\t\t2:开始考试\n");
printf("\t\t\t3:退出\n");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
scanf("%d",&choose);
switch(choose)
{
case 1:
showChildNenu();
break;
case 2:
char str[2];
beginExam();
printf("输入任意字符退出考试\n");
scanf("%s",str);
break;
case 3:
release();
break;
default:
system("cls");
printf("输入错误\n");
printf("回车键返回\n");
getchar();
break;
}
}while(choose!=3);
}
void showChildNenu() //题目管理页面
{
int choose=-1;
do
{
system("cls");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
printf("\t\t\t1:新增题目\n");
printf("\t\t\t2:删除题目\n");
printf("\t\t\t3:修改题目(没有选此项目)\n");
printf("\t\t\t4:查看题目\n");
printf("\t\t\t5:保存\n");
printf("\t\t\t6:返回上一级\n");
printf("※※※※※※※※※※※※※※※※※※※※※※※\n");
fflush(stdin);
scanf("%d",&choose);
switch(choose)
{
case 1:
{
char str[2];
system("cls");
while(stricmp(str,"n")!=0)
{
addStu();
printf("是否继续添加题目y/n\n");
scanf("%s",str);
}
break;
}
case 2:
{
char str[2];
while(stricmp(str,"n")!=0)
{
deleteStu();
printf("是否继续删除题目y/n\n");
scanf("%s",str);
}
break;
}
case 3:
{
char str[2];
while(stricmp(str,"n")!=0)
{
//correctQuestion();
printf("是否继续修改题目y/n\n");
scanf("%s",str);
}
break;
}
case 4:
{
system("cls");
char str[2];
displayStu();
printf("输入任意字符退出查看\n");
scanf("%s",str);
break;
}
case 5:
{
system("cls");
char str[2];
save(stuList);
printf("输入任意字符退出保存\n");
scanf("%s",str);
break;
}
}
}while(choose!=6);
}
void addStu() //添加题目
{
struct Student stu;
printf("添加题目\n");
printf("请输入题目编号:\n");
scanf("%d",&stu.nNum);
printf("请输入题目:\n");
scanf("%s",stu.maintest);
printf("请输入A:");
scanf("%s",stu.a);
printf("请输入B:");
scanf("%s",stu.b);
printf("请输入C:");
scanf("%s",stu.c);
printf("请输入D:");
scanf("%s",stu.d);
printf("请输入答案:");
scanf("%s",stu.ans);
if(0==addNode(&stu))
{
printf("添加失败\n");
}
else
{
printf("添加成功\n");
}
}
int init() //初始化链表
{
struct Node * head=NULL;
if(stuList==NULL)
{
head=(struct Node*)malloc(sizeof(struct Node));
if(head==NULL)
{
return 0;
}
head->next=NULL;
stuList=head;
return 1;
}
return 0;
}
int addNode(struct Student* pStu) //添加结点
{
struct Node*node=NULL;
struct Node*cur=NULL;
if(stuList==NULL)
{
if(0==init())
{
return 0;
}
}
cur=(struct Node*)malloc(sizeof(struct Node)); ///为添加的结点分配内存
if(cur==NULL)
{
return 0;
}
cur->data=*pStu; //将添加的学生信息保存到结点中
cur->next=NULL;
node=stuList; //遍历链表,将结点添加到链表尾部
while(node->next!=NULL)
{
node=node->next;
}
node->next=cur;
return 1;
}
void release() //释放链表
{
struct Node *cur=stuList;
struct Node* next=NULL;
while(cur!=NULL)
{
next=cur->next; //结点内存释放前,next保存其后继
free(cur); //释放结点内存
cur=next;
}
stuList=NULL;
}
struct Student*traverseList(int* pCount) //遍历链表
{
struct Node*node=NULL;
int i=0;
Student*pStu=NULL;
node=stuList->next;
if(node==NULL) //获取结点个数
{
return NULL;
}
node=stuList->next;
do
{
(*pCount)++;
node=node->next;
}
while(node!=NULL);
pStu=(struct Student*)malloc(sizeof(struct Student)*(*pCount)); //动态内存分配
node=stuList->next; //取出链表中结点的数据
while(node!=NULL)
{
pStu[i]=node->data ;
node=node->next ;
i++;
}
return pStu;
}
void displayStu() //显示题目
{
int i=0;
int nCount=0;
printf("题目\n");
pStu=traverseList(&nCount); //获取学生信息和个数
if(pStu==NULL)
{
printf("显示失败");
return;
}
for(i=0;i<nCount;i++) //显示学生信息
{
printf("%d%s\n",pStu[i].nNum ,pStu[i].maintest);
printf("选项A\n");
printf("%s\n",pStu[i].a );
printf("选项B\n");
printf("%s\n",pStu[i].b);
printf("选项C\n");
printf("%s\n",pStu[i].c);
printf("选项D\n");
printf("%s\n",pStu[i].d);
printf("答案\n");
printf("%s\n",pStu[i].ans );
}
free(pStu); //释放动态分配的内存
pStu=NULL;
}
void deleteStu() //删除题目
{
int nNum=0;
printf("请输入删除的题目号:");
scanf("%d",&nNum);
if(0==deleteNode(nNum))
{
printf("删除失败\n");
return;
}
else
{
printf("删除成功\n");
return;
}
}
int deleteNode(int nNum) //删除结点
{
struct Node*node=stuList;
struct Node*pTemp=NULL;
if(node==NULL)
{
return 0;
}
while(node->next!=NULL) //从链表的第一个结点开始遍历
{
if(node->next->data.nNum==nNum) //如果遍历到的结点的学号与删除的学号相同
{
pTemp=node->next;
node->next=pTemp->next; //将当前结点的上一个结点,指向当前结点的下一个结点
free(pTemp); //释放当前结点
pTemp=NULL;
return 1;
}
node=node->next;
}
return 0;
}
void save(Node *stuList) //将链表的数据保存到文件中
{
FILE *w=fopen("student.txt","a+");
int i=0;
int nCount=0;
pStu=traverseList(&nCount); //获取学生信息和个数
if(pStu==NULL)
{
printf("保存失败!\n");
return;
}
for(i=0;i<nCount;i++) //保存数据
{
fprintf(w,"第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n答案:%s\n",pStu[i].nNum,pStu[i].maintest,pStu[i].a,pStu[i].b,pStu[i].c,pStu[i].d,pStu[i].ans);
}
printf("保存成功!");
fclose(w);
free(pStu);
pStu=NULL; //关闭文件
}
void beginExam() //开始考试
{
system("cls");
struct Student* pTemp;
struct Student* pNew=NULL;
pNew=(struct Student*)malloc(sizeof(struct Student));
pTemp=(struct Student*)malloc(sizeof(struct Student));
FILE *p=NULL;
char aim[50];
int num=0;
int j=0;
double score=0;
if((p=fopen("student.txt","r"))==NULL)
{
printf("不能打开文件或者是文件内无题目\n");
exit(0); //停止程序
}
while(!feof(p))
{
fscanf(p,"第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n答案:%s\n",&pNew->nNum,&pNew->maintest ,&pNew->a ,&pNew->b ,&pNew->c,&pNew->d,&pNew->ans);
printf("第%d题:%s\nA:%s\nB:%s\nC:%s\nD:%s\n",pNew->nNum,pNew->maintest,pNew->a ,pNew->b ,pNew->c ,pNew->d);
fflush(stdin);
printf("请输入所选答案:");
scanf("%s",aim);
if(aim==pNew->ans)
{
printf("答案正确!\n");
j++;
}
else
{
printf("答案错误!\n");
printf("正确答案是:%s\n",pNew->ans);
} num++;
fflush(stdin);
pNew->next=NULL;
pTemp->next=pNew;
pTemp=pTemp->next;
}
fclose(p);
score=100/num*j;
printf("总成绩:%d\n",score);
}