드디어 구조체!!
#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;
}
완성을 하기에는 시간이 너무 오래걸릴 것 같아서 공부 끝나구 시간 남으면 다시 만들어봐야겠다.
이것도 좀 지나서 만들어보자... 엄청 오래걸릴 것 같다.
*
이 때, 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
'초기 네이버 기록 > 과거 공부 기록' 카테고리의 다른 글
스택과 큐 자료구조 C로 (0) | 2023.01.08 |
---|---|
합병정렬 (0) | 2023.01.08 |
도서관리 프로그램 최종본 (씹어먹는 C) (0) | 2023.01.07 |
공부기록 문자열 (씹어먹는 C언어)(scanf함수에서 띄어쓰기 해결 ,화면 출력함수 변환문자 제어문자) (0) | 2023.01.07 |
다시 천천히 -씹어먹는 C언어 에라토스테네스의 체 예제 + 계산기 예제 (0) | 2023.01.07 |