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

도서관리 프로그램 구조체 활용버전 씹어먹는 C언어

뜨거운 개발자 2023. 1. 7. 01:46

드디어 구조체!!

#include<stdio.h>
struct Human {
	int age;
	int height;
	int weight;

};
int main() {
	struct Human Psi;
	Psi.age = 99;
	Psi.height = 185;
	Psi.weight = 80;

	printf("psi에 관한 정보\n");
	printf("나이: %d\n", Psi.age);
	printf("키: %d\n", Psi.height);
	printf("몸무게: %d\n", Psi.weight);

	return 0;
}

드디어 구조체를 배운다!! 슬슬 C언어 공부의 고지가 보인다. 최소 이 정도는 끝내고 가야 한다의 이정도를 끝내가는거다. 아자아자!! 노트필기중이라 블로그에는 별로 남기는게 없는데 진짜 대박이다 구조체!!! 새로운 기능을 알아갈때마다 이걸 활용해서 내가 어디까지 만들 수 있을까라는 기대와 걱정이 생기지만 기대가 더 크다 ㅎㅎ

구조체 2일차

#include<stdio.h>
struct TEST {
	int c;
	int* pointer;

};
int main() {
	struct TEST t;
	struct TEST* pt = &t;
	int i = 0;
	/* t 의 멤버 pointer 는 i 를 가리키게 된다*/
	t.pointer = &i;
	printf("i:%d\n", i);
	/* t 의 멤버 pointer 가 가리키는 변수의 값을 3 으로 만든다*/
	*t.pointer = 3;
	/*

  -> 가 * 보다 우선순위가 높으므로 먼저 해석하게 된다.
  즉,
  (pt 가 가리키는 구조체 변수의 pointer 멤버) 가 가리키는 변수의 값을 4 로
  바꾼다. 라는 뜻이다/

  */
	printf("i:%d \n", i);
	*pt->pointer = 4;
	printf("i:%d\n", i);
	return 0;
}
#include<stdio.h>
int add_one(int* a);
struct TEST {
	int c;
};
int main() {
	struct TEST t;
	struct TEST* pt = &t;
	/* pt 가 가리키는 구조체 변수의 c 멤버의 값을 0 으로 한다*/
	pt->c = 0;
	/*
	add_one 함수의 인자에 t 구조체 변수의 멤버 c 의 주소값을
	전달하고 있다.
	*/
	add_one(&t.c);
	printf("t.c:%d\n", t.c);
	/*
	add_one 함수의 인자에 pt 가 가리키는 구조체 변수의 멤버 c의 주소값을 전달 
	하고 있다.

	*/
	add_one(&pt->c);
	printf("t.c:%d\n", t.c);
	return 0;
}
int add_one(int* a) {
	*a += 1;
	return 0;

}
#include<stdio.h>
struct TEST {
	int age;
	int gender;
};
int set_human(struct TEST *a, int age, int gender);
int main() {
	struct TEST human;
	set_human(&human, 10, 1);
	printf("AGE: %d//Genger: %d\m", human.age, human.gender);
	return 0;
}
int set_human(struct TEST *a, int age, int gender) {
	a->age = age;
	a->gender = gender;
	return 0;

}
#include <stdio.h>
struct TEST {
	int age;
	int gender;
	char name[20];
};
int set_human(struct TEST* a, int age, int gender, const char* name);
char copy_str(char* dest, const char* src);
int main() {
	struct TEST human;

	set_human(&human, 10, 1, "lee");
	printf("AGE: %d\n gender:%d\nname:%s\n", human.age, human.gender, human.name);
	return 0;

}
int set_human(struct TEST* a, int age, int gender, const char* name) {
	a->age = age;
	a->gender = gender;
	copy_str(a->name, name);
	return 0;

}
char copy_str(char* dest, const char* src) {
	while (*src) {
		*dest = *src;
		src++;
		dest++;
	}
	*dest = '\0';
	return 0;
}

도서관리 프로그램 구조체 활용버전

/*문제 5
도서 관리 프로그램을 만들어봅시다. 프로그램에는 다음과 같은 기능들이 구현되어 있어야 합니다. (난이도 : 上)

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

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

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

책을 빌리는 기능.

책을 반납하는 기능

*/
#include<stdio.h>
char copy_str(char* str1, char* str2);
int add_book(struct book* paper,int book_num);
int search_book(struct book* paper);
int borrow_book(struct book* paper);
struct book {
	char book_name[30];
	char auth_name[30];
	char publ_name[30];
	int borrow;//그 책의 갯수 반납과 대출을 위해서 필요
	
};

int main() {
	struct book paper[100];//100권까지 보관
	int userchoice;
	int book_num = 0;//책의 총 종류 갯수
	for (;;) {
		printf("1. 책을 추가하기\n2. 책이름 검색하기\n3. 책 빌리기\n4. 책 반납하기\n다른키를 누르면 프로그램은 종료\n");
		scanf("%d", &userchoice);
		switch (userchoice) {
		case 1: add_book(paper, book_num);
			book_num++;
			break;
		case 2:
			search_book(paper);
			break;
		case 3:
			borrow_book(paper);
			break;
		case 4:
			book_borrow(paper);
			break;

		default:
			return 0;
		}

	}
}
	int add_book(struct book* paper, int book_num) {
		char user_bookname[30];
		printf("what is the book name:");
		scanf("%s", &user_bookname);
		copy_str(paper->book_name, user_bookname);
		printf("복사 완료");
		printf("what is the auth name:");
		scanf("%s", &user_bookname);
		copy_str(paper->auth_name, user_bookname);
		printf("what is the publisher name:");
		scanf("%s", &user_bookname);
		copy_str(paper->publ_name, user_bookname);
	
	}
	char copy_str(char* str1, char* str2) {
		while (*str2) {
			*str1 = *str2;
			str1++;
			str2++;

		}
		*str1 = '\0';
		return 0;
	}

완성을 하기에는 시간이 너무 오래걸릴 것 같아서 공부 끝나구 시간 남으면 다시 만들어봐야겠다.

 

 

이것도 좀 지나서 만들어보자... 엄청 오래걸릴 것 같다.

https://modoocode.com/60

 

씹어먹는 C 언어 - <16 - 2. 모아 모아 구조체(struct) - 구조체 인자로 가진 함수>

 

modoocode.com

*
이 때, BigNum 구조체의 변수들의 덧셈, 뺄셈을 수행하는 함수를 작성해보세요 (난이도 : 中上)

BigNum 구조체 변수들의 곱셈을 수행하는 함수를 만들어보세요 (난이도 : 上)

BigNum 구조체 변수들의 나눗셈을 수행하는 함수를 만들어보세요 (난이도 : 最上)

참고로 BigNum 구조체를 다룰 때 중요한 점은 수의 크기가 위 배열에 들어가지 않을 정도로 클 때를 적절히 처리해 주어야 한다는 점에 있습니다.
*/
#include<stdio.h>
struct BigNum {
	int i_digit[100];   // 정수 부분 한칸당 숫자 하나씩 넣어버리자
	int d_digit[100];   // 소수 부분 
	int i_total_digit;  // 전체 사용되고 있는 정수부분 자리수
	int d_total_digit;  // 전체 사용되고 있는 소수부분 자리수
	char sign;  // 부호, 0 이면 양수, 1 이면 음수. 0 은 양수로 간주한다.
};
/*
덧셈 뺄셈 함수 만들기- 이 함수는 두개의 숫자를 계산한다. 정수부분 끼리 소수부분끼리 계산 해야한다. 
곱셈 함수 만들기 
나눗셈 함수 만들기,

*/ 
int save(struct BigNum* num1, struct BigNum* num2) {
	int i=0;
	num1->i_total_digit = 0;
	num1->d_total_digit = 0;
	printf("정수 부분 숫자를 입력하시오!(00를 누르면 종료 됩니다.) \n");
	while (1) {
		scanf("%d", &num1->i_digit[i]);//숫자는 배열의 0부터 저장이 된다.
		num1->i_total_digit++;
		if (num1->i_digit[i] == 00) {
			break;
		}
		i++;
	}

	num1->i_digit[i] = '\0';

	i = 0;
	printf("소수점 밑 부분 숫자를 입력하세요 (00를 누르면 종료 됩니다.) ");
	while (1) {
		scanf("%d", &num1->d_digit[i]);//숫자는 배열의 0부터 저장이 된다.
		num1->d_total_digit++;
		if (num1->d_digit[i] == 00) {
			break;
		}
		i++;
	}

}

int fuction(struct Bignum* num1,struct Bignum*num2) {
	/*num1->i_digit;*/
	
}
int main() {
	int num;//게산하고 싶은 자릿수
	struct BigNum num1;
	struct BigNum num2;
	printf("계산하고 싶은 수의 소수점 밑의 수가 100이상이면 안됩니다. ");
	save( &num1, &num2);
	

}
( * start.h )

struct BigNum
{

int i_digit[100];
int d_digit[100];
int i_total_digit;
int d_total_digit;
char sign;
};



( * start.c )

#include "start.h";
#include "calc_function.h";
#include <stdio.h>


int main()
{
/* 배열의 크기를 201로 주는 이유는 정수값 100자리 소수값 100자리 + 널값 하나 */
char Input_Number_1[201], Input_Number_2[201], operation;
struct BigNum bignum[6];
int i;
enum{ Positive, Negative };

printf("큰 수 계산기 입니다 ! 정수 100자리 소수 100자리 연산이 가능합니다 ^^ \n");
printf("숫자를 입력하세요 : ");
scanf("%s", Input_Number_1);
getchar();
regist_number(Input_Number_1, &bignum[0]);
print_number(bignum);

for (;;)
{
printf("어떤 연산을 실행 하시겠습니까 ? 종료하시려면 ' x ' 를 입력해주세요. ( + , - , * , / )");
scanf("%c", &operation);
getchar();
printf("%c \n", operation);

if (operation == 'x')
{
printf("프로그램 종료 ! \n");
break;
}

if (operation == '+' || operation == '-' || operation == '*' || operation == '/')
{
printf("두 번째 수를 입력하세요 : ");
scanf("%s", Input_Number_2);
getchar();
regist_number(Input_Number_2, &bignum[1]);
print_number(&bignum[1]);
}
else
{
printf("비정상적인 입력 입니다.\n");
continue;
}

switch (operation)
{
case '+' :
if (bignum[0].sign == Positive)
{
if (bignum[1].sign == Positive)
{
calc_plus(&bignum[0], &bignum[1], &bignum[2]);
}
else
{
// bignum[0] - bignum[1];
}
}
else
{
if (bignum[1].sign == Negative)
{
calc_plus(&bignum[0], &bignum[1], &bignum[2]);
}
else
{
// bignum[1] - bignum[0]
}
}
// allocate bignum[2] (result value) in bignum[0].
bignum[0] = bignum[2];
// initialize bignum[1] , bignum[2]
bignum[1] = bignum[3];
bignum[2] = bignum[3];
break;
case '-' :
break;
case '*' :
break;
case '/' :
break;
}
}
return 0;
}
-- ( * calc_function.h )


int regist_number(char *input_number, struct BigNum *st_bignum);
int compare_number(struct BigNum *object, struct BigNum *object2);
int calc_plus(struct BigNum *bignum, struct BigNum *bignum2, struct BigNum *bignum3);
int counting_up(int *total_digit, int *digit);
int Copy_B_To_A_by_repeat_size(int repeat_size, int * object, int * subject);
int A_equal_B_plus_C_by_repeat_size(int repeat_size, int * object, int * subject_1, int * subject_2);
int print_number(struct BinNum *st_bignum);


-- ( * calc_function.c )

#include <stdio.h>
#include "start.h";
#include "calc_function.h";
#define MAX_VALUE_OF_ARRAY 100
int regist_number(char *input_number, struct BigNum *st_bignum)
{
int i = 0;
int temp_size = 0;
int *pi_total_digit, *pd_total_digit;
st_bignum->i_total_digit = 0;
st_bignum->d_total_digit = 0;
pi_total_digit = &(st_bignum->i_total_digit);
pd_total_digit = &(st_bignum->d_total_digit);
st_bignum->sign = 0;

if (*input_number)
{
// if number is negative quantity
// skip '-' value;
if (*input_number == '-')
{
st_bignum->sign = 1;
input_number++;
}
/* count size of input_number until appear char ' . ' */
while (*input_number && *input_number != '.')
{
*pi_total_digit += 1;
input_number++;
}


/* bring back (reset) == > input_number */
input_number -= *pi_total_digit;

/* If size of array i_digit is upper than max , reset value to max_value */
if (*pi_total_digit > MAX_VALUE_OF_ARRAY)
{
printf("정수 배열의 최대치를 초과한 관계로 최대치 까지만 저장 됩니다. \n");
/* only store exceeded value of array max value (100) */
temp_size = *pi_total_digit - MAX_VALUE_OF_ARRAY;
*pi_total_digit = MAX_VALUE_OF_ARRAY;
}

/* insert data input_number to i_digit */
// ASCII Value of Integer number 1(one) is 49.
// So if want to chagne from char(number one) to Interger(number one)
// subtract 48 from the char value;

for (i = 0; i < *pi_total_digit; i++)
{
st_bignum->i_digit[i] = (int)*input_number - 48;
input_number++;
}

/* add temp_size ( exceeded value of array i_digit ) */
input_number += temp_size;

/* if char is ' . ' go to next value  == has d_digit is exist */
if (*input_number == '.')
{
input_number++;

/* count size of d_digit */
while (*input_number)
{
*pd_total_digit += 1;
input_number++;
}

/* initialize input_number until appear value of '.' */
input_number = input_number - *pd_total_digit;

/* If size of array i_digit is upper than max reset value to max_value */
if (*pd_total_digit > MAX_VALUE_OF_ARRAY)
{
printf("소수 배열의 최대치를 초과한 관계로 최대치 까지만 저장 됩니다. \n");
/* only store the value of exceeded of i_digit's max value(100) */
temp_size = *pd_total_digit - MAX_VALUE_OF_ARRAY;
*pd_total_digit = MAX_VALUE_OF_ARRAY;
}


for (i = 0; i < *pd_total_digit; i++)
{
st_bignum->d_digit[i] = (int)*input_number - 48;
input_number++;
}
}
}
return 0;
}

첫번째 소스코드 말고는 어떤분껄 베껴온건데 덧셈 하나 구현하는데 이렇게 코드가 길다... 줸장 이건 천천히 만들어서 이해를 높이도록 하자.

구조체 응용 버전

구조체 안에 구조체 예제

/* 구조체 안의 구조체*/
#include <stdio.h>
struct employee {
  int age;
  int salary;
};
struct company {
  struct employee data;
  char name[10];
};
int main() {
  struct company Kim;

  Kim.data.age = 31;
  Kim.data.salary = 3000000;

  printf("Kim's age : %d \n", Kim.data.age);
  printf("Kim's salary : %d$/year \n", Kim.data.salary);

  return 0;
}

구조체를 리턴하는 함수 예제

/* 구조체를 리턴하는 함수 */
#include <stdio.h>
struct AA function(int j);
struct AA {
  int i;
};

int main() {
  struct AA a;

  a = function(10);
  printf("a.i : %d \n", a.i);

  return 0;
}

struct AA function(int j) {
  struct AA A;
  A.i = j;

  return A;
}
​

구조체 변수를 색다르게 정의하는 방법

/*

구조체 변수를 정의하는 색다른 방법.
예제를 이렇게 길게 만든 이유는 소스를 읽으면서 구조체와 조금 더 친해지기 바래서
입니다. 소스를 찬찬히 분석해보세요 ^^

*/
#include<stdio.h>
char copy_str(char* dest, char* src);
int print_obj_status(struct obj OBJ);
struct obj {
	char name[20];
	int x, y;
}Ball;
int main() {
	Ball.x = 3;
	Ball.y = 3;
	copy_str(Ball.name, "RED BALL");
	
	print_obj_status(Ball);
	return 0;
}
int print_obj_status(struct obj OBJ) {
	
	printf("Location of %s\n", OBJ.name);
	printf("(%d,%d)\n", OBJ.x, OBJ.y);
	return 0;
}
char copy_str(char* dest, char* src) {
	while (*src) {
		*dest = *src;
		dest++;
		src++;

	}
	*dest = '\0';
	return 1;

}

구조체 멤버를 쉽게 초기화 하는 방법!!

/* 멤버를 쉽게 초기화 하기*/
#include<stdio.h>
int print_status(struct HUMAN human);
struct HUMAN {
	int age;
	int height;
	int weight;
	int gender;
};
int main() {
	struct HUMAN adam = { 31,182,75,0 };
	struct HUMAN Eve = { 27,166,48,1 };

	print_status(adam);
	print_status(Eve);
}
int print_status(struct HUMAN human) {
	if (human.gender == 0) {
		printf("male\n");
	}
	else {
		pirntf("female\n");
	}
	printf("AGE: %d, Height:%d,Weight:%d\n", human.age, human.height, human.weight);
	if (human.gender == 0 && human.height >= 180) {
		printf("HE IS A WINNER!! \n");
	}
	else if (human.gender == 0 && human.height < 180) {
		printf("HE IS A LOSER!! \n");
	}

	printf("------------------------------------------- \n");

	return 0;
}

도서관리 프로그램 구조체 및 헤더파일 소스파일 버전

/* book_function.h*/
#pragma once
int add_book(struct Book* book_system);
int search_book(struct Book* book_system);
int borrow_book(int* borrowed);
int return_book(int* borrowed);
struct Book {
    int num_total_book; /* 현재 책의 수 */

    /* 각각 책, 저자, 출판사를 저장할 배열 생성. 책의 최대 개수는 100 권*/
    char book_name[100][30], auth_name[100][30], publ_name[100][30];
    /* 빌렸는지 상태를 표시 */
    int borrowed[100];
};
/*str.h*/
char compare(char* str1, char* str2);
/* str.c */
#include "str.h"
char compare(char* str1, char* str2) {
    while (*str1) {
        if (*str1 != *str2) {
            return 0;
        }
        str1++;
        str2++;
    }
    if (*str2 == '\0') return 1;
    return 0;
}
#include <stdio.h>
#include "book_function.h"

int main() {
    struct Book paper;
    int user_choice;        /* 유저가 선택한 메뉴 */
    paper.num_total_book = 0;
    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(&paper);
        }
        else if (user_choice == 2) {
            /* 책을 검색하는 함수 호출 */
            search_book(&paper);
        }
        else if (user_choice == 3) {
            /* 책을 빌리는 함수 호출 */
            borrow_book(paper.borrowed);
        }
        else if (user_choice == 4) {
            /* 책을 반납하는 함수 호출 */
            return_book(paper.borrowed);
        }
        else if (user_choice == 5) {
            /* 프로그램을 종료한다. */
            break;
        }
    }

    return 0;
}

/*book_function.c

#include <stdio.h>
#include "book_function.h"
#include "str.h"
/* 책을 추가하는 함수*/
int add_book(struct Book* book_system) {
    printf("추가할 책의 제목 : ");
    scanf("%s", &book_system->book_name[book_system->num_total_book]);

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

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

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

    return 0;
}
/* 책을 검색하는 함수 */
int search_book(struct Book* book_system) {
    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 < book_system->num_total_book; i++) {
            if (compare(book_system->book_name[i], user_search)) {
                printf("번호 : %d // 책 이름 : %s // 지은이 : %s // 출판사 : %s \n", i,
                    book_system->book_name[i], book_system->auth_name[i], book_system->publ_name[i]);
            }
        }

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

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

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

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

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

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

    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