리눅스

아직 과제 argc=2인 경우만 구현

정지홍 2023. 3. 25. 23:23
//기본 경우 수
//-n은 이름, -y는 연도 , -a는 연봉
/*show -n hong*/ //이름만 입력시 매년 정보 출력
/*show -n hong -y 2021*/ //이름 및 연도만 입력시 해당연도 연봉
/*show -a*/	//전 직원 평균 연봉
/*show -a -y 2021*/ //해당연도 평균 연봉
//2020y ~ 2024y
//나중에 추가해볼것
//-b 부서 , -g 근문 평점, -e입사년도
//argc가 2인 경우:->./show -a 
//argc가 3인 경우:->./show -n Hong  
//argc가 4인 경우:->./show -a -y 2021 
//argc가 5인 경우:->./show -n Hong -y 2021
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
int main(int argc , char *argv[]){
	int fd1,fd2,fd3,fd4,fd5;//파일 기술자 각각 txt1부터 txt5까지.
	int n;//스업예제로 테스트 나중에 지우기 
	char buf[512];
	//char *inform[]={"-n", "-y", "-a", "-b", "-g", "-e", '\0'};

	
	//차례대로 텍스트파일을 읽기 전용으로 열어줍니다.
	fd1=open("data1.txt",O_RDONLY);
	if (fd1==-1){
		perror("data1.txt");
		exit(1);
	}
	fd2=open("data2.txt",O_RDONLY);
	if (fd2==-1){
		perror("data2.txt");
		exit(1);
	}
	fd3=open("data3.txt",O_RDONLY);
	if (fd3==-1){
		perror("data3.txt");
		exit(1);
	}
	fd4=open("data4.txt",O_RDONLY);
	if (fd4==-1){
		perror("data4.txt");
		exit(1);
	}
	fd5=open("data5.txt",O_RDONLY);
	if (fd5==-1){
		perror("data1.txt");
		exit(1);
	}
	
	extern char *oparg;
	extern int optind;

	//printf("Current Optind : %d\n",optind);

	if(argc==2){
			while( (n=getopt(argc,argv,"a"))!=-1){
				switch(n){
					case 'a'://매년 모든 직원의 연봉을 출력합니다.(./show -a)
						int x;//read함수에서 사용할 변수입니다. 리드함수는 실행마다 읽어온 크기만큼 오프셋이 이동합니다.
						int cnt=1;//텍스트 파일에 처음 숫자는 입사한 연도이니 이것을 구별하기 위한 변수입니다.
						int rst=0;//각각 자릿수마다 더 해질 변수입니다.
						int sum=0;//사원들의 연봉 합을 저장하는 변수입니다.
						int bunmo=0;//사원수를 카운트하는 변수입니다.
						float avg;//연봉 평균을 저장할 변수입니다.
						
						/*----------------------2020년도 전 직원의 평균 연봉 출력-----------------------*/
						while((x=read(fd1,buf,1))>0){//2020년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
						//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
						//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
							if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
								if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
									sum+=rst;//사원의 연봉을 총합에 더해줍니다.
									rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
									bunmo+=1;//사원수를 1명 더해줍니다.
									cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
								}
							}
							if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
									int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
									save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
									if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
										if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
											rst=save;//rst에 저장해줍니다.
											cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
										}
										else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
											rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
											rst+=save;//뒤에 숫자를 더해줍니다.
											cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
										}
									}
									else{//입사년도에 해당되는 케이스입니다.
										cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
									}
								}
						}
						avg=sum/bunmo;//평균 연봉을 구합니다.
						printf("2020년 직원의 평균 연봉은 %.2f입니다.\n",avg);


						/*----------------------2021년도 전 직원의 평균 연봉 출력-----------------------*/
						cnt=1;
						rst=0;
						sum=0;
						bunmo=0;
						while((x=read(fd2,buf,1))>0){//2021년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
						//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
						//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
							if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
								if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
									sum+=rst;//사원의 연봉을 총합에 더해줍니다.
									rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
									bunmo+=1;//사원수를 1명 더해줍니다.
									cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
								}
							}
							if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
									int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
									save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
									if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
										if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
											rst=save;//rst에 저장해줍니다.
											cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
										}
										else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
											rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
											rst+=save;//뒤에 숫자를 더해줍니다.
											cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
										}
									}
									else{//입사년도에 해당되는 케이스입니다.
										cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
									}
								}
						}
						avg=sum/bunmo;//평균 연봉을 구합니다.
						printf("2021년 직원의 평균 연봉은 %.2f입니다.\n",avg);

					/*----------------------2022년도 전 직원의 평균 연봉 출력-----------------------*/
						cnt=1;
						rst=0;
						sum=0;
						bunmo=0;
						while((x=read(fd3,buf,1))>0){//2022년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
						//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
						//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
							if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
								if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
									sum+=rst;//사원의 연봉을 총합에 더해줍니다.
									rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
									bunmo+=1;//사원수를 1명 더해줍니다.
									cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
								}
							}
							if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
									int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
									save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
									if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
										if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
											rst=save;//rst에 저장해줍니다.
											cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
										}
										else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
											rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
											rst+=save;//뒤에 숫자를 더해줍니다.
											cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
										}
									}
									else{//입사년도에 해당되는 케이스입니다.
										cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
									}
								}
						}
						avg=sum/bunmo;//평균 연봉을 구합니다.
						printf("2022년 직원의 평균 연봉은 %.2f입니다.\n",avg);

					/*----------------------2023년도 전 직원의 평균 연봉 출력-----------------------*/
						cnt=1;
						rst=0;
						sum=0;
						bunmo=0;
						while((x=read(fd4,buf,1))>0){//2023년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
						//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
						//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
							if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
								if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
									sum+=rst;//사원의 연봉을 총합에 더해줍니다.
									rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
									bunmo+=1;//사원수를 1명 더해줍니다.
									cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
								}
							}
							if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
									int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
									save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
									if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
										if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
											rst=save;//rst에 저장해줍니다.
											cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
										}
										else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
											rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
											rst+=save;//뒤에 숫자를 더해줍니다.
											cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
										}
									}
									else{//입사년도에 해당되는 케이스입니다.
										cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
									}
								}
						}
						avg=sum/bunmo;//평균 연봉을 구합니다.
						printf("2023년 직원의 평균 연봉은 %.2f입니다.\n",avg);

					/*----------------------2024년도 전 직원의 평균 연봉 출력-----------------------*/
						cnt=1;
						rst=0;
						sum=0;
						bunmo=0;
						while((x=read(fd5,buf,1))>0){//2024년도 사원 파일, 임시저장 버퍼,1바이트씩 읽습니다.
						//파일 끝 도달시 read함수는 0을 리턴하여 반복문을 탈출합니다.
						//위에서 부서명은 2바이트씩이니 알파벳과 숫자만 읽어 들입니다.
							if(*buf<48 || *buf>57){//버퍼에 숫자가 저장 안된 경우입니다.
								if(rst>=1000){//연봉이 네자리 이상인 경우에 실행합니다.(한 사원의 연봉이 다 구해진 경우.)
									sum+=rst;//사원의 연봉을 총합에 더해줍니다.
									rst=0;//그리고 다음 사원을 검색하기 위해 rst=0을 해줍니다..
									bunmo+=1;//사원수를 1명 더해줍니다.
									cnt=1;//다음 검색을 위해 카운트=1을 해줍니다.
								}
							}
							if(*buf>=48 && *buf<=57){//버퍼에 숫자가 저장된 경우입니다.
									int save=*buf;//버퍼에 저장된 수를 save변수에 저장합니다.
									save-=48;//아스키코드에서 십진수로 바꿔야하니 48을 빼줍니다.
									if(cnt>=5 && cnt<=9){//앞의 cnt가 1~4인경우는 입사년도이며 5~8or9는 연봉을 나타내는 숫자입니다.
										if(rst==0){//cnt=5인 경우이며 천의 자리 숫자 혹은 만의 자리 숫자입니다.
											rst=save;//rst에 저장해줍니다.
											cnt+=1;//다음 자리숫를 위해 cnt+=1일 합니다.
										}
										else{//cnt=6,7,8,9인 경우입니다. 연봉이 만의 자리 숫까지 가는 경우만 cnt=9까지 도달합니다.
											rst*=10;//기존 숫자에 자릿수를 앞으로 늘립니다.
											rst+=save;//뒤에 숫자를 더해줍니다.
											cnt+=1;//다음 연산을 위해서 1을 더해줍니다.
										}
									}
									else{//입사년도에 해당되는 케이스입니다.
										cnt+=1;//입사년도,연봉 구별하는 변수에 1을 더해줍니다.
									}
								}
						}
						avg=sum/bunmo;//평균 연봉을 구합니다.
						printf("2024년 직원의 평균 연봉은 %.2f입니다.\n",avg);
						break;
					}
				}
	}

	if(argc==3){
			while( (n=getopt(argc,argv,"n:y:a:"))!=-1){
				switch(n){
					case 'n':
						printf("Option : n , Argment=%s\n",optarg);
						break;
					case 'y':
						printf("Option : y , Argment=%s\n",optarg);
						break;
					case 'a':
						printf("Option : a , Argment=%s\n",optarg);
						break;
					}

					printf("next optind: %d\n",optind);
					}
	}

	if(argc==4){
			while( (n=getopt(argc,argv,"n:y:a:"))!=-1){
				switch(n){
					case 'n':
						printf("Option : n , Argment=%s\n",optarg);
						break;
					case 'y':
						printf("Option : y , Argment=%s\n",optarg);
						break;
					case 'a':
						printf("Option : a , Argment=%s\n",optarg);
						break;
					}

					printf("next optind: %d\n",optind);
					}
	}

	return 0;
	



	//파일을 닫아줍니다.
	close(fd1);
	close(fd2);
	close(fd3);
	close(fd4);
	close(fd5);
	return 0;
}