5주차는 'RB트리'다.
심화 자료구조에 대한 이해와 구현 실습? 정도가 되겠다.
근데 전제가 'C언어로'였다.
그래서 C부터 해야하는데, 사실 초면은 아니지만.. 학교에서도 C의 꽃이라는 포인터, 구조체까지는 안했었고 이참에 제대로 봐두면 좋을테니. 시간이 좀 들지만 C부터 잡고가기로 팀원과도 이야기가 됐다. 그래서 구름edu를 통해 C언어를 한 번 정주행하면서 기록을 남긴다🙂
#include <stdio.h>
// 전처리문 -> 컴파일하기 전에 <stdio.h> 헤더파일을 추가할 것
// 헤더파일 -> 이미 만들어진 함수를 가져와서 씀
// stdio.h -> 표준입출력 헤더파일 -> 입출력, 반복문, 조건문 등을 위함
int main(){
// 실행시 main부터 돌아감
// (return 자료형) 함수이름(입력자료형) {} : 기본형태
return 0;
// 반환 -> 함수가 종료되었을 때, 변수나 값을 돌려주는 역할
// ; -> 세미콜론, 코드의 마침을 의미함
}
#include <stdio.h>
int main(){
printf("한줄");
printf("줄바꿈 \n");
return 0;
}
/*
-- 이스케이프 시퀀스 --
\(백슬러시)와 특정 문자를 결합하여 c언어 특성상 표현할 수 없는 특정 기능이나 문자를 표시해주는 문자
*/
#include <stdio.h>
int main(){
int a;
printf("정수를 입력하세요 : ");
scanf("%d", &a);
printf("입력받은 정수 : %d", a);
return 0;
} #include <stdio.h>
void main(){
a = 1;
b = 10;
if(a<b){
printf("%d가 큼",b);
}
else if(a>b){
printf("%d가 큼",a);
}
else{
printf("같음");
}
return
}
#include <stdio.h>
int main(){
int num;
scanf("%d", &num);
if(num%2==0) {
printf("입력받은 정수는 짝수입니다.");
}
else {
printf("입력받은 정수는 홀수입니다.");
}
return 0;
}
#include <stdio.h>
int main()
{
int num;
scanf("%d", &num);
if(num>10 && num%2==0)
{
printf("%d(은)는 10 초과의 짝수입니다.", num);
}
else if(num>10 && num%2)
{
printf("%d(은)는 10 초과의 홀수입니다.", num);
}
else if(num<=10 && num%2==0)
{
printf("%d(은)는 10 이하의 짝수입니다.", num);
}
else
{
printf("%d(은)는 10 이하의 홀수입니다.", num);
}
}
switch(기준값)
{
case 비교값1:
기준값과 비교값1이 같을 때 실행
case 비교값2:
기준값과 비교값2가 같을 때 실행
default: // 생략가능
기준값과 비교값들이 같지 않을 때 실행
}
#include <stdio.h>
void main()
{
int input;
scanf("%d", &input);
switch(input)
{
case 1:
printf("1을 선택하셨습니다.\n");
break; // 선택이긴한데, break없으면 밑에거 다 실행함
case 2:
printf("2를 선택하셨습니다.\n");
break;
case 3:
printf("3을 선택하셨습니다.\n");
break;
case 4:
printf("4를 선택하셨습니다.\n");
break;
case 5:
printf("5를 선택하셨습니다.\n");
break;
default:
printf("범위에 맞지 않는 값입니다.\n");
break;
}
return 0;
}
#include <stdio.h>
void main()
{
int input;
scanf("%d", &input);
switch(input)
{
case 10:
case 9:
case 8:
case 7:
printf("학점은 A입니다.\n");
break;
case 6:
case 5:
case 4:
printf("학점은 B입니다.\n");
break;
case 3:
case 2:
case 1:
case 0:
printf("학점은 C입니다.\n");
break;
default:
printf("범위에 맞지 않는 값입니다.\n");
}
return 0;
} #include <stdio.h>
int main()
{
int arr[10] = {5, 10, 15, 22, 23, 102, 99, 102, 130, 8};
int odd = 0;
int even = 0;
for(int i=0; i<10; i++)
{
if(arr[i]%2==0)
{
even++;
}
else
{
odd++;
}
}
printf("홀수의 갯수는 %d개 입니다.\n", odd);
printf("짝수의 갯수는 %d개 입니다.\n", even);
return 0;
}
#include <stdio.h>
int main()
{
int arr[10] = {1032, 99, 1004, 234, 452, 8, 922, 445, 246, 2048};
int min = 1e9;
for(int i=0; i<10; i++)
{
if(arr[i]<min)
{
min = arr[i];
}
}
printf("배열 안에서 가장 작은 수는 %d입니다.\n", min);
return 0;
}
#include <stdio.h>
void main(){
a = 10
for(i=0; i<a; i++){
printf("지금은 {%d}.\n", &i);
}
return
}
// while 문으로 "Hello, world!\n" 를 5번 출력
int main(){
int i = 0;
while(i<5) {
printf("Hello, world!\n");
i++;
}
return 0;
}
do{
적어도 한 번 실행될 내용
}
while(조건식);
// 한줄주석
/*
여러줄 주석
*/
#include <stdio.h>
int main(){
// 자료형 이름 = 초기값
int level = 1;
int hp = 50;
int damage = 5;
int defense = 2;
// 선언과 동시에 대입
defense = 5; // 바꿀 수 있음
return 0;
}



// 정수형
int a = 10;
printf("a : %d", a);
// 이때 a에 값이 없으면 쓰레기값이 출력됨
// 실수형
float b = 1.32f;
// f 안붙여주면 double 크기(8바이트)로 받아들임
// float 크기(4바이트)라고 명시해 주는거
double c = 1.321123;
printf("b : %f",b);
printf("c : %f",c);
// 실수형 출력은 기본 소수점 6자리까지 나옴
// float은 6자리, double은 15자리 까지 지원하는데
printf("c : %.3f",c);
// 이렇게 정해주면 3자리 까지 표시함
// 소수점이 정확하지 않음(10자리까지 늘려보면ㅇㅇ)
// 컴퓨터가 2진수로 구성되어 소수점인 10진수를 정확히 표현할 수 없음
#include <stdio.h>
int main(){
const double PI = 3.1415;
PI = 5;
return 0;
}
#include <stdio.h>
int main()
{
int a = 3;
printf("%d\n", ++a); // a가 1 증가됨 -> 4
printf("%d", a); // 1 증가된 a가 출력 -> 4
int b = 3;
printf("%d\n", b++); // b가 출력된 다음에 1 증가 -> 3
printf("%d", b); // 1 증가된 b가 출력 -> 4
return 0;
}
왼쪽
오른쪽
int main(){
// 자료형 배열이름[크기] = {값1, 값2, ...};
int arr1[5] = {1, 33, 47, 100, 155}; // 선언과 동시에 초기화해줌
int arr2[5] = {5}; // 0인덱스는 5, 나머지는 0으로 초기화
int arr3[5] = {5, 10}; // 0인덱스는 5, 1인덱스는 10, 나머지는 0으로 초기화
int arr4[5] = {}; // 모두 0으로 초기화
int arr5[5]; // 선언만 하고 초기화하지 않음
int arr6[] = {11, 22, 33, 44}; // 배열의 크기가 초기값 개수에 맞게 4로 정해짐
// 인덱스로 접근, 0부터 시작
return 0;
}
// 접근
// 배열이름[인덱스]
arr1[2] -> 47
// 배열의 크기를 넘어서는 인덱스나 초기화하지 않은 배열을 출력함면 대부분 쓰레기값이 나옴
// 변수는 선언되는 동시에 메모리를 차지하는데 값을 정해주면 해당 영역은 변수 값을 가지지만
// 정해주지 않으면 메모리 자체에서 가지고 있던 값을 보여줌 -> 쓰레기
#include <stdio.h>
int main(){
int arr[5] = {1, 33 , 47, 102, 155}; // 선언과 동시에 초기화
for(int i=0; i<5; i++) {
printf("arr 배열의 인덱스 %d 의 값 : %d\n", i, arr[i]);
}
return 0;
}
#include <stdio.h>
int main(){
int arr[5];
for(int i=0; i<5; i++) {
printf("인덱스 %d에 들어갈 값을 입력하세요. : \n", i);
scanf("%d", &arr[i]);
}
printf("-----결과-----\n");
for(int i=0; i<5; i++) {
printf("인덱스 %d의 값 : %d\n", i, arr[i]);
}
printf("-----종료-----\n");
return 0;
}
#include <stdio.h>
int main(){
int arr[3];
// int -> 4byte짜리 메모리가 3개 연결되어 있음
// 0번째 원소가 1000번지에 저장되어있다고 가정하면
// 1번째는 1004, 2번째는 1008번지에 각각 저장되는 거
// int니까 4씩 증가, char 였으면 1씩, double이었으면 8씩 주소가 증가했을 것
// 즉, 연속된 각 원소들의 주소는 자료형의 크기만큼 차이남
return 0;
}
#include <stdio.h>
int main(){
int arr[] = {519, 31, 7988, 165326, 100, 150};
printf("%d\n", sizeof(arr)); // 배열이 메모리 상에서 차지하고 있는 용량
// int 는 4 바이트이고 6개가 있으므로 출력 결과는 : 24
printf("%d\n", sizeof(arr) / sizeof(arr[0]));
// 배열의 전체크기 / 요소 하나의 크기
// -> 24 바이트 / 4바이트
// 전체 배열을 요소 하나로 나누면 길이를 구할 수 있음
// 출력 결과는 24 / 4 이므로 6
return 0;
}
#include <stdio.h>
int main(){
char ch = 'a';
printf("%d\n", ch); // a 와 매칭되는 97 출력
printf("%c\n", ch); // a 출력
return 0;
}
#include <stdio.h>
int main(){
char ch = 'ab';
printf("%d\n", ch); // 98
printf("%c\n", ch); // b
// char : 1byte -> 한 글자만 담을 수 있음
// 마지막에 입력된 b만 저장됨
return 0;
}
#include <stdio.h>
int main(){
char ch[5] = "abcd";
// 문자들 마지막에 0, NULL, \0 등의 값이 들어있음 -> 종료문자
printf("ch 는 %s", ch); // 여러글자 즉 문자열을 출력할때는 '%s'
return 0;
}
#include <stdio.h>
int main(){
char ch[7] = { 'a', 'b', 'c', 'd', 0, 'e', 'f' };
printf("ch 는 %s", ch);
return 0;
}
#include <stdio.h>
int main(){
char ch;
printf("한 글자만 입력해주세요 : ");
scanf("%c", &ch); // 한글자 이상 받으면 첫글자만 남음
printf("%c", ch);
char ch2[201];
printf("200 자 이내로 입력해주세요 : ");
scanf("%s", ch2); // & 표시 없이 scanf 입력 받기
// 배열은 배열이름에 주소를 담고있어서 없어도됨
printf("%s", ch2);
return 0;
}
int main(){
int arr[5] = {1, 33, 47, 102, 155};
return 0;
}
int main(){
int tarr[2][3]; // 행열 크기지정
// 이것도 인덱스는 0부터 시작
}#include <stdio.h>
int main(){
int tarr[3][3] = { // 초기화 - 중괄호 사용
{1, 2, 3},
{4, 5, 6}
};
for(int i=0; i<2; i++) { // 출력은 이중for문으로
for(int j=0; j<3; j++) {
printf("%d ", tarr[i][j]); // i:row, j:col
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main()
{
int tarr[2][3];
printf("2차원 배열 입력\n");
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
printf("tarr[%d][%d] 입력 : ", i, j);
scanf("%d", &tarr[i][j]);
}
}
printf("\n2차원 배열 출력\n");
for(int i=0; i<2; i++)
{
for(int j=0; j<3; j++)
{
printf("\t%d", tarr[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main()
{
char tarr[3][10];
printf("이차원 배열 문자열 입력\n");
for(int i=0; i<3; i++)
{
printf("10자 이내의 문자열을 입력해주세요 : ");
scanf("%s", tarr[i]); // 문자열 저장
}
printf("\n이차원 배열 문자열 출력\n");
for(int i=0; i<3; i++)
{
printf("%s\n", tarr[i]); // 문자열 출력
}
return 0;
}
#include <stdio.h>
int main()
{
int a = 5;
int b = 10;
int temp;
temp = a;
a = b;
b = temp;
printf("a : %d ", a);
printf("b : %d", b);
return 0;
}
#include <stdio.h>
int main()
{
int arr[10] = {9, 17, 5, 6, 124, 112, 1, 3, 87, 55};
int temp;
int length = sizeof(arr)/4;
for (int i=0; i<length-1; i++)
{
for (int j=0; j<length-1-i; j++)
{
if (arr[j]<arr[j+1])
{
if (arr[j]<arr[j+1])
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for(int i=0; i<length; i++){
printf("%d ", arr[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
int arr[10] = {9, 17, 5, 6, 124, 112, 1, 3, 87, 55};
int length = sizeof(arr)/4;
int j;
int temp;
for(int i=1; i<length; i++)
{
temp = arr[i];
j = i-1;
while(arr[j]<temp && j>=0)
{
arr[j+1] = arr[j];
j--;
}
arr[j+1]=temp;
}
for(int i=0; i<length; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
반환자료형 함수이름 (매개변수){
호출 시 실행될 함수 내부 코드
}
#include <stdio.h>
int sumNumbers(n1, n2)
{
return n1+n2;
}
int main()
{
int num1;
int num2;
scanf("%d", &num1);
scanf("%d", &num2);
int result = sumNumbers(num1, num2);
printf("a와 b의 합 : %d", result);
return 0;
}
지역변수 : 한 지역(중괄호에 의해 만들어지는 영역) 내에서만 사용할 수 있는 변수
전역변수 : 어느 지역에서나 사용할 수 있는 변수 // 괄호밖에 쓴 변수


#include <stdio.h>
int main()
{
// 선언
// 담고자 하는 자료형에 *(참조연산자)를 붙여서 선언
// 자료형과 상관없이 포인터변수의 크기는 동일함
// 운영체제 시스템이 가지는 주소값크기에 따라 결정됨
// 32bit 시스템은 4byte, 64bit 시스템은 8byte
// 가리킬 자료형에 따라 선언이 달라지는 이유는,
// 가리킬 주소가 어떤 자료형을 갖는지 알려주기 위함
// 포인터 연산은 그 주소로 찾아가 자료형의 크기만큼 값을 읽어들여야 하니까
// 어떤 자료형의 주소를 가리키는지 알아야함
// 그리고 밑에 보다시피 *의 위치는 상관없음
int *p = NULL; // int* p == int * p 모두 같음
// 포인터는 주소값을 담는 변수이기 때문에 특정 숫자로 초기화할 수 없음
// 그래서 NULL(0)로 초기화함(권장), 초기화 안하고 주소값 넣을 수도 있음(초기값은 쓰레기값)
// 방금 NULL의 0은 0번지 아니고, **아무것도 없다는 뜻**
int num = 15;
p = # // 값을 넣을 때는 *을 붙이지 않음
printf("int 변수 num의 주소 : %d \n", &num); // num의 주소값
printf("포인터 p의 값 : %d \n", p);
printf("포인터 p가 가리키는 값 : %d \n", *p);
// int 변수 num의 주소 : 62607116
// 포인터 p의 값 : 62607116
// 포인터 p가 가리키는 값 : 1
return 0;
}

#include <stdio.h>
int main()
{
int *p = NULL;
int num = 15;
p = #
printf("포인터 p가 가리키는 값 : %d\n", *p);
printf("num의 값 : %d\n\n", num);
*p += 5;
// p의 주소로가서 5를 증가시킴
printf("포인터 p가 가리키는 값 : %d\n", *p);
printf("num 값 : %d\n\n", num);
(*p)++;
// 증감연산자가 참조연산자보다 우선순위가 높음
// 괄호 쳐줬으니까 주소를 먼저 참조하고 증가시킴
printf("포인터 p가 가리키는 값 : %d\n", *p);
printf("num 값 : %d\n\n", num);
*p++;
// 주소값이 들어있는 p를 먼저 증가시키고 참조
// 증가한 주소에 선언해준게 없으므로 쓰레기값이 출력
printf("포인터 p가 가리키는 값 : %d\n", *p);
printf("num 값 : %d\n", num);
return 0;
}
#include <stdio.h>
void pointerPlus(int *num)
{
*num += 5;
}
void numPlus(int num)
{
num += 5;
}
int main()
{
int num = 15;
printf("num 값 : %d\n", num);
// num 값 : 15
numPlus(num);
printf("numPlus 사용 후 : %d\n", num);
// numPlus 사용 후 : 15
// 값이 복사되어 넘겨졌기 때문에 함수내에서 변경된 내용이 반영되지 않음
pointerPlus(&num);
printf("pointerPlus 사용 후 : %d\n", num);
// pointerPlus 사용 후 : 20
// 포인터를 이용해 직접적으로 메모리에 접근해 값을 변경했기 때문에 반영됨
return 0;
}
Call by value : 값을 복사해서 전달하는 방식
#include <stdio.h>
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(a, b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
Call by reference : 주소값을 전달하는 방식
#include <stdio.h>
void swap(int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int a, b;
a = 10;
b = 20;
printf("swap 전 : %d %d\n", a, b);
swap(&a, &b);
printf("swap 후 : %d %d\n", a, b);
return 0;
}
#include <stdio.h>
int main()
{
int arr[5] = {10, 20, 30, 40, 50};
int *arrPtr = arr;
printf("%d\n", *arrPtr); // 10
printf("%d\n", arr[0]); // 10
return 0;
}
#include <stdio.h>
int main()
{
int arr[5] = {10, 20, 30, 40, 50};
double arr2[5] = {10.1, 20.2, 30.3, 40.4, 50.5};
int *arrPtr = arr;
double *arrPtr2 = arr2;
printf("포인터 주소 : %d %d\n", arrPtr++, arrPtr2++);
printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);
// 포인터 주소 : 172507**7360** 172507**7392**
// 증가 연산 후 : 172507**7364** 172507**7400**
// 변수 값 : 20 20.20
arrPtr += 2; // 배열을 구성하는 자료형의 크기 *2 만큼 증가
arrPtr2 += 2;
printf("증가 연산 후 : %d %d\n", arrPtr, arrPtr2);
printf("변수 값 : %d %.2f\n", *arrPtr, *arrPtr2);
// 증가 연산 후 : 172507**7372** 1725077416
**// 변수 값 : 40 40.40**
return 0;
}
#include <stdio.h>
void bubbleSort(int arr[])
{
int temp;
int n = sizeof(arr)/sizeof(arr[0]);
// printf(n);
for(int i=0; n-1; i++)
{
for(int j=0; n-1-i; j++)
{
if(*(arr+j)>*(arr+j+1)) // 왼쪽이 더 크면
{
temp = *(arr+j);
*(arr+j) = *(arr+j+1);
*(arr+j+1) = temp;
}
}
}
}
int main()
{
int arr[10];
for(int i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
bubbleSort(arr);
for(int i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
//---다시---//
#include <stdio.h>
void bubbleSort(int *arr)
{
int temp;
// int n = sizeof(arr)/sizeof(arr[0]);
// printf(n);
for(int i=0; i<10; i++)
{
for(int j=0; j<9-i; j++)
{
if(*(arr+j)>*(arr+j+1)) // 왼쪽이 더 크면
{
temp = *(arr+j);
*(arr+j) = *(arr+j+1);
*(arr+j+1) = temp;
}
}
}
}
int main()
{
int arr[10];
for(int i=0; i<10; i++)
{
scanf("%d", &arr[i]);
}
bubbleSort(&arr);
for(int i=0; i<10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
int num = 10;
int *ptr1 = #
const int *ptr2 = #
*ptr1 = 20; // 이건 가능
num = 30; // num이 상수화되는 건 아니라서 이것도 가능
*ptr2 = 40; // 오류
// ptr2를 이용해 값을 변경할 수 없음
return 0;
}
#include <stdio.h>
int main()
{
int num1 = 10, num2 = 20;
int *ptr1 = &num1;
int* const ptr2 = &num1;
ptr1 = &num2;
*ptr2 = 30; // 포인터를 이용해서 값을 변경하는 건 가능
ptr2 = &num2; // 오류
// 포인터가 가리키는 주소값을 변경하는건 불가능
// -> 이 **포인터가 오로지 num1만을 가리키**며, 절대 다른 변수를 가리키지 않겠다
// 라고 할 때 사용
return 0;
}
#include <stdio.h>
int main()
{
int num = 10, num2 = 20;
int *ptr1 = #
const int* const ptr2 = #
ptr1 = &num2;
*ptr2 = 30;
ptr2 = &num2;
return 0;
}
#include <stdio.h>
int main()
{
int num = 10; // 변수
int *ptr; // 변수의 주소값을 가리키는 포인터
int **pptr; // 포인터의 주소값을 가리키는 포인터
ptr = #
pptr = &ptr;
// 참조연산자를 사용하면 포인터가 가리키고 있는 변수의 값을 반환하는데
// **이중 포인터는 포인터가 가리키는 곳(포인터)으로 가서,
// 그 포인터가 가리키는 곳(변수)의 값을 반환함**
printf("num : %d, *ptr : %d, **ptr : %d\n", num, *ptr, **pptr);
// num : 10, *ptr : 10, **ptr : 10
// -> 그래서 다 같은 값을 가리킴
printf("num 주소 : %d, ptr 값 : %d, **ptr 값 : %d\n", &num, ptr, *pptr);
// num의 주소를 ptr이 가지고 있고 ptr의 주소를 pptr이 가지고 있으므로
// num의 주소 == ptr의 값 == pptr이 가리키는 곳(ptr)의 값
// num 주소 : -288438268, ptr 값 : -288438268, **ptr 값 : -288438268
printf("ptr 주소 : %d, pptr 값 : %d", &ptr, pptr);
// ptr 주소 : -288438264, pptr 값 : -288438264
return 0;
}
#include <stdio.h>
int main()
{
int num1 = 10, num2 = 20, num3 = 30;
int *parr[3];
// 참조연산자 붙이는 거 말고는 일반배열이랑 똑같이 선언
// 대입할 때는 변수의 주소값을 넣어줌
parr[0] = &num1;
parr[1] = &num2;
parr[2] = &num3;
for(int i=0; i<3; i++)
{
printf("parr[%d] : %d\n", i, *parr[i]);
}
return 0;
}
#include <stdio.h>
int main()
{
int num1 = 10, num2 = 20, num3 = 30;
int *parr[3];
parr[0] = &num1;
parr[1] = &num2;
parr[2] = &num3;
for(int i=0; i<3; i++)
{
printf("parr[%d] : %d\n", i, *parr[i]);
// 2 3.200000 1000 2008
}
return 0;
}
구조체란?
#include <stdio.h>
struct student
{
char name[15];
int s_id;
int age;
char phone_number[14];
};
// 세미콜론 붙여야 함!
// struct 구조체 이름 { 구조체 멤버들 };
// 구조체 멤버 : 구조체 안에서 사용할 변수들
int main()
{
// - 선언하고 정의하고나면 main안에서 따로 선언해줘야함
// - struct로 선언했던 구조체 이름과, 앞으로 사용할 변수이름을 써줌
// - struct 구조체이름 : 자료형
struct student goorm; // goorm의 자료형은 student 구조체 인거
// - 선언하고 나면 구조체 멤버를 사용함
// - 변수이름.구조체멤버이름 으로 사용
printf("이름 : ");
scanf("%s", **goorm.name**);
printf("학번 : ");
scanf("%d", &**goorm.s_id**);
printf("나이 : ");
scanf("%d", &**goorm.age**);
printf("번호 : ");
scanf("%s", **goorm.phone_number**);
printf("이름 : %s, 학번 : %d, 나이 : %d, 번호 : %s\n", goorm.name, goorm.s_id, goorm.age, goorm.phone_number);
return 0;
}
구조체의 기본형
#include <stdio.h>
struct student // student라는 구조체
{
int age; // 멤버변수 age
char phone_number[14]; // 멤버변수 phone_number
int s_id; // 멤버변수 s_id
};
int main()
{
struct student goorm = { .age = 20, .phone_number = "010-1234-5678", 10 };
// 초기화시키는 방법1 : {.변수이름 = 값, .변수이름 = 값};
struct student codigm = { 22, "010-8765-4321"};
// 초기화시키는 방법2 : {값, 값};
// -> 구조체를 정의했던 순서대로 들어가고 안 넣어준건 0으로 초기화됨
printf("나이 : %d, 번호 : %s, 학번 : %d\n", goorm.age, goorm.phone_number, goorm.s_id);
printf("나이 : %d, 번호 : %s, 학번 : %d\n", codigm.age, codigm.phone_number, codigm.s_id);
return 0;
}
#include <stdio.h>
typedef struct _Student { // _Student 라는 구조체
int age;
char phone_number[14];
} Student; // 별칭이 Student
int main(){
Student goorm; // 별칭만으로 선언이 가능
printf("나이 : ");
scanf("%d", &goorm.age);
printf("번호 : ");
scanf("%s", goorm.phone_number);
printf("----\n나이 : %d\n번호 : %s\n----", goorm.age, goorm.phone_number);
return 0
#include <stdio.h>
typedef struct { // 이름이 없음
int age;
char phone_number[14];
} Student; // 별칭만 있음 - 이름없이 별칭만 있는 걸 **익명구조체**라고 함
int main(){
Student goorm;
printf("나이 : ");
scanf("%d", &goorm.age);
printf("번호 : ");
scanf("%s", goorm.phone_number);
printf("----\n나이 : %d\n번호 : %s\n----", goorm.age, goorm.phone_number);
return 0;
}
#include <stdio.h>
typedef struct {
char name[30];
int age;
} Student;
int main(){
Student goorm[3] = { {.name = "해리 포터"}, {.name = "헤르미온느 그레인저"}, {.name = "론 위즐리"} };
// 구조체도 문자열은 선언할때만 초기화할 수 있음 -> 선언과 동시에 초기화
// 똑같이 배열 크기 적고 중괄호로 요소 나열
goorm[0].age = 10;
goorm[1].age = 10;
goorm[2].age = 10;
// 인덱스를 통해 구조체타입의 원소를 가리키고
// .연산자를 통해 각 구조체의 멤버변수에 접근할 수 있음
printf("이름 : %s / 나이 : %d\n", goorm[0].name, goorm[0].age);
printf("이름 : %s / 나이 : %d\n", goorm[1].name, goorm[1].age);
printf("이름 : %s / 나이 : %d\n", goorm[2].name, goorm[2].age);
return 0;
}
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
int main(){
Student goorm;
Student *ptr; // 구조체 포인터 ptr선언
ptr = &goorm; // goorm의 주소값을 대입
(*ptr).s_id = 1004;
(*ptr).age = 20;
// ptr이 가리키는 구조체의 멤버변수 s_id에 1004를 대입
// 참조연산자보다 .연산자가 우선순위가 높아서 그냥쓰면
// 구조체가 아닌 포인터변수를 구조체처럼 참조하려고 해서 오류발생함
// 구조체 포인터 사용시에는 항상 괄호 사용!
// 해야하는데 더 편한 방법을 만듦
// 화살표 기호 -> 를 쓰면 괄호없어도 **알아서 주소로 찾아가서 구조체를 참조**
prt->age = 20;
printf("goorm의 학번 : %d, 나이: %d\n", goorm.s_id, goorm.age);
}
#include <stdio.h>
typedef struct {
char name[15];
int age;
} Teacher;
typedef struct {
char name[15];
int age;
Teacher teacher; // **다른 구조체를 멤버로 포함할 수 있음**
} Student;
int main(){
Student Student;
Teacher Teacher;
Student.teacher.age = 30; // 이렇게 **접근**
Teacher.age = 40;
return 0;
}
typedef struct {
char name[15];
int age;
struct Student *ptr; // 자기자신을 가리키는 포인터를 멤버로 가질 수 있음
} Student;
- 값을 복사하면 구조체는 크기가 커질수록 복사할 공간도 더 필요하게됨
- 낭비되어 비효율적이기 때문에 값을 바꿀 필요가 없어도 보통 포인터로 전달
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
void print_student(Student *s){ // 포인터로 받음
s->s_id = 2000;
s->age = 25;
printf("학번 : %d, 나이 : %d\n", s->s_id, s->age);
// 2000, 25
}
int main(){
Student s;
s.s_id = 1000;
s.age = 20;
print_student(&s); // 주소로 전달
printf("학번 : %d, 나이: %d\n", s.s_id, s.age);
// 2000, 25
}
#include <stdio.h>
typedef struct {
int s_id;
int age;
} Student;
void print_student(Student s){
s.s_id = 2000;
s.age = 25;
printf("학번 : %d, 나이 : %d\n", s.s_id, s.age);
// 2000, 25
}
int main(){
Student s;
s.s_id = 1000;
s.age = 20;
print_student(s);
printf("학번 : %d, 나이: %d\n", s.s_id, s.age);
// 1000, 20
}
#include <stdio.h>
typedef struct
{
char name[15];
int kor; // 국어
int eng; // 영어
int math; // 수학
float avg; // 평균
} Student;
int main()
{
Student s[3];
for(int i=0; i<3; i++)
{
scanf("%s", s[i].name);
scanf("%d", &s[i].kor);
scanf("%d", &s[i].eng);
scanf("%d", &s[i].math);
s[i].avg = (s[i].kor+s[i].eng+s[i].math)/3.0;
}
for(int i=0; i<3; i++)
{
printf("%s", s[i].name);
printf(" %.1f\n", s[i].avg);
}
return 0;
}
#include <stdio.h>
void bell();
int main(){
bell(); // ➊ 첫 번째 주문
bell(); // ➋ 두 번째 주문
bell(); // ➌ 세 번째 주문
}
void bell() { // ➍ bell( ) 함수 실행
static int order = 0; // ➎ 정적 변수 order 선언
order++;
printf(<span class="brown">"현재 주문 번호는 %d입니다.\n"</span>, order);
// 현재 주문 번호는 1입니다.
// 현재 주문 번호는 2입니다.
// 현재 주문 번호는 3입니다.
return 0
}