求解,为什么我的考试程序出现不了想要的控制台界面?只输出一个主菜单?
#include <stdio.h> #include <ctype.h> //toupper()
#include <string.h> //strcpy()
#include <malloc.h> //malloc()
//定义试题的结构体
typedef struct node
{
int id; //试题编号
char problem[200]; //题干
char optionA[100]; //选项A
char optionB[100]; //选项B
char optionC[100]; //选项C
char optionD[100]; //选项D
char ans; //答案
struct node *pNext; //指向下一个试题的指针
}Node;
//函数声明
void insert(); //新增试题
void del(); //删除试题
void mod(); //修改试题
void view(); //查看试题
void save(); //保存试题
void test(); //考试
Node *pHead = NULL; //存放试题的链表的首节点地址
int main()
{ void menuManager();
char choose=' ';
while(choose!='0')
{
printf("\n**************************");
printf("\n 欢迎进入考试系统 ");
printf("\n 1.题目管理 ");
printf("\n 2.开始考试 ");
printf("\n 3.退出 ");
printf("\n*************************");
printf("\n请选择:");
choose=getchar();
getchar(); //过滤掉输入的回车符 或者 用 fflush(stdin) 清空输入的回车符
switch (choose)
{
case '1':
printf("\n题目管理");
break;
case '2':
printf("\n开始考试");
break;
case '3':
printf("\n退出");
break;
}
}
return 0;
}
void menuManager()
{
char choose=' ';
while(choose!='0')
{
printf("\n***************************");
printf("\n 新增试题 ");
printf("\n 删除试题 ");
printf("\n 修改试题 ");
printf("\n 查看试题 ");
printf("\n 保存试题 ");
printf("\n 返回上一级 ");
printf("\n***************************");
printf("\n请选择:");
choose=getchar();
getchar(); //过滤掉输入的回车符 或者 用 fflush(stdin) 清空输入的回车符
switch (choose)
{
case '1':
insert();
break;
case '2':
del();
break;
case '3':
mod();
break;
case '4':
view();
break;
case '5':
save();
break;
case '6':
printf("\n返回上一级");
break;
}
}
}
/* 插入函数
将输入要插入的试题信息,然后将该试题插入到链表中
*/
void insert()
{
//函数声明
void insertNode(int id,char problem[200],char optionA[100],char optionB[100],
char optionC[100],char optionD[100],char ans);
int id; //试题编号
char problem[200]; //题干
char optionA[100]; //选项A
char optionB[100]; //选项B
char optionC[100]; //选项C
char optionD[100]; //选项D
char ans; //答案
char choose='Y';
while(toupper(choose)=='Y')
{
printf("\n*********录入试题**********");
printf("\n请输入试题编号:");
scanf("%d",&id);
getchar(); //过滤掉试题编号后面的回车符或者 用 fflush(stdin)
printf("请输入题干:");
gets(problem);
printf("请输入选项A:");
gets(optionA);
printf("请输入选项B:");
gets(optionB);
printf("请输入选项C:");
gets(optionC);
printf("请输入选项D:");
gets(optionD);
ans=getchar();
getchar(); //过滤掉试题编号后面的回车符或者 用 fflush(stdin)
//调用函数,插入一个节点
insertNode(id,problem,optionA,optionB,optionC,optionD,toupper(ans));
printf("\n继续录入(Y/N)?");
scanf("%c",&choose);
getchar(); //过滤掉试题编号后面的回车符或者 用 fflush(stdin)
}
}
/*保存试题函数
将链表中的试题,存入文件
*/
void save()
{
Node *tempNode=pHead; //第一道试题(结构体)的地址
//重定向,标准的输出stdout不是显示器,而是指定的文件。
//以后的printf语句会输出到指定的文件中
freopen("D:\\****","w",stdout);
while(tempNode!=NULL)
{
printf("%d\n",tempNode->id);
printf("%s\n",tempNode->problem);
printf("%s\n",tempNode->optionA);
printf("%s\n",tempNode->optionB);
printf("%s\n",tempNode->optionC);
printf("%s\n",tempNode->optionD);
printf("%s\n",tempNode->ans);
printf("%s\n",tempNode->pNext);
tempNode=tempNode->pNext;
}
fclose(stdout);
//重定向,标准的输出stdout不是文件,而是输出到控制台(显示器)
//以后的printf语句会输出显示器上
freopen( "CON", "w", stdout );
}
/* 插入一个节点函数
功 能:根据参数传入的信息,生成一个节点,并插入到链表的尾部
入口参数:试题编号,题干,选项1,选项2,选项3,选项4,答案
返回值:无
*/
void insertNode(int id,char problem[200],char optionA[100],char optionB[100],
char optionC[100],char optionD[100],char ans)
{
//申请存储空间(用于存放一道试题<结构体>),该存储空间的首地址为pNew
Node *pNew=(Node *)malloc(sizeof(Node));
pNew->id = id;
pNew->problem == problem ;
pNew->optionA == optionA;
pNew->optionB == optionB;
pNew->optionC == optionC;
pNew->optionD == optionD;
pNew->pNext = NULL;
if(pHead==NULL) //插入前链表为空,新插入的节点为头节点
pHead=pNew;
else
{
Node *tempNode=pHead; //将地址为pNew的节点插入到首地址为pHead的链表的尾部
}
}
/* 显示所有的试题 */
void view()
{
Node *tempNode=pHead;
while(tempNode!=NULL)
{
printf("%s",&pHead);
}
}
/*根据输入的试题编号,找到指定的试题
如果找不到指定的试题,显示“该题不存在”
否则:
(1)显示该试题信息
(2)输入确认信息(是否要删除?)
如果要删除,则删除该试题
(3)显示删除一道试题后,剩下的所有试题
*/
void del()
{
int id;
char choose;
Node *tempNode=pHead; //存放试题链表的首地址,即第一道试题(结构体)的地址
Node *previousNode=pHead; //指定试题的上一道试题的地址
printf("\n请输入要删除的题号:");
scanf("%d",&id);
getchar(); //过滤掉试题编号后面的回车符或者 用 fflush(stdin)
while(tempNode!=NULL) //从第一题开始,一个一个找,直到找到指定的试题
{
if(id==tempNode->id)
break;
previousNode=tempNode; //当前的节点是下一个节点的前节点
tempNode=tempNode->pNext; //指向下一节点
}
if(tempNode==NULL)
{
printf("\n该题不存在!");
return;
}
//显示该试题信息
printf("\n要删除该题吗(Y/N):");
scanf("%c",&choose);
getchar(); //过滤掉试题编号后面的回车符或者 用 fflush(stdin) if(toupper(choose)=='Y')
{
//tempNode是要删除的试题的地址
if(tempNode==pHead) //要删除的是第一题
pHead=tempNode->pNext;
else //要删除的不是第一题(previousNode是上一题的地址)
previousNode->pNext=tempNode->pNext;
free(tempNode); //释放被删除节点的占用的内存
}
//显示所有试题
}
/*根据输入的试题编号,找到指定的试题
如果找不到指定的试题,显示“该题不存在”
否则:
(1)显示该试题修改前的信息
(2)输入修改后的试题信息
(3)输入确认信息(是否要修改?)
如果要修改,则修改该试题
(4)显示修改后的所有试题
*/
void mod()
{
int id; //试题编号
char problem[200]; //题干
char optionA[100]; //选项A
char optionB[100]; //选项B
char optionC[100]; //选项C
char optionD[100]; //选项D
char ans; //答案
char choose;
Node *tempNode=pHead;
printf("\n请输入要修改的题号:");
scanf("%d",&id);
fflush(stdin);
printf("\n请输入修改后的试题信息:");
fflush(stdin);
printf("\n是否修改(Y/N)?");
scanf("%c",&choose);
getchar(); //或者用 fflush(stdin)
if(toupper(choose)=='Y')
{
printf("\n请输入要修改的题号:");
printf("\n请输入修改后的试题信息:");
}
//显示所有试题
}
/* 考试函数
从指定的文件中,读入一道道试题。
每显示一道试题后,从键盘输入答案,然后判断作答是否正确
最后显示成绩=正确的答题数*100.0/总的试题数
由于本函数交替地从文件、键盘输入数据,所以用重定位stdin不方便
*/
void test()
{
int id;
int result;
int count;
FILE *fp;
fp=fopen("D:\\11.txt","r");
if(fp==NULL)
{
printf("文件不存在!");
return ;
}
printf("\n 正在考试 ");
printf("\n");
//scanf函数,返回读入数据的个数
while(fscanf(fp,"%d",&id)>0)
{
printf("%d",&result);
printf("%d",&count);
}
printf("\n你的成绩是:%5.1f 分",result*100.0/count);
fclose(fp);
}