![[C05] C언어/자료구조_구조체(기본, 별칭, 익명 구조체)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5SlBb%2Fbtrb9Ha6DpE%2FTLYYCHSMD9YDESBzgmG360%2Fimg.png)
[C05] C언어/자료구조_구조체(기본, 별칭, 익명 구조체)C언어_자료구조/C언어 기본 개념2021. 9. 7. 18:00
목차
구조체
📌 여러 개의 멤버들을 모아서 하나의 새로운 자료형을 만드는 개념
📌 구조체 변수의 멤버에 접근할 때는 구조체 변수명.멤버병 형식으로 접근한다.
📌 ex) struct Data d; d.data1 = 10;
📌 기본 구조체 정의하는 방법:
struct 구조체이름 { 멤버; };
⭐ Code [구조체 정의]
#include <stdio.h>
// 기본 구조체
struct Data {
int data1;
int data2;
};
// 별칭을 이용한 구조체 정의
// 별칭을 이용한 구조체를 사용하면 구조체 이름, 별칭 모두 사용 가능
typedef struct Data1 {
int data1;
int data2;
}Da;
// 익명 구조체 정의
// 익명 구조체를 사용하면 구조체 이름으로 변수 선언 x, 별칭만 사용 가능
typedef struct {
int data1;
int data2;
}Da2;
int main() {
struct Data d;
Da a;
Da2 b;
d.data1 = 10;
d.data2 = 20;
a.data1 = 30;
a.data2 = 40;
b.data1 = 50;
b.data2 = 60;
printf("출력 : %d %d\n", d.data1, d.data2);
printf("d의 크기 : %d\n", sizeof(d));
return 0;
}
⭐ code [국어, 영어, 수학 성적을 입력받고 총합, 평균, 등급을 출력하는 코드. 단, 모든 함수는 반환값이 존재하지 않는 형태여야 하고 출력은 반드시 main 함수에서 진행해야함. (90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F) ]
#include <stdio.h>
struct Score {
int kor;
int math;
int eng;
int tot;
double avg;
char grade;
};
void Total(int* tot, int kor, int math, int eng)
{
(*tot) = kor + math + eng;
}
void Avg(double* avg, int tot)
{
*avg = (double)(tot) / 3;
}
void Grade(char* grade, double avg)
{
if (avg >= 90)
*grade = 'A';
else if (avg >= 80)
*grade = 'B';
else if (avg >= 70)
*grade = 'C';
else if (avg >= 60)
*grade = 'D';
else if (avg < 60)
*grade = 'F';
//switch ((int)avg / 10)
//{
//case 10:
//case 9:
// *grade 'A';
//case 8:
// *grade 'B';
//case 7:
// *grade 'C';
//case 6:
// *grade 'D';
//default:
// *grade 'F';
//}
}
int main() {
struct Score stuA;
printf("국어, 수학, 영어 입력 : ");
scanf("%d %d %d", &stuA.kor, &stuA.math, &stuA.eng);
Total(&stuA.tot, stuA.kor, stuA.math, stuA.eng);
Avg(&stuA.avg, stuA.tot);
Grade(&stuA.grade, stuA.avg);
printf("총합 : %d\n", stuA.tot);
printf("평균 : %.2f\n", stuA.avg);
printf("등급 : %c\n", stuA.grade);
return 0;
}
구조체 포인터
📌 구조체 포인터를 이용해서 역참조를 진행할 때는 기본적으로 ->(애로우)를 사용해서 진행한다.
📌 별도로 *를 사용할 수 있는데 이때는 우선 순위 때문에 괄호로 묶어준다. ex) (*d).data1 == d -> data1
⭐ code [구조체 포인터]
#include <stdio.h>
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;
}
⭐ code [국어, 영어, 수학 성적을 입력받고 총합, 평균, 등급을 출력하는 코드. 단, 모든 함수는 반환값이 존재하지 않는 형태여야 하고 출력은 반드시 main 함수에서 진행해야함. (90점 이상은 A, 80점 이상은 B, 70점 이상은 C, 60점 이상은 D, 60점 미만은 F) ]
#include <stdio.h>
typedef struct {
int kor;
int math;
int eng;
int tot;
double avg;
char grade;
}Score;
void Total(Score* stuA)
{
stuA->tot = stuA->kor + stuA->math + stuA->eng;
}
void Avg(Score* stuA)
{
stuA->avg = (double)(stuA->tot) / 3;
}
void Grade(Score* stuA)
{
if (stuA->avg >= 90)
stuA->grade = 'A';
else if (stuA->avg >= 80)
stuA->grade = 'B';
else if (stuA->avg >= 70)
stuA->grade = 'C';
else if (stuA->avg >= 60)
stuA->grade = 'D';
else if (stuA->avg < 60)
stuA->grade = 'F';
//switch ((int)avg / 10)
//{
//case 10:
//case 9:
// *grade 'A';
//case 8:
// *grade 'B';
//case 7:
// *grade 'C';
//case 6:
// *grade 'D';
//default:
// *grade 'F';
//}
}
int main() {
Score stuA;
printf("국어, 수학, 영어 입력 : ");
scanf("%d %d %d", &stuA.kor, &stuA.math, &stuA.eng);
Total(&stuA);
Avg(&stuA);
Grade(&stuA);
printf("총합 : %d\n", stuA.tot);
printf("평균 : %.2f\n", stuA.avg);
printf("등급 : %c\n", stuA.grade);
return 0;
}
728x90
반응형
'C언어_자료구조 > C언어 기본 개념' 카테고리의 다른 글
[C06] C언어/자료구조_동적 할당(malloc, free) (2) | 2021.09.14 |
---|---|
[C04] C언어/자료구조_재귀 (0) | 2021.08.31 |
[C03] C언어/자료구조_변수 (0) | 2021.08.24 |
[C02] C언어/자료구조_반환값에 따른 함수의 여러가지 형태 (0) | 2021.08.17 |
[C01] C언어/자료구조_포인터 기본 개념 (2) | 2021.08.11 |
@kdj :: Childev'note
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!