☆ 구조체

  - 배열은 같은 타입의 자료들의 묶음
  - 구조체는 다른 타입의 자료들의 묶음


☆ 구조체 예제 1

#include <stdio.h>
#include <string.h>

/*
struct Student
{
char name[10];
int age;
int score;
};
*/

typedef struct Student
{
char name[10];
int age;
int score;
}ST;

void display(ST s)
{
printf("Name : %s\n",s.name);
printf("Age : %d\n",s.age);
printf("Score : %d\n",s.score);
}

void datain(ST *sp)   // #1. 아래에서 datain(&t); 로 사용되고 있으므로 sp부분에 포인터라는 것을 명시한다.
                              // 값을 return하지 않아도 포인터이므로 변수에 접근할 수 있다.
{
strcpy(sp->name,"송혜교");
sp->age=30;
sp->score=67;
}

void main0()
{
//struct Student s={"이미연",23,98};
ST s={"이미연",23,98};
ST t;
/*
strcpy(t.name,"한은정");
t.age=11;
t.score=90;
*/

datain(&t);     // t는 주소임. 그러므로 포인터로 받아야 한다 (위쪽 #1)


//printf("Student = \%d Byte\n",sizeof(Student));

//출력
/*
printf("Name : %s\n",s.name);
printf("Age : %d\n",s.age);
printf("Score : %d\n",s.score);
*/
display(s);

puts("==============================");

/*
printf("Name : %s\n",t.name);
printf("Age : %d\n",t.age);
printf("Score : %d\n",t.score);
*/
display(t);
}


☆ 구조체 예제 2

#include <stdio.h>

//레퍼런스 변수 : 같은 기억장소에 붙는 또 하나의 이름(별명). C++에만 있다.
//선언 : 데이터형 &변수명

void main()
{
int a=5;
int &b=a;
int *c=&a;
int d=a;

puts("주소 알아보기");
printf("a의 주소 = %d, b의 주소 = %d, d의 주소 = %d\n",&a,&b,&d);

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

a=3;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

b=1;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

d=100;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);

*c=7;

printf("a=%d,b=%d,*c=%d,d=%d\n",a,b,*c,d);
}


☆ 구조체 예제 3

#include <stdio.h>

void change(int &a)      // call by reference<-- a가 레퍼런스이다. 
{
printf("change a의 주소 : %d\n",&a);
a=5;
}

void change2(int a)     // call by value. 값만 받는 것.
{
printf("change2 a의 주소 : %d\n",&a);
a=10;
}

void main()
{
int a=10;
printf("main a의 주소 : %d\n",&a);
change(a);
change2(a);
printf("a=%d\n",a);
}


☆ 구조체 예제 4

#include <stdio.h>
#include <malloc.h>

void write(int *p)
{
for(int i=0;i<3;i++)
{
printf("p+%d의 값 : %d\n",i,*(p+i));
}
}


void main()
{
// 포인터 변수는 자료형에 상관없이 무조건 4바이트이다.

int *p;

// 동적 메모리 할당
// 포인터 변수명 = (자료형 *)malloc(할당받을 바이트 수);
// 메모리 해제 : free(변수명)

// p = (int *)malloc(sizeof(int)*3);

p=new int[3];    // C++에서 동적 메모리 할당하는 방법. 문법은 new 자료형[갯수]
*p=10;
*(p+1)=15;
*(p+2)=20;

write(p);

// free(p); // 메모리 해제. C에서 하는 방식임(C++은 다름).

delete p; // C++의 메모리 해제. 

write(p);
}


☆ 구조체 예제 5

#include <stdio.h>
#include <malloc.h>
#include <string.h>

void main()
{
char *s;

// s=(char *)malloc(sizeof(char)*20);

s=new char[20];

strcpy(s,"Happy Virus!!!");

puts(s);

// free(s);

delete s;

puts(s);
}


☆ 구조체 예제 6 

#include <stdio.h>

#include <iostream.h>

typedef struct Sawon
{
int no;
char name[10];
int pay;
int bonus;
int total;
}SA;

/*
SA datain()       // return을 써서 값을 넘길 때에는 이런 식으로 함
{
SA s;
cout<<"사원번호 :";
cin>>s.no;
cout<<"사원이름 :";
cin>>s.name;  
cout<<"월급여 :";
cin>>s.pay;
cout<<"보너스 :";
cin>>s.bonus;

s.total = s.pay + s.bonus;
return s;
};
*/

void datain(SA &s)     // 변수명으로만 받을 경우 void 타입으로 선언하고 이렇게 매개변수를 정의함
{
cout<<"사원번호 :";
cin>>s.no;
cout<<"사원이름 :";
cin>>s.name; 
cout<<"월급여 :";
cin>>s.pay;
cout<<"보너스 :";
cin>>s.bonus;

s.total = s.pay + s.bonus;
}

void dataout(SA *s)
{
cout<<"사원번호 : "<<s->no<<endl;
cout<<"사원명 : "<<s->name<<endl;
cout<<"월급여 : "<<s->pay<<endl;
cout<<"보너스 : "<<s->bonus<<endl;
cout<<"월수령액 : "<<s->total<<endl;
};

void main()
{
SA s;
// s=datain();            // <-- 이렇게 '='로 받는 것은 return을 써서 값을 넘긴다는 뜻.

datain(s); // 변수명으로만 받고 있다. 

dataout(&s);
}


☆ 구조체 예제 7

#include <stdio.h>

typedef struct Sawon
{
int no;
char name[10];
int pay;
int bonus;
int total;
}SA;

// write() 함수를 사용할 때의 선언 및 정의

//void write(SA *sp)      // #1. 아래와 같이 선언할 수도 있다
void write(SA sp[])              // #2. 이렇게 선언할 수도 있다.
{
for(int i=0;i<3;i++)
{
//(sp+i)->total = (sp+i)->pay + (sp+i)->bonus;   // 위에서 #1처럼 했으면 이렇게 사용
sp[i].total = sp[i].pay + sp[i].bonus; // 위 식과 같은 결과를 가진다. #2처럼 하면 이렇게 사용함

printf("%5d%10s%8d%8d%10d\n",
(sp+i)->no, (sp+i)->name, (sp+i)->pay, (sp+i)->bonus, (sp+i)->total);
}
}

void main()
{
SA s[3]={{1,"송혜교",800000,120000},
      {2,"한은정",900000,50000},
      {3,"이승기",1200000,70000}};

/*  #3. 요 부분을 아래의 write()라는 함수로 대체할수도 있음.
for(int i=0;i<3;i++)
{
s[i].total = s[i].pay + s[i].bonus;

printf("%5d%10s%8d%8d%10d\n",
s[i].no, s[i].name, s[i].pay, s[i].bonus, s[i].total);
}
*/

write(s);        // #3 부분을 write()함수로 만들어서 사용하고 있다.
}


☆ 구조체 예제 8

#include <stdio.h>
#define MAX 5

struct record
{
char name[20], id[20];
float kor, eng, avg;
};

typedef struct record RECORD;

void data_in(RECORD st[ ], int size);
void data_out(RECORD st[ ], int size);
void find_avg(RECORD st[ ], int size);

float sum_k=0.0, sum_e=0.0;

void main()
{
RECORD st[MAX];

data_in(st, MAX);
find_avg(st, MAX);
data_out(st, MAX);
}

void data_in(RECORD st[ ], int size)
{
printf("학번|이름|국어|영어\n");
for(int i=0; i<size; i++)
{
scanf("%s", st[i].id);
scanf("%s", st[i].name);
scanf("%f", &st[i].kor);
scanf("%f", &st[i].eng);
}
}

void data_out(RECORD st[ ], int size)
{
printf("학번|이름|국어|영어\n");
for(int i=0; i<size; i++)
{
printf("%s\t", st[i].id);
printf("%s\t", st[i].name);
printf("%.2f\t", st[i].kor);
printf("%.2f\t", st[i].eng);
printf("%.2f\t", st[i].avg);
}

printf("학과 평균\n");
printf("학과 국어 평균 : %.2f\n", sum_k/MAX);
printf("학과 영어 평균 : %.2f\n", sum_e/MAX);
}

void find_avg(RECORD st[ ], int size)
{
for(int i=0; i<size; i++)
{
sum_k += st[i].kor;
sum_e += st[i].eng;
st[i].avg = (st[i].kor + st[i].eng)/2.0;
}
}


+ Recent posts