초기 네이버 기록/과거 공부 기록

도서관리 프로그램 최종본 (씹어먹는 C)

뜨거운 개발자 2023. 1. 7. 01:38
/*문제 1
길이가 최대 100 인 문자열을 하나 입력 받아서 문자열을 역순으로 출력하는 함수를 만들어보세요. (난이도 : 下) 
예를 들어서 "abcde" 입력 --> "edcba" 출력
함수가 할 일: 문자열의 순서를 역순으로 바꿔서 출력한다.문자열의 갯수를 세고, 제일 뒤에 제일 앞을 넣고 그걸 문자열의 길이 /2까지 반복하는 \0이 나오는 n구하고 arr[n]에 대입
arr[i]=arr[n-i] 범위는 n/2
리턴값:num
받아야하는 인자: char형 문자열 하나
*/
#include <stdio.h>
int change(char* str);
int main() {
	int num;
	char arr[100];
	printf("문자열을 입력하세요");
	scanf("%s",arr);
	num = change(arr);
	printf("문자열의 숫자는: %d\n", num);
	for (int i = 0; i < num; i++) {
		printf("%c",arr[num-i-1]);
	}
	return 0;
}

int change(char* str) {
	int num=0;
	while (*str) {
		num++;
		str++;
	}
	

	return num;
}//ez
/*
문제 2
길이가 최대 100 인 문자열을 입력 받아서 소문자는 대문자로, 대문자는 소문자로 출력하는 함수를 만들어보세요. (난이도 : 下) 예를 들어서 "aBcDE" 입력 --> "AbCde" 출력
함수가 해야하는일: 0이 나올때까지 반복하면 되고 문자열이 대문자 아스키 코드일때 소문자 아스키 코드일때 로 구분해서 각 값의 차만큼 계산해서 풀어주면 된다.
리턴값: 리턴 0
인자: 문자열
*/
#include<stdio.h>
int exchange(char* arr);
int main() {
	char arr[100];
	printf("write any word (word<100)");
	scanf("%s",arr);
	exchange(arr);
	return 0;

}
int exchange(char* arr) {
	while (*arr) {
		if (65 <= *arr&& *arr<= 90) {
			*arr +=32;
			printf("%c", *arr);
		}
		else if (97 <= *arr&&*arr <= 122) {
			*arr -=32;
			printf("%c", *arr);

		}
		else { printf("%c", *arr); }


		arr++;
	}
	return 0;
}//두번째 문제는 조건식을 할때 생각없이 a<b<c이런식으로 작성해서 살짝 애를 먹었지만 쉽게 품

문제 3번은 이전에 본문에서 문제를 풀었기 때문에 패스

/*문제 4
문자열을 두 개 입력 받아서 먼저 입력받은 문자열에서 나중에 입력받은 문자열의 위치를 검색하는 함수를 만들어보세요. 
만일 없다면 -1 을 리턴하고 있다면 그 위치를 리턴합니다. (난이도 : 中)
예를 들어먼저 처음 입력한 것이 I_am_a_boy 이고, 나중에 입력한 것이 am 이였다면 컴퓨터는 I_am_a_boy 에서 am 의 위치를 찾는다. 
이 경우에는 am 의 위치는 2 (처음에서 세번째) 이므로 2 를 리턴한다. 만일 am 이라는 문자열이 없다면 -1 을 리턴한다.

이 함수가 하는 일: 문자열 2개를 입력받아서 두개를 비교한다. 두번째 문자열의 앞 부분의 모양이 같은 문자를 찾는다. 찾았다면 다음문자까지 같은지 본다. 아니라면 1번 문자열에 다른게 있는지 본다.
다시 있다면 비교를 한다. 1번 문자열이 0이 된다면 -1을 리턴한다. 만약 문자열이 같은 부분이 있고 2번 문자열이 0이 될때까지 반복해서 같다면 첫번째 문자열 그 부분을 출력한다.
함수의 리턴값: 문자열이 다르면 -1 있다면 숫자 num출력
인자값: char형 문자열 2개 포인터로 입력받기

*/
#include<stdio.h>
int find_same(char* str1, char* str2/*, int num1, int nu2*/);
//int num_str(char* str);
int main() {
	char arr1[300];
	char arr2[300];
	int n;
	//int n1, n2;
	printf("첫번째 문자열을 입력해주세요");
	scanf("%s", arr1);
	printf("두번째 문자열을 입력해주세요");
	scanf("%s", arr2);
	//n1 = num_str(arr1);
	//n2 = num_str(arr2);
	n = find_same(arr1, arr2/*n1, n2*/);
	if (n == -1) {
		printf("문자열에 동일한게 없습니다.");

	}
	else {
		printf("두번째 문자열의 위치는 %d이다.", n);
	}
	return 0;
}

int find_same(char* str1, char* str2 /*, int num1, int num2*/) {
	int t=0;
	int k = 0;
	int j = 0;
	while (*str1) {
		while (*str2) {
			j++;
			if (*str2 == *str1) {
				str2++;
				t++;
				str1++;
				k++;
				
				if (*str2 == 0) {
					return k;
				}
			}	
			else {
				break;
			}
		}
		str2 -= t;
		t = 0;
		str1++;
		
	}
	return -1;
}

/*
int num_str(char* str) {
	int num=0;
	while (*str) {
		str++;
		num++;
	}
	return num;
}
*/
//왠지 쓸 것 같았던 문자열의 숫자 구하기는 필요가 없어져서 주석 표시로 지웠다. 
//이걸 풀면서 실력이 많이 늘었음을 느낀다.
/*
문제 5
도서 관리 프로그램을 만들어봅시다. 프로그램에는 다음과 같은 기능들이 구현되어 있어야 합니다. (난이도 : 上)

책을 새로 추가하는 기능 (책의 총 개수는 100 권이라 하자. 이 때, 각 책의 정보는 제목, 저자의 이름, 출판사로 한다)

책의 제목을 검색하면 그 책의 정보가 나와야 한다.

위와 마찬가지로 저자, 출판사 검색 기능이 있어야 한다.

책을 빌리는 기능.

책을 반납하는 기능

프로그램 만들기 일단 각 도서별 제목 저자 이름 출판사이므로 배열을 2차원으로 만들어서 책을 저장하자. book[100][4]이런식으로 책 
제목,지은이 출판사 대출여부
만들 함수 : 1. 누르면 책 추가  2: 책 검색 3: 출판사 검색 4. 책 빌리기 5. 책 반납 
1: 배열에 책을 추가하는 방법 현재까지 몇개가 차있는지 알아야하고 즉 배열의 갯수 먼저 두번째로 그 다음칸에 정보를 3개를 입력해야한다. 
2. 책 검색 :검색을 book[][0]중에서 하도록 해야한다. 
3. 출판사 검색 book[][2] 에서 해야됨 
4. 책을 빌리는 기능은 그 책을 검색해서 그게 몇번째 있는지 알아보고 대출가능 여부를 바꾼다.
*/
#include<stdio.h>
int new_book(char(* book)[4]);//리턴값 0
int find_bookname(char(*book)[4]);//리턴값 책이 몇번째 있는지 num
int find_bookpubilsher(char(*book)[4]);//리턴값 역시 책이 몇번째 있는지 num
int book_borrow(char(*book)[4]);//책의 이름을 받아서 대출 가능상태: 1 불가능 상태: 0  
int booknum(char(*book)[4]);
int main() {
	char book[100][4];
	int n;
	
	printf("1. 책을 추가하기\n2. 책이름 검색하기\n3. 출판사로 검색하기\n4. 책 빌리기\n5. 책 반납하기\n다른키를 누르면 프로그램은 종료");
	scanf("%d",&n);
	switch (n) {
	case 1: new_book(book);
		break;
	case 2:
		find_bookname(book);
		break;
	case 3:
		find_bookpubilsher(book);
		break;
	case 4:
		book_borrow(book);
		break;
	case 5:
		book_borrow(book);
		break;

	default: 
		return 0;

}
	
	return 0;
}


int new_book(char(*book)[4]) {
	int num = booknum(book);
	if (num== 0) { num = 1; }
	printf("추가할 책의 이름을 입력하세요");
	scanf("%s",&book[num-1][0]);
	printf("추가할 책의 지은이를 입력하세요");
	scanf("%s",&book[num - 1][1]);
	printf("추가할 책의 출판사를 입력하세요");
	scanf("%s",&book[num - 1][2]);
	printf("추가할 책의 갯수를 입력하세요");
	scanf("%s",&book[num - 1][3]);


	return 0;
}
int find_bookname(char(*book)[4]) {
	return 0;
}
int find_bookpubilsher(char(*book)[4]) {
	return 0;
}
int book_borrow(char(*book)[4]) {
	return 0;
}
int booknum(char(*book)[4]) {
	int n = 0;
	while (*book) {
		n++;
		book++;
		
	}
	return n;//찐 책의 갯수는 n/4이다.
}//제법 열심히 풀어보려고 했는데 안 된다. 새로운 책을 더하는 부분에서 접근하는 방법을 모르겠다.
/*
문제 5
도서 관리 프로그램을 만들어봅시다. 프로그램에는 다음과 같은 기능들이 구현되어 있어야 합니다. (난이도 : 上)

책을 새로 추가하는 기능 (책의 총 개수는 100 권이라 하자. 이 때, 각 책의 정보는 제목, 저자의 이름, 출판사로 한다)

책의 제목을 검색하면 그 책의 정보가 나와야 한다.

위와 마찬가지로 저자, 출판사 검색 기능이 있어야 한다.

책을 빌리는 기능.

책을 반납하는 기능

프로그램 만들기 일단 각 도서별 제목 저자 이름 출판사이므로 배열을 2차원으로 만들어서 책을 저장하자. book[100][4]이런식으로 책 
제목,지은이 출판사 대출여부
만들 함수 : 1. 누르면 책 추가  2: 책 검색 3: 출판사 검색 4. 책 빌리기 5. 책 반납 
1: 배열에 책을 추가하는 방법 현재까지 몇개가 차있는지 알아야하고 즉 배열의 갯수 먼저 두번째로 그 다음칸에 정보를 3개를 입력해야한다. 
2. 책 검색 :검색을 book[][0]중에서 하도록 해야한다. 
3. 출판사 검색 book[][2] 에서 해야됨 
4. 책을 빌리는 기능은 그 책을 검색해서 그게 몇번째 있는지 알아보고 대출가능 여부를 바꾼다.
*/
#include<stdio.h>
int new_book(char(* book)[4],int *n);//리턴값 0
int find_bookname(char(*book)[4]);//리턴값 책이 몇번째 있는지 num
int find_bookpubilsher(char(*book)[4]);//리턴값 역시 책이 몇번째 있는지 num
int book_borrow(char(*book)[4]);//책의 이름을 받아서 대출 가능상태: 1 불가능 상태: 0  
//int booknum(char(*book)[4]);
int main() {
	char book[100][4];
	int n;
	int num = 1;//책의 숫자 num-1이다.
	for(;;){
	printf("1. 책을 추가하기\n2. 책이름 검색하기\n3. 출판사로 검색하기\n4. 책 빌리기\n5. 책 반납하기\n다른키를 누르면 프로그램은 종료\n");
	scanf("%d",&n);
	switch (n) {
	case 1: new_book(book,&num);
		break;
	case 2:
		find_bookname(book);
		break;
	case 3:
		find_bookpubilsher(book);
		break;
	case 4:
		book_borrow(book);
		break;
	case 5:
		book_borrow(book);
		break;

	default:
		return 0;
	}
}
	
	return 0;
}


int new_book(char(*book)[4],int *n) {
	//int num = booknum(book);
	//if (num== 0) { num = 1; }
	
	printf("추가할 책의 이름을 입력하세요");
	scanf("%s",&book[*n-1][0]);
	printf("추가할 책의 지은이를 입력하세요");
	scanf("%s",&book[*n- 1][1]);
	printf("추가할 책의 출판사를 입력하세요");
	scanf("%s",&book[*n - 1][2]);
	printf("추가할 책의 갯수를 입력하세요");
	scanf("%d",&book[*n - 1][3]);
	*n+=1;

	return 0;
}
int find_bookname(char(*book)[4]) {
	return 0;
}
int find_bookpubilsher(char(*book)[4]) {
	return 0;
}
int book_borrow(char(*book)[4]) {
	return 0;
}
//int booknum(char(*book)[4]) {
//	int n = 0;
//	while (*book) {
//		n++;
//		book++;
//		
//	}
//	return n;//찐 책의 갯수는 n/4이다.
//}
//이정도면 제법 괜찮다.

사실상 책을 추가하는건 되게 쉬운데 책을 검색하는 기능이 매우 어렵다.

nt find_bookname(char(*book)[4]) {
	int i = 0;
	char *tmpbook;
	printf("찾고싶은 책의 제목을 입력하세요");
	scanf("% s",&tmpbook);
	while (*book) {
		if (book[i][0] == *tmpbook) {
			printf("%s",*tmpbook);
		}

			i++;
	}

	return 0;
}//나는 이렇게 구현했었는데 역시 잘 되지 않았다. 이게 안된다는건 이전 강의에서 들었던 것 같긴한데 
//그러면 어떻게 하라는거야?
/*
문제 5
도서 관리 프로그램을 만들어봅시다. 프로그램에는 다음과 같은 기능들이 구현되어 있어야 합니다. (난이도 : 上)

책을 새로 추가하는 기능 (책의 총 개수는 100 권이라 하자. 이 때, 각 책의 정보는 제목, 저자의 이름, 출판사로 한다)

책의 제목을 검색하면 그 책의 정보가 나와야 한다.

위와 마찬가지로 저자, 출판사 검색 기능이 있어야 한다.

책을 빌리는 기능.

책을 반납하는 기능

프로그램 만들기 일단 각 도서별 제목 저자 이름 출판사이므로 배열을 2차원으로 만들어서 책을 저장하자. book[100][4]이런식으로 책 
제목,지은이 출판사 대출여부
만들 함수 : 1. 누르면 책 추가  2: 책 검색 3: 출판사 검색 4. 책 빌리기 5. 책 반납 
1: 배열에 책을 추가하는 방법 현재까지 몇개가 차있는지 알아야하고 즉 배열의 갯수 먼저 두번째로 그 다음칸에 정보를 3개를 입력해야한다. 
2. 책 검색 :검색을 book[][0]중에서 하도록 해야한다. 
3. 출판사 검색 book[][2] 에서 해야됨 
4. 책을 빌리는 기능은 그 책을 검색해서 그게 몇번째 있는지 알아보고 대출가능 여부를 바꾼다.
*/
#include<stdio.h>
int add_book(char(*bookname)[30],char(*authname)[30],
	char(*publ_name)[30],int *borrow ,int *num_totalbook);
int find_bookname(char(*bookname)[30], char(*authname)[30],
	char(*publ_name)[30], int* borrow, int* num_totalbook);
int book_borrow(char(*bookname)[30], char(*authname)[30],
	char(*publ_name)[30], int* borrow, int* num_totalbook);




int main() {
	char bookname[100][30];//책의 이름 보관
	char authname[100][30];//작가의 이름 보관
	char publ_name[100][30];//출판사 이름 보관
	int borrowed[100];//지금 책이 몇권있는지 표기
	int user_choice;//유저가 선택한 번호
	int totalbook=0;//지금 배열에 있는 책의 총 숫자.
	while(1){
	printf("1. 책을 추가하기\n2. 책 검색하기\n3. 책 빌리기\n4. 책 반납하기\n다른키를 누르면 프로그램은 종료\n");
	scanf("%d",&user_choice);
	switch (user_choice) {
	case 1: add_book(bookname,authname,publ_name,borrowed,&totalbook);
		break;
	case 2:
		find_bookname(bookname, authname, publ_name, borrowed, &totalbook);
		break;
	case 3:
		book_borrow(bookname, authname, publ_name, borrowed, &totalbook);
		break;
	case 4:
		book_borrow(bookname, authname, publ_name, borrowed, &totalbook);
		break;

	default:
		return 0;
	}
}
	
	return 0;
}


int add_book(char(*bookname)[30], char(*authname)[30], 
	char(*publ_name)[30], int* borrow, int* num_totalbook){
	
	
	printf("추가할 책의 이름을 입력하세요");
	scanf("%s",bookname[*num_totalbook]);
	printf("추가할 책의 지은이를 입력하세요");
	scanf("%s", authname[*num_totalbook]);
	printf("추가할 책의 출판사를 입력하세요");
	scanf("%s", publ_name[*num_totalbook]);
	printf("추가할 책의 갯수를 입력하세요");
	scanf("%d", borrow+*num_totalbook);
	printf("추가 완료!!\n");
	(*num_totalbook)++;

	return 0;
}


int find_bookname(char(*bookname)[30], char(*authname)[30], 
	char(*publ_name)[30], int* borrow, int* num_totalbook) {
	int choice;
	char name[30];//입력 칸
	printf("1. 책 제목으로 찾기\n2. 책 출판사로 찾기\n3. 지은이로 찾기\n");
	scanf("%d", &choice);
	switch (choice) {

	case 1: //이렇게 만들어도 되지만 
		printf("찾고싶은 책의 제목을 입력하세요");
		scanf("%s",name);
		for (int i = 0; i < *num_totalbook; i++) {
			if (bookname[i][0] == name[i]) {
				for (int i1 = 0; i1 < 30; i1++) {
					if (bookname[i][i1] == name[i1]) {
						if (i1 == 29) {
							printf("같은 책이 있다.\n");
							printf("책의 제목은%s\n", bookname[i]);
							printf("책 출판사는 %s\n", publ_name[i]);
							printf("책의 지은이는:%s\n", authname[i]);
						}
					}
					else {
						break;
					}
				}
			}
		}
		printf("같은 책이 없다.");
		break;

	case 2: 
		printf("출판사 이름을 입력해주세요 ");
		scanf("%s", name);
		break;

	case 3:
		printf("지은이를 입력해주세요");
		scanf("%s", name);
		break;
	}
	return 0;
}
/*
int compare(char *str1, char *str2) {
  while (*str1) {
    if (*str1 != *str2) {
      return 0;
    }

    str1++;
    str2++;
  }

  if (*str2 == '\0') return 1;

  return 0;
  이 비교함수를 이용해서 두개의 문자열이 같은지 비교하는게 더 코드가 깔끔해진다. 
  if (compare(book_name[i], user_search))이걸 사용해서 아에 코드를 깔끔하게 다음에도 쓸 수 있게 만드는거다.
}*/


int book_borrow(char(*bookname)[30], char(*authname)[30],
	char(*publ_name)[30], int* borrow, int* num_totalbook) {
	return 0;
}//이렇게 강의를 참고해서 만들었다. 사실 다른 부분은 쉬워서 굳이 만들지 않았기에 모범답안도 밑에 
//적어놓겠다
#include <stdio.h>
int add_book(char (*book_name)[30], char (*auth_name)[30],
             char (*publ_name)[30], int *borrowed, int *num_total_book);
int search_book(char (*book_name)[30], char (*auth_name)[30],
                char (*publ_name)[30], int num_total_book);

int compare(char *str1, char *str2);
int borrow_book(int *borrowed);
int return_book(int *borrowed);

int main() {
  int user_choice;        /* 유저가 선택한 메뉴 */
  int num_total_book = 0; /* 현재 책의 수 */

  /* 각각 책, 저자, 출판사를 저장할 배열 생성. 책의 최대 개수는 100 권*/
  char book_name[100][30], auth_name[100][30], publ_name[100][30];
  /* 빌렸는지 상태를 표시 */
  int borrowed[100];

  while (1) {
    printf("도서 관리 프로그램 \n");
    printf("메뉴를 선택하세요 \n");
    printf("1. 책을 새로 추가하기 \n");
    printf("2. 책을 검색하기 \n");
    printf("3. 책을 빌리기 \n");
    printf("4. 책을 반납하기 \n");
    printf("5. 프로그램 종료 \n");

    printf("당신의 선택은 : ");
    scanf("%d", &user_choice);

    if (user_choice == 1) {
      /* 책을 새로 추가하는 함수 호출 */
      add_book(book_name, auth_name, publ_name, borrowed, &num_total_book);
    } else if (user_choice == 2) {
      /* 책을 검색하는 함수 호출 */
      search_book(book_name, auth_name, publ_name, num_total_book);
    } else if (user_choice == 3) {
      /* 책을 빌리는 함수 호출 */
      borrow_book(borrowed);
    } else if (user_choice == 4) {
      /* 책을 반납하는 함수 호출 */
      return_book(borrowed);
    } else if (user_choice == 5) {
      /* 프로그램을 종료한다. */
      break;
    }
  }

  return 0;
}
/* 책을 추가하는 함수*/
int add_book(char (*book_name)[30], char (*auth_name)[30],
             char (*publ_name)[30], int *borrowed, int *num_total_book) {
  printf("추가할 책의 제목 : ");
  scanf("%s", book_name[*num_total_book]);

  printf("추가할 책의 저자 : ");
  scanf("%s", auth_name[*num_total_book]);

  printf("추가할 책의 출판사 : ");
  scanf("%s", publ_name[*num_total_book]);

  borrowed[*num_total_book] = 0; /* 빌려지지 않음*/
  printf("추가 완료! \n");
  (*num_total_book)++;

  return 0;
}
/* 책을 검색하는 함수 */
int search_book(char (*book_name)[30], char (*auth_name)[30],
                char (*publ_name)[30], int num_total_book) {
  int user_input; /* 사용자의 입력을 받는다. */
  int i;
  char user_search[30];

  printf("어느 것으로 검색 할 것인가요? \n");
  printf("1. 책 제목 검색 \n");
  printf("2. 지은이 검색 \n");
  printf("3. 출판사 검색 \n");
  scanf("%d", &user_input);

  printf("검색할 단어를 입력해주세요 : ");
  scanf("%s", user_search);

  printf("검색 결과 \n");

  if (user_input == 1) {
    /*

    i 가 0 부터 num_total_book 까지 가면서 각각의 책 제목을
    사용자가 입력한 검색어와 비교하고 있다.

    */
    for (i = 0; i < num_total_book; i++) {
      if (compare(book_name[i], user_search)) {
        printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
               book_name[i], auth_name[i], publ_name[i]);
      }
    }

  } else if (user_input == 2) {
    /*

    i 가 0 부터 num_total_book 까지 가면서 각각의 지은이 이름을
    사용자가 입력한 검색어와 비교하고 있다.

    */
    for (i = 0; i < num_total_book; i++) {
      if (compare(auth_name[i], user_search)) {
        printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
               book_name[i], auth_name[i], publ_name[i]);
      }
    }

  } else if (user_input == 3) {
    /*

    i 가 0 부터 num_total_book 까지 가면서 각각의 출판사를
    사용자가 입력한 검색어와 비교하고 있다.

    */
    for (i = 0; i < num_total_book; i++) {
      if (compare(publ_name[i], user_search)) {
        printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
               book_name[i], auth_name[i], publ_name[i]);
      }
    }
  }

  return 0;
}
int compare(char *str1, char *str2) {
  while (*str1) {
    if (*str1 != *str2) {
      return 0;
    }

    str1++;
    str2++;
  }

  if (*str2 == '\0') return 1;

  return 0;
}
int borrow_book(int *borrowed) {
  /* 사용자로 부터 책번호를 받을 변수*/
  int book_num;

  printf("빌릴 책의 번호를 말해주세요 \n");
  printf("책 번호 : ");
  scanf("%d", &book_num);

  if (borrowed[book_num] == 1) {
    printf("이미 대출된 책입니다! \n");
  } else {
    printf("책이 성공적으로 대출되었습니다. \n");
    borrowed[book_num] = 1;
  }

  return 0;
}
int return_book(int *borrowed) {
  /* 반납할 책의 번호 */
  int num_book;

  printf("반납할 책의 번호를 써주세요 \n");
  printf("책 번호 : ");
  scanf("%d", &num_book);

  if (borrowed[num_book] == 0) {
    printf("이미 반납되어 있는 상태입니다\n");
  } else {
    borrowed[num_book] = 0;
    printf("성공적으로 반납되었습니다\n");
  }

  return 0;
}

이 글은 코딩 꼬꼬마 시절에 푼 문제를 보관한 글로 네이버에 저장해둔 글을 옮긴 글입니다.
혹시나 참고하시는 부분에 이상한 부분이나 질문이 생긴다면 남겨주시면 친절히 답변 드리겠습니다.

728x90