标题:求解,为什么我的考试程序出现不了想要的控制台界面?只输出一个主菜单?
只看楼主
llllxxxxqqqq
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-1-17
结帖率:0
已结贴  问题点数:20 回复次数:4 
求解,为什么我的考试程序出现不了想要的控制台界面?只输出一个主菜单?
#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);
}


搜索更多相关主题的帖子: 试题 char 选项 printf 输入 
2018-01-20 09:59
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:7 
代码也只输出一个主菜单,没有调用下级菜单。
另,用 getchar(); 只能吸掉一个字符。如果误输入1234,就有可能会连续执行几个菜单选择过程。
2018-01-20 12:06
虫眼
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:314
专家分:1121
注 册:2017-11-29
得分:7 
谈点看法
程序代码:
 choose=getchar(); //建议用 scanf输入
        getchar();     //过滤掉输入的回车符 或者 用 fflush(stdin) 清空输入的回车符
        switch (choose)
        {
            case '1':
                printf("\n题目管理"); //这里只显示了提示,应该加入相应的子函数
                break;
            case '2':
                printf("\n开始考试");
                break;
            case '3':
                printf("\n退出");
                break;
2018-01-21 10:05
llllxxxxqqqq
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2018-1-17
得分:0 
好的,谢谢啦,我试试
2018-01-23 11:22
Knocker
Rank: 8Rank: 8
等 级:贵宾
威 望:47
帖 子:10454
专家分:603
注 册:2004-6-1
得分:7 
初学者最大问题:不考虑程序的容错设计。

九洲方除百尺冰,映秀又遭蛮牛耕。汽笛嘶鸣国旗半,哀伤尽处是重生。     -老K
治国就是治吏。礼义廉耻,国之四维。四维不张,国之不国。   -毛泽东
2018-01-23 13:39



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-484365-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.182509 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved