读书人

关于用while做菜单选项的有关问题

发布时间: 2012-11-09 10:18:48 作者: rapoo

关于用while做菜单选项的问题

C/C++ code
// Test12.cpp : 定义控制台应用程序的入口点。////#include "stdafx.h"#include <stdlib.h>#define  N 5struct Employee //员工{    unsigned int ClerkNo; //员工编号    float Salary;   //工资    Employee *next;};class List {public:    List();//构造函数    bool MakeList(Employee *arr,int size);  //创建员工链表    bool ClearList();  //清空链表    bool addClerk(unsigned int ClerkNo,float Salary);  //添加员工    bool delClerk(unsigned int ClerkNo);  // 删除员工    bool setSalary(unsigned int ClerkNo,float Salary); //设置员工薪资    float ReturnSalary(unsigned int ClerkNo); //得到员工薪资    void ShowList(); //显示链表private:    Employee *head;  //头结点指针};List::List(){    head = NULL;}bool List::MakeList(Employee *arr, int size)//创建员工链表{    if(head)        ClearList();//如果链表不为空,先清空    head = (Employee*)malloc(sizeof(Employee));    head->ClerkNo = arr[0].ClerkNo;    head->Salary = arr[0].Salary;    head->next = NULL;    Employee *LastList = head;    for (int i = 1;i<size;i++)    {        Employee *Listnew = (Employee*)malloc(sizeof(Employee));        Listnew->ClerkNo = arr[i].ClerkNo;        Listnew->Salary = arr[i].Salary;        LastList->next = Listnew;        LastList = Listnew;        Listnew->next = NULL;    }    if (NULL == head)    return false;    else        return true;}bool List::ClearList()//清空{    Employee *p = NULL;    while(head)    {        p = head;        head = head->next;        free(p);    }    if (NULL == head)        return true;    else        return false;}bool List::addClerk(unsigned int ClerkNo,float Salary)//增加员工{    for(Employee *tmptr = head; tmptr != NULL; tmptr = tmptr->next)    {        if(ClerkNo<tmptr->ClerkNo)        {            Employee *Newem = (Employee*)malloc(sizeof(Employee));            Newem->ClerkNo = ClerkNo;            Newem->Salary = Salary;            Newem->next = head;            head = Newem;            return true;        }         if (tmptr->ClerkNo<ClerkNo && tmptr->next->ClerkNo>ClerkNo &&tmptr != NULL)        {                Employee *Newem = (Employee*)malloc(sizeof(Employee));                Newem->ClerkNo = ClerkNo;                Newem->Salary = Salary;                Newem->next = tmptr->next;                tmptr->next = Newem;                return true;        }         if (tmptr->next == NULL)        {            Employee *Newem = (Employee*)malloc(sizeof(Employee));            Newem->ClerkNo = ClerkNo;            Newem->Salary = Salary;            tmptr->next = Newem;            Newem->next = NULL;            return true;        }    }    return false;}bool List::delClerk(unsigned int ClerkNo)//删除员工{    if(head->ClerkNo == ClerkNo)    {        Employee *dehaed = head;        head = dehaed->next;        free(dehaed);        return true;    }else    {        Employee *pur = head->next;        while (pur)        {                if (pur->ClerkNo == ClerkNo)            {                Employee *depur = pur;                pur = depur->next;                free(depur);                return true;            }        }    }    return false;}bool List::setSalary(unsigned int ClerkNo, float Salary)//设置某个员工的工资{    for(Employee *tmptr = head; tmptr != NULL; tmptr = tmptr->next)    {        if (tmptr->ClerkNo == ClerkNo)        {            tmptr->Salary = Salary;            return true;        }    }    return false;}void List::ShowList()//输出{    for(Employee *tmptr = head; tmptr != NULL; tmptr = tmptr->next)    {        printf("%d\t%f\n",tmptr->ClerkNo,tmptr->Salary);    }}float List::ReturnSalary(unsigned int ClerkNo)//获取某个员工的工资{    for(Employee *tmptr = head; tmptr != NULL; tmptr = tmptr->next)    {        if(tmptr->ClerkNo == ClerkNo)            return tmptr->Salary;    }    return -1;}void ShowMenu(){    printf("1.显示员工列表\n");    printf("2.添加一个员工\n");    printf("3.删除一个员工\n");    printf("4.查看一个员工的工资\n");    printf("5.设置一个员工的工资\n");}int _tmain(int argc, _TCHAR* argv[]){    Employee team[N] = {{1,10},{2,20},{3,30},{4,40},{6,50}};    List teamNode;    teamNode.MakeList(team,N);    int menunu = 0;    unsigned int emnu = 0;    float salary = 0;    int flag = 1;  //换成char flag = 'y'    while (flag)  //while(flag == 'y')    {        ShowMenu();        printf("请输入菜单编号操作\n");        scanf_s("%d",&menunu);        switch(menunu)        {        case 1:            teamNode.ShowList();            break;        case 2:            printf("请输入要添加员工的信息\n");            scanf_s("%u %f",&emnu,&salary);            teamNode.addClerk(emnu,salary);            break;        case 3:            printf("请输入要删除员工的编号\n");            scanf_s("%u",&emnu);            teamNode.delClerk(emnu);            break;        case 4:            printf("请输入要查看员工工资的编号\n");            scanf_s("%u",&emnu);            printf("%u号员工的工资是:%f\n",emnu,teamNode.ReturnSalary(emnu));            break;        case 5:            printf("请输入要员工的信息\n");            scanf_s("%u %f",&emnu,&salary);            teamNode.setSalary(emnu,salary);            break;        default:break;        }        printf("继续?(输入1继续,输入0结束)");//printf("继续?(y/n)");        scanf_s("%d",&flag);//scanf_s("%c",&flag);        //为什么换成注释后面的就不行呢???    teamNode.ClearList();    }    return 0;} 



在主函数的菜单里 为什么换成注释后面的就不行呢???


[解决办法]
在每个最后不带\n的printf后面加fflush(stdout);
在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin);
另外请检查scanf的返回值。

读书人网 >C++

热点推荐