Cấu trúc dữ liệu danh sách nhân viên

14
10251

Bài toán:
Viết chương trình quản lý nhân sự cho một công ty, mỗi nhân viên trong công ty gồm các thông tin sau: mã số (không có hai người trùng mã số), họ, tên, ngày sinh, nơi sinh, địa chỉ, ngày công tác, lương. Viết chương trình quản lý nhân viên với các thao tác sau:
 Thêm vào một nhân viên.
 Xem danh sách nhân viên.
 Tìm nhân viên theo mã số.
 Tìm một nhân viên theo tên.
 In ra bảng lương của các nhân viên trong công ty theo thứ tự giảm dần.
 Xóa một nhân viên.
Xử lý bài toán:
Khai báo thư viện
Khai báo struct nhân viên
Khai báo các hàm cần sử dụng
Hàm ngày tháng năm sinh
Xuất ngày tháng năm
Hàm nhập 1 nhân viên
Hàm xuất 1 nhân viên
Hàm danh sach nhân viên
Đưa vòng lặp vào và gọi lại hàm nhập 1 nhân viên
Hàm xuất danh sách nhân viên
Đưa vòng lặp vào và gọi lại hàm xuất 1 nhân viên
Hàm thêm nhân viên
Khi thêm vào thì trước tiên cần nhập sinh viên đó vào thì chỉ cần gọi lại hàm nhap 1 nhân viên Và nhập vào vị trí cần thêm
Lưu ý cần phải có: & để lưu lại và khi thêm vào thì phải xuất ra danh sách (trong hàm main)
Hàm tìm nhân viên theo tên
Tên nhân viên cần tìm
Duyệt danh sách, dùng hàm strcmp trong thư viện string.h để kiểm tra 2 tên có trùng nhau hay không
Nếu bằng 0 thì tìm thấy, return lại vị trí tìm được, dùng lệnh break để thoát khỏi vòng lặp
Ngược lại thì tìm không thấy nhân viên có tên đã nhập -1
Hàm tìm mã số nhân viên
Mã số nhân viên cần tìm
Duyệt danh sách, nếu mã nhân viên bằng mã số cần tìm thì return lại ví trí tìm được, dùng lệnh break để thoát khỏi vòng lặp
Ngược lại thì return -1
Hàm sắp xếp lương giảm dần
Duyệt từ vị trí i=0 đến vị trí n-1, duyệt từ vị trí j=i +1 đến n
Nếu lương của vị trí i < lương vị trí j thì
float t=ds.a[i].luong;
ds.a[i].luong=ds.a[j].luong;
ds.a[j].luong=t;
Hàm xóa 1 nhân viên
Mã số nhân viên muốn xóa
Gọi lại hàm tìm mã số nhân viên
Nếu hàm tìm mã số nhân viên =-1 thì không tìm thấy nhân viên cần xóa
Ngược lại thì duyệt danh sach từ vị trí tìm được mã số đến hết danh sách
i=i+1 khi đó n-1

Chương trình

#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#define max 100
struct Date
{
	int ngay;
	int thang;
	int nam;
};
typedef Date date;
struct NhanVien
{
	int msnv;
	char ho[10];
	char ten[30];
	date namsinh;
	char noisinh[300];
	char diachi[300];
	float luong;
	date ngayvao;
};
typedef NhanVien nhanvien;
struct DanhSach
{
	nhanvien a[max];
	int n;
};
typedef DanhSach danhsach;
void menu();
void nhapngaythang(date &ntn);
void nhap1nv(nhanvien &nv);
void xuat1nv(nhanvien nv);
void xuatngaythang(date ntn);
void nhapdanhsach(danhsach &ds);
void xuatdanhsach(danhsach ds);
int timten(danhsach ds,char *c);
void themnv(danhsach &ds,nhanvien x,int k);
int timMSNV(danhsach ds,int d);
void xoanv(danhsach ds,int d);
void sapxep(danhsach ds);
void main()
{
	menu();
	getch();
}
void menu()
{
	int ch;
	int d,k;
	danhsach ds;
	nhanvien x;
	nhapdanhsach(ds);
	xuatdanhsach(ds);
	printf("\n\t\t--------------MENU--------------");
	printf("\n\t1.Them vao 1 nhan vien");
	printf("\n\t2.Tim nhan vien theo ma so");
	printf("\n\t3.Tim nhan vien thoe ten");
	printf("\n\t4.Bang luong cua  nhan vien giam dan");
	printf("\n\t5.Xoa 1 nhan vien");
	printf("\n\    *************************************************");
	printf("\n\tChon 1 trong chuc nang tren: ");
	scanf("%d",&ch);
	switch(ch)
	{
		case 1:
			{
				printf("\n\tvi tri them: ");
				scanf("%d",&k);
				nhap1nv(x);
				themnv(ds,x,k);
				printf("\n\t\t\tdanh sach sau khi them");
				xuatdanhsach(ds);
				break;
			}
		case 2:
			{
				int d;
				danhsach ds;
				printf("\n\tNhap ma so can tim: ");
				scanf("%d",&d);
				int b=timMSNV(ds,d);
				if(timMSNV(ds,d)==-1)
					printf("\nkhong tim thay");
				else
					printf("\nTim thay nhan vien thu %d",b+1);
			}
		case 3:
			{
				char c[20];
				printf("\n\tnhap ten can tim: ");
				fflush(stdin);
				gets(c);
				int b=timten(ds,c);
				if(timten(ds,c)==-1)
					printf("\nKhong tim thay nhan vien: %s",c);
				else
					printf("\nTim thay nhan vien thu %d",b+1);
				break;
			}
		case 4:
			{
				sapxep(ds);
				printf("\n\t\t\tDANH SACH LUONG SAU KHI SAP XEP ");
				xuatdanhsach(ds);
				break;
			}
		case 5:
			{
				printf("\nnhap ma so can xoa: ");
				scanf("%d",&d);
				xoanv(ds,d);
				printf("\n\t\tdanh sach sau khi xoa");
				xuatdanhsach(ds);
				break;
			}
		default: printf("\nkhong co chuc nang nay");
			break;
	}
}
void nhapngaythang(date &ntn)
{
	do
	{
		printf("\nnhap vao ngay ");
		scanf("%d",&ntn.ngay);
	}while(ntn.nam>0 || ntn.ngay>31);
	do
	{
		printf("\nnhap vao thang ");
		scanf("%d",&ntn.thang);
	}while(ntn.thang<0 || ntn.thang>12);
	printf("\nnhap vao nam ");
	scanf("%d",&ntn.nam);
}
void xuatngaythang(date ntn)
{
	printf("%d-",ntn.ngay);
	printf("%d-",ntn.thang);
	printf("%d",ntn.nam);
}
void nhap1nv(nhanvien &nv)
{
	
	printf("\nnhap vao msnv: ");
	scanf("%d",&nv.msnv);
	printf("\nnhap vao ho: ");
	fflush(stdin);
	gets(nv.ho);
	printf("\nnhap vao ten:");
	fflush(stdin);
	gets(nv.ten);
	printf("\nngay sinh: ");
	nhapngaythang(nv.namsinh);
	printf("\nnhap vao noi sinh: ");
	fflush(stdin);
	gets(nv.noisinh);
	printf("\nnhap vao dia chi: ");
	fflush(stdin);
	gets(nv.diachi);
	printf("\nnhap vao luong: ");
	scanf("%f",&nv.luong);
	printf("\nngay vao: ");
	nhapngaythang(nv.ngayvao);
}
void xuat1nv(nhanvien nv)
{
	printf("\nma so nhan vien: %d",nv.msnv);
	printf("\nho: %s",nv.ho);
	printf("\nten: %s",nv.ten);
	printf("\nngay sinh: ");
	xuatngaythang(nv.namsinh);
	printf("\nnoi sinh: %s",nv.noisinh);
	printf("\ndia chi: %s",nv.diachi);
	printf("\nluong: %8.2f",nv.luong);
	printf("\nngay vao: ");
	xuatngaythang(nv.ngayvao);
}
void nhapdanhsach(danhsach &ds)
{
	printf("\nnhap so luong nhan vien: ");
	scanf("%d",&ds.n);
	printf("\n\t\t\tnhap thong tin nhan vien");
	for(int i=0;i< ds.n;i++)
	{
		printf("\n\t\tnhan vien thu %d",i+1);
		nhap1nv(ds.a[i]);
	}
}
void xuatdanhsach(danhsach ds)
{
	printf("\n\t\t\tdanh sach nhan vien");
	for(int i=0;i< ds.n;i++)
	{
		printf("\n\t\tnhan vien thu %d",i+1);
		xuat1nv(ds.a[i]);
	}
}
void themnv(danhsach &ds,nhanvien x,int k)
{
	for(int i=ds.n;i>k;i--)
		ds.a[i]=ds.a[i-1];
	ds.a[k]=x;
	ds.n++;
}
int timten(danhsach ds,char *c)
{
	for(int i=0;i<ds.n;i++)
	{
		if(strcmp(ds.a[i].ten,c)==0)
		{
			return i;
			break;
		}
	}
	return -1;
}
int timMSNV(danhsach ds,int d)
{
	for(int i=0;i<ds.n;i++)
	{
		if(ds.a[i].msnv==d)
		{
			return i;
			break;
		}
	}
	return -1;
}

void sapxep(danhsach ds)
{
	for(int i=0;i<ds.n-1;i++)
	{
		for(int j=i+1;j<ds.n;j++)
		{
			if(ds.a[i].luong<ds.a[j].luong)
			{
				float t=ds.a[i].luong;
				ds.a[i].luong=ds.a[j].luong;
				ds.a[j].luong=t;
			}
		}
	}
}
void xoanv(danhsach ds,int d)
{
	int vt=timMSNV(ds,d);
	if(vt==-1)
		printf("\nkhong tim thay msnv %d muon xoa",d );
	else
		for(int i=vt;i<ds.n;i++)
		{
			ds.a[i]=ds.a[i+1];
			ds.n--;
		}
}

Mình chia sẽ code này đê các bạn tham khảo các vấn đề tương tự. Tuy nhiên các bạn nên tự làm lại, đừng nên copy. Nếu gặp vấn đề gì khó khăn, hoặc thắc mắc gì, các bạn có thể đặt câu hỏi ở cuối bài. Mình sẽ giải đáp.

Chúc các bạn thành công!

14 COMMENTS

  1. Cho mình hỏi tại sao trong 1 số hàm con lại có dấu & vậy. Mình tưởng dấu & chỉ dùng để lấy địa chỉ của tham số khi gọi hàm thôi mà. Bạn làm ơn giải thích giùm mình vs.

  2. Tại sao ở hàm nhapnv, themnv , nhapds lại có dấu & trước tham số trong khi đó ở hàm timten lại có dấu con trỏ trước tham số vậy. Mình k hiểu cho lắm

  3. Nếu không có dấu & thì khi vào hàm va ra hàm giá trị sẽ không thay đổi ví dụ như hàm chưa có gì thì khi bạn nhập 1 mảng: 2 4 5 6 …vào rồi khi ra khỏi hàm hàm vẫn rỗng, nhưng khi bạn để dấu & thì hàm sẽ lưu lại các giá trị đã nhập

  4. Mình tưởng cách truyền tham số bằng địa chỉ này thì phải có dấu * ở đằng trc chứ. K lẽ code này bạn viết theo c++ ak?

  5. nếu sử dụng danh sách liên kết bạn có thể cho mình hàm xuất được k ạ, mình viết hàm mà nó k thể xuất giá trị ra được

  6. Các ac giúp e bài này với e mới học nên chưa hiểu lắm. Viết chương trình nhập vào danh sách công nhân gồm các thuộc tính: mã công nhân, tên công nhân, giới tính, năm sinh, hệ số lương, lương = hệ số lương * 1300000.
    Viết phương thức nhập và hiển thị Thoòng tin về danh sách công nhân.
    A. In ra màn hình danh sách công nhân có tên là :”Hung”.
    B. In ra màn hình danh sách cn về hưu năm nay( quy định nữ 55 tuổi , nam 60 tuổi). Mong các cao nhân chỉ giáo. Cám ơn

  7. Ae giúp e đc k ạ. Nhóm e đang tạo 1 website giới thiệu mẫu tóc, e làm phần nhân viên, giờ phải code. Gồm có tên nv, mã nv, giới tính, năm sinh, nơi ở, sđt, kinh nghiệm. Mà lap e k tải đc c# vs sql. Các cao nhân giúp e với

  8. Chào các anh chị em đanh làm bài tập về quản lý nhân viên. Nhưng trong quá trình nhập nhân viên có một vấn đề muốn giải quyết là nhập mã bộ phận thì sẽ tự động hiện ra tên bộ phận (tránh trường hợp nhập cùng mã bộ phận nhưng tên bộ phận khác nhau). Thì mình làm cách nào ạ? PS: Chạy trên Dos chứ không phải trên Form nhe anh chị.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

This site uses Akismet to reduce spam. Learn how your comment data is processed.