c语言中窗口控制台一直出不来结果怎么办,求解,为什么我的考试程序出现不了想要的控制台界面?只输出一个主菜单?...

已结贴√

问题点数:20 回复次数:4

ca56232b3bbedf9a539d07f37fffb99a.gif

3144d8b7615c79d9f638db40d5689d26.gif

a218af6549b45ee526caf607ebff1358.gif

0f8df0e29816ae721419de940fb833d1.gif

求解,为什么我的考试程序出现不了想要的控制台界面?只输出一个主菜单?

#include

#include //toupper()

#include //strcpy()

#include //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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值