关于用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的返回值。