구조체

ChoRong0824·2022년 9월 27일
0

C

목록 보기
2/17
post-thumbnail

구조체

  • 구조체란, 서로 다른 데이터형을 갖는 데이터를 하나의 단위로 참조할 수 있도록 그룹처럼 만드는 것이다.
  • 구조체형도 열거형과 똑같이 윌가 작성 가능한 사용자 정의형의 하나이다.
  • 예를들면, int 학번, char 이름, 합계 int, 평균 float 등 다른 형의 값을 종합해서 개인 성적표를 나타내는 형으로 할 수 있는 것이다.
	int no; //학번
    char name[20];
    int total;
    float avg;
  • 이러한 데이터들은 서로 묶여져 있지 않기 때문에 다루기 불편,

구조체형

  • 배열은 여러개의 같은 데이터를 하나로 묶는 동질형 데이터형이고, 구조체는 서로 다른 데이터형을 하나로 묶는 이질형 데이터형인 레코드와 같다.

구조체의 선언

  • c는 구조체의 선언에 의해 여러 종류의 데이터 형을 1개로 종합하여 이것을 구조체형이라고 부른ㄴ 1개의 데이터 형으로 정의할 수 있다.
  • 구조체를 이용할 경우 어떤 구성의 구조체를 이용할 것인가를 선언해야한다. 구조체는 struct라는 지시어를 사용하여 선언하며, 일반 형식은 다음과 같다.

구조체 변수의 선언과 멤버의 참조

  • 구조체의 선언은 템플레이트의 정의뿐이고 메모리 할당은 없다. 이것을 실제로 메모리에 할당하려면 구조체 변수의 선언이 필요하다.
  • 구조체 변수의 선언
	struct 태그명 변수명[,변수명,.....];
또는
	struct 태그명{
    	데이터형1 멤버명;
        데이터형2 멤버명;
        ...
        } 변수명[, 변수명, ...];

-> 이미지 코드에서 총 바이트는 22byte
  • struct의 앞에 기억 클래스 지정자를 생략하고 있기 때문에 student1과 student2는 자동변수로 된다. 이것에 의해 student1,2는 sturct sungjug의 구조체 변수로 됨.
  • 구조체 멤버의 참조방법은 구조체 변수명과 멤버명을 ,로 연결하며, 구조체 멤버 또는 항목은 일반변수와 같은 방법으로 처리된다.

예제, 구조체 선언과 구조체 변수(1)

#include <stdio.h>

int main() {
    struct sungjug{
      int no;
      char*name;   //포인터 써서 1byte
      int total;
      float avg;
    }
    student;
    student.no=10;
    student.name="김하나";
    student.total=250;
    student.avg=83.3;

    printf("%d %s %d %4.1f\n", student.no,
      student.name, student.total, student.avg);
}


구조체 변수의 초기화

  • 예를들면, struct sugjug형 변수 student1,2의 각 멤버에 데이터를 입력하는 경우에는
    scanf(%d , %s, &student1.no, student1.name);<-10, 김하나
    로 쓰면 된다. 또한,
  • printf("\n%s %d %4.1f", student1.name, student1.total, student1.avg); 로 하면 김하나 250 83.3 을 출력한다.

구조체 선언과 초기화(2)

#include <stdio.h>

int main() {
    struct sungjug{
      int no;
      char*name;
      int total;
      float avg;
    };
  struct sungjug student1 = {10,"김하나", 250, 83.3};
  struct sungjug student2 = {22,"최두나", 275, 91.7};
  printf("%d %s %d %4.1f\n", student1.no, student1.name, student1.total, student1.avg);
    printf("%d %s %d %4.1f\n", student2.no, student2.name, student2.total, student2.avg);


  //배정 연산자를 사용해서 스튜던트 1,2 출력
  student1=student2;
  printf("%d %s %d %4.1f\n", student1.no, student1.name, student1.total, student1.avg);
   printf("%d %s %d %4.1f\n", student2.no, student2.name, student2.total, student2.avg);
   
}

scanf 로 입력 받아서 출력하는 방법(printf 가아닌)

  • name이 포인터라서 오류가 나는 것임. 포인터는 주소를 저장하는 것임.
  • scnaf로 할거면 %s
  • 저장은 주소번지에 저장하면 메모리 할당이 안된거임. 그래서 포인터를 쓸때
  • scanf로 받으려면 포인터가 아닌 배열로 잡아줘야함.
#include <stdio.h>

int main() {
    struct sungjug{
      int no;
      char name[5];
      int total;
      float avg;
    };
  struct sungjug student1;
  struct sungjug student2;
  
  // scanf 로 입력 받아서 출력하는 방법(printf 가아닌)
  
  scanf("%d %s %d %f\n", &student1.no, &student1.name, &student1.total, &student1.avg);
  scanf("%d %s %d %f\n", &student2.no, &student2.name, &student2.total, &student2.avg);
  
   // scanf 로 입력 받아서 출력하는 방법(printf 가아닌)
  //name이 포인터라서 오류가 나는 것임. 포인터는 주소를 저장하는 것임.
  // scnaf로 할거면 %s 
  //저장은 주소번지에 저장하면 메모리 할당이 안된거임. 그래서 포인터를 쓸때
  //scanf로 받으려면 포인터가 아닌 배열로 잡아줘야함.
  // printf("학번 :") scanf
  //printf 에서는 &가 오면 안됌. 입력받으니까, 그러나 scanf에는 &이 와서 출력해줘야함. => printf 에서 입력받고 scanf에서 출력하고
}
  
  • &student 는 주소 값 때문에 이렇게 &를 앞에 넣어준다

구조체 배열의 선언과 초기화 (3)

#include <stdio.h>

int main() {
    struct book{

  char *title;
  char *author;
  int price;
  }mybook[3];

  mybook[0].title = "c언어";
  mybook[0].author = "홍길동";
  mybook[0].price = "250000";
   mybook[1].title = "java";
  mybook[1].author = "Robert";
  mybook[1].price = "30000";
  mybook[2].title = "C++";
  mybook[2].author ="Riche";
  mybook[2].price ="25000";

  for(int i=0;i<3;i++){
    printf("%10s %10s %10d\n", mybook[i].title, mybook[i].author, mybook[i].price);
  } 
}

(3)을 많이 쓰이는 배열로 변형

#include <stdio.h>

int main() {
    struct book{

  char *title;
  char *author;
  int price;
  }
 struct book mybook[3]={{"c","hohg",25000},{"java","Robert",30000}{"c++","Riche",25000}};
  
  for(int i=0;i<3;i++){
    printf("%10s %10s %10d\n", mybook[i].title, mybook[i].author, mybook[i].price);
  } 
}

소팅

#include <stdio.h>

struct jumsu{
        int num;
        char name[10];
        int subject[3];
        int sum;
        float avg;
    };
    int main(void){
        int i,j;
        struct jumsu temp;
        struct jumsu sungjuk[5]=
        {{2001, "이나라", 24,11,41},{2002,"최민수",32,52,22},{2003,"서진아",32,43,32},{2004,"박흥수",41,14,24},{2005,"김미나",51,15,11}};
        for( i=0;i<5;i++){
            for(j=0;j<3;j++)
            sungjuk[i].sum+=sungjuk[i].subject[j];
            sungjuk[i].avg=sungjuk[i].sum/3.0;
        }
    printf("\n\n===========정렬 수행 전 ==============\n");
    printf("번호 이름 과목점수 합계 평균 \n");
    printf("=====================\n");
    for(i=0;i<5;i++){
        printf("%d %s %4d %4d %4d %5d %8.2f\n", sungjuk[i].num, sungjuk[i].name, sungjuk[i].subject[0],
        sungjuk[i].subject[1], sungjuk[i].subject[2],sungjuk[i].sum, sungjuk[i].avg);
    }
    for(i=0;i<4;i++){
        for(j=i+1;j<5;j++)
        {
            if(sungjuk[i].sum<sungjuk[j].sum)
            {
                temp=sungjuk[i];
                sungjuk[i]=sungjuk[j];
                sungjuk[j]=temp;

            }
        }
    }
    printf("\n\n========정렬 수행 후=================\n");
    printf("번호 이름 과목점수 합계 평균\n");
    printf("================================\n");
    for(i=0;i<5;i++){
         printf("%d %s %4d %4d %4d %5d %8.2f\n", sungjuk[i].num, sungjuk[i].name, sungjuk[i].subject[0], sungjuk[i].subject[1],
         sungjuk[i].subject[2],sungjuk[i].sum, sungjuk[i].avg);
    }
    
}


해당코드를 이용하여 입력을 받아서 한다면 어떻게 됄까?

#include <stdio.h>

struct jumsu{
        int num;
        char name[10];
        int subject[3];
        int sum;
        float avg;
    };
    struct jumsu sungjuk[5]; // 식별자 구분을 위해 struct jumsu 이후 sungjuk[5];
    int main(void){
        int i,j;
        struct jumsu temp;
     //   struct jumsu sungjuk[5]=
     //   {{2001, "이나라", 24,11,41},{2002,"최민수",32,52,22},{2003,"서진아",32,43,32},{2004,"박흥수",41,14,24},{2005,"김미나",51,15,11}};
        for( i=0;i<5;i++){
            printf("학번 :");
           scanf("%d", &sungjuk[i].num);
            printf("이름 ;");
            scanf("%d", &sungjuk[i].name);
            printf("과목 점수 1: ");
            scanf("%d", &sungjuk[i].subject[0]);
            printf("과목 점수 2: ");
            scanf("%d", &sungjuk[i].subject[0]);
            printf("과목 점수 3: ");
            scanf("%d", &sungjuk[i].subject[0]);
        }
       for (i = 0; i < 5; i++){
        for(j=0; j<3;j++){
            sungjuk[i].sum+=sungjuk[i].subject[j];
            sungjuk[i].avg = sungjuk[i].sum / 3.0;
       }
    

   //         for(j=0;j<3;j++)
     //       sungjuk[i].sum+=sungjuk[i].subject[j];
     //       sungjuk[i].avg=sungjuk[i].sum/3.0;
        }
    printf("\n\n===========정렬 수행 전 ==============\n");
    printf("번호 이름 과목점수 합계 평균 \n");
    printf("=====================\n");
    for(i=0;i<5;i++){
        printf("%d %s %4d %4d %4d %5d %8.2f\n", sungjuk[i].num, sungjuk[i].name, sungjuk[i].subject[0],
        sungjuk[i].subject[1], sungjuk[i].subject[2],sungjuk[i].sum, sungjuk[i].avg);
    }
    for(i=0;i<4;i++){
        for(j=i+1;j<5;j++)
        {
            if(sungjuk[i].sum<sungjuk[j].sum)
            {
                temp=sungjuk[i];
                sungjuk[i]=sungjuk[j];
                sungjuk[j]=temp;

            }
        }
    }
    printf("\n\n========정렬 수행 후=================\n");
    printf("번호 이름 과목점수 합계 평균\n");
    printf("================================\n");
    for(i=0;i<5;i++){
         printf("%d %s %4d %4d %4d %5d %8.2f\n", sungjuk[i].num, sungjuk[i].name, sungjuk[i].subject[0], sungjuk[i].subject[1],
         sungjuk[i].subject[2],sungjuk[i].sum, sungjuk[i].avg);
    }
}
profile
컴퓨터공학과에 재학중이며, 백엔드를 지향하고 있습니다. 많이 부족하지만 열심히 노력해서 실력을 갈고 닦겠습니다. 부족하고 틀린 부분이 있을 수도 있지만 이쁘게 봐주시면 감사하겠습니다. 틀린 부분은 댓글 남겨주시면 제가 따로 학습 및 자료를 찾아봐서 제 것으로 만들도록 하겠습니다. 귀중한 시간 방문해주셔서 감사합니다.

0개의 댓글