☆ 구조체
- 배열은 같은 타입의 자료들의 묶음
- 구조체는 다른 타입의 자료들의 묶음
☆ 구조체 예제 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;
}
}
'기반지식 > C/C++' 카테고리의 다른 글
중앙정보학원 C/C++/OOP 강좌 14일차 - 2010년 6월 28일 (0) | 2010.06.28 |
---|---|
중앙정보학원 C/C++/OOP 강좌 13일차 - 2010년 6월 25일 (0) | 2010.06.25 |
중앙정보학원 C/C++/OOP 강좌 11일차 - 2010년 6월 23일 (0) | 2010.06.23 |
중앙정보학원 C/C++/OOP 강좌 9일차 - 2010년 6월 21일 (0) | 2010.06.22 |
중앙정보학원 C/C++/OOP 강좌 9일차 - 2010년 6월 21일 (0) | 2010.06.21 |