직원에 대한 인사 급여 관리를 할 수 있는 프로그램을 작성 해보자 인사 관리 정보는 이름 직급 근무, 부서 근무 년 수, 초과 업무 시간, 월 급여 액 이다 출력 기능은 각 직원의 월 급여 액을 출력 하도록 하고 분석 기능에서는 부서 별 직원의 총 급여 액을 합산하여 보여주는 기능을 개발한다
<전체 코드 구조>
namespace salary_ex
{
// 인사 관리 정보
struct worker
{
}
class Program
{
// 사원등록
static void AddWorker(worker[] w)
{
}
// 사원 직급 수정
static void ChangePos(worker[] w)
{
}
// 사원 근무 부서 수정
static void ChangeDepart(worker[] w)
{
}
// 사원 근무 년수 수정
static void ChangeWorkeyear(worker[] w)
{
}
// 사원 초과 근무 수정
static void ChangeOvertime(worker[] w)
{
}
// 사원 직급 명세서 출력
static void PrintPaymentList(worker[] w)
{
}
// 부서별 총 급여액 출력
static void PrintDepartPayment(worker[] w)
{
}
static void Main(string[] args)
{
}
}
}
<구조체>
struct worker
{
public string name; // 이름
public string pos; // 직급
public string depart; // 근무 부서
public int workyear; // 근무 년수
public int overtime; // 초과 근무시간
public int totalpay; // 이번달 지급할 급여액
}
<Main>
static void Main(string[] args)
{
worker[] data = new worker[30];
while (true)
{
Console.WriteLine("# 1 = 신규둥록, 2 = 직급 수정, 3 = 부서 수정, 4 = 근무 년수 수정, 5 = 초과 근무 수정 #");
Console.WriteLine("# 6 = 급여 명세서 출력, 7 = 부서별 급여 총액 분석, 0 = 프로그램 종료 #");
Console.Write("원하는 작업을 선택하세요 -->");
int command = int.Parse(Console.ReadLine());
if (command == 0)
{
break;
}
Console.WriteLine();
switch (command)
{
case 1:
{
AddWorker(data);
Console.WriteLine();
break;
}
case 2:
{
ChangePos(data);
Console.WriteLine();
break;
}
case 3:
{
ChangeDepart(data);
Console.WriteLine();
break;
}
case 4:
{
ChangeWorkeyear(data);
Console.WriteLine();
break;
}
case 5:
{
ChangeOvertime(data);
Console.WriteLine();
break;
}
case 6:
{
PrintPaymentList(data);
Console.WriteLine();
break;
}
case 7:
{
PrintDepartPayment(data);
Console.WriteLine();
break;
}
}
}
}
}
}
새로운 직원이 입사하는 경우 직원을 등록하기 위해서 AddWorker() 메서드를 실행하게 되는데 근무 년 수와 초과 근무 시간은 숫자로 등록 해야 하기에 숫자로 변환하는 int.Parse() 함수를 사용하였다
<AddWorker>
// 사원등록
static void AddWorker(worker[] w)
{
Console.Write("사원번호를 입력하세요(1~30)"); // 사원 번호는 1~30번으로 정의.
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 31)
{
Console.Write("이름을 입력하세요");
w[n = 1].name = Console.ReadLine();
Console.Write("직급을 입력 하세요(부장, 차장, 과장, 대리, 사원)");
w[n - 1].pos = Console.ReadLine();
Console.Write("근무 부서를 입력하세요 (영업부, 구매부, 물류부, 생산부, 총무부)");
w[n - 1].depart = Console.ReadLine();
Console.Write("근무 년수를 입력하세요");
w[n - 1].workyear = int.Parse(Console.ReadLine());
Console.Write("초과 근무 시간을 입력해 주세요");
w[n - 1].overtime = int.Parse(Console.ReadLine());
}
else
{
Console.WriteLine("사원 번호는 1~30번을 사용하세요");
}
}
필요에 따라 직원이 승진한 경우 직급을 수정하기 위해 ChangePos() 메서드를 호출 한다
<ChangePos>
// 사원 직급 수정
static void ChangePos(worker[] w)
{
Console.WriteLine("현재 사원 직급");
for (int i = 0; i < 31; i++)
{
if (w[i].name != null) // 기존 사원 번호와 직급을 보여준다
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].pos);
}
}
Console.Write("직급을 수정할 사원 번호를 입력하세요 (1~30)");
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 30) // 사번 에러 체크
{
Console.Write("새로운 직급을 입력하세요");
string newpos = Console.ReadLine();
w[n - 1].pos = newpos; // 지정한 사원의 직급을 수정한다
}
else
{
Console.WriteLine("사원 번호는 1~30을 사용하세요");
}
}
직원의 소속 부서가 변경된 경우 ChangeDepart() 메소드를 호출 한다 코드는 ChangePos()와 유사하다
<ChangeDepart>
// 사원 근무 부서 수정
static void ChangeDepart(worker[] w)
{
Console.WriteLine("현재 사원 근무 부서");
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].depart);
}
}
Console.Write("수정할 사원의; 사원번호를 입력하세요(1~30)");
int n = int.Parse(Console.ReadLine());
if(0<n && n < 31)
{
Console.Write("새로운 부서를 입력하세요");
string newdepart = Console.ReadLine();
w[n - 1].depart = newdepart; // 선택한 사원 부서 변경
}
else
{
Console.WriteLine("사원 번호는 1~30번을 사용하세요");
}
}
급여 계산에 필요한 근무 년수를 바꾸기 위해서는 ChangeWorkeyear() 메소드를 사용한다
// 사원 근무 년수 수정
static void ChangeWorkeyear(worker[] w)
{
Console.WriteLine("현재 사원 근무 년수");
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].workyear);
}
}
Console.Write("수정할 사원번호를 입력하세요 (1~30)");
int n = int.Parse(Console.ReadLine()) ;
if(0<n && n < 31)
{
Console.Write("새로운 근무 년수를 입력하세요");
int newworkyear = int.Parse(Console.ReadLine());
w[n-1].workyear = newworkyear; // 선택한 사원 근무 년수 변경
}else {
Console.WriteLine("사원번호는 1~30번을 사용하세요");
}
매월 말일에 급여 계산을 하기 위해서 각 직원의 초과근무 시간을 입력하는 업무 절차가 필요하다 ChangeOvertime() 메소드를 사용한다 코드는 ChangeWorkeyear 와 유사하다
// 사원 초과 근무 수정
static void ChangeOvertime(worker[] w)
{
Console.WriteLine("현재 사원의 초과근무");
for (int i = 0; i < 30; ++i)
{
if (w[i].name != null)
{
Console.WriteLine("{0},{1},{2}", i + 1, w[i].name, w[i].overtime);
}
}
Console.Write("수정할 사원 번호를 입력 하세요(1~30)");
int n = int.Parse(Console.ReadLine());
if(0<n && n < 31)
{
Console.Write("새로운 초과 근무 시간을 입력하세요");
int newovertime = int.Parse(Console.ReadLine());
w[n-1].overtime = newovertime;
}
else
{
Console.WriteLine("사원번호는 1~30번을 사용하세요");
}
}
매월 말일에 급여업무를 위하여 모든 직원의 급여 명세서를 출력 해야 한다 급여계산로직은 아래와 같이 계산하는 것으로 가정했다. 메소드는 PrintPaymentList() 를 사용한다
부장:200 + 근무년수 * 5 + 초과근무시간 * 4
차장:180 + 근무년수 * 4 + 초과근무시간 * 4
과장:160 + 근무년수 * 3 + 초과근무시간 * 4
대리:150 + 근무년수 * 2 + 초과근무시간 * 4
사원:130 + 근무년수 * 1 + 초과근무시간 * 4
출력 양식은 아래 형식을 사용 한다
- [사원 번호 : 이름 : 직급 : 근무 부서 : 월 급여액]
// 사원 직급 명세서 출력
static void PrintPaymentList(worker[] w)
{
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
w[i].totalpay = 0;
if (w[i].pos == "부장")
{
w[i].totalpay = 200 + w[i].workyear * 5 + w[i].overtime * 4;
}
else if (w[i].pos == "차장")
{
w[i].totalpay = 180 + w[i].workyear * 4 + w[i].overtime * 4;
}
else if (w[i].pos == "과장")
{
w[i].totalpay = 160 + w[i].workyear * 3 + w[i].overtime * 4;
}
else if (w[i].pos == "대리")
{
w[i].totalpay = 150 + w[i].workyear * 2 + w[i].overtime * 4;
}
else
{
w[i].totalpay = 130 + w[i].workyear * 1 + w[i].overtime * 4;
}
}
}
각 부서별 총 인건비를 분석해 보기위해 다음 코드에서 직원의 급여를 부서별로 정리 해 본다 Hashtable을 이용하였다
// 부서별 총 급여액 출력
static void PrintDepartPayment(worker[] w)
{
Hashtable summary = new Hashtable();
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
string key = w[i].depart;
if (summary.ContainsKey(key))
{
summary[key] = (int)summary[key] + w[i].totalpay;
}
else
{
summary.Add(key, w[i].totalpay);
}
}
foreach (DictionaryEntry cs in summary)
{
string depart = (string)cs.Key;
int totalpay = (int)cs.Value;
Console.WriteLine("{0}부서 총급여액 = {1}", depart, totalpay);
}
}
}
<전체 코드>
using System.Collections;
namespace salary_ex
{
// 인사 관리 정보
struct worker
{
public string name; // 이름
public string pos; // 직급
public string depart; // 근무 부서
public int workyear; // 근무 년수
public int overtime; // 초과 근무시간
public int totalpay; // 이번달 지급할 급여액
}
class Program
{
// 사원등록
static void AddWorker(worker[] w)
{
Console.Write("사원번호를 입력하세요(1~30)"); // 사원 번호는 1~30번으로 정의.
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 31)
{
Console.Write("이름을 입력하세요");
w[n = 1].name = Console.ReadLine();
Console.Write("직급을 입력 하세요(부장, 차장, 과장, 대리, 사원)");
w[n - 1].pos = Console.ReadLine();
Console.Write("근무 부서를 입력하세요 (영업부, 구매부, 물류부, 생산부, 총무부)");
w[n - 1].depart = Console.ReadLine();
Console.Write("근무 년수를 입력하세요");
w[n - 1].workyear = int.Parse(Console.ReadLine());
Console.Write("초과 근무 시간을 입력해 주세요");
w[n - 1].overtime = int.Parse(Console.ReadLine());
}
else
{
Console.WriteLine("사원 번호는 1~30번을 사용하세요");
}
}
// 사원 직급 수정
static void ChangePos(worker[] w)
{
Console.WriteLine("현재 사원 직급");
for (int i = 0; i < 31; i++)
{
if (w[i].name != null) // 기존 사원 번호와 직급을 보여준다
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].pos);
}
}
Console.Write("직급을 수정할 사원 번호를 입력하세요 (1~30)");
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 30) // 사번 에러 체크
{
Console.Write("새로운 직급을 입력하세요");
string newpos = Console.ReadLine();
w[n - 1].pos = newpos; // 지정한 사원의 직급을 수정한다
}
else
{
Console.WriteLine("사원 번호는 1~30을 사용하세요");
}
}
// 사원 근무 부서 수정
static void ChangeDepart(worker[] w)
{
Console.WriteLine("현재 사원 근무 부서");
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].depart);
}
}
Console.Write("수정할 사원의; 사원번호를 입력하세요(1~30)");
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 31)
{
Console.Write("새로운 부서를 입력하세요");
string newdepart = Console.ReadLine();
w[n - 1].depart = newdepart; // 선택한 사원 부서 변경
}
else
{
Console.WriteLine("사원 번호는 1~30번을 사용하세요");
}
}
// 사원 근무 년수 수정
static void ChangeWorkeyear(worker[] w)
{
Console.WriteLine("현재 사원 근무 년수");
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
Console.WriteLine("{0}:{1}:{2}", i + 1, w[i].name, w[i].workyear);
}
}
Console.Write("수정할 사원번호를 입력하세요 (1~30)");
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 31)
{
Console.Write("새로운 근무 년수를 입력하세요");
int newworkyear = int.Parse(Console.ReadLine());
w[n - 1].workyear = newworkyear; // 선택한 사원 근무 년수 변경
}
else
{
Console.WriteLine("사원번호는 1~30번을 사용하세요");
}
// 사원 초과 근무 수정
static void ChangeOvertime(worker[] w)
{
Console.WriteLine("현재 사원의 초과근무");
for (int i = 0; i < 30; ++i)
{
if (w[i].name != null)
{
Console.WriteLine("{0},{1},{2}", i + 1, w[i].name, w[i].overtime);
}
}
Console.Write("수정할 사원 번호를 입력 하세요(1~30)");
int n = int.Parse(Console.ReadLine());
if (0 < n && n < 31)
{
Console.Write("새로운 초과 근무 시간을 입력하세요");
int newovertime = int.Parse(Console.ReadLine());
w[n - 1].overtime = newovertime;
}
else
{
Console.WriteLine("사원번호는 1~30번을 사용하세요");
}
}
// 사원 직급 명세서 출력
static void PrintPaymentList(worker[] w)
{
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
w[i].totalpay = 0;
if (w[i].pos == "부장")
{
w[i].totalpay = 200 + w[i].workyear * 5 + w[i].overtime * 4;
}
else if (w[i].pos == "차장")
{
w[i].totalpay = 180 + w[i].workyear * 4 + w[i].overtime * 4;
}
else if (w[i].pos == "과장")
{
w[i].totalpay = 160 + w[i].workyear * 3 + w[i].overtime * 4;
}
else if (w[i].pos == "대리")
{
w[i].totalpay = 150 + w[i].workyear * 2 + w[i].overtime * 4;
}
else
{
w[i].totalpay = 130 + w[i].workyear * 1 + w[i].overtime * 4;
}
}
}
// 부서별 총 급여액 출력
static void PrintDepartPayment(worker[] w)
{
Hashtable summary = new Hashtable();
for (int i = 0; i < 30; i++)
{
if (w[i].name != null)
{
string key = w[i].depart;
if (summary.ContainsKey(key))
{
summary[key] = (int)summary[key] + w[i].totalpay;
}
else
{
summary.Add(key, w[i].totalpay);
}
}
foreach (DictionaryEntry cs in summary)
{
string depart = (string)cs.Key;
int totalpay = (int)cs.Value;
Console.WriteLine("{0}부서 총급여액 = {1}", depart, totalpay);
}
}
}
static void Main(string[] args)
{
worker[] data = new worker[30];
while (true)
{
Console.WriteLine("# 1 = 신규둥록, 2 = 직급 수정, 3 = 부서 수정, 4 = 근무 년수 수정, 5 = 초과 근무 수정 #");
Console.WriteLine("# 6 = 급여 명세서 출력, 7 = 부서별 급여 총액 분석, 0 = 프로그램 종료 #");
Console.Write("원하는 작업을 선택하세요 -->");
int command = int.Parse(Console.ReadLine());
if (command == 0)
{
break;
}
Console.WriteLine();
switch (command)
{
case 1:
{
AddWorker(data);
Console.WriteLine();
break;
}
case 2:
{
ChangePos(data);
Console.WriteLine();
break;
}
case 3:
{
ChangeDepart(data);
Console.WriteLine();
break;
}
case 4:
{
ChangeWorkeyear(data);
Console.WriteLine();
break;
}
case 5:
{
ChangeOvertime(data);
Console.WriteLine();
break;
}
case 6:
{
PrintPaymentList(data);
Console.WriteLine();
break;
}
case 7:
{
PrintDepartPayment(data);
Console.WriteLine();
break;
}
}
}
}
}
}
}
}
'개발일지 > C#' 카테고리의 다른 글
파일 파싱 예제 (0) | 2024.11.11 |
---|---|
회계 관리 프로그램 예제 (1) | 2024.11.09 |
C# Delegate (2) | 2024.10.02 |
C# Indexer (0) | 2024.10.02 |
yield (5) | 2024.10.01 |