[C] C 언어 기초

최현석·2022년 3월 9일
0

정보처리 기사 시험을 위해 C, C++, python의 기초를 공부해보고자 한다.
공부하면서 프로그래밍 언어에 대한 통찰을 가지는데 주안점을 두고 공부해야겠다.


1. 출력하기 printf

#include <stdio.h>

// main메소드가 int:?
int main(){
// printf 함수는 stdio.h 라는 헤더 코드를 상단에 포함시켜줘야 사용할 수 있다.
// " " 큰 따옴표 안에 문자열을 작성한다.
printf("Hello World !");
// 무조건 return 문이 있어야 하는 것 같다.
return 0; 
}
  • 특수문자 출력을 위한, 백팁 \

" 같은 특수문자를 출력하고 싶다면, 특수 문자 앞에 \백팁을 넣어주면 출력할 수 있다.

printf("큰 따옴표 나와라 얍! \(\"\) ")
  • 줄 변경을 위한 new line, \n
    printf 함수를 이용해 출력을 하게 되면 한 줄에 쭉 출력이된다. 줄을 띄우고 싶다면 \n을 삽입하자.
printf("안녕하세요, 저는 최현석입니다. \n 감사합니다.")
  • 숫자 출력을 하고 싶다면, %d
    printf(3) 같이 작성하면 오류가 발생한다. printf("3") 이라고 쓰거나, 아래와 같이 출력 형식을 지정해줘야 한다.
//printf("%d", 포맷에 대응하는 숫자 변수)
printf("%d", 3);
  • 공백 출력을 하고 싶다면, " "
    공백은 그냥 큰 따옴표 안에 " " 이렇게 스페이스바를 누르면 된다.
    그렇지 않고 변수포맷을 이용하고 싶다면 아래와 같이 작성한다.
printf("%d %d", 3 10)
  • 변수 포맷의 종류

변수 포맷은 문자열의 경우 %s를, 문자의 경우 %c를, 정수의 경우 %d, 실수의 경우 %lf 등이 가능하다.

  • 소수점 맞춰 출력하기

%.nlf 포맷을 쓰면 된다

double a = 33.567268;
printf("%4.nlf", a);
  • 총 예시
#include <stdio.h>

int main(){
    printf("Total days in Year");
    printf("\n");
    printf("%d", 365);
    printf("\nCircumference rate\n3.1415926535");
    return 0;
}
  • 문제

변수 a, b 에 각각 5.26, 8.27 을 넣어주고, 두 수의 곱을 소수점 셋째 자리까지만 출력하는 프로그램을 작성하세요.

#include <stdio.h>

int main(){
    double a = 5.26;
    double b= 8.27;
    printf("%3nlf", a * b);
    return 0;
}
  • 변수 값 동시에 복사

아래와 같이 체인(chain)형식으로 연속적으로 동시에 복사할 수 있다.

#include <stdio.h>
int main() {
	int a = 5, b = 3, c = 9;
	a = b = c;
	printf("A is %d B is %d C is %d", a, b, c);
	return 0;
}

이 경우 마지막 c의 값이 일괄적을 복사된다.

출력값
A is 9 B is 9 C is 9

2. 변수와 자료형

C 언어의 자료형에는 아래와 같은 형이 있다.

정수 : int, long long

실수 : double

문자 : char

문자열 : char[]

위 자료형은 아래와 같이 변수로 선언한다.

int a;
a = 5;
printf("%d", a);

정수형, 실수형에 해당하는 변수들 끼리는 더하고(+) 빼고(-) 곱하고(*) 나누는(/) 간단한 사칙연산이 가능하다.


3. 입력 (scanf)

c에서는 scanf 라는 함수를 통해 공백 단위로 입력을 받을 수 있다.
scanf 를 통해 입력을 받는 형식은 다음과 같다.

scanf ("변수 포맷", 변수의 주소);

printf 와 동일하게 적절한 type 의 변수 포맷을 이용하여 입력을 받을 수 있다.

다만 printf 와 다르게 맨 뒤에 변수가 아닌 변수의 주소 를 써주어야 하는데, 이때 변수의 주소는 & 를 변수 이름 앞에 붙여서 나타낼 수 있다.

다음 코드는 숫자 (int) 를 입력받아 int형 변수 a 에 저장한 후 출력하는 코드다.

#include <stdio.h>

int main() {

	int a;
	scanf("%d", &a);
	printf("%d", a);

	return 0;

입력 함수 역시 #include <stdio.h> 가 필요하다.

  • 공백 입력

공백을 사이에 두고 두개의 수를 입력받고 싶다면 두개의 %d 변수포맷을 이용해 입력받을 수 있다.

#include <stdio.h>

int main() {

	int a, b;
	scanf("%d %d", &a, &b);
	printf("%d %d", a, b);

	return 0;

}
  • 문자열 입력

c에서 문자열 1개 입력은 char[] type 과 %s 포맷을 이용해 받을 수 있다.

다만 문자열의 경우, 앞에서 수, 문자를 받을때와는 다르게, 변수 주소 자리에 & 없이 변수 이름 자체가 들어가야 한다.

이는 문자열은 char 들의 배열에 받을 수 있고, 문자열이 담긴 배열의 주소는 변수의 이름이 곧 주소가 되기 때문이다.

char[] 배열의 선언은 다음과 같이 할 수 있다.

char a[15];

(char 가 15개 들어갈 수 있는 char배열/ 문자열을 생성)

#include <stdio.h>
int main() {
	char a[15];
	scanf("%s", a);
	printf("%s", a);
	return 0;
}

4. 사칙연산

C 언어에서 자주 이용되는 사칙연산은 덧셈, 뺄셈, 나눗셈, 곱셈 이다.

덧셈, 뺄셈, 곱셈의 경우에는 +, -, * 를 사용하면 되며, 나눗셈의 경우에는 몫과 나머지를 잘 구해야 한다.

나누기 연산시 몫의 경우에는 / 연산을 통해 구할 수 있으며, 나머지의 경우 % 연산을 통해 구할 수 있다.

만약 5를 2로 나누는 경우 처럼 나누어 떨어지지 않는 경우에 나눗셈을 진행하여 그 결과를 실수 값으로 받고 싶은 경우라면, 연산이 이루어지는 항들 중 반드시 실수 type이 들어있어야 한다.

아래 코드에 형 변환 예제도 적혀있다.

#include <stdio.h>

int main() {
	int a = 9, b = 4;
	printf("%d %d %d %d %d %lf", a + b, a * b, a - b, a / b, a % b, (double)a / b);
	return 0;
}
  • 사칙연산 축약형

+= , -=, *=, %=, /=


5. if, 조건문

if(조건){
	조건이 참일 떄 실행문
}

여기서 if 내부 라는 범위(scope)를 명확히 정의하기 위해 c 에서는 중괄호 블록 { } 을 사용한다.

즉, if문을 사용하게 되면 if조건을 만족할 때, 해당 블록 내부에 있는 코드만을 실행하게 된다.

아래 코드에서 if문의 블록 { } 안에 존재하는 printf 는 a > 10이라는 조건을 만족하는 경우에만 실행된다.

반면 가장 마지막 줄에 있는 printf는 if문의 블록 { } 바깥에 존재하고, if와 같은 위계에 놓여있기 때문에, if 조건과 상관없이 항상 실행된다.

#include <stdio.h>

int main() {
	int a;
	scanf("%d", &a);
	if (a > 10) {
		a += 5;
		printf("%d\n", a);
		a -= 6;
	}
	printf("%d", a);
	return 0;
}

만약 { } 블록을 쓰지 않는다면 어떻게 될까?

이럴 경우, if조건 다음에 나오는 오직 한 줄의 코드만 if조건에 의해 실행된다. 따라서 다음 두 코드는 같은 코드다.

	if (a > 10) {
		a += 5;
	}
	if (a > 10) 
		a += 5;

하지만 아래 두 코드는 다른 코드다.

{ } 블록이 없는 두번째 코드의 경우,

a+=5 한줄만 if 조건에 의해 실행되며 a-= 6은 if조건과 관계없이 실행되기 때문이다.

	if (a > 10) {
		a += 5;
		a -= 6;
	}
	if (a > 10) 
		a += 5;
		a -= 6;
  • 비교연산자

if문에 조건을 넣기 위해 다음의 여러 비교 연산자들을 사용할 수 있다.

a > b : a가 b보다 큰 경우에만 true / 아니면 false
a >= b : a가 b보다 같거나 큰 경우에만 true / 아니면 false
a < b : a가 b보다 작은 경우에만 true / 아니면 false
a <= b : a가 b보다 같거나 작은 경우에만 true / 아니면 false
a == b : a와 b가 동일한 경우에만 true / 아니면 false
a != b : a와 b가 다른 경우에만 true / 아니면 false
  • if else 조건문
if (조건) {
  여기에 조건이 참일 경우에만 수행되는 코드 작성
}
else {
    여기에 조건이 거짓일 경우에만 수행되는 코드 작성
}
이 위치에 있는 코드는 조건과 무관하게 항상 수행된다.
  • 삼항연산자

정확히 if else 로만 이루어져 있는 구문은 다음과 같이 삼항연산자를 이용하면 한 줄에 표현이 가능하다.

이렇게 코드를 작성하면 변수 a는 조건이 참인 경우 v1값을, 조건이 거짓인 경우에는 v2 값을 갖게 된다.

기존 코드
if (조건) {
    a = v1;
}
else {
    a = v2;
}
삼항연산자를 이용한 코드
a = 조건 ? v1 : v2;
  • and 기호, &&

숫자 a가 짝수이면서 동시에 10보다 크다면 이라는 조건은 어떻게 넣을 수 있을까?

2개 이상의 조건을 동시에 만족하는지를 알고싶은 경우라면, 다음과 같이 && (and) 를 사용하면 된다.

if (조건1 && 조건2) {
    코드1
}
  • or 기호, ||

숫자 a가 짝수이거나 10보다 크다면 이라는 조건은 어떻게 넣을 수 있을까?

2개 이상의 조건들 중 하나라도 만족하는지를 알고싶은 경우라면, 다음과 같이 || (or) 를 사용하면 된다.

if ( 조건1 || 조건2 ) {
    코드1
}

부록, 코딩 컨벤션

"코딩 컨벤션" (Coding Convention) 이라고 하는 일종의 코드 작성 규약을 정의해두었습니다. 물론 그 규약을 안 지킨다고 오류가 나진 않지만, 모두와 협업하기 위해 정해놓은 일종의 "약속" 입니다.

각 언어나, 회사에 따라 정의해 놓은 코딩 컨벤션은 다양합니다. 일반적으로 변수나 함수명은 소문자로 쓰는 것이 원칙이며, 여러 단어를 사용하는 경우 언더바 (Underscore)를 사용합니다. (hello_world)


위 내용은 코드트리 를 통해 학습하고 정리한 내용입니다.

profile
노력과 성장을 기록합니다.

0개의 댓글