資料結構 課程設計 員工管理系統(C語言)

qq959261982發表於2018-04-26

1、新增員工模組:輸入員工的姓名、年齡、職位、工齡以,通過自己定義的void  add()函式來實現。將錄入的資訊寫入到“data.dat”中。

2、刪除員工模組:刪除需要刪除的員工的所有資訊,通過自己定義的void del( )函式來實現。先通過查詢找到需要刪除的資訊,將檔案中除要刪除的資訊之外全部讀入記憶體,刪除原檔案,將建立一個同名檔案。

3、修改模組:可以修改該員工的部分資訊,通過自己定義的void change()。根據選擇修改具體部分。

4、查詢員工資訊模組:可以按員工職務來查詢員工的相關資訊,通過自己定義的void search( )函式來實現。根據名字查詢。

5、員工資訊排序模組:可以按照規定要求對員工資訊排序,通過自己定義的void sort()函式來實現。分為按工齡和按專業降序排列,排序後將寫入檔案。

6、員工資訊輸出模組:可以輸出所有員工的資訊,通過自己定義的void  display()函式實現。

#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#define len sizeof(worker)
typedef struct
{
	char name[20];//姓名
	char sex;
	int age;//年齡
	int work_age;//工齡
	char duty[20];
	char education[20];
	char address[40];
	char phone[20];
} worker;

static int total;
void add()    //新增
{
	FILE *fp;
	worker b,b1;
	fp=fopen("data.dat","ab+");
	printf(" \n請輸入職工姓名:   ");
	scanf("%s",&b.name);
	fflush(stdin);
	printf(" \n請輸入職工性別(f或m):    ");
	scanf("%c",&b.sex);
	while((b.sex!='f'&&b.sex!='m')||(b.sex!='m'&&b.sex!='f'))
		{
			fflush(stdin);
			printf(" \n輸入有誤,請重新輸入員工性別(f或m)注意f 或 m :    ");
			scanf("%c",&b.sex);
		}
	printf(" \n請輸入職工的年齡:   ");
	scanf("%ld",&b.age);

	printf(" \n請輸入職工的工齡:   ");
	scanf("%ld",&b.work_age);
	printf(" \n請輸入職工的職務 :   ");
	scanf("%s",b.duty);
	printf(" \n 請輸入職工的學歷(博士、碩士、本科、大專、高中、初中及以下)  : ");
	scanf("%s",b.education);
	printf(" \n請輸入職工的居住地址 :   ");
	scanf("%s",b.address);
	printf(" \n請輸入職工的電話:   ");
	scanf("%s",b.phone);
	fseek(fp,0,SEEK_SET);
	while (fread(&b1,len,1,fp))
		{
			if((strcmp(b.name,b1.name)==0)&&(strcmp(b.address,b1.address)==0))
				{
					fclose(fp);
					printf("\n資訊庫中已有同的資訊,無法加入");
					Sleep(2000);
					system("cls");
					return;
				}
		}
	fseek(fp,0,SEEK_END);
	fwrite(&b,len,1,fp);
	fclose(fp);
	printf("\t\t\t 新增成功!\n");
	system("pause");

}
int record()
{
	worker b;
	FILE *fp;
	int i = -1;
	if((fp=fopen("data.dat","rb+"))==NULL)
		{
			printf("檔案開啟錯誤");
			exit(0);
		}
	fseek(fp,0,SEEK_SET);
	while(!feof(fp))
		{
			i++;
			fread(&b,len,1,fp);
		}
	return  i;
}
void display()
{
	if(record()==0)
		{
			printf("檔案沒有資訊,去新增吧");
		     system("pause");
		}
	else
		{
			worker sta;
			FILE *fp;
			fp=fopen("data.dat","rb");
			fseek(fp,0,SEEK_SET);
			fread(&sta,len,1,fp);
			printf("姓名    性別  年齡   工齡    學歷   職務   地址              電話\n");
			printf("-----------------------------------------------------------------------------\n");
			while(!feof(fp))
				{
					printf("%-10s %-4c %-4ld %-4ld   %-6s %-6s %-20s%-s\n",
					       sta.name,sta.sex,sta.age, sta.work_age,sta.education,sta.duty,
					       sta.address,sta.phone);
					fread(&sta,len,1,fp);
				}
			system("pause");
			fclose(fp);
		}
}
void del()

{
	worker b,b1;
	int flag=0,i=0;   //flag用於判斷職工是否存在
	total= record();
	worker temp[total];
	FILE *fp,*fp1;
	char a[20];
	if ((fp=fopen("data.dat","rb+"))==NULL)

		{
			printf("開啟檔案錯誤!!!\n");
			Sleep(1000);
			exit(1);
		}
	printf("\n請輸入職工名字:");
	scanf("%s",a);
	system("cls");
	fseek(fp,0,SEEK_SET);
	while (fread(&b,len,1,fp))   //遍歷檔案所有結構體
		{
			if(!strcmp(a,b.name))
				flag=1;           //判斷有無此職工
		}

	if(flag==0)   //沒有此職工退出函式

		{
			printf("\n\t\t\t沒這人");
			Sleep(2000);
			system("cls");
			return;
		}

	fseek(fp,0,SEEK_SET);
	while((!feof(fp))&&(i<total))
		{
			fread(&b,len,1,fp);   //將除了要刪除的資訊之外的所有資訊儲存進結構體 book temp[total],寫進記憶體
			if (strcmp(a,b.name))
				{
					temp[i]=b;
					i=i+1;
				}
		}
	fclose(fp);
	fp1=fopen("data.dat","wb");
	fclose(fp1);
	fp1=fopen("data.dat","ab");   //以覆蓋原有的檔案資訊 的方式建立同名檔案
	for(i=0; i<total-1; i++)      //將 除了要刪除的資訊之外的所有資訊儲存進的結構體 book temp[total]賦值給b1,寫入檔案
		{
			b1=temp[i];
			fseek(fp1,0,SEEK_END);
			fwrite(&b1,len,1,fp1);
		}
	fclose(fp1);
}
void change()                        //修改職工資訊

{
	int flag = 0;
	worker b,b1;
	FILE *fp;
	char a[20];
	if ((fp=fopen("data.dat","rb+"))==NULL)
		{
			printf("開啟檔案錯誤!!!\n");
			Sleep(1000);
			exit(1);
		}
	printf("請輸入要修改資訊的職工的姓名  :");
	scanf("%s",a);
	system("cls");
	fseek(fp,0,SEEK_SET);
	while (fread(&b,len,1,fp))             //遍歷檔案所有結構體
		{
			if (!strcmp(b.name,a))

				{
					printf("            【1】 修改姓名               【2】修改學性別\n");
					printf("            【3】 修改年齡               【4】修改職務\n");
					printf("            【5】 修改學歷               【6】修改居住地址\n");
					printf("            【7】 修改電話                            \n");
					printf("請輸入以上數字,選擇相應的功能: ");
					int  choice;
					scanf("%d",&choice);
					fflush(stdin);
					switch(choice)
						{
							case 1 :
							{
								printf(" \n請輸入職工姓名:   ");
								scanf("%s",&b.name);
								break;
							}

							case 2 :
							{
								printf(" \n請輸入職工性別(f或m):    ");
								scanf("%c",&b.sex);
								break;
							}
							case 3 :
							{
								printf(" \n請輸入職工的年齡:   ");
								scanf("%ld",&b.age);
								break;
							}
							case 4 :
							{
								printf(" \n請輸入職工的職務 :   ");
								scanf("%s",b.duty);
								break;
							}
							case 5 :
							{
								printf(" \n 請輸入職工的學歷(博士、碩士、本科、大專、高中、初中及以下)  : ");
								scanf("%s",b.education);
								break;
							}
							case 6 :
							{
								printf(" \n請輸入職工的居住地址 :   ");
								scanf("%s",b.address);
								break;
							}
							case 7 :
							{
								printf(" \n請輸入職工的電話:   ");
								scanf("%s",b.phone);
								break;
							}
							default :
								printf("\n輸入錯誤");
								system("pause");
								break;
						}
					if(flag!=1)
						{
							fseek(fp,-len,SEEK_CUR);   /*位置指標移動到該資料塊首位*/
							fwrite(&b,len,1,fp);
							printf("\n        修改成功!!!");
							system("pause");
							fclose(fp);
							if (feof(fp))

								{
									printf("沒有這個職工資訊\n");
									system("pause");

								}
						}
				}
		}
}
void search()                     //查詢
{
	worker b;
	int flag = 0;
	char ch,a[20];
	char name[20];
	FILE *fp;
	fp=fopen("data.dat","rb");
	fseek(fp,0,SEEK_SET);
	ch=fgetc(fp);
	if((fp=fopen("data.dat","r"))==NULL)
		{
			printf("\t\t\t錯誤,請先新增!\n");
			return ;
		}
	else if(ch==EOF)
		{
			printf("\t\t\t沒資訊!");
			return;

		}
	else
		{
			printf("請輸入查詢資訊的職工的姓名  :");
			scanf("%s",a);
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))             //遍歷檔案所有結構體
				{
					if (!strcmp(b.name,a))
						{
							printf("姓名    性別   年齡 工齡 學歷   職務   地址              電話\n");
							printf("-----------------------------------------------------------------------------\n");
							printf("%-10s %-4c %-4ld %-4ld   %-6s %-6s %-20s%-s\n",
							       b.name,b.sex,b.age, b.work_age,b.education,b.duty,
							       b.address,b.phone);
							flag = 1;
							system("pause");
						}
				}
			if (flag = 0)

				{
					printf("沒有這個職工資訊\n");
					system("pause");
				}
		}
}
void work_age(int n)
{
	total = n;
	int i=0,j;
	char ch;
	worker b,temp;
	worker a[total];
	FILE *fp;
	fp=fopen("data.dat","rb+");
	fseek(fp,0,SEEK_SET);
	ch=fgetc(fp);
	if(fp==NULL)
		{
			printf("\t\t\t錯誤,請先新增!\n");
			return ;
		}
	else if(ch==EOF)
		{
			printf("\t\t\t檔案沒有資訊!");
			return;

		}
	else
		{
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					a[i] = b;
					i++;
				}
			for(i=1; i<total; i++)
				{
					temp= a[i];
					j=i-1;
					while(j>=0&&temp.work_age>a[j].work_age)
						{
							a[j+1] = a[j];
							j--;
						}
					a[j+1]=temp;
				}

			fseek(fp,0,SEEK_SET);
			for(i=0; i<total; i++)
				fwrite(&a[i],len,1,fp);
			fclose(fp);
			display();
		}
}
void education(int n)
{
	int i=0;
	total = n;
	char ch;
	worker b,temp;
	worker a[total];
	FILE *fp;
	fp=fopen("data.dat","rb+");
	fseek(fp,0,SEEK_SET);
	ch=fgetc(fp);
	if(fp==NULL)
		{
			printf("\t\t\t錯誤,\n");
			return ;
		}
	else if(ch==EOF)
		{
			printf("\t\t\t檔案沒有資訊!");
			return;
		}
	else
		{
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"博士")==0)
						{
							a[i]=b;
							i++;
						}
				}
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"碩士")==0)
						{
							a[i]=b;
							i++;
						}
				}
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"碩士")==0)
						{
							a[i]=b;
							i++;
						}
				}
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"本科")==0)
						{
							a[i]=b;
							i++;
						}
				}
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"大專")==0)
						{
							a[i]=b;
							i++;
						}
				}
			fseek(fp,0,SEEK_SET);
			while (fread(&b,len,1,fp))
				{
					if(strcmp(b.education,"初中及以下")==0)
						{
							a[i]=b;
							i++;
						}
				}
			for(i=0; i<total; i++)
				{
					printf("%10s",a[i].name);
				}
			printf("   \n");
			fseek(fp,0,SEEK_SET);
			for(i=0; i<total; i++)
				fwrite(&a[i],len,1,fp);
			fclose(fp);
			display();
		}
}
void sort()
{
	int j;
	getchar();                         /*接收回車*/
	j=record();
	printf("            【1】 按工齡降排序               【2】按學歷降排序\n");
	printf("請輸入以上數字,選擇相應的功能: ");
	switch (getchar())
		{
			case '1':
				work_age(j);
				break;
			case '2':
				education(j);
				break;
		}
	getchar();                                /*接收回車*/
	system("cls");
	printf("            【1】 回到主介面               【2】退出系統\n");
	printf("請輸入以上數字,選擇相應的功能: ");
	switch(getchar())
		{
			case '1':
				getchar();
				system("cls");
				break;
			default:
				exit(1);
		}
}


int main()
{
	int flag=1;
	while(flag)
		{
			fflush(stdin);
			system("cls");             /*清屏*/
			printf("                         歡迎登陸職工資訊管理系統!\n");
			printf("            【1】 輸入職工資訊            【2】 輸出職工資訊\n");
			printf("            【3】 資訊查詢排序            【4】 刪除職工資訊\n");
			printf("            【5】 修改職工資訊            【6】 查詢職工資訊\n");
			printf("請輸入以上數字,選擇相應的功能: ");
			switch (getchar())
				{
					case '1':
						add();
						break;        /*呼叫輸入資訊的函式*/
					case '2':
						display();
						break;       /*呼叫輸出資訊的函式*/
					case '3':
						sort();
						break;       /*呼叫排序的函式*/
					case '4':
						del();
						break;         /*呼叫刪除職工資訊函式*/
					case '5':
						change();
						break;     /*呼叫修改職工資訊的函式*/
					case '6':
						search();
						break;       //查詢員工資訊
					default:
						flag=0;
						break;       /*跳出迴圈體,結束程式*/
				}
		}
	return 0;
}






相關文章