c언어 프로그래밍 기초 문법 

 

배열

 

배열은 ‘같은 타입’의 여러 공간을 하나의 변수로 ‘다루는 것’이며 만들어지는 공간은 ‘연속’된다. 배열을 선언(생성) 하기 위해서는 [ ](대괄호)를 사용한다. 대괄호 안에 배열의 크기를 정하는 정수 값을 넣는다. 그리고 배열에는 ‘인덱스(index)’를 이용해 각 요소에 접근하고 사용할 수 있다. 여기서 인덱스는 간단하게 위치 또는 순서로 의미를 이해하면 된다. 참고로 모든 프로그래밍 언어에서 인덱스는 1이 아닌 0부터 시작한다. 따라서 마지막 순서의 인덱스는 길이에서 1을 뺀 값이 된다. 아래에 배열을 생성하는 여러 가지 형태들을 보여준다.

 

// 배열생성
int iArr1[5]; // 배열생성, 각 공간(5개의정수)은 초기화 되지 않음 (쓰레기값)

int iArr2[5] = { 1, 2, 3, 4, 5 }; // 배열생성과 동시에 초기화(순서대로) 

int iArr3[5] = { 1, 2 }; // 뒤에 나머지 공간3개는 자동으로 0이 대입

int iArr4[5] = { 0, };  // 모든 공간을0대입

int iArr5[] = { 10, 20, 30, 40, 50 }; // 자동으로 길이가5가된다.

 

1. 문자열 배열

 

여기서 char는 1개 문자를 표현하는 자료형이다. char의 배열 형태는 ‘문자열’을 표현할 수 있다. 그리고 문자열의 끝에는 자동으로 ‘널 문자(\0)’가 삽입되어 있다는 것을 주의해야 한다. 널 문자는 정수 0을 의미하며 공백과는 다른 문자이다.(참고로 공백은 정수 32) 따라서 널 문자 때문에 배열 선언 시 원하는 문자열 길이보다 최소 1이상 여유 있게 선언해야 한다. 아래에 문자열 배열을 생성하는 여러 가지 형태들을 보여준다.

 

char szStr1[20] = "Hello"; // char 배열 선언과 동시에 초기화 할 때'문자열'사용가능

char szStr2[20] = { 'H', 'e', 'l', 'l', 'o', }; // szStr1과동일

char szStr3[20] = { 0, }; // 정수0은 널 문자

char szStr4[20]; // 초기화 하지 않은 문자 배열

char szStr[] = "Hello World"; // 길이가 자동으로 잡힌다.(11글자) 

 

2. 다차원 배열

 

다차원 배열은 2차원, 3차원 혹은 그 이상의 배열 형태를 말한다.

예를 들어 int iArr[2][3] = {0, }은 2행 3열의 행렬 형태를 나타낸다. 아래에는 2차원 배열 생성 형태를 나타낸다.

 

// 2차원 배열 생성 시 초기값 넣기
int iArr[2][3] = { {1, 2, 3}, {4, 5, 6} };
int iArr[2][3] = { {1, 2, 3},
		{4, 5, 6} }; 

 

 

예제

#include <stdio.h>

void main()
{
	// 2차원 문자배열로 동물이름 입력 받기 
	char szArrAnimal[3][20] = { 0, }; // 20글자 문자열이 3개 
	int i = 0;
	int iArrLen = 0;

	//				20칸 * 3개 = 60byte / 1개 행의 크기 (20byte) --> 3 (행의개수) 
	iArrLen = sizeof(szArrAnimal) / sizeof(szArrAnimal[0]);
	//		1차원 : iArr[1] ---> 2번째 요소 
	//		2차원 : iArr[1][1] --> 1행, 1열 요소 1개 
	//		       iArr[1] --> 1행 전체 의미 

	printf("동물 이름 입력\n");
	for (i = 0; i < iArrLen; i++)
	{
		printf("%d번 동물 : ", (i + 1));
		gets(szArrAnimal[i]); // 한 행 전체를 의미 = 1차원 문자배열과 같다. 
	}

	for (i = 0; i < iArrLen; i++)
	{
		printf("%d번 동물은 %s입니다.\n", (i + 1), szArrAnimal[i]);
	}

}

 

반응형

 c언어 프로그래밍 기초문법 - 함수 

 

 

함수 (Function)

 

 

함수는 특정 행위, 동작을 수행하기 위해 만들어 놓은 기능을 말한다. 함수를 정의하지 않고 프로그래밍이 가능하지만 반복적인 동작을 효율적으로 수행할 수 있고, 유지보수 측면에서도 함수 사용이 용이하다. 코드 상에서 함수를 호출하는 순간, 코드가 함수의 수행문으로 ‘점프’한 뒤 수행문이 끝나면 ‘호출했던 위치’로 다시 돌아와 다음 코드를 수행한다.

함수를 사용하는 이유이자 특징은 첫 번째로 높은 재사용성이다. 함수를 한 번 만들어 놓으면 언제든 호출해 사용할 수 있다. 두 번째, 중복된 코드의 제거가 가능하다. 마지막으로 프로그램을 구조화할 수 있다.

함수의 기본 구조는 다음과 같다.

 

반환타입 함수이름(매개변수)
{
수행문
}

 

int Add(int iNum1, int iNum2)
{
	return (iNum1 + iNum2);
}

 

void PrintAdd(int iNum1, int iNum2)
{
	if (iNum1 == 0 && iNum2 == 0)
	{
		printf("둘 다 0이다.\n");
		return; //void일 때 그냥 return; 사용하면, 마치 반복문의 break;와 같은 효과 
	}
	printf("두 수의 합 : %d\n", (iNum1 + iNum2));
}

 

 

1) 매개변수

 

함수의 기능 수행을 위해, 함수가 호출 될 때 받을 값을 담는 변수다. 필요 여부에 따라 사용해도 되고 생략 또한 가능하다. 매개변수에 개수 제한은 없다.

매개변수는 ‘지역 변수’이기 때문에, 함수가 호출 됐을 때 생성되고 함수의 수행이 끝나면 자동으로 소멸한다.

 

 

 

2) 함수이름

 

이 함수가 어떠한 기능을 수행하는지 의미를 부여한다. 변수명을 정할 때처럼 함수 이름도 함수의 기능을 잘 드러내는 이름으로 짓는 것이 좋다. 다만, 변수명과 같이 C언어에 이미 정해진 내장 함수명과 겹치지 않도록 주의해야 한다.

 

 

 

3) 반환 타입(Return Type)

 

함수의 기능 수행이 끝나고, 호출했던 위치로 돌려줄 값의 타입이다. 쉽게 말해 함수의 최종적으로 반환되는 출력이 어떤 타입인지 나타낸다. 반환할 값이 없다면 void라고 명시한다.

반환 타입이 void가 아니면 반드시 함수의 수행문 안에 'return'이 있어야 한다. return을 이용해 반환 타입과 일치하는 값을 반환해줘야 하기 때문이다. 만약 반환 타입이 정수형(int) 면

'return 0;'처럼 정수를 반환해준다. 반환되는 값은 여러 개일 수 없다.

 

 

※ 반환 타입과 매개변수 유, 무에 따른 함수의 형태

1. 둘 다 있다.
2. 둘 다 없다.
3. 매개변수만 있다.
4. 반환타입(즉, 반환 값)만 있다.

 

※ 함수의 세 가지 상태

1. 선언 : 함수의 원형을 미리 알려주는 용도로 쓰인다. 뒤에 세미콜론(;)을 붙인다.
	> 함수의 원형 : ‘반환타입 함수명(매개변수);‘의 구조를 갖는다.
2. 정의 : 함수를 만든다. (수행문 작성)
3. 호출 : 함수를 사용한다. (매개변수가 있으면 함께 전달)

 

 

반응형

 c언어 프로그래밍, 기초 문법

 

프로그래밍 언어는 일반적으로 수학에서 사용하는 연산기호와 유사한 연산자들의 집합을 지원한다. 다음에 C언어에서 사용되는 여러 가지 연산자들이 있다.

 

1. 기본 연산자

 

 

연산자

기능

+

덧셈

-

뺄셈

/

나누기

*

곱하기

%

나머지 값

 

 

2. 복합 대입 연산자

 

대입 연산자(=)에 다른 연산자가 합쳐진 것이다. 예를 들어 +=, -=, /=, >=, <= 등이 있다.

이것은 자연스레 많이 사용하게 되는 연산자이므로 가볍게 알고 넘어가면 된다.

 

 

3. 단항 연산자

 

단항 연산자는 항이 하나밖에 없는 경우(피연산자가 1개)다.

연산자

기능

++, --

피연산자 값을 1 증가 또는 1 감소

-(부호 연산자)

피연산자 값에 부호 적용

 

 

4. 비교 연산자

 

비교 연산자는 밑에서 나올 조건문과 반복문에서 ‘조건식’으로 사용이 된다. 조건을 만족하면 정수 1 즉, True(참)을 반환하고, 조건을 불만족하면 정수 0 즉, False(거짓)을 반환한다.

C언어에서는 0이 아닌 모든 값을 ‘참’으로 간주한다. 여기서 모든 값이란 0이 아닌 음수를 포함한 모든 숫자, 문자 등을 의미한다. 비교 연산자에는 등가 비교와 대소 비교가 있다.

 

연산자

기능

==

같다

!=

다르다

<

크다

>

작다

>=

크거나 같다

<=

작거나 같다

 

 

5. 논리 연산자

 

연산자

기능

&&

AND연산자, 둘 다 참이면 참, 하나라도 거짓이면 거짓

| |

OR연산자, 둘 중 하나라도 참이면 참, 둘 다 거짓이면 거짓

!

참 / 거짓의 결과를 반대로

 

비교 연산자와 같이 조건문과 반복문의 ‘조건식’에서 사용된다. 조건을 만족하면 정수 1(참) 반환, 조건을 불만족하면 정수 0(거짓)을 반환한다.

OR 연산은 좌측 식이 참이면 우측식을 연산하지 않고 바로 참이 된다. AND 연산은 좌측식이 거짓이면 우측식을 연산하지 않고 바로 거짓이 된다. 이렇게 되는 이유는 불필요한 연산을 줄여 프로그램 메모리 낭비를 줄이기 위해서다. 참고로 모든 연산자들에는 우선순위가 있기에 여러 가지 연산자들을 사용할 때에는 반드시 ( )를 하는 습관을 들이는 것이 좋다. 소괄호를 제대로 하지 않으면 원하지 않는 결과가 나올 수 있다.

 

 

6. 비트 연산자

 

연산자

기능

&

AND, 둘 다 1이어야 1, 아니면 0

|

OR, 둘 중 하나만 1이면 1, 둘 다 0이면 0

^

XOR, 두 값이 다르면 1, 같으면 0

~

비트 전환, 0은 1로, 1은 0으로

<<

비트를 좌측으로 쉬프트(이동)

>>

비트를 우측으로 쉬프트(이동)

 

비트 연산은 2진수로 연산을 하며, 일반적인 연산보다 속도가 빠르다. 왜냐하면 컴퓨터는 값을 bit단위로 저장하고 있기 때문이다. 그 차이가 크지 않기 때문에 굳이 비트 연산을 사용하지 않아도 무방하다. 가독성이 떨어지기 때문에 꼭 필요한 경우에 사용하면 된다.

 

 

 

7. 조건 연산자 (삼항 연산자)

 

삼항 연산자의 형태는 ‘조건식 ? 식1 : 식2“이다.

조건식이 참(1)이면 식 1을 수행하고, 조건식이 거짓(0)이면 식 2를 수행한다. 코드에 ? 가 있다면 삼항 연산자이니 콜론(:)을 찾아 식을 구별하면 된다.

 

 

8. 형 변환

 

형변환은 자료형의 변환을 의미한다. 2가지 형태로 형 변환을 할 수 있다.

 

1) 자동 형변환

C언어에서는 기본적으로 형변환을 해주는 기능이 있다. 먼저, 정수에서 실수로 형변환이 될 경우 없던 소수점이 생긴다. 하지만 오차가 발생할 가능성이 있어 사용자가 주의를 해야 한다.

두 번째로 실수에서 정수로 변환이 될 경우 소수점 이하의 수는 소멸하고 정수 부분만 남는다.

마지막으로 큰 타입 정수를 작은 타입의 정수로 변환이 이뤄진다.

 

2) 명시적 형변환(Casting)

값 앞에 (type)을 명시하여 변환하는 방식이다. 예를 들어 (int) 3.14 --> 3처럼 실수를 명시적으로 정수 형태로 변환한다.

 

반응형

+ Recent posts