구조체
- 구조체란, 서로 다른 데이터형을 갖는 데이터를 하나의 단위로 참조할 수 있도록 그룹처럼 만드는 것이다.
- 구조체형도 열거형과 똑같이 윌가 작성 가능한 사용자 정의형의 하나이다.
- 예를들면, 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);
}
}