#include "stdio.h" /* 표준 입출력 라이브러리 */
#include "stdlib.h" /* 표준 라이브러리 */
#include "string.h" /* 문자열 라이브러리 */
#include "conio.h" /* 화면 운영 라이브러리 */
# 제목 정의 1 "-ZGGZ-\n"
# defineheader2 "| number | name | jbgz | jj | kk | yfgz | sk | sfgz | \ n"
# defineheader 3 "|-|-|-|-|-|-|-|-|-| \ n"
# define format "|%-8s |%-10s |% 8.2f |% 8.2f |% 8.2f |% 8.2f |% 8.2f |
# 데이터 정의 p-> Num, p- > 이름, p-> Jbgz, p-> Jj, p-> Kk, p-> Yfgz, p-> Sk, p-> Sfgz
# 정의 끝 "-\n"
# N 60 정의
Intsaveflag = 0; /* 플래그 변수를 저장해야 합니까 */
/* 직원 관련 데이터 구조 정의 */
Typedef 구조 직원/* 직원으로 표시 */
{
Char num: ");
Scanf("%d ",& 선택);
If (선택 = =1)/* 번호별 조회 */
{
Stringinput(searchinput, 10, "기존 직원 번호 입력:");
P=Locate(tp, n, searchinput, "num"); /* 배열 TP 에서 값이 searchinput 인 요소를 찾고 배열 요소의 아래 첨자 값 */
만약 (p! =- 1) /* 레코드를 찾은 경우 */
{
Printheader ();
Printdata (TP: ");
Scanf("%d ",& ampsel);
If(sel== 1)
{
Stringinput(findmess, 10, "기존 직원 번호 입력:");
P=Locate(tp, n, findmess, "num");
Getchar ();
만약 (p! =- 1)
{
For (I = p+1; 나 & ltn;; I++) /* 이 레코드를 삭제하면 후속 레코드가 앞으로 이동합니다 */
{
Strcpy(tp[i- 1]). Num, tp[i] 입니다. Num);
Strcpy(tp[i- 1]). 이름, tp[i]. 이름);
Tp[i- 1]. Jbgz=tp[i] 입니다. Jbgz
Tp[i- 1]. Jj=tp[i] 입니다. JJ
Tp[i- 1]. Kk=tp[i] 입니다. KK
Tp[i- 1]. Yfgz=tp[i] 입니다. Yfgz
Tp[i- 1]. Jbgz=tp[i] 입니다. Sk;
Tp[i- 1]. Sfgz=tp[i] 입니다. Sfgz
}
Printf(" \ n = =>;; 삭제에 성공했습니다! \ n ");
N-;
Getchar ();
저장 플래그 =1;
}
기타
Nofind ();
Getchar ();
}
Else if(sel==2) /* 먼저 레코드가 있는 배열 요소의 아래 첨자 값을 이름 */으로 질의합니다
{
Stringinput(findmess, 15, "기존 직원 이름 입력:");
P=Locate(tp, n, findmess, "name");
Getchar ();
만약 (p! =- 1)
{
For (I = p+1; 나 & ltn;; I++) /* 이 레코드를 삭제하면 후속 레코드가 앞으로 이동합니다 */
{
Strcpy(tp[i- 1]). Num, tp[i] 입니다. Num);
Strcpy(tp[i- 1]). 이름, tp[i]. 이름);
Tp[i- 1]. Jbgz=tp[i] 입니다. Jbgz
Tp[i- 1]. Jj=tp[i] 입니다. JJ
Tp[i- 1]. Kk=tp[i] 입니다. KK
Tp[i- 1]. Yfgz=tp[i] 입니다. Yfgz
Tp[i- 1]. Jbgz=tp[i] 입니다. Sk;
Tp[i- 1]. Sfgz=tp[i] 입니다. Sfgz
}
Printf(" \ n = = = = =>;; 삭제에 성공했습니다! \ n ");
N-;
Getchar ();
저장 플래그 =1;
}
기타
Nofind ();
Getchar ();
}
N 을 반환합니다
}
/* 레코드를 수정합니다. 먼저 입력된 사원 번호를 기준으로 레코드를 질의한 다음 번호 이외의 값을 수정하라는 메시지를 표시합니다. 이 번호는 수정할 수 없습니다 */
Void Modify(ZGGZ tp[], int n)
{
Char find mess [20];
Int p = 0;;
(n & lt=0) 인 경우
{system ("cls");
Printf(" \ n = = = = =>;; 직원 기록이 없습니다! \ n ");
Getchar ();
반환;
}
시스템 ("cls");
Printf ("직원 기록 수정");
Disp(tp, n) :
Stringinput(findmess, 10, "기존 직원 번호 입력:"); /* 번호 입력 및 확인 */
P=Locate(tp, n, findmess, "num"); /* 배열 요소를 쿼리하고 아래 첨자 값 */
만약 (p! =- 1) /* If P! =- 1, 배열 요소 */
{
Printf ("번호: %s, \n", tp[p]. Num);
Printf ("이름: %s,", tp[p]. 이름);
Stringinput(tp[p]. 이름, 15, "새 이름 입력:");
Printf("jbgz:%8.2f, ",tp[p]. Jbgz);
Tp[p]. Jbgz = numberinput ("jbgz:");
Printf ("강진: %8.2f,", TP [p]. jj);
Tp[p]. Jj = 번호 입력 ("강진:");
Printf("koukuan:%8.2f, ",TP [p]. kk);
Tp[p]. Kk = numberinput ("koukuan:");
Tp[n]. Yfgz=tp[n] 입니다. Jbgz+tp[n] 입니다. Jj-tp[n] 입니다. KK
Tp[n]. Sk=tp[n] 입니다. Yfgz * 0.12;
Tp[n]. Sfgz=tp[n] 입니다. Yfgz-tp[n]. Sk;
Printf(" \ n = = = = =>;; 수정 성공! \ n ");
Getchar ();
Disp(tp, n) :
Getchar ();
저장 플래그 =1;
}
기타
{nofind ();
Getchar ();
}
반환;
}
/* Insert record: 직원 번호를 기준으로 삽입할 배열 요소의 위치를 질의한 다음 번호 뒤에 새 배열 요소를 삽입합니다. */
Int Insert(ZGGZ tp[], int n)
{
Char ch, num[ 10], s [10]; /*s[] 삽입점 위치 앞의 번호를 저장하고 num[] 은 입력한 새 레코드의 번호를 저장합니다 */
ZGGZ newinfo
Int flag=0, i=0, kkk = 0;;
시스템 ("cls");
Disp(tp, n) :
While( 1)
{stringinput(s, 10, "숫자 뒤에 삽입 위치 입력:");
Flag = 0;; I = 0;;
While (나 & ltN) /* 이 번호가 있는지, flag= 1 이 번호가 있음을 나타냅니다 */
{
If(strcmp(tp[i].num, s) = = 0) {kkk = I; Flag =1; 깨뜨리다 }
I++;+;
}
If(flag== 1)
깨뜨리다 /* 번호가 있는 경우 삽입하기 전에 새 레코드를 입력하십시오 */
기타
{getchar ();
Printf(" \ n = = = = =>;; 번호 %s 이 (가) 존재하지 않습니다. 다시 시도해 보시겠습니까? (y/n): ",s);
Scanf("%c ",& ampch);
If(ch=='y'||ch=='Y')
{계속; }
기타
{return n;; }
}
}
/* 다음 새 레코드의 입력 작업은 Add () */ 와 동일합니다
While( 1)
{stringinput(num, 10, "새 직원 번호 입력:");
I = 0;; Flag = 0;;
While (나 & ltN) /* 이 번호가 있는지, flag= 1 이 번호가 있음을 나타냅니다 */
{
If(strcmp(tp[i].num, num) = = 0) {flag =1; 깨뜨리다 }
I++;+;
}
If(flag== 1)
{
Getchar ();
Printf(" \ n = = = = =>;; 죄송합니다. 번호 %s 이 (가) 이미 존재합니다. 다시 시도해 보시겠습니까? (y/n): ",num);
Scanf("%c ",& ampch);
If(ch=='y'||ch=='Y')
{계속; }
기타
{return n;; }
}
기타
깨뜨리다
}
Strcpy(newinfo.num, num); /* 문자열 num 을 newinfo.num */
Stringinput(newinfo.name, 15, "name:");
Newinfo.jbgz = numberinput ("jbgz:"); /* jbgz*/ 입력 및 검증 */
Newinfo.jj=numberinput ("강진:"); /* 강진 입력 및 검증 */
Newinfo.kk = numberinput ("koukuan:"); /* 공제 입력 및 검증 */
Newinfo.yfgz = newinfo.jbgz+newinfo.jj-newinfo.kk; /* yfgz*/ 계산 */
Newinfo.sk = newinfo.yfgz * 0.12; /* 계산 sk*/
Newinfo.sfgz = newinfo.yfgz-newinfo.sk;
저장 플래그 =1; /* 전역 변수는 main () 에서 판단됩니다. 1 인 경우 */
For (I = n-1; 나 & gtkki-)/* 마지막 조직 요소에서 한 요소 위치 앞으로 이동 */
{strcpy(tp[i+ 1]). Num, tp[i] 입니다. Num);
Strcpy(tp[i+ 1]. 이름, tp[i]. 이름);
Tp[i+ 1]. Jbgz=tp[i] 입니다. Jbgz
Tp[i+ 1]. Jj=tp[i] 입니다. JJ
Tp[i+ 1]. Kk=tp[i] 입니다. KK
Tp[i+ 1]. Yfgz=tp[i] 입니다. Yfgz
Tp[i+ 1]. Sk=tp[i] 입니다. Sk;
Tp[i+ 1]. Sfgz=tp[i] 입니다. Sfgz
}
Strcpy(tp[kkk+ 1]. Num, newinfo.num); /* kkk 의 요소 위치 뒤에 새 레코드 삽입 */
Strcpy(tp[kkk+ 1]. Name, newinfo.name);
Tp[kkk+ 1]. Jbgz = newinfo.jbgz;
Tp[kkk+ 1]. Jj = newinfo.jj
Tp[kkk+ 1]. Kk = newinfo.kk
Tp[kkk+ 1]. Yfgz = newinfo.yfgz;
Tp[kkk+ 1]. Sk = newinfo.sk
Tp[kkk+ 1]. Sfgz = newinfo.sfgz;
N++;+;
Disp(tp, n) :
Printf ("\ n \ n");
Getchar ();
N 을 반환합니다
}
/* 모든 수준의 회사 직원 급여 통계 */
Void 중복 (ZGGZ tp[], int n)
{
Int count 10000=0, count5000=0, count2000=0, count0 = 0
Int I = 0;;
(n & lt=0) 인 경우
{system ("cls");
Printf(" \ n = = = = =>;; 직원 기록이 아닙니다! \ n ");
Getchar ();
반환;
}
시스템 ("cls");
Disp(tp, n) :
I = 0;;
While (나<n)
{
If (TP [I]. sfgz & gt =10000) {count10000+; I = I+1; 계속; }/* 실제 임금 > 10000*/
If (TP [I]. sfgz & gt = 5000) {count5000+; I = I+1; 계속; }/* 5000 < = 실제 임금
If (TP [I]. sfgz & gt = 2000) {count2000+; I = I+1; 계속; }/* 2000 < = 실제 임금
If (TP [I]. sfgz & lt2000) {count0+; I = I+1; 계속; }/* 실제 임금 < 2000*/
}
Printf("\n-중복 결과-\ n ");
Printf(" sfgz & gt;; = 10000:%d (ren)\n ",count10000);
Printf(" 5000 & lt;; = sfgz & lt 10000:%d (임의) \n ",count 5000);
Printf(" 2000 & lt;; = sfgz & lt5000:%d (임의) \n ",count 2000);
Printf(" sfgz & lt;; 2000:%d (임의) \n ",count0);
Printf ("-\ n");
Printf(" \ n \ n 아무 키나 눌러 ");
Getchar ();
}
/* 버블 정렬 방법을 사용하여 실제 급여 필드별로 내림차순으로, 높음에서 낮음까지 */
Void Sort(ZGGZ tp[], int n)
{
Int i=0, j=0, flag = 0;;
ZGGZ newinfo
(n & lt=0) 인 경우
{system ("cls");
Printf(" \ n = = = = =>;; 직원 기록이 아닙니다! \ n ");
Getchar ();
반환;
}
시스템 ("cls");
Disp(tp, n) : /* 정렬 전에 모든 레코드 표시 */
For(I = 0;; 나 & ltn;; I++)
{
Flag = 0;;
For(j = 0;; J<n-1; J++)
If ((TP [j]. sfgz & lttp [j+1]). Sfgz))
{flag =1;
Strcpy(newinfo.num, TP [j]. num); /* 구조 변수 newinfo 를 사용하여 배열 요소 교환 */
Strcpy(newinfo.name, tp[j]. 이름);
Newinfo.jbgz=tp[j] 입니다. Jbgz
Newinfo.jj=tp[j] 입니다. JJ
Newinfo.kk=tp[j] 입니다. KK
Newinfo.yfgz=tp[j] 입니다. Yfgz
Newinfo.sk=tp[j] 입니다. Sk;
Newinfo.sfgz=tp[j] 입니다. Sfgz
Strcpy(tp[j].num, tp[j+ 1]. Num);
Strcpy(tp[j]. 이름, tp[j+ 1]. 이름);
Tp[j]. Jbgz=tp[j+ 1]. Jbgz
Tp[j]. Jj=tp[j+ 1]. JJ
Tp[j]. Kk=tp[j+ 1]. KK
Tp[j]. Yfgz=tp[j+ 1]. Yfgz
Tp[j]. Sk=tp[j+ 1]. Sk;
Tp[j]. Sfgz=tp[j+ 1]. Sfgz
Strcpy(tp[j+ 1]. Num, newinfo.num);
Strcpy(tp[j+ 1]. Name, newinfo.name);
Tp[j+ 1]. Jbgz = newinfo.jbgz;
Tp[j+ 1]. Jj = newinfo.jj
Tp[j+ 1]. Kk = newinfo.kk
Tp[j+ 1]. Yfgz = newinfo.yfgz;
Tp[j+ 1]. Sk = newinfo.sk
Tp[j+ 1]. Sfgz = newinfo.sfgz;
}
If (flag = = 0) break; /* 플래그 =0 이면 교환이 없고 정렬이 완료된 것입니다 */
}
Disp(tp, n) : /* 정렬된 모든 레코드 표시 */
저장 플래그 =1;
Printf(" \ n = = = = =>;; 정렬 완료! \ n ");
}
/* 데이터를 저장합니다. 사용자가 특별히 이 작업을 하지 않고 데이터를 수정한 경우 시스템을 종료할 때 데이터를 저장하라는 메시지가 표시됩니다 */
Void Save(ZGGZ tp[], int n)
{
FILE * FP
Int I = 0;;
Fp=fopen("c:\\zggz ","WB "); /* 쓰기 전용으로 이진 파일 열기 */
If(fp==NULL) /* 파일을 열 수 없음 */
{
Printf(" \ n = = = = =>;; 파일 열기 오류! \ n ");
Getchar ();
반환;
}
For(I = 0;; 나 & ltn;; I++)
{
If (fwrite (& TP [I], sizeof (zggz), 1, FP) = = 1)/* 한 번에 하나의 레코드 또는 하나의 구조 배열 요소 */
{
계속;
}
기타
{
깨뜨리다
}
}
(I>0) 인 경우
{
Getchar ();
Printf(" \ n \ n = = = = =>;; 파일 저장이 완료되었습니다. 저장된 총 레코드 수는 %d\n ",I) 입니다.
Getchar ();
저장 플래그 = 0;
}
기타
{system ("cls");
Printf ("현재 링크가 비어 있습니다. 직원 레코드가 저장되지 않았습니다! \ n ");
Getchar ();
}
Fclose (FP); /* 파일 닫기 */
}
Void main ()
{
Zggz gz [n]; /* ZGGZ 구조 정의 */
파일 * FP/* 파일 포인터 */
Int select/* 선택 결과 변수 저장 */
Char ch/* Save (y, y, n, N)*/
Intcount = 0; /* 저장된 파일의 레코드 (또는 요소) 수 */
Fp=fopen("C:\\zggz ","a b+");
/* 바이너리 c:\zggz 를 추가로 열어 읽기/쓰기가 가능합니다. 파일이 없으면 */
If(fp==NULL)
{
Printf(" \ n = = = = =>;; 파일을 열 수 없습니다! \ n ");
종료 (0);
}
그리고 (! Feof(fp))
{
If (fread (& Gz [count], sizeof (zggz), 1, FP) = = 1)/* 파일에서 한 번에 하나의 직원 급여 레코드 읽기 */
Count++;+;
}
Fclose (FP); /* 파일 닫기 */
Printf(" \ n = =>;; 파일 열기가 성공했습니다. 총 레코드 수는 %d.\n ",개수);
Getchar ();
메뉴 ();
While( 1)
{
시스템 ("cls");
메뉴 ();
Printf("\n 선택 사항을 입력하십시오 (0 ~ 9): "); /* 프롬프트 정보 표시 */
Scanf("%d ",& 선택);
If (선택 = = 0)
{
If(saveflag== 1) /* 배열 데이터가 수정되고 저장되지 않은 경우 이 플래그는 1*/
{getchar ();
Printf(" \ n = =>;; 수정된 레코드를 파일에 저장하시겠습니까? (y/n):);
Scanf("%c ",& ampch);
If(ch=='y'||ch=='Y')
저장 (gz, 개수);
}
Printf(" \ n = = =>;; 유용해 주셔서 감사합니다! );
Getchar ();
깨뜨리다
}
스위치 (선택)
{
시나리오 1:count=Add(gz, count); 깨뜨리다 /* 직원 급여 기록 추가 */
사례 2: count=Del(gz, count); 깨뜨리다 /* 사원 임금 레코드 삭제 */
사례 3: 코란 (gz, 수); 깨뜨리다 /* 직원 급여 기록 조회 */
사례 4: 수정 (gz, 개수); 깨뜨리다 /* 직원 급여 기록 수정 */
사례 5: 개수 = 삽입 (gz, 개수); 깨뜨리다 /* 직원 급여 기록 삽입 */
사례 6: 동지 (gz, count); 깨뜨리다 /* 직원 급여 기록 통계 */
사례 7:Sort(gz, count); 깨뜨리다 /* 사원 임금 레코드 정렬 */
사례 8: 저장 (gz, 개수); 깨뜨리다 /* 직원 급여 기록 보관 */
사례 9: 시스템 ("cls"); Disp(gz, 개수); 깨뜨리다 /* 직원 급여 기록 표시 */
기본값: 오류 (); Getchar (); 깨뜨리다 /* 키가 잘못되었습니다. 0-9*/
}
}
}