C언어 공부

구조체

Bordercolli 2023. 7. 24. 15:28
728x90
#include <stdio.h>

struct GameInfo(){

}; // 구조체 선언방법, 여기다가 정보를 집어넣으면 된다.★ 여기가 핵심

int main(void)
{
/*
프로젝트 설명 : [게임 출시]
이름: 나도 게임
발매년도: 2017년
가격 : 50원
제작사: 나도 회사
*/


    char * name="나도게임";
    int year=2017;
    int price=50;
    char * company="나도회사";

/*
프로젝트 설명 : [ 또 다른 게임 출시]
이름: 너도 게임
발매년도: 2017년
가격 : 100원
제작사: 너도 회사
*/

    char * name2="너도게임";
    int year2=2017;
    int price2=100;
    char * company2="너도회사";



    return 0;
   
}

/* 구조체가 필요한 이유
관련있는 정보들이 하나로 관리되면 좋겟는데, 다 따로따로 변수에 있어서 정신이 없다.
이떄 필요한 것이 구조체
 
구조체 선언 방법
struct Gameinfo{

};*/

구조체가 필요한 이유: 관련있는 정보들이 하나로 관리되면 좋겠는데 다 따로따로 위처럼 숫자 붙여서 변수를 만드니 정신이 없다. 따라서 이때 필요한 것이 구조체

#include <stdio.h>

struct GameInfo(){
     char * name;
    int year;
    int price;
    char * company;
    // 뒤에 값들은 다 뺴 버리고 변수 선언부 까지만 두면 된다.
    // 이렇게 하면 gameinfo라는 구조체 함수가 만들어진 것

}; //구조체 선언방법, 여기다가 정보를 집어넣으면 된다.
#include <stdio.h>

struct GameInfo
{
    char * name;
    int year;
    int price;
    char * company;
    // 뒤에 값들은 다 뺴 버리고 변수 선언부 까지만 두면 된다.
    // 이렇게 하면 gameinfo라는 구조체 함수가 만들어진 것

}; //구조체 선언방법, 여기다가 정보를 집어넣으면 된다.

int main(void)
{ // 구조체 사용방법
    struct GameInfo gameinfo1;  // struct GameInfo까지가 자료형이고, 뒤에가 변수명
    gameinfo1.name="나도게임"; // 실제로 값을 집어넣을 때
    gameinfo1.year=2017;
    gameinfo1.price=100;
    gameinfo1.company="나도회사";

    printf("-- 게임 출시 정보 --\n");
    printf("게임명: %s\n", gameinfo1.name);
    printf("게임출시연도: %d\n", gameinfo1.year);
    printf("게임가격: %d\n", gameinfo1.price);
    printf("게임회사: %s\n", gameinfo1.company);



    return 0;
}

구조체를 사용하는 방법

#include <stdio.h>

struct GameInfo
{
    char * name;
    int year;
    int price;
    char * company;
    // 뒤에 값들은 다 뺴 버리고 변수 선언부 까지만 두면 된다.
    // 이렇게 하면 gameinfo라는 구조체 함수가 만들어진 것

}; //구조체 선언방법, 여기다가 정보를 집어넣으면 된다.

int main(void)
{ // 구조체 사용방법
    struct GameInfo gameinfo1;  // struct GameInfo까지가 자료형이고, 뒤에가 변수명
    gameinfo1.name="나도게임"; // 실제로 값을 집어넣을 때
    gameinfo1.year=2017;
    gameinfo1.price=100;
    gameinfo1.company="나도회사";

    printf("-- 게임 출시 정보 --\n");
    printf("게임명: %s\n", gameinfo1.name);
    printf("게임출시연도: %d\n", gameinfo1.year);
    printf("게임가격: %d\n", gameinfo1.price);
    printf("게임회사: %s\n", gameinfo1.company);

    //구조체를 배열처럼 초기화
    struct GameInfo gameinfo2={"너도 게임", 2017, 100, "너도회사"};
    printf("-- 또 다른 게임 출시 정보 --\n");
    printf("게임명: %s\n", gameinfo2.name);
    printf("게임출시연도: %d\n", gameinfo2.year);
    printf("게임가격: %d\n", gameinfo2.price);
    printf("게임회사: %s\n", gameinfo2.company);
    return 0;
}

 

   // 구조체 배열
    struct GameInfo gameArray[2]= {{"나도 게임", 2017, 50, "나도회사"},
    {"너도 게임", 2017, 100, "너도회사"}};

구조체 재정의(typedef)

typedef struct GameInformation
{   //구조체를 선언해뒀는데 구조체 안에서 똑같은 구조체를 변수로 가질 수 있다.
    char * name;
    int year;
    int price;
    char * company;
    // 뒤에 값들은 다 뺴 버리고 변수 선언부 까지만 두면 된다.
    // 이렇게 하면 gameinfo라는 구조체 함수가 만들어진 것

    /* 내가 게임회사를 하나 만들었는데 내 게임회사 안에서 내 친구의 게임회사를 소개하고 싶다?
    그럴떄 자기가 가지고 있는 구조체 내에 자기 구조체를 다시 선언한다.*/

    struct GameInfo * friendGame; // 연관업체 게임} GAME_INFO; //구
 
//=======================GAME_INFO와 게임정보는 같은 형태로 쓰임=======================
 
typedef struct GameInfo 게임정보; // struct gameinfo 이만큼이 게임정보라는 녀석으로 불려진다.
    // 이후부터는 게임정보로 변수를 만들 수 있다.
    게임정보 game1;
    game1. name="한글게임";
    game1. year=20117;
    game1.

조체 선언방법, 여기다가 정보를 집어넣으면 된다.

여기서 GAME_NFO와 게임정보라는 변수는 자료형으로 사용될 수 있다.

struct GameInformation game3; //struct GameInformation 여기까지 구조체
    game3.name="한글게임3;

이렇게도 사용가능하고

typedef struct       //구조체 이름 정의 없이 사용도 가능하다. 
{   //구조체를 선언해뒀는데 구조체 안에서 똑같은 구조체를 변수로 가질 수 있다.
    char * name;
    int year;
    int price;
    char * company;
    // 뒤에 값들은 다 뺴 버리고 변수 선언부 까지만 두면 된다.
    // 이렇게 하면 gameinfo라는 구조체 함수가 만들어진 것

    /* 내가 게임회사를 하나 만들었는데 내 게임회사 안에서 내 친구의 게임회사를 소개하고 싶다?
    그럴떄 자기가 가지고 있는 구조체 내에 자기 구조체를 다시 선언한다.*/

    struct GameInfo * friendGame; // 연관업체 게임



} GAME_INFO; //구조체 선언방법, 여기다가 정보를 집어넣으면 된다.

↑위 처럼 사용하는게 더 편리하다.

 

고양이 키우기 프로젝트1 (전반전)

#include <stdio.h>
#include <time.h>

typedef struct {
    char *name;   // 이름   -> 문자열만 * 표시를 한다.
    int age; // 나이
    char *character; // 성격
    int level;   // 키우기 난이도(1~5까지해서 5가 가장 어려움)
}CAT;

// 현재까지 보유한 고양이
int collection[5]={0,0,0,0,0};

// 전체 고양이 리스트
CAT cats[5];

void initCats();  // 고양이정보 초기화
void printCat(int selected);


int main(void)
{
/*고양이를 랜덤으로 뽑아야 하니까, srand*/
    srand(time(NULL));


    initCats();// 고양이 초기화
    while(1)
    {
        printf("두근두근!~ 어느 고양이의 집사가 될까요?\n 아무 키나 눌러서 확인하세요! ");
        getchar(); // 어떤 키를 누르면 그제서야 고양이를 뽑는 동작을 하도록 한다.
        // getchar 은 어떤 키가 들어오는 것을 기다림.  

        int selected = rand() * 5; // 0~4 사이의 숫자를 반환한다.
        printCat(selected);
        // 고양이를 뽑고 뽑은 고양이에 대한 정보를 알려준다. ~이런 고양이를 뽑았다.




    }




    return 0;
}


void initCats()
{  
    cats[0].name="깜냥이";   //첫번째 고양이에 대해서
    cats[0].age=5;
    cats[0].character="온순";
    cats[0].level=1;

    cats[1].name="귀요미";   //첫번째 고양이에 대해서
    cats[1].age=3;
    cats[1].character="날카롭";
    cats[1].level=2;


    cats[2].name="수줍이";   //첫번째 고양이에 대해서
    cats[2].age=7;
    cats[2].character="늘 잠만 잠";
    cats[2].level=3;


    cats[3].name="까꿍이";   //첫번째 고양이에 대해서
    cats[3].age=2;
    cats[3].character="시끄러움";
    cats[3].level=4;


    cats[4].name="돼냥이";   //첫번째 고양이에 대해서
    cats[4].age=1;
    cats[4].character="배고픔";
    cats[4].level=5;
}


void printCat(int selected)
{
    printf("\n\n === 당신은 이 고양이의 집사가 되었어요! ===\n\n");
    printf("이름        :%s \n", cats[selected].name);
    printf("나이        :%s \n", cats[selected].age);
    printf("성격        :%s \n", cats[selected].character);
    printf("키우기난이도 : ");// 레벨은 별로 표시를 해본다.

    for(int i=0; i<cats[selected].level; i++)
    {
        printf("%s", "★");
    }
    printf("\n\n");
}


/*프로젝트 설명: 고양이 수집 게임
5마리의 고양이가 있다. 아무키나 눌러서 랜덤으로 고양이를 뽑되, 5마리 모두 다 수집해서 열심히 키우는
되는 게임
중복 발생 가능하다.
고양이에 대한 정보: 이름, 나이, 성격, 키우기 난이도(level정보) */

고양이 키우기 프로젝트1 (후반전)

#include <stdio.h>
#include <time.h>

typedef struct {
    char *name;   // 이름   -> 문자열만 * 표시를 한다.
    int age; // 나이
    char *character; // 성격
    int level;   // 키우기 난이도(1~5까지해서 5가 가장 어려움)
}CAT;

// 현재까지 보유한 고양이
int collection[5]={0,0,0,0,0};

// 전체 고양이 리스트
CAT cats[5];

void initCats();  // 고양이정보 초기화
void printCat(int selected);


int main(void)
{
/*고양이를 랜덤으로 뽑아야 하니까, srand*/
    srand(time(NULL));


    initCats();// 고양이 초기화
    while(1)
    {
        printf("두근두근!~ 어느 고양이의 집사가 될까요?\n 아무 키나 눌러서 확인하세요! ");
        getchar(); // 어떤 키를 누르면 그제서야 고양이를 뽑는 동작을 하도록 한다.
        // getchar 은 어떤 키가 들어오는 것을 기다림.  

        int selected = rand() % 5; // 0~4 사이의 숫자를 반환한다.
        printCat(selected); // 뽑은 공양이 정보를 출력하고 나서
        // 고양이를 뽑고 뽑은 고양이에 대한 정보를 알려준다. ~이런 고양이를 뽑았다.

        collection[selected]=1;// 고양이 뽑기 처리, collection
        // 이런 동작을 하다가 고양이 5마리를 다 모았으면, 열심히 키우면 된다.

        int collectAll=checkcollection();
        if(collectAll == 1)
        {
            break;
        }





    }




    return 0;
}


void initCats()
{  
    cats[0].name="깜냥이";   //첫번째 고양이에 대해서
    cats[0].age=5;
    cats[0].character="온순";
    cats[0].level=1;

    cats[1].name="귀요미";   //첫번째 고양이에 대해서
    cats[1].age=3;
    cats[1].character="날카롭";
    cats[1].level=2;


    cats[2].name="수줍이";   //첫번째 고양이에 대해서
    cats[2].age=7;
    cats[2].character="늘 잠만 잠";
    cats[2].level=3;


    cats[3].name="까꿍이";   //첫번째 고양이에 대해서
    cats[3].age=2;
    cats[3].character="시끄러움";
    cats[3].level=4;


    cats[4].name="돼냥이";   //첫번째 고양이에 대해서
    cats[4].age=1;
    cats[4].character="배고픔";
    cats[4].level=5;
}


void printCat(int selected)
{
    printf("\n\n === 당신은 이 고양이의 집사가 되었어요! ===\n\n");
    printf("이름        :%s \n", cats[selected].name);
    printf("나이        :%s \n", cats[selected].age);
    printf("성격        :%s \n", cats[selected].character);
    printf("키우기난이도 : ");// 레벨은 별로 표시를 해본다.

    for(int i=0; i<cats[selected].level; i++)
    {
        printf("%s", "★");
    }
    printf("\n\n");
}

int checkcollection()
{
    // 1. 현재 보유한 고양이 목록도 출력하면서 다 모았는지 여부를 반환한다.
    // 2. 다 모았는지 여부를 반환
    int collectAll=1;  // 다 모았는지 여부를 확인한다.

    printf("\n\n === 보유한 고양이 목록이에요 === \n\n");
    for (int i=0; i<5; i++)
    {
        if (collection[i]==0)   // 고양이 수집 안 된 경우
        {
            printf("%10s", "(빈 박스)");
            collectAll=0;   // 다 모으지 못한 상태
        }
        else{ // 고양이 수집된 경우
            printf("%10s", cats[i].name);
        }
    }
    printf("\n=======================================================\n\n");

    if(collectAll)  //모든 고양이를 다 모은 경우
    {  
        printf("\n\n 축하합니다! 모든 고양이를 다 모았어요. 열심히 키워주세요\n\n");
    }

    return collectAll;

}

'C언어 공부' 카테고리의 다른 글

다차원배열  (0) 2023.07.24
다차원 배열  (0) 2023.07.21
포인터2  (0) 2023.07.18
C언어 포인터 다시 공부  (0) 2023.07.17
VSCode에서 c언어 시작하기1  (0) 2023.07.17