티스토리 뷰
c++ 을 이용해서 급여관리프로그램을 짜봤다.
급여관리프로그램 설계도는 이러하다.
입력 받은 Data 값을 넣는 돈, 정보, 시간 class들을 만들고 그 Data를 has~a 관계로 연결하여 Data를 받는 Data 보관 class를 만든다. 정규직class와 비정규직class를 구분하여 Data 보관 class를 상속 받는 class들을 만든다. 정규직과 비정규직 기능을 나누고 정규직과 비정규직 class의 데이터를 받는 데이터 관리(Data Managerment) class를 만들어 has~a 관계로 이어줬다. Data Managerment class는 모든 입력, 출력, 조회, 삭제 및 값 연산을 수행하는 class로 main에서 주는 메모리 갯수 인자를 받아 정규직 class의 객체, 비정규직 class의 배열을 만들어 메모리 할당을 해줬다. 입력받는 각 정규직, 비정규직들은 정규직, 비정규직 배열에 각각 한 메모리씩 들어가게 된다.
* 프로그램 시연장면
1. 메인화면 : ID와 Password를 입력할 수 있는 로그인 창이 나타난다. 로그인을 하면 급여관리프로그램을 실행 할 수 있다.
2. 관리자, 사용자 모드 선택 : 로그인 뒤 관리자/사용자 모드를 선택할 수 있다. 관리자 모드는 모든 입,출력,조회,삭제 기능을 제공하고, 사용자 모드는 사람을 검색하여 검색한 사람의 개인정보를 나타내주는 기능을 제공한다.
3. 관리자 기능 : 입력 기능은 정규직과 비정규직을 새로 또는 추가로 입력 할 수있는 기능을 제공하고, 전체 출력은 모든 입력 대상의 개인 정보 및 월급을 계산한 것을 출력한다. 조회는 이름으로 검색하여 검색한 사람의 개인정보를 나타내고 삭제는 입력한 이름의 데이터를 모두 삭제한다.
4. 출력 화면
5. 삭제 화면 : 삭제할 이름 입력하면 삭제가 완료되고, 삭제할 이름을 못 찾으면 삭제할 데이터가 없다고 뜬다. (예외 처리)
6. 비정규직 등록
7. 사용자 모드 : 사용자 모드를 들어가면 조회할 수 있는 화면이 나타난다.
* 배열 삭제
급여관리프로그램에서 가장 까다롭고 중요한 부분은 삭제 부분이다. 배열의 개념을 잘 아는것이 중요하다.
배열은 추가하는 족족 메모리를 할당하는 LinkedList 개념과 다르게 미리 배열 메모리를 잡고 시작한다. 내가 만약 삭제할 위치가 있다면 그 삭제할 위치를 앞으로 앞당긴다. 그럼 삭제할 부분이 뒤쪽에 있는 부분으로 덮어쓰기 되어 삭제할 부분이 없어지고 한칸씩 앞으로 밀려오게 된다. 만약에 배열 메모리가 5개 있을때 1을 삭제하고 싶으면 한칸씩 계속 앞으로 당긴다.
pos + 1 = {1,2,3,4,5}
↓
pos = {2,3,4,5,5}
한칸씩 당기면 2,3,4,5,5 모양이 되는데, 5번째 자리에서는 앞당길 것이 없기 때문에 5값이 그대로 내려오게 된다. 이 5값을 NULL로 바꾸게 되면
pos = {2,3,4,5}
이런식으로 삭제가 된 것처럼 보인다. 5값 뒤에 있는 공간은 NULL 값이 들어가있다.
* Data Managerment class 일부(삭제 메소드ver)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93 |
class Managerment {
Regular *regular;//정규직 배열을 가리키는 정규직 포인터
NonRegular *nonregular;//비정규직 배열을 가리키는 비정규직 포인터
string na,g;//이름, 직급
int nu,num;//사원번호, 직급번호
int se;//정규직 비정규직 모드 선택
int yesno;//계속 여부
int basic;//기본금
string gradename;//직급 이름
int count;//정규직 배열 개수 세는 변수
int count_1;//비정규직 배열 개수 세는 변수
int pos,pos1;//정규직, 비정규직 배열 검색하는 변수
public:
Managerment(int a, int b)//암시적 방법의 생성자
{ //초기화
count = 0;
count_1 = 0;
regular = new Regular[a];//정규직 배열타입 동적메모리 할당
nonregular = new NonRegular[b];//비정규직 배열타입 동적메모리 할당
}
void del() {//삭제 메소드
pos = 0;//정규직 위치검색 변수
pos1 = 0;//비정규직 위치검색 변수
int i = 0;
cout << "정규직 삭제는 1번/비정규직 삭제는 2번을 입력하세요" << endl;
cin >> se;
if (se= 1)
{//정규직 삭제모드
system("cls");
cout << "삭제할 이름을 입력하세요" << endl;
cin >> na;
for ( i = 0; i < count; i++)//정규직 배열 갯수만큼 돌린다
{
if (na.compare(regular[i].getregularName())== 0)
{ //입력한 이름이 배열안에 있는 이름과 같을때
for (int j = pos; j < count; j++)
{//삭제 위치를 삭제위치 다음으로 덮어쓰기한다//그러면 삭제할 위치가 앞위치로 당겨짐
regular[pos] = regular[pos + 1];
pos++;//삭제할 위치가 하나 없어졌으니 위치 제자리로 돌리기 위해 하나 증가
}
}
else {
//입력한 이름이 배열안에 있는 이름과 다를때
pos++;//위치 검색 변수 증가
}
}//for문 탈출
count--;//배열갯수 한개 삭제
if (count < 0) {
//배열 갯수가 마이너스가 되면 배열에 다음 입력을 못하기때문에 예외처리
cout << "삭제할 데이터가 없습니다." << endl;
count++;//배열 갯수를 마이너스에서 양수로 올림
}
}
else {
//비정규직 삭제모드
system("cls");
cout << "삭제할 이름을 입력하세요" << endl;
cin >> na;
for (i = 0; i < count_1; i++)//비정규직 배열 갯수만큼 돌린다
{
if (na.compare(nonregular[i].getnoregularName()) == 0)
{ //입력한 이름이 배열안에 있는 이름과 같을때
for (int j = pos1; j < count_1; j++)
{//삭제 위치를 삭제위치 다음으로 덮어쓰기한다//그러면 삭제할 위치가 앞위치로 당겨짐
nonregular[pos1] = nonregular[pos1 + 1];
pos1++;//삭제할 위치가 하나 없어졌으니 위치 제자리로 돌리기 위해 하나 증가
}
}
else {
//입력한 이름이 배열안에 있는 이름과 다를때
pos1++;//위치 검색 변수 증가
}
}//for문 탈출
count_1--;//배열갯수 한개 삭제
if (count_1 < 0) {
//배열 갯수가 마이너스가 되면 배열에 다음 입력을 못하기때문에 예외처리
cout << "삭제할 데이터가 없습니다." << endl;
count_1++;//배열 갯수를 마이너스에서 양수로 올림
}
}
}
};
|
cs |
if(you want to view the file){
;
}else{
exit(-1);
}
'Programming > C++' 카테고리의 다른 글
[c++]가상함수(virtual method) (1) | 2018.03.13 |
---|---|
[c++]가상상속(virtual) (1) | 2018.03.13 |
[c++] 상속 (0) | 2018.03.09 |
[c++]has~a 관계를 이용한 사람수 제한없는 성적프로그램 (0) | 2018.03.08 |
[c++]const (0) | 2018.03.08 |