#include 
#include 
#include  //getch()
#include 
#include  //str쓰기위해

typedef struct node 
{
	char name[5] ;
	int num,count;
	char major[20];
	char booklist[10][50];

	struct node* next;
}Info;


Info *head, *tail;

//초기 노드설정
void InitAddStudent()
{
	head = (Info*)malloc(sizeof(Info));
	tail = (Info*)malloc(sizeof(Info));
	head->next = tail;
	tail->next = NULL;
}

//학생수 카운트
int CountStudent()
{
	Info *temp;
	int countstudent=0;

	temp = head->next;
	while(temp != tail)//구조체 길이(head 와 tail빼고)
	{
		countstudent++;
		temp = temp->next;
	};
	return countstudent;
}

//학생추가
void AddStudent()
{
	int i,j, //temp->booklist 초기화
		StudentCount = CountStudent(),
		numcount=0;	//학번 중복 검사
	Info *temp = (Info*)malloc(sizeof(Info));	//임시로 학생정보 저장
	Info *ctemp;	//추가된 학생수 세기위해
	Info *numtemp;	//학번 중복 검사

	printf("******학생 추가******\n");
	temp->count = StudentCount;
	printf("이름 : ");
	scanf("%s",&temp->name);
	fflush(stdin);

getnum:
	printf("학번 : ");
	scanf("%d",&temp->num);
	fflush(stdin);

	numtemp = head->next;	//학번 중복 검사
		while(numtemp != tail)
		{
			if(temp->num ==numtemp->num)
			{	
				printf("중복되는 학번이 있습니다. 다시 입력하세요.\n");
				goto getnum;	//중복학번 있을시 학번 재입력
			}
			else
			{
				numtemp = numtemp->next;
				numcount++;
			}
		};

	if(numcount == StudentCount)	//학번 중복검사 == 학생수 카운트 => 학번중복검사 통과시
	{	
		printf("전공 : ");
		gets(temp->major);
		fflush(stdin);
		
		for(i=0 ; i<10 ; i++)	//책목록 초기화
			for(j=0 ; j<50 ; j++)
				temp->booklist[i][j] = '\0';
		
		temp->next = head->next;		//head뒤에 학생추가
		head->next = temp;

		printf("추가되었습니다.\n\n");
		printf("메뉴로 돌아갑니다. ");
		system("pause");
	}
}

//학생삭제
void DelStudent()
{
	int delnum;	//삭제할 학번
	Info *ptemp = (Info*)malloc(sizeof(Info));
	Info *temp; //삭제할 노드
	
	printf("******학생 삭제******\n");
	printf("삭제할 학번을 입력하세요 : ");
	scanf("%d",&delnum);

	temp = head->next;
	while(temp != tail)
	{
		if(delnum==temp->num) //지울 문자열 찾으면
		{
			ptemp = head;
			while(ptemp->next != temp)		//ptemp 뒤에 temp가 올때까지 반복
			{
				ptemp = ptemp->next;
			};

			ptemp->next = temp->next;		//ptemp와 삭제할 노드의 다음노드를 연결

			free(temp);
			printf("삭제되었습니다.\n\n");
			printf("메뉴로 돌아갑니다. ");
			system("pause");
			return;
		}
	temp = temp->next;
	};
	printf("학번이 %d인 학생은 없습니다.\n\n",delnum);
	printf("메뉴로 돌아갑니다. ");
	system("pause");
}

//대출
void BorrowBook()//이름검색으로 대출 이름같은학생있으면 전공으로 찾기, 학생의 책목록에 추가
{
	Info *Book;			//대출학생 검색
	int samename=0,		//이름 같은학생 수
		i,				//비어있는 도서목록 배열찾기.
		j=1,k=1,bookcount=0;
	char n[10][50]={0,}, 
		borrowname[50],	//대출 학생이름
		borrowmajor[10];

	Book = head->next;
	printf("*********대출********\n");
	printf("학생이름 : ");
	scanf("%s",&borrowname);
	fflush(stdin);
	printf("이름      | 전공      \n"); //입력한 이름 목록 출력
	while(Book != tail)
	{
		if(strcmp(Book->name,borrowname)==0)
		{
			printf("%-10s| %-20s\n",Book->name,Book->major);
			samename++;
		}
	Book = Book->next;
	};
	
	printf("%s 학생을 %d명 찾았습니다.\n\n",borrowname,samename);
	if(samename>=1)
	{
		if(samename==1)	//검색한 이름의 학생이 1명일때
		{
			Book = head->next;
			while(Book != tail)
			{
				if(strcmp(Book->name,borrowname)==0)
				{
					for(i=0 ; i<10 ; i++)
					{
						if(strcmp(Book->booklist[i], n[i])==0)//비어있는 도서목록배열찾기.
						{
							printf("대출할 책을 입력하세요 : ");
							gets(Book->booklist[i]);
							fflush(stdin);
							break;
						}
						bookcount++;
						if(bookcount==10)
							printf("대출가능 권수 초과\n\n");
					}
				}
			Book = Book->next;
			};
		}
		
		else if(samename>1)		//검색한 이름의 학생이 1명 이상일때
		{
			printf("전공을 입력하세요 : ");
			gets(borrowmajor);
			Book = head->next;

			bookcount=0;
			while(Book != tail)
			{
				if(strcmp(Book->name,borrowname)==0)
				{
					if(strcmp(Book->major,borrowmajor)==0)
					{
						for(i=0 ; i<10 ; i++)
						{
							if(strcmp(Book->booklist[i], n[i])==0)//비어있는 도서목록배열찾기.
							{
								printf("대출할 책을 입력하세요 : ");
								gets(Book->booklist[i]);
								fflush(stdin);
								break;
							}
							bookcount++;
							if(bookcount==10)
								printf("대출가능 권수 초과.\n\n");
						}
					}
				}
					Book = Book->next;
			};
		}
		if(bookcount != 10)
				printf("대출되었습니다.\n\n");
	printf("메뉴로 돌아갑니다. ");
	system("pause");
	}
	else	//등록된 학생이 없을때
	{
		printf("등록된 학생이 없습니다.학생을 추가해 주세요.\n\n");
		system("pause");
	}
}

//반납
void ReturnBook()//이름검색으로 반납 이름같은학생있으면 전공으로 찾기, 학생의 책목록에 삭제
{
	Info *Book;
	int a=0,i,j;
	char rebook[50]={0,}, 
		returnname[5];

	Book = head->next;

	printf("*********반납********\n");
	printf("반납 학생이름 : ");
	scanf("%s",&returnname);
	fflush(stdin);
	printf(" 이름      전공\n"); //입력한 이름 목록 출력
	while(Book != tail)
	{
		if(strcmp(Book->name,returnname)==0)
		{
			printf("%s            %s\n",Book->name,Book->major);
			a++;
		}
	Book = Book->next;
	};
	
	printf("%s 학생을 %d명 찾았습니다.\n",returnname,a);
	
	if(a==1)
	{
		Book = head->next;
		while(Book != tail)
		{
			if(strcmp(Book->name,returnname)==0)
			{
				printf("반납할 책을 입력하세요 : ");
				gets(rebook);
				for(i=0 ; i<10 ; i++)
				{
					if(strcmp(Book->booklist[i], rebook)==0)
					{
						for(j=0 ; j<50 ; j++)
						{
							Book->booklist[i][j] = '\0';
							
						}
						break;
					}
				}
			}
		Book = Book->next;
		};
	printf("반납되었습니다.\n\n");
	printf("메뉴로 돌아갑니다. ");
	system("pause");
	}
}

//Swap
void Swap(Info *a) // a는 비교하고자 하는 노드의 앞 노드
{
	Info *temp;
	temp = a->next;

	a->next = temp->next;
	temp->next = a->next->next;
	a->next->next = temp;

}

//1. 대출과 반납. 이름검색으로 대출(반납) 이름같은학생있으면 전공으로 찾기, 학생의 책목록에 추가(삭제)
void MenuCase1(int a)
{
	int menu;
	char chmenu;

	//system("cls");
	printf("*****대출과 반납*****\n");
	printf("1. 대출\n");
	printf("2. 반납\n");
	printf("3. MENU로 되돌아가기\n");
	printf("*********************\n");

	while(a)//조건이 0(거짓)이면 while문 종료. menu값 받기
	{
	chmenu = getch();
	putch(chmenu);
	if(!(chmenu>=48 && chmenu<=57))
		printf(" (문자입력은 할 수 없습니다.)\n");

	else if(!(chmenu>=49 && chmenu<=51))
		printf(" (1~3사이의 숫자를 입력하세요.)\n");
	
	else
		a=0;
	}	

	menu=chmenu-48;
		if(menu == 1)
		{
			system("cls");
			BorrowBook();
			system("cls");
		}
		else if(menu == 2)
		{
			system("cls");
			ReturnBook();
			system("cls");
		}
}

//2. 학생 관리. 학생 추가와 학생 삭제,삭제시 학번을 이용해서 삭제
void MenuCase2(int a)
{
	int menu;
	char chmenu;
	
	printf("******학생 관리******\n");
	printf("1. 학생 추가\n");
	printf("2. 학생 삭제\n");
	printf("3. MENU로 되돌아가기\n");
	printf("*********************\n");

	while(a)//조건이 0(거짓)이면 while문 종료. menu값 받기
	{
	chmenu = getch();
	putch(chmenu);
	if(!(chmenu>=48 && chmenu<=57))
		printf(" (문자입력은 할 수 없습니다.)\n");

	else if(!(chmenu>=49 && chmenu<=51))
		printf(" (1~3사이의 숫자를 입력하세요.)\n");
	
	else
		a=0;
	}	

	menu=chmenu-48;
		if(menu == 1)	//학생추가
		{
			system("cls");
			AddStudent();
			system("cls");
			
		}
		else if(menu == 2)	//학생삭제
		{
			system("cls");
			DelStudent();
			//system("cls");
			
		}
		
}

//3. 대출 도서목록. 학번으로 검색해서 책목록 출력
void MenuCase3()
{
	Info* Book;
	int num,i,k=0,count=0,a=0,StudentCount = CountStudent();
	char arr[10][50]={0,};

	Book = head->next;
	printf("****대출 도서목록****\n");
	printf("도서목록을 출력할 학번을 입력하세요 : ");
	scanf("%d",&num);
	fflush(stdin);


	while(Book != tail)
	{
		if(Book->num == num)
			for(i=0 ; i<10 ; i++)
			{
				if(Book->booklist[i][0] != arr[i][0])
					printf("%10s\n",Book->booklist[i]);
				else if(Book->booklist[i][0] == arr[i][0])
				{
					count++;
					if(count==10)
						printf("대출한 책이 없습니다.\n");
					k=1;
				}
			}
	a++;
	Book = Book->next;
	};
	if(k=0)
		printf("학번 %d 인 학생은 없습니다.\n\n",num);
	printf("메뉴로 돌아갑니다. ");
	system("pause");
}

//4. 전체 정렬. 학번순으로 학생을 정렬하여 출력(이름,학번,대출목록)
void MenuCase4()
{
	Info* temp2 = (Info*)malloc(sizeof(Info));
	Info* sorttemp;
	int StudentCount = CountStudent(),
		count=0,
		i,n,m;
	char arr[10][50]={0,};

	for(n=1 ; nnext->num > sorttemp->next->next->num)
				Swap(sorttemp);//sorttemp->next와 sorttemp->next->next 의 위치가 바뀜

			sorttemp=sorttemp->next;
		}
	}

	 //정렬된것출력
	printf("******전체 정렬******\n");
	printf(" 이름       학번\n");        
	temp2 = head->next;
	while(temp2 != tail)
	{
		printf("%s",temp2->name);
		printf("%10d\n",temp2->num);
		printf("    책목록\n");    
		for(i=0 ; i<10 ; i++)
		{
			if(temp2->booklist[i][0] != arr[i][0])
				printf("%10s\n",temp2->booklist[i]);
			else if(temp2->booklist[i][0] == arr[i][0])
			{
				count++;
			}
			if(count==10)
				printf("대출한 책이 없습니다.\n\n");
		}
		count=0;
		temp2 = temp2->next;
	};
	printf("메뉴로 돌아갑니다. ");
	system("pause");
}

//5. 전체 출력. 학생을 추가시켜준 순서대로 출력(이름,학번,전공,대출목록)
void MenuCase5()
{
	Info *temp = (Info*)malloc(sizeof(Info));
	Info *ctemp = (Info*)malloc(sizeof(Info));
	int a,i,j,k,count=0,StudentCount = CountStudent();
	char arr[10][50]={0,};
	
	printf("******전체 출력******\n");
	printf(" 이름       학번         전공\n");
	
	temp = head->next;
	for(a=0 ; acount==a)
			{
				printf("%s",temp->name);
				printf("%12d",temp->num);
				printf("%17s\n",temp->major);
				printf("  책목록 \n");
				for(i=0 ; i<10 ; i++)
				{
					if(temp->booklist[i][0] != arr[i][0])
						printf("%10s\n",temp->booklist[i]);

					else if(temp->booklist[i][0] == arr[i][0])
					{
						count++;
						if(count==10)
						{
							printf("대출한 책이 없습니다.\n\n");
							count=0;
							k=1;
							break;
						}
					}
				}
				temp = head->next;//브레이크
				if(k==1)
					break;
			}
			else
			{
				temp = temp->next;
			}
		}
	}
	printf("메뉴로 돌아갑니다. ");
	system("pause");
}

//6.종료
void MenuCase6()
{
	Info *pptail;
	Info *temp;
	int i,
		StudentCount = CountStudent();

	if(head->next == tail)
	{
		free(head);
		free(tail);
	}
	else
	{
		for(i=0 ; inext->next != tail)
			{
				pptail = pptail->next;
			};
			temp = pptail->next;
			pptail->next = tail;

			free(temp);
		}
		free(head);
		free(tail);
	}
}

void main()
{
	char chmenu;
	int menu,a;

	InitAddStudent();
	CountStudent();

Menu:

	printf("*******MENU*******\n");
	printf("1. 대출과 반납\n");	//이름검색으로 대출(반납) 이름같은학생있으면 전공으로 찾기, 학생의 책목록에 추가(삭제)
	printf("2. 학생 관리\n");	//학생 추가와 학생 삭제,삭제시 학번을 이용해서 삭제
	printf("3. 대출 도서목록\n");	//학번으로 검색해서 책목록 출력
	printf("4. 전체 정렬\n");	//학번순으로 학생을 정렬하여 출력(이름,학번,대출목록)
	printf("5. 전체 출력\n");	//학생을 추가시켜준 순서대로 출력(이름,학번,전공,대출목록)
	printf("6. 종료\n");
	printf("******************\n");
	//printf("메뉴를 선택하세요\n");
	a=1;
	while(a) //조건이 0(거짓)이면 while문 종료. menu값 받기
	{
		chmenu = getch();
		putch(chmenu);
		if(!(chmenu>48 && chmenu<57))
			printf(" (문자입력은 할 수 없습니다.)\n");

		else if(!(chmenu>=49 && chmenu<=54))
			printf(" (1~6사이의 숫자를 입력하세요.)\n");
		
		else
			a=0;
	}
	menu=chmenu-48;
	
	switch (menu)
	{

	case 1://대출과 반납. 이름검색으로 대출(반납) 이름같은학생있으면 전공으로 찾기, 학생의 책목록에 추가(삭제)
		system("cls");
		MenuCase1(1);
		system("cls");
		goto Menu;
		break;

	case 2:	//학생 관리. 학생 추가와 학생 삭제,삭제시 학번을 이용해서 삭제
		system("cls");
		MenuCase2(1);
		system("cls");
		goto Menu;
		break;

	case 3:	//대출 도서목록. 학번으로 검색해서 책목록 출력
		system("cls");
		MenuCase3();
		system("cls");
		goto Menu;
		break;

	case 4:	//전체 정렬. 학번순으로 학생을 정렬하여 출력(이름,학번,대출목록)
		system("cls");
		MenuCase4();
		system("cls");
		goto Menu;
		break;

	case 5:	//전체 출력. 학생을 추가시켜준 순서대로 출력(이름,학번,전공,대출목록)
		system("cls");
		MenuCase5();
		system("cls");
		goto Menu;
		break;

	case 6: //종료
		printf("프로그램을 종료합니다.\n");
		MenuCase6();
		break;

	}
}
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기