将查看试题函数(view),测试函数(test)改为从指定txt文本中读取试题
#include
#include
#include
#include
//定义试题结构体
typedef struct node
{
int id; //试题编号
char problem[512]; //题干
char optionA[256]; //选项A
char optionB[256]; //选项B
char optionC[256]; //选项C
char optionD[256]; //选项D
char ans[4]; //正确答案
char choose[4];//学员答案
struct node*pNext; //指向下一个试题的指针
}Node;
Node *pHead = NULL; //存放试题的链表的首节点地址
Node *pTail = NULL;
//申请储存空间
void insertNode(int id, char *problem, char *optionA, char *optionB, char *optionC, char *optionD, char *ans)
{
Node *pNew = (Node *)malloc(sizeof(Node));
pNew->id = id;
strcpy(pNew->problem, problem);
strcpy(pNew->optionA, optionA);
strcpy(pNew->optionB, optionB);
strcpy(pNew->optionC, optionC);
strcpy(pNew->optionD, optionD);
strcpy(pNew->ans, ans);
pNew->pNext=NULL;
if (pHead == NULL)
{
pHead = pNew;
pTail = pHead;
}
else
{
//尾插入法
pTail->pNext = pNew;
pTail = pNew;
//头插入法
//pNew->pNext = pHead;
//pHead = pNew;
}
}
//录入试题
void insert()
{
int id;
char problem[512];
char optionA[256];
char optionB[256];
char optionC[256];
char optionD[256];
char ans[4];
char choose = 'Y';
while(toupper(choose)=='Y')
{
printf("\n**********录入试题**********");
printf("\n请输入试题编号:");
scanf("%d",&id);
getchar();//读取换行符
printf("请输入题干:");
gets(problem);
printf("请输入选项A: ");
gets(optionA);
printf("请输入选项B:");
gets(optionB);
printf("请输入选项C:");
gets(optionC);
printf("请输入选项D:");
gets(optionD);
printf("请输入答案: ");
gets(ans);
if ((id > 0) && (strlen(problem) > 0))
{
insertNode(id, problem, optionA, optionB, optionC, optionD, ans);
}
else
{
printf("试题内容错误,请重新输入\n");
}
printf("\n继续录入(Y\\N)?");
scanf("%c",&choose);
getchar();
}
}
//查看试题
void view()
{
Node *tempNode = pHead;
/* FILE *fp = fopen("exam.txt", "w");
while(tempNode!=NULL)
{
fscanf(fp, "题号: %d\n",tempNode->id);
fscanf(fp, "题干: %s\n",tempNode->problem);
fscanf(fp, "答案A: %s\n",tempNode->optionA);
fscanf(fp, "答案B:%s\n",tempNode->optionB);
fscanf(fp, "答案C:%s\n",tempNode->optionC);
fscanf(fp, "答案D:%s\n",tempNode->optionD);
fscanf(fp, "正确答案:%s\n",tempNode->ans);
fscanf(fp, "********************\n");
tempNode=tempNode->pNext;
}
fclose(fp);
fp = NULL;*/
while(tempNode != NULL)
{
printf("id:%d\n,problem:%s\n,optionA:%s\n,optionB:%s\n,optionC:%s\n,optionD:%s\n,ans:%s\n",tempNode->id,tempNode->problem,
tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans);
tempNode = tempNode->pNext;
}
}
//保存试题
void save() //保存试题
{
Node *tempNode=pHead;
FILE *fp = fopen("exam.txt", "a");
while(tempNode!=NULL)
{
fprintf(fp, "题号: %d\n",tempNode->id);
fprintf(fp, "题干: %s\n",tempNode->problem);
fprintf(fp, "答案A: %s\n",tempNode->optionA);
fprintf(fp, "答案B:%s\n",tempNode->optionB);
fprintf(fp, "答案C:%s\n",tempNode->optionC);
fprintf(fp, "答案D:%s\n",tempNode->optionD);
fprintf(fp, "正确答案:%s\n",tempNode->ans);
fprintf(fp, "********************\n");
printf("\n保存成功!");
printf("\n\n\n");
tempNode=tempNode->pNext;
}
fclose(fp);
fp = NULL;
}
//修改试题
void mod()
{
void view();
int id; //题号
char problem[200]; //题干
char optionA[100]; //选项A
char optionB[100]; //选项B
char optionC[100]; //选项C
char optionD[100]; //选项D
char ans[4]; //答案
char choose;
Node *tempNode=pHead;
printf("\n请输入要修改的题号:");
scanf("%d", &id);
getchar();
while(tempNode!=0) //从第一题开始找,直到找到指定的试题
{
if(id==tempNode->id)
{
break;
}
tempNode=tempNode->pNext;
}
if(tempNode==NULL)
{
printf("该试题不存在\n");
return;
}
//显示试题信息
printf("id:%d\n,problem:%s\n,optionA:%s\n,optionB:%s\n,optionC:%s\n,optionD:%s\n,ans:%s\n",tempNode->id,tempNode->problem,
tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans);
printf("请输入修改后的试题信息");
printf("\n请输入试题编号:");
scanf("%d",&id);
getchar();
printf("请输入题干:");
gets(problem);
printf("请输入选项A: ");
gets(optionA);
printf("请输入选项B:");
gets(optionB);
printf("请输入选项C:");
gets(optionC);
printf("请输入选项D:");
gets(optionD);
printf("请输入答案:");
gets(ans);
printf("是否修改(Y\\N)?");
scanf("%c", &choose);
getchar();
if(toupper(choose)=='Y')
{
strcpy(tempNode->problem, problem);
strcpy(tempNode->optionA, optionA);
strcpy(tempNode->optionB, optionB);
strcpy(tempNode->optionC, optionC);
strcpy(tempNode->optionD, optionD);
strcpy(tempNode->ans, ans);
}
printf("\n修改成功!");
printf("\n\n\n");
//显示所有试题
view();
}
//删除试题
void del()
{
int id;
char choose;
Node *tempNode=pHead; //存放试题链表的首地址,即第一道试题(结构体)的地址
Node *previousNode=pHead; //指定试题的上一道试题的地址
printf("\n请输入要删除的试题题号:");
scanf("%d",&id);
getchar();
while(tempNode != NULL) //从第一题开始找,直到找到指定的试题
{
if(id==tempNode->id)
{
break;
}
previousNode=tempNode; //当前节点是下一个节点的前节点
tempNode=tempNode->pNext; //指向下一节点
}
if(tempNode==NULL)
{
printf("该试题不存在\n");
return;
}
//显示试题信息
printf("id:%d\n,problem:%s\n,optionA:%s\n,optionB:%s\n,optionC:%s\n,optionD:%s\n,ans:%s\n",tempNode->id,tempNode->problem,
tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans);
printf("要删除该题么(Y\\N)?");
scanf("%c",&choose);
getchar();
if(toupper(choose)=='Y')
{
previousNode->pNext=tempNode->pNext;
free(tempNode);
}
printf("\n删除成功!");
printf("\n\n\n");
}
//测试
void exam()
{
Node *tempNode = pHead;
printf("开始进行测试=========\n");
while (NULL != tempNode)
{
printf("\n\n\n");
printf("题目:id:%d\n,problem:%s\n,optionA:%s\n,optionB:%s\n,optionC:%s\n,optionD:%s\n",tempNode->id,tempNode->problem,
tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD);
printf("请输入答案(A,B,C,D):");
gets(tempNode->choose);
tempNode = tempNode->pNext;
}
printf("考试完毕=========\n");
}
//统计得分
void calcScore()
{
int iSucc = 0;
Node *tempNode = pHead;
while (tempNode != NULL)
{
printf("=====================\n");
printf("id:%d\n,problem:%s\n,optionA:%s\n,optionB:%s\n,optionC:%s\n,optionD:%s\n,ans:%s\n,choose:%s\n",tempNode->id,tempNode->problem,
tempNode->optionA,tempNode->optionB,tempNode->optionC,tempNode->optionD,tempNode->ans,tempNode->choose);
if (0 == strcmp(tempNode->ans, tempNode->choose))
{
iSucc++;
}
tempNode = tempNode->pNext;
}
printf("共答对:%d题\n", iSucc);
}