상세 컨텐츠

본문 제목

#자료구조와 함께 배우는 알고리즘 입문 C언어편 - 2

Programing/C, C++

by CouqueD'asse 2022. 5. 4. 15:02

본문

2장 기본 자료구조

 

02-1 배열

자료구조

데이터 단위와 데이터 자체 사이의 물리적 또는 논리적인 관계

 

배열

같은 자료형의 변수로 이루어진 요소가 모여 직선 모양으로 줄지어 있는 자료구조

// 자료형이 int이며 요소 개수가 5개인 배열
#define N 5
int main(void)
{
	int i;
	int a[N];

	for (i = 0; i < N; i++)
	{
		printf("a[%d] : ", i);
		scanf_s("%d", &a[i]);
	}
	puts("각 요소의 값");
	for (i = 0; i < N; i++)
	{
		printf("a[%d] = %d\n", i, a[i]);
	}
	return 0;
}
더보기

자료형 배열이름[요소 개수];

요소와 인덱스

배열의 개별 요소에 접근하기 위해 인덱스를 사용

첫번째 배열 요소의 인덱스는 0으로 정해져 있음

 

메모리 할당 기간과 동적 객체 생성

calloc, malloc 함수는 힙(Heap)이라는 빈 공간에 기억 장소를 확보

free 함수는 확보한 메모리가 불필요 시 공간을 해제

 

C언어의 메모리 구조

데이터(Data) 영역

전역 변수와 정적 변수가 할당되는 영역

프로그램을 시작하면 할당하고, 프로그램을 종료하면 메모리에서 해제함

스택(Stack) 영역

함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역

함수 호출이 완료되면 사라짐

힙(Heap) 영역

필요에 따라 동적으로 메모리를 할당

 

포인터란?

객체(변수) 또는 함수를 가리키는 것

void 포인터

모든 형의 객체를 가리킬 수 있음

void 포인터의 값을 모든 자료형의 포인터에 대입할 수 있고, 모든 자료형의 포인터 값을 void 포이터에 대입할 수 있음

 

전위형 증가 연산자 ++a

식 전체를 펑가하기 전 a의 값을 증가

후위형 증가 연산자 a++

식 전체를 평가한 후 a의 값을 증가

 

다차원 배열

int형 : 'int'를 자료형

int[3]형 : 'int'를 자료형으로 하는 단일 요소가 3개인 배열

int[3][4]형 : 'int'를 자료형으로 하는 단일 요소가 3개인 배열을 자료형으로 하는 요소 개수가 4개인 배열

// 한 해의 지난 날 수를 계산하는 프로그램

//각 달의 날 수
int mdays[][12]
= { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} };

//윤년인가?
int isleap(int year)
{
	return year % 4 == 0 && year % 100 != 0 || year % 400 == 0;
}

//년 월 일의 그 해 지난 날 수를 구하기
int dayofyear(int y, int m, int d)
{
	int i;
	int days = d;
	for (i = 1; i < m; i++)
	{
		days += mdays[isleap(y)][i - 1];
	}
	return days;
}

int main(void)
{
	int year, month, day;
	int retry;
	do
	{
		printf("년 : ");
		scanf_s("%d", &year);
		printf("월 : ");
		scanf_s("%d", &month);
		printf("일 : ");
		scanf_s("%d", &day);
		printf("%d년의 %d일째 입니다.\n", year, dayofyear(year, month, day));
		printf("다시 할까요? (1....예/0....아니오) : ");
		scanf_s("%d", &retry);
	} 	while (retry == 1);

	return 0;
}

 

02-2 구조체

구조체란?

임의의 자료형의 요소를 조합하여 다시 만든 자료구조

// 구조체 xyz
struct xyz {
    int x;
    long y;
    double z;
};
// 구조체 xyz형 a의 정의
struct xyz a;
// a를 가리키는 포인터
struct xyz *p = &a;
// 구조체 xyz와 동의어인 XYZ를 선언
typedef struct xyz XYZ;
-> struct xyz a; == XYZ a;
-> struct xyz *p = &a; == XYZ *p = &a;

 

관련글 더보기