본문 바로가기
3.9 기타 개발/C

[C언어/이론] 구조체

by Dohi._. 2023. 5. 22.
728x90

8개의 값(점수)을 받아야 한다고 가정하에 직접 받으면 이렇게 노가다를 해야합니다

#include <stdio.h>
main() {
   int a1,a2,a3,a4,a5,a6,a7,a8;
   int hap;
   scanf("%d %d %d %d %d %d %d %d",
               &a1,&a2,&a3,&a4,&a5,&a6,&a7,&a8);
   hap=a1+a2+a3+a4+a5+a6+a7+a8;
   printf("hap = %d\n",hap);
}

간단하게 배열을 이용하여 만들면

main() {
   int a[8];
   int hap=0;
    scanf("%d",a+0);
    scanf("%d",a+1);
    scanf("%d",a+2);
    scanf("%d",a+3);
    scanf("%d",a+4);
    scanf("%d",a+5);
    scanf("%d",a+6);
    scanf("%d",a+7);
    
   hap=a[0]+a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7];
   printf("hap = %d\n",hap);

달라진게..없는데?...

 

for문을 이용하면 좀더 간단해집니다

#include <stdio.h>
main() {
   int a[8];
   int hap=0;
   int i;
   for(i=0;i<8;i++)
   	scanf("%d",a+i);
    //scanf("%d",&a[i]);
   for(i=0;i<8;i++)
        hap=hap+a[i];
   printf("hap = %d\n",hap);
}

이렇게 보기엔 더 복잡해진 것같은데 

저장해야하는 수가 8이였다가 5였다가 9였다가 수정을 하기 편해집니다 

아래 코드처럼

#include <stdio.h>
#define N 10
main() {
   int a[N];
   int hap=0;
   int i;
   for(i=0;i<N;i++)
   	scanf("%d",a+i);
    //scanf("%d",&a[i]);
   for(i=0;i<N;i++)
        hap=hap+a[i];
   printf("hap = %d\n",hap);
}

지금은 한가지의 데이터(점수)을 받았는데 A의 수학점수,국어점수,이름과 같이

각 다른 데이터형을 저장하기 위해서 구조체를 사용합니다. 

 

조체에 관해서는 2가지 알아두셔야 할 것이 있습니다. 하나는 틀을 만드는 방법이고, 또 다른 하나는 이를 기억공간에 만드는 방법입니다. 우선 틀을 만드시는 방법은 다음과 같습니다.

  struct 태그명 {
      변수 ;
      변수 ;
        :
  };

위에서 태그명은 기억공간의 이름만드는 방법과 동일합니다. 예를 들어 다음과 같은 구조체의 틀을 만들 수가 있습니다.

  struct ABC {
      int 정수;
      float 실수; //이해하기 편하게 한글코딩으로합니다
  };

위에서 "정수"라는 이름의 정수형 기억공간과

"실수"라는 이름의 실수값을 담을 수 있는

실수형 기억공간을 ABC라는 이름으로 하나의 구조를 만들 었구요. 


위의 작성은 '이러한 구조를 만들겠다' 라는 정의에 지나지 않습니다.

메모리에 실제적인 기억공간으로 만드시려면 다음과 같이 함수내에서 선언해 주셔야 한답니다.

#include <stdio.h>
struct ABC {
    int 정수;
    float 실수;
};

main() {
    struct ABC kbs;
}

 

위에서 보시는 바와 같이 선언하시는 방법은

  struct 태그명 이름;

따라서 위의 프로그램과 같이 struct ABC kbs; 라고 해주시면, 그때서야 kbs 라는 이름으로 ABC 라는 이름의 구조가 기억될 수 있도록 기억공간을 만드는 겁니다. 다음의 그림과 같이 말이죠.

값을 저장하고 읽어내는 방법은 

    태그명.변수명 = 값;
    변수 = 태그명.변수명;
#include <stdio.h>
struct ABC {
    int jung;//정수
    float sil;//실수
};

main() {
    struct ABC test;
    test.jung = 14;
    test.sil = 105.72;
    printf("%d %6.2f\n",test.jung,test.sil);
}

 

어 그럼 구조체 안에도 배열을 넣을 수 있으려나?

 

하고 하나를 만들어 봤는데

#include <stdio.h>
#include <string.h>
struct peopledata {
    int no;
    char name[10];
    int age;
    char juso[20];    
};

main() {
   struct peopledata my;
   my.no=1;
   my.name="갓도히";
   my.age=102;
   strcpy(my.juso,"행복행");
   printf("%d %s %d %s\n",
      my.no,my.name,my.age,my.juso);
}

이대로 돌리면 만약 에러가 날 것인데요

그이유는....

name="갓도히" 부분에

한번에 배열값을 넣을 수 가 없기에

my.name[0]="갓"; 

my.name[1]="도";

my.name[2]="히";

my.name[3]="\0";

이렇게 진행 해야하는데 너무너무 귀찮죠 

 

라이브러리를 사용할 예정입니다

#include <string.h>
strcpy(my.name,"갓도히");
#include <stdio.h>
#include <string.h>
struct peopledata {
    int no;
    char name[10];
    int age;
    char juso[20];    
};

main() {
   struct peopledata my;
   my.no=1;
   //my.name="갓도히";
   strcpy(my.name,"갓도히");
   my.age=102;
   strcpy(my.juso,"행복행");
   printf("%d %s %d %s\n",
      my.no,my.name,my.age,my.juso);
}

 

어.. 그럼 한번에 하나하나  저장할떄도 저렇게 해야하나..

 

한번에 저장하는 코드(배열로)를보고 마무리 하도록 하겠습니다

#include <stdio.h>
struct peopledata {
    int no;
    char name[10]; //한글이름은 2바이트씩 먹기때문에 넉넉하게 잡아준다 (\0값도 포함해서)
    char gender;
    int age;
    float sinjang;
    char juso[20];    
};
//name[10]은 한글이름이 4글자까지있을것이라고 예상해서 4*2 +1(\0값) 9이상인 10으로 지정
main() {
   struct peopledata dat[8] = { {1,"갓도히",'m',24,180.5,"사랑동"},
                           {2,"도히쿤",'w',15,165.4,"행복동"},
                           {3,"도히상",'m',18,170.7,"미치동"},
                           {4,"소도히",'m',22,185.2,"게도동"},
                           {5,"왕도히",'w',20,160.2,"보고동"},
                           {6,"도히스",'m',32,177.7,"싶은동"},
                           {7,"도도히",'m',33,168.4,"사람원"},
                           {8,"히도히",'w',18,164.2,"도히동"} };
   int i;
   for(i=0;i<8;i++) 
      printf("%d %s %c %d %5.1f %s\n",
          dat[i].no,dat[i].name,dat[i].gender,
          dat[i].age,dat[i].sinjang,dat[i].juso);

}

 

뭔가 이렇게 응용이 가능해요!

한번 각자 코드를 짜봐서 응용해보시는 것을 추천드려요!

728x90

'3.9 기타 개발 > C' 카테고리의 다른 글

[C언어/코드] 지렁이꼬리키우기 게임  (1) 2023.05.18

댓글