#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;
}
}
최근댓글