본문 바로가기

IT&코딩/자료구조

자료구조 - 5일차 (구조체)

728x90
반응형

#include<stdio.h>

// ---- 구조체 ----
// 여러 개의 멤버들을 모아서 하나의 '새로운 자료형'을 만드는 개념
// 구조체 변수의 멤버에 접근할 때는 구조체변수 .멤버 형식으로 접근한다.
// ex) struct Data d;
// d.data1=10;

// 구조체의 크기는 구조체 멤버들을 모두 더한 크기이다.


// 기본 구조체 정의 원형
struct Data
{
int data1;
int data2;
int data3;
};

// 별칭 구조체 정의
// 별칭 구조체를 사용하면 구조체 이름, 별칭 모두 사용 가능
typedef struct Data
{
int data1;
int data2;
int data3;
}Da;
// Da라는 별칭을 사용하겠다.
// 하지만 같은 대상에 2개의 이름이 붙는다는 단점이 존재한다.

// 익명 구조체 정의
// 익명 구조체를 사용하면 구조체 이름으로 변수 선언X, 별칭만 사용 가능.
typedef struct
{
int data1;
int data2;
}Da;

// 아예 앞 부분 이름을 삭제
// 이름 자체를 사용할 수 없다는 단점이 있다.

-------------------------------------------------------------------------------------------------------------------

// ---- 구조체 포인터 ----
// 구조체 포인터를 이용해서 역참조를 진행할 때는 기본적으로 ->(애로우)를 사용해서 진행한다.
// 별도로 *를 사용할 수 있는데 이때는 우선순위 때문에 괄호로 묶어준다.
// ex) (*d).data1 == d->data1

typedef struct Data
{
int data1;
int data2;
}Da;

int main()
{
struct Data d;
Da d2;

d.data1 = 10;
d.data2 = 20;

printf("출력 : %d %d\n", d.data1, d.data2);
printf("d의 크기 : %d\n", sizeof(d));

return 0;
}

-------------------------------------------------------------------------------------------------------------------

// 문제)
// 철수의 성적을 국어, 수학, 영어 순서로 입력 받은 후
// 세 성적의 총합을 구조체 멤버 total 에 할당해주는 함수,
// 성적의 평균을 구조체 멤버 avg 변수에 할당해주는 함수,
// 평균을 비교해 등급을 구조체 멤버 grade에 할당해주는 함수를 작성하고
// main에서 각 총합, 평균, 등급을 출력해보세요.
// 모든 함수는 반환값이 존재하지 않는 형태로 작성해보세요.
// (90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F)
// 필요한 변수들은 구조체를 통해서 선언하세요.

// 국어, 수학, 영어 입력 : 98 92 86
// 총합 : 276
// 평균 : 92.00
// 등급 : A

struct Test {
int kor, mat, eng, total;
double avg;
char grade;
};

void Total(int kor, int mat, int eng, int* total)
{
*total = kor + mat + eng;
}

void Avg(int total, double* avg)
{
*avg = (double)total / 3;
}

void Grade(double avg, char* grade)
{
if (avg >= 90)
*grade = 'A';
else if (avg >= 80)
*grade = 'B';
else if (avg >= 70)
*grade = 'C';
else if (avg >= 60)
*grade = 'D';
else
*grade = 'F';
}


int main()
{
struct Test t;

printf("국어, 수학, 영어 입력 : ");
scanf("%d%d%d", &t.kor, &t.mat, &t.eng);

Total(t.kor, t.mat, t.eng, &t.total);
Avg(t.total, &t.avg);
Grade(t.avg, &t.grade);

printf("총합 : %d\n평균 : %.2f\n등급 : %c\n", t.total, t.avg, t.grade);


return 0;

}

-------------------------------------------------------------------------------------------------------------------



typedef struct{
int data1;
int data2;
}Data;

void Func(Data d)
{
d.data1 = 11;
d.data2 = 22;
}

int main()
{
Data d;

d.data1 = 10;
d.data2 = 20;

Func(d);

printf("출력 : %d %d\n", d.data1, d.data2);

return 0;
}

-------------------------------------------------------------------------------------------------------------------

typedef struct {
int data1;
int data2;
}Data;

void Func(Data* d) // 구조체 포인터
{
(*d).data1 = 11; // 도트 연산자가 우선 순위가 높기 때문에 괄호로 묶어준다.
d->data2 = 22;
// d->data2 - arrow 연산자, *와 .를 동시에 포함해주는 연산자.
}

int main()
{
Data d;

d.data1 = 10;
d.data2 = 20;

Func(&d);

printf("출력 : %d %d\n", d.data1, d.data2);

return 0;
}

-------------------------------------------------------------------------------------------------------------------

// 문제)
// 철수의 성적을 국어, 수학, 영어 순서로 입력 받은 후
// 세 성적의 총합을 구조체 멤버 total 에 할당해주는 함수,
// 성적의 평균을 구조체 멤버 avg 변수에 할당해주는 함수,
// 평균을 비교해 등급을 구조체 멤버 grade에 할당해주는 함수를 작성하고
// main에서 각 총합, 평균, 등급을 출력해보세요.
// 모든 함수는 반환값이 존재하지 않는 형태로 작성해보세요.
// (90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F)
// 필요한 변수들은 구조체를 통해서 선언하세요.
// 
// 기존 문제와 달라진 점 : 각 함수는 구조체의 모든 멤버에 접근할 수 있어야 한다.


// 국어, 수학, 영어 입력 : 98 92 86
// 총합 : 276
// 평균 : 92.00
// 등급 : A

typedef struct {
int kor, mat, eng, total;
double avg;
char grade;
}Test;

void Total(Test* t)
{
t->total = t->kor + t->mat + t->eng;
}

void Avg(Test* t)
{
t->avg =t->total / 3.0;
}

void Grade(Test* t)
{
switch((int)t->avg/10)
{
case 10:
case 9:
t->grade = 'A';
break;
case 8:
t->grade = 'B';
break;
case 7:
t->grade = 'C';
break;
case 6:
t->grade = 'D';
break;
default:
t->grade = 'F';
break;
}
}

int main()
{
Test t;

printf("국어, 수학, 영어 입력 :");
scanf("%d%d%d", &t.kor, &t.mat, &t.eng);
Total(&t);
Avg(&t);
Grade(&t);

printf("총합 : %d\n", t.total);
printf("평균 : %.2f\n", t.avg);
printf("등급 : %c\n", t.grade);

return 0;
}

-------------------------------------------------------------------------------------------------------------------

typedef struct {
int data1;
int data2;
int data3;
}Data;

int main()
{
Data d;
Data* pd;

pd = &d;

printf("d의 크기 : %d\n", sizeof(d)); // 12바이트
printf("pd의 크기 : %d\n", sizeof(pd)); // 4바이트

printf("\npd의 값 : %p\n", pd); // 16진법

//  구조체 포인터 변수는 멤버를 가지고 있지 않다는 것을 알 수 있다.

return 0;
}

 

 

// 주소= 16진수 8자리 = 2진수 32자리 = 32bit = 4byte

 

// 16진수 한 자리 : 0~15까지 표현
// 2진수  네 자리 : 0~15까지 표현 

// 진법의 변환
// 각 비트별로 2^n의 값을 나타내고 비트가 커져있는 값들을 더하면 10진수로 나타낼 수 있다.

// 비트 : 컴퓨터에서 사용하는 가장 작은 단위는 bit, 프로그래밍에서 사용하는 기본 단위는 byte

728x90
반응형

'IT&코딩 > 자료구조' 카테고리의 다른 글

자료구조 - 7일차 (퀴즈)  (0) 2022.09.19
자료구조 - 6일차 (동적할당)  (1) 2022.09.19
자료구조 - 4일차 (재귀함수)  (0) 2022.09.15
자료구조 - 3일차 (변수)  (0) 2022.09.12
자료구조 - 2일차 (함수)  (0) 2022.09.12