⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 del.h

📁 职工信息管理系统的功能是设置职工最大数.职工信息查询.增加职工记录.删除职工记录.生成信息简表.显示原始记录.显示简表记录.显示工资平均值.帮助菜单,退出该系统
💻 H
字号:
//文件del.h(删除职工记录函数del()的实现。
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<iomanip>
#include"str.h"
using namespace std;

/***********************************************
删除职工记录的时候,以职工编号为主键,且数据文件
中必须存在该职工记录。先验证用户输入的职工编号是
否符合条件(必须只含数字),再将职工记录全部读入
内存,匹配编号,计数器记下编号,在内存中替换数据,
最后将最新的记录写入数据文件,删除完毕。
***********************************************/

void del()
{
	for( ; ; )
	{       int have=0;        //记录编号的匹配数。
		    char back='1';       //询问用户是否返回。
			int num_in;       //用户输入的编号。
			char num_in_char[20];
			int back_out=1;   //判断是否退出这个for循环回到主菜单。	
			int max_Current;  //记录当前的职工最大数。
		
		    /***********从数据文件max.dat中得知当前的职工最大数是多少*********/
		    int max;
	        ifstream fcin("max.dat");
	        if(fcin.fail())       //判断文件max.dat是否成功打开。
			{
		       cout<<"文件max.dat打开失败,程序将结束"<<endl;
		       exit(1);
			}
            fcin>>max;           //从数据文件max.dat得到职工的最大数。
	        fcin.close();        //关闭文件max.dat。

			/**********************从数据文件中读取职工的信息*****************/           
		    struct _Employee              //_Employee结构的定义。
			{
			    int num;
			    string name;
			    string sex;
			    int age;
			    int wage;        //工资
			};        
             _Employee *employee=new _Employee[max];   //定义动态结构体数组。
		
       
		    ifstream fin("name.dat");   //定义一个输入流对象,用于读取文件的记录。
		    if(fin.fail())
			{
			cout<<"文件name.dat打开失败,程序将结束"<<endl;
		    exit(1);
			}
		
		           /******这个while循环是很容易出错的,注意*****/
		    int i=0;
		    while(!fin.eof())        //文件末尾检查,如果文件读取没结束,返回0。
			{
		       fin>>employee[i].num>>employee[i].name>>employee[i].sex
			      >>employee[i].age>>employee[i].wage;
			   i++;
			}
		    max_Current=i;                     //记录当前的职工最大数。     				             			
            //cout<<"max="<<max<<endl;         //测试当前职工最大数是多少。
		    fin.close();                   //关闭文件name.dat。	
			/**********************从数据文件中读取职工的信息完毕*****************/

            for( ; ; )       //删除职工信息的循环。
			{
				bool temp_bool=false;  //判断用户输入是否合法的变量。
				cout<<"**************开始删除职工信息****************"<<endl;
				cout<<"请输入想要删除的职工编号("<<max+1<<"-"<<max*2<<"):";
		        cin>>num_in_char;
				temp_bool=check(num_in_char);
				while(!temp_bool)
				{
					cout<<"对不起,您的输入带有非法字符!请重新输入:";
					cin>>num_in_char;
				    temp_bool=check(num_in_char);
				}
                
				num_in=atoi(num_in_char);  //


		        while(have==0)                    
				{
		            for(i=0;i<max_Current;i++)    //将用户输入的编号原始的职工记录匹配。
					{
			            if(employee[i].num!=num_in)
				            ;
			            else
						{
				            have+=1;
							num_in=i;
							break;
						}
					}
		            if(have==0)    //判断想要删除的职工信息是否存在。
					{						
			            cout<<"对不起,您想要删除的这个职工不存在或者该职工信息已经被删除!"<<endl;
				        cout<<"返回主菜单请按1,重新输入请按2:";
				        cin>>back;
						while(back!='1' && back!='2')
						{
							cout<<"对不起,您输入的只能是1或2!"<<endl;
							cout<<"返回主菜单请按1,重新输入请按2:";
				            cin>>back;
						}
				        if(back=='1')
						{
					        back='0';
							back_out=0;
					        break;            //退出while循环,回到外层的for循环。
						}
			            cout<<"请输入想要删除的职工编号("<<max+1<<"-"<<max*2<<"):";
		                cin>>num_in_char;
			            temp_bool=check(num_in_char);
				        while(!temp_bool)
						{
					        cout<<"对不起,您的输入带有非法字符!请重新输入:";
					        cin>>num_in_char;
				            temp_bool=check(num_in_char);
						}
                
				        num_in=atoi(num_in_char);  //
						continue;
					}
			        else
			            if(have==1)
				            break;       // 跳出while循环。
				}                        //匹配循环while循环j结束。
                
				if(back_out==0)
					break;
                //询问用户是否真的要删除职工信息。
				char select;      //用户再次选择自己的操作。
				cout<<"是否要删除"<<employee[i].num<<"号职工的信息?"<<endl;
				cout<<"确认删除请按1,否则回到主菜单请按0:";
				cin>>select;
				while(select!='1' &&select!='0')
				{
					cout<<"对不起,您输入的只能是1或0!"<<endl;
					cout<<"是否要删除"<<employee[i].num<<"号职工的信息?"<<endl;
				    cout<<"确认删除请按1,回到主菜单请按0:";
				    cin>>select;	    
				}
				
				if(select=='1')
					;
				else 
					{
						back='0';    
					    back_out=0;
					}
				

				if(back=='0')       //判断是否跳出内层for循环,停止删除职工信息。
					break;        // 停止删除职工信息。
				/***************************开始执行删除操作**********************************/
				have=0;   //记录是否匹配变量归0.
				if(max_Current==1)      //若只剩下一个职工信息。
				{
				    cout<<"*******对不起,原始职工信息不能为空!*************"<<endl;
					back='0';
					back_out=0;
					break;
				}

                for(i=num_in;i<max_Current;i++)   //若职工信息记录数大于1,开始删除。
				{
				    employee[i].num=employee[i+1].num;
				    employee[i].name=employee[i+1].name;
				    employee[i].sex=employee[i+1].sex;
			        employee[i].age=employee[i+1].age;
				    employee[i].wage=employee[i+1].wage;
				}
				max_Current--;     //当前最大职工数减1.
			
				ofstream fout("name.dat");   //定义一个输出流对象。
		        if(fout.fail())
				{
			       cout<<"文件name.dat打开失败,程序将结束"<<endl;
		           exit(1);
				}
             
				 //把职工记录写入文件。   			
				 fout<<employee[0].num<<" "<<employee[0].name<<" "
					 <<employee[0].sex<<" "<<employee[0].age<<" "
			         <<employee[0].wage;
				 for(i=1;i<max_Current;i++)           							
		              fout<<endl<<employee[i].num<<" "<<employee[i].name<<" "
					      <<employee[i].sex<<" "<<employee[i].age<<" "
			              <<employee[i].wage;
			
		        
				cout<<"职工信息删除成功,继续删除请按1,返回主菜单请按0." ;  //询问用户是否继续删除信息。
				cout<<"请输入:";
                cin>>back;
				while(back!='0' && back!='1')
				{
                    cout<<"您的输入有误,请重新输入!"<<endl;
					cout<<"职工信息删除成功,继续删除请按1,返回主菜单请按0." ;
					cout<<"请输入:";
					cin>>back;
				}

				/****************************删除职工信息结束*********************************/
				if(back=='0')   //一次信息删除后接受消息,执行继续或退出删除操作。
				{
					back_out=0;    //用户决定停止删除职工信息的同时,准备退出该菜单。
					fout.close();   //关闭输出流对象。
					break;
				}

			}                     //删除职工信息for循环结束。
		    if(back_out==0)
			    break;            //退出外层for循环,回到主菜单。

	}      //外层for循环结束。

}          //del函数结束。






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -