# include & ltstring.h & gt
# include & ltstdlib.h & gt
//
#define MAXSIZE 100 // 최대값은 100 으로 정의됩니다.
# definelist _ init _ size 100//도서관 카드 최대 사용자 수는100 으로 정의됩니다.
//차용인의 구조
Typedef 구조 Boro// 대여 동작
{
Char bnum [20]; //빌린 도서의 책 번호
Char ret date [8]; //반환 날짜
Struct Boro * next
} Bor
Typedef 구조 링크 북
{
Bor * next// 이 도서관 카드 대출 행위
Char cnum [20]; //인증서 번호
Int Total// 대출 수량
} lend [list _ init _ size]; //차용자 배열
//책의 구조 정보
Typedef 구조 LNode
{
Char card num [20]; //라이브러리 ID 번호
Struct LNode * next
} 링크 목록; //차용인
Typedef 구조 책
각 책에 등록할 내용은 ISBN, 제목, 저자, 출판사, 총 재고 및 기존 재고입니다.
문자 번호 [20]; //도서 번호
차 이름 [20]; //제목
Char auth [20]; //저자
Char pub [20]; //누르기
Int TotNum// 총 재고
Int NowNum// 현재 재고
LinkList * next// 책을 빌린 사람
} ook [maxsize];
//
Int Retotal// 독자 수
Int total// 외부 변수를 정의합니다. 책의 수
//
//구조 초기화
Void init bo (ook & Boo) // 도서 정보 초기화
{
For(int I = 0;; 나 & ltMAXSIZEi++)
{
쉿 [나]. NowNum = 0;;
쉿 [나]. Totnum = 0;
쉿 [나]. Next = NULL
}
}
Void InitRe(lend & amp;; 린)//차용자 정보 초기화
{
For(int I = 0;; 나 & ltLIST _ INIT _ SIZEi++)
린 [나]. Next = NULL
}
//
Intmid = 0; //찾은 위치를 반환하는 외부 함수 mid 입니다.
부울 이분법 (OOkboo, Charsearchnum[])// 이분법은 비교 도서 번호를 찾습니다.
{//는 bool 함수를 사용하지만 함수는 두 개의 반환 값을 가질 수 없으므로 찾은 위치를 반환하도록 외부 변수 mid 를 설정합니다.
Int low=0, high = total-1;
Intfound = 0;
While(low & lt;; = 높음)
{
Mid= (낮음+높음)/2; //중간점
If (strcmp (boo [mid]) 입니다. Num, search num)= = 0)// 책 번호가 같습니다.
{
발견 =1;
True 를 반환합니다
}//검색이 성공했습니다.
If(strcmp(boo[mid]) 입니다. Num, SearchNum)! =0)// 책 번호가 다릅니다.
높음 = 보통1;
Else 낮음 = mid+1;
}
If (발견됨 ==0)
False// 검색 실패를 반환합니다.
}
무효 구매 (ook & ampboo, char BuyNum[])
편집 저장: 새 책을 구입하면 이미 도서 계정에 있는 경우 재고를 늘립니다 (포함
//총 재고 및 현재 재고 포함), 장부가 없는 경우 장부에 장부를 추가합니다. 총 재고 및 현재 재고는 모두 1 입니다.
If(BinarySearch(boo, BuyNum)) // 도서관에 이 책이 있다면.
{
쉿 [중]. Totnum++;+; //총 재고+1
쉿 [중]. Nownum++;+; //현재 재고와 1
Printf ("수신이 성공했습니다. \ n ");
Printf ("도서관에서이 책의 정보가 변경되었습니다. 번호 %s 의 책 %s 의 저자는 %s, 출판사는% s, 현재 총 재고는 %d, 현재 재고는% d, \n ",boo[mid] 입니다. Num, boo[mid]. 이름, boo[mid]. Auth, boo[mid]. 술집, 보 [mid]. 토트넘, 보 [mid]. Now num);
}
만약 (! BinarySearch(boo, BuyNum))
{
For(int I = total;; 나> 중기 및 중기. & amp 합계; I-)// 올바른 위치에 삽입하여 순서를 유지하십시오.
Boo [I] = boo [I-1]; //빈 삽입 위치
Printf ("도서관에는 이 책이 없습니다. 새로운 참고서 목록을 만들려면 전체 책의 세부 사항을 기입해 주세요. \ n ");
Strcpy(boo[i]. Num, buy num);
Printf ("도서 구매 수량:");
Scanf(" %d ",& 쉿 [나]. Now num);
쉿 [나]. TotNum=boo[i] 입니다. 노엄
Printf ("책의 이름은");
Scanf(" %s ",& 쉿 [나]. 이름);
Printf ("이 책의 저자는");
Scanf(" %s ",& 쉿 [나]. Auth);
Printf ("이 책의 출판사는");
Scanf(" %s ",& 쉿 [나]. Pub); //전체 정보
쉿 [나]. Next = NULL
합계++; //총액+1
Printf ("이 책 정보가 추가되었습니다. 번호 %s 의 책 %s 의 저자는 %s, 출판사는% s, 현재 총 재고는 %d, 현재 재고는% d, \n ",boo[i] 입니다. Num, boo[i]. 이름, 보 [I]. Auth, boo[i]. Pub, boo[i]. 토트넘, 쉿 [나]. Now num);
Printf ("수신이 성공했습니다. \ n ");
}
}
유효하지 않은 삭제 (ook & ampboo, char DeleteNum[])
{//2. 재고 정리: 어떤 책은 예약가치가 없어서 장부에서 로그아웃한다.
If (이진 검색법 (boo, delete num)= = false | | total = = 0)// 책이 없는 경우
Printf ("책은 도서관에 없습니다. \ n ");
If (이진 검색법 (boo, num 제거))//그렇다면.
{
만약 (! 쉿 [중]. 다음)
{
For(int j = mid;; J< 합계; J++)
Boo [j] = boo [j+1];
Strcpy(boo[j].num, boo[j+ 1]. Num);
Strcpy(boo[j]. 이름, boo[j+ 1]. 이름);
Strcpy(boo[j].auth, boo[j+ 1]. Auth);
Strcpy(boo[j].pub, boo[j+ 1]. Pub);
Boo[j]. TotNum=boo[j+ 1]. TotNum
Boo[j]. NowNum=boo[j+ 1]. 노엄
Printf ("이 책은 성공적으로 삭제되었습니다. \ n ");
}
Else printf ("이 책은 대출자가 있어서 삭제할 수 없습니다. \ n ");
}
}
무효 대여 (ook & ampboo, lend & amp 포리스트, char BorrowNum[], char CaNum[])
차용: 한 책의 기존 재고가 0 보다 크면 책 한 권을 빌려 기존 재고를 줄이십시오 1.
//그리고 대출자의 도서 번호와 반환 기한을 등록하다.
Bor *p, * q;;
체인 테이블 *m, * n;;
만약 (! 이진 검색법 (boo, borrownum)| | Total = = 0)// 이 책을 찾을 수 없는 경우
Printf ("이 책은 도서관에 없습니다. \ n "); //만약 당신이 이 책을 가지고 있다면,
If (이분 검색법)//도서관에 몇 가지가 있습니다.
{
If(boo[mid]. NowNum & gt0) // 현재 재고가 0 보다 큰지 확인합니다.
{
쉿 [중]. Now num-; //책 한 권 빌려, 1 적다.
If(boo[mid]. Next==NULL) // 도서 정보에 이 책이 대여되지 않았다고 표시되는 경우.
{
M = (linklist *) malloc (sizeof (lnode)); //분포
쉿 [중]. Next = m;; //도서 정보에서 연결된 목록의 첫 번째 노드입니다.
Strcpy (m-> CardNum, canum);
M-> Next = NULL// 마지막 노드가 비어 있습니다.
}
Else // 누군가가 이미 이 책을 빌리고 있다면.
{
M=boo[mid] 입니다. 다음으로,
While (m->; 다음)//마지막 노드로 이동
M = m-& gt;; 다음으로,
N = (linklist *) malloc (sizeof (lnode)); //공간 할당, 1 개 노드 추가.
M-> Next = n;;
Strcpy (n-> CardNum, canum); //인증서 번호 기록
N->; Next = NULL
}
Int I = 0;;
For(I = 0;; 나 & ltRetotali++)//
{
만약 (! 린 [i].CNum, CaNum))// 이미 이 도서관 카드에 대한 정보가 있다면,
{
P = 린 [나]. 다음으로,
While (p->; 다음) p = p-& gt;; 다음으로, //마지막 노드로 이동
Q = (bor *) malloc (sizeof (boro)); //공간 할당
P->; Next = q;;
Strcpy (q-> BNum, borrow num); //책 번호 기록
Printf ("반환 날짜 입력:");
Scanf("%s ",& ampq->; Ret date);
Q->; Next = NULL
Printf ("대출이 성공했습니다. \ n ");
깨뜨리다 //인증서를 찾으면 루프에서 벗어납니다.
}
}
If(i==Retotal)// 이 인증서에 대한 정보가 없는 경우 ,
{
숲 [1]. CNum, canum); //인증서 번호 기록
P = (bor *) malloc (sizeof (boro)); //공간 할당
린 [나]. Next = p;;
Strcpy (p-> BNum, borrow num);
Printf ("반환 날짜 입력:");
Scanf(" %s ",& ampp->; Ret date);
P->; Next = NULL
Retotal++;+; //도서 카드 번호 총 정보 플러스 1.
Printf ("대출이 성공했습니다. \ n ");
}
}
Else printf ("대출에 실패했습니다. 이 책은 현재 0 파운드의 재고가 있다. \ n ");
}
}
무효 반품 (ook & ampboo, lend & ampLin, char ReturnNum[], char BorrowerNum[])
반환: 차용인 등록을 취소하고 기존 도서 수를 변경합니다.
Bor *p, * q;;
체인 테이블 *m, * n;;
Intflag = 0; //매개 변수 설정
만약 (! BinarySearch(boo, ReturnNum)||! 합계)//책 없음.
Printf ("도서관에 책이 없습니다. \ n ");
If (이분검색법 (boo, return num))// 책이 있다.
{
M=boo[mid] 입니다. 다음으로,
만약 (! Strcmp (m-> Cardnum, borrowernum)// 첫 번째 차용인이 반납한 경우.
{
쉿 [중]. Nownum++;+; //현재 재고와 1
쉿 [중]. Next = m-& gt;; 다음으로, //노드 제거
무료 (m); //이 노드의 공간을 확보하십시오.
}
기타
{
While (m->; 다음)//반환자의 차용자 노드를 찾습니다.
{
만약 (! Strcmp (m-> 다음-> CardNum, BorrowerNum)) // 발견된 경우 ,
{
N = m-& gt;; 다음으로, //n 은 차용인의 대출 노드입니다.
M-> Next = n-& gt;; 다음으로, //m 차용자 대출 노드의 다음 노드를 가리킵니다.
무료 (n); //공간 확보
쉿 [중]. Nownum++;+; //현재 재고와 1
깨뜨리다
}
M = m-& gt;; 다음으로,
}
}
}
//차용자 테이블에서 차용자 정보를 찾습니다.
For(int I = 0;; 나 & ltRetotali++)
{
만약 (! 임 [I].cnum, borrowernum))// 대출자를 찾으면
{
P = 린 [나]. 다음으로,
만약 (! Strcmp (p-> BNum, return num))/// 반납하면 빌린 첫 번째 책이다.
{
린 [나]. Next = p-& gt;; 다음으로, //다음 대여 노드를 가리킵니다
무료 (p); //노드 공간 확보
Printf ("책이 성공적으로 반환되었습니다. \ n ");
Flag =1;
깨뜨리다
}
Else // 찾을 수 없습니다.
{
While (p->; 다음)//책을 반납할 대출 노드를 찾습니다.
{
만약 (! Strcmp (p-> 다음-> BNum, ReturnNum)) // 발견된 경우.
{
Q = p->; 다음으로, //q 는 책을 반납하는 대출 노드입니다.
P->; Next = q-& gt;; 다음으로, //p 는 다음 대여 노드를 가리킵니다.
무료 (q); //공간 확보
Printf ("책이 성공적으로 반환되었습니다. \ n ");
Flag =1;
깨뜨리다
}
P = p-& gt;; 다음으로,
}
}
}
}
For(int k = 0;; K & ltRetotalk++)
만약 (! 린 [k]. 다음)
{
For(int j = k;; J & ltRetotalj++)
Lin [j] = Lin [j+1]; //이후 모두 한 명 앞으로 나아가 현재 정보를 덮어씁니다.
린 [j].CNum, ""; //도서 번호 삭제
Retotal-; //도서관 카드 수 감소 1
}//현재 상태에서 책을 빌리지 않은 도서관 카드 정보를 삭제하여 공간을 절약합니다.
If(flag==0) printf ("이 인증서에 대한 정보가 없습니다. \ n ");
}
//5. 검색: 세 가지 질의 기준 중 하나로 검색: 책 번호별 검색,
//제목과 작성자별로 검색합니다. 주: 조합 검색, 즉 여러 조건의 조합 검색은 구현되지 않을 수 있습니다.
Void search bynum(ook & amp;; Boo, char SeaNum[])
Bynum 은 책 번호로 검색합니다.
링크 목록 * p;
P=boo[mid] 입니다. 다음으로,
If (이진 검색법 (boo, seanum) = = false) printf ("죄송합니다. 찾으시는 책을 찾을 수 없습니다. \ n "); //이진 검색법을 찾을 수 없습니다
Else// 찾으면.
{
{
Printf ("Ⓖ" Ⓖ Ⓖ Ⓖ Ⓖ-
Printf ("책 번호" 제목 "저자" 출판사 "현재 재고" 총 재고 \ n ");
Printf ("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Printf ("%14s"%14s "%16s"%/kloc-" 이름, boo[mid]. Auth, boo[mid]. 술집, 보 [mid]. 노엄, 쉿 [mid]. To tnum);
Printf ("Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ
If(boo[mid]. 다음! = 비어 있음)
{
Printf ("Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ \ n");
Printf ("빌린 책의 \ n");
Printf ("\" 도서관 번호 \ n ");
While(p)
{
Printf ("⓱ ⓱ ⓱ 945e ⓮ ⓱ \ n");
Printf ("%14s \ \ n", p-> Card num);
P = p-& gt;; 다음으로,
}
Printf ("Ⓖ Ⓖ Ⓖ Ⓖ Ⓖ Ⓘ \ n");
}
}
While(p)
{
Printf(" %s ",p-> Card num); //책 번호로 찾는 기능에도 차용인의 카드 번호가 표시됩니다.
P = p-& gt;; 다음으로,
}
Printf ("\ n");
}//검색한 책에 대한 정보를 표시합니다.
}
Void search by name(ook & amp;; 보)
{//제목별로 이름을 기준으로 검색합니다.
Char seaname [20];
Printf ("찾고 있는 책의 제목을 입력하십시오: \ n");
Scanf(" %s ",& ampseaname);
Printf ("이 책의 제목을 찾는 책의 세부 사항은 다음과 같습니다. \ n");
For(int I = 0;; 나< 합계; I++)
{
If (strcmp (seaname, boo [i]). Name)= = 0)// 제목이 같은 경우.
{
Printf ("책 번호:% s \ n 제목:% s \ n 작성자:% s \ n 출판사:% s \ n 총 재고:% d \ n 재고:% d \ n \ n Num, boo [i]. 이름, boo [
}//정보와 일치하는 모든 책에 대한 정보를 표시합니다.
}
}
Void search by auth(ook & amp;; 보)
작성자별 검색 승인 {//
Char sea auth [20];
Printf ("찾고 있는 책의 저자 입력: \ n");
Scanf(" %s ",& ampsea auth);
Printf ("저자와 일치하는 책 찾기 세부 사항은 다음과 같습니다. \ n");
For(int I = 0;; 나< 합계; I++)
{
If (strcmp (seaauth, boo [i]). Auth)= = 0)// 작성자가 같은 경우.
{
Printf ("책 번호:% s \ n 제목:% s \ n 작성자:% s \ n 출판사:% s \ n 총 재고:% d \ n 재고:% d \ n \ n Num, boo [i]. 이름, boo [
}//정보와 일치하는 모든 책에 대한 정보를 표시합니다.
}
}
//6. 보기: 차용자가 한 도서 번호로 빌린 모든 책과 기한이 지난 모든 책을 볼 수 있습니다.
유효하지 않은 뷰 카드 (ook & ampboo, lend & amp 포리스트)
차용자가 차용증 번호로 빌린 모든 책을 확인하십시오.
문자 번호 [20];
Printf ("보려는 도서증 번호 입력: \ n");
Scanf(" %s ",& ampnum);
Bor * p;;
Intqqq = 0;
For(int I = 0;; 나 & ltRetotali++)
{
If (strcmp (Lin [I].cnum, num)= = 0)// 인증서 찾기.
{
Printf ("이 증명서가 빌린 책은: \ n");
P = 린 [나]. 다음으로,
While(p)
{
Printf(" %s ",p-> Bnum); //도서 번호
P = p-& gt;; 다음으로,
}
Printf ("\ n");
Qqq =1;
깨뜨리다
}
}
(qqq==0) 인 경우
Printf ("이 인증서는 존재하지 않습니다. \ n ");
}
Void viewbook (ook & Boo, lend & amp 숲)
만료 된 모든 책을 확인하십시오.
Char date [8];
Bor * p;;
Printf ("날짜를 입력하십시오 (20060605 형식으로 입력하십시오): \ n");
Scanf(" %s ",& 날짜);
Printf ("모든 연체 도서는: \ n");
For(int I = 0;; 나 & ltRetotali++)
{
P = 린 [나]. 다음으로,
While(p)// p 가 비어 있지 않을 때
{
If (strcmp (p-> RetDate, date)& lt;; 0) // 만료됨
{
Printf ("책 번호 %s, 인증서 번호 %s, 만료 날짜 %s \n", p-> 린 [나]. CNum, p-> Ret date);
}//기한이 지난 모든 도서에 대한 정보를 표시합니다.
P = p-& gt;; 다음으로,
}
}
}
Void Menu() // 메뉴
{
Printf ("ⓣ-------m e n u----
Printf ("│ \ n");
Printf("│ 1. 편집 저장: 새 책 구입, 도서 계좌에 이미 있다면 Ⓦ │\ n”);;
Printf("│ ") 는 자체 재고 (총 재고 및 현재 재고 포함) 를 증가시킵니다. │ \ n ");
Printf("│ "책이 없으면 책 계정에 책 한 권, │ \ n");
Printf("│ "총 재고 및 기존 재고는 모두 입력 수치입니다. │ \ n ");
Printf("│ 2). 재고 정리: 어떤 책은 예약가치가 없어 장부에서 로그아웃한다. │ \ n ");
Printf("│ 3. 대출: 한 권의 책이 재고품이 0 보다 크면, 책 한 권을 빌려 재고재고 1, │ \ n) 을 줄인다.
Printf("│ ") 는 대출자의 도서증 번호와 반환 기한을 등록한다. │ \ n ");
Printf("│ 4. 반환: 차용인 등록을 취소하고 책의 기존 수량을 변경합니다. │ \ n ");
Printf("│ 5. ISBN 별로 검색합니다. │ \ n ");
Printf("│ 6. 제목별로 검색하다. │ \ n ");
Printf("│ 7. 작성자별로 검색합니다. │ \ n ");
Printf("│ 8. 도서관 카드 번호를 빌린 차용자가 빌린 모든 책을 확인하십시오. │ \ n ");
Printf("│ 9. 기한이 지난 모든 도서를 살펴보다. │ \ n ");
Printf("│ 0) 입니다. 도서 관리 시스템을 퇴출하다. │ \ n ");
Printf ("│ \ n");
Printf ("┖------┘ \ n-필요한 운동을 선택하십시오---\ n");
}
Void main ()
{
Ook Bo
임에게 빌려주다
Char bnum [20];
Char cnum [20];
Printf ("-도서관 관리 시스템에 오신 것을 환영합니다! -\ n \ n ");
Intchoice =10;
Int SearchCho= 10, view CHO =10;
그리고 (선택! =0)
{
메뉴 (); //메뉴 표시
Scanf(" %d ",& 선택);
스위치 (선택)
{
사례 1:// 편집 및 체크 인
Printf ("책 입고의 책 번호를 입력하십시오:");
Scanf(" %s ",bnum);
매입 (보, bnum);
깨뜨리다
시나리오 2:// 재고 삭제
Printf ("지우려는 책의 책 번호 입력:");
Scanf(" %s ",bnum);
삭제 (Bo, bnum);
깨뜨리다
사례 3://대출
Printf ("빌리고 싶은 책의 책 번호를 입력하십시오: \ n");
Scanf(" %s ",& ampbnum);
Printf ("라이브러리 번호 입력:");
Scanf(" %s ",& ampcnum);
차용 (Bo, Lin, BNum, cnum);
깨뜨리다
시나리오 4:// Return
Printf ("반환할 책의 책 번호 입력: \ n");
Scanf(" %s ",& ampbnum);
Printf ("라이브러리 번호 입력:");
Scanf(" %s ",& ampcnum);
Return(Bo, Lin, BNum, cnum) :
깨뜨리다
사례 5://검색//책 번호별 검색
Printf ("ISBN 입력:"); //찾으려는 책 번호를 입력합니다.
Scanf(" %s ",& ampbnum);
SearchByNum(Bo, bnum);
깨뜨리다
사례 6:// 제목별로 검색합니다.
Search by name (bo);
깨뜨리다
사례 7:// 작성자별 검색
Searchbyauth (bo);
깨뜨리다
사례 8://도서관 카드가 빌린 모든 책을 확인하십시오.
비디오 카드 (보, 린);
깨뜨리다
사례 9://모든 연체 도서를 확인하십시오.
ViewBook (보, 린);
깨뜨리다
상황 0:// 시스템을 종료합니다.
종료 (0); 깨뜨리다
기본값: printf ("입력 오류! \ n "); 종료 (0); 깨뜨리다
}
}
}