自己的第一个垃圾考试系统

#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);
}

猜你喜欢

转载自blog.csdn.net/syoung_7/article/details/79135620
今日推荐