정보처리기사 공부를 다시 시작했습니다.
① 10진수를 n진수로 변환
② n진수를 10진수로 변환
① 아스키 코드
② 주요 아스키 코드
10진수 | 부호 | 10진수 | 부호 | 10진수 | 부호 |
---|---|---|---|---|---|
0 | NULL | 65 | A | 97 | a |
32 | ' '(Space) | 66 | B | 98 | b |
48 | 0 | 67 | C | 99 | c |
49 | 1 | 68 | D | 100 | d |
① 전처리기(Preprocessor)
② 전처리기 종류
#include
: C언어 프로그램에 헤더 파일을 포함할 때 사용하는 전처리기#define
: 매크로를 정의할 때 사용하며, 상숫값을 지정하기 위한 예약어로 구문의 상수로 치환할 때 사용하는 전처리기유형 | 설명 | 선언 형식 |
---|---|---|
문자(Character) | - 문자 하나를 저장 - 메모리에 저장은 숫자로 | char |
정수(Integer) | - 정숫값을 저장 | int |
부동 소수점 (Floating Point) | - 소수점을 포함하는 실숫값 저장 | float, double |
구분 | 규칙 | 사용 가능 예시 | 사용 불가능 예시 |
---|---|---|---|
사용 가능 문자 | - 영문 대문자/소문자, 숫자, 밑줄 사용 가능 | a, A, a1, _, _hello | ?a, <a |
변수 사용 규칙 | - 첫 자리에는 숫자 사용 불가 - 변수 이름 중간에 공백 사용 불가 | _1, a1, a100 my_student | 1, 1a, 1A, 1234 my student |
변수 의미 부여 | - 이미 사용되고 있는 예약어의 경우 변수 사용 불가 | For, If, While | int, shor, long, ··· |
에약어
이미 문법적인 용도로 사용되고 있는 단어
표기법 | 설명 | 예시 |
---|---|---|
카멜 표기법 (Camel Case) | - 여러 단어가 이어지면 첫 단어 시작만 소문자로, 각 단어의 첫 글자는 대문자로 지정 | inputFunction |
파스칼 표기법 (Pascal Case) | - 여러 단어가 이어지면 각 단어의 첫 글자는 대문자로 지정하는 표기법 | InputFunction |
스네이크 표기법 (Snake Case) | - 여러 단어가 이어지면 단어 사이에 언더바를 넣는 표기법 | input_function |
헝가리안 표기법 (Hungarian Case) | - 두어에 자료형을 붙이는 표기법 - int 형일 경우 n, char 형일 경우 c, 문자열일 경우 sz를 붙임 | nScore |
자료형 변수명;
자료형 변수명=초깃값;
① 전역 변수(Global Variable)
블록(Block) : C언어에서 중괄호로 묶는 부분
② 지역 변수(Local Variable)
③ static 변수(초기화용)
① 단순 출력
printf(문자열);
② 이스케이프 문자를 이용한 출력
\n
(New Line) : 커서를 다음 줄 앞으로 이동(개행)\t
(Tab) : 커서를 일정 간격만큼 수평 이동③ 포맷 스트링을 이용한 변수 출력
printf(포맷_스트링이_포함된_문자열, 인자, ···);
유형 | 표현 | 의미 | 설명 |
---|---|---|---|
문자 (Character) | %c | Character | - 문자 1글자에 대한 형식 |
문자열 (String) | %s | String | - 문자가 여러 개인 문자열에 대한 형식 |
정수 (Integer) | %u %d %o %x, %X | Unsigned Decimal Decimal Octal Hexa Decimal | - 부호 없는 10진수 정수 - 10진수 정수 -8진수 정수 -16진수 정수(%x일땐 영어가 소문자로, %X일땐 대문자로 표시) |
부동 소수점 (Floating Point) | %e, %E %f %lf | Exponent Floating Point Long Floating Point | - 지수 표기(%e는 지수표현을 e로, %E는 E로 표시) - 부동 소수점 표기 - 부동 소수점 표기 |
④ 포맷 스트링을 이용한 변수 상세 출력
%[-][0][전체자리수].[소수점자리수]스트링
포맷 스트링 | 설명 |
---|---|
[] | - []를 붙이면 왼쪽 정렬 - []를 붙이지 않고, 가 정해져 있을 경우 오른쪽 정렬 |
[0] | - 0을 붙이면 전체 자릿수에서 앞에 빈공간 만큼 0으로 채움 |
[전체자리수] | - [전체자리수]만큼 공간이 확보됨 - 소수점(.)도 한 자릿수로 포함됨 |
.[소수점자리수] | - [소수점자리수]만큼 소수점이 출력됨 - 실수형일 때만 적용됨 |
scanf(포맷_스트링이_포함된_문자열, 변수의_주솟값, ···);
scanf를 사용하기 위해서는
stdio.h
헤더를 선언해야함
우선순위 | 연산자 | 유형 |
---|---|---|
1 | x++, x-- | 증감 |
2 | ++x, --x ! ~ | 증감 *논리 *비트 |
3 | *, /, % | 산술 |
4 | +, - | 산술 |
5 | <<, >> | 시프트 |
6 | <, <=, >, >= | 관계 |
7 | ==, != | 관계 |
8, 9, 10 | &, ^, | | 비트 |
11, 12 | &&, || | 논리 |
13 | (조건식)? a:b | 삼항 |
14 | =, +=, -=, *=, /=, %= | 대입 |
① 증감 연산자(Increment & Decrement Operator)
종류 | 설명 |
---|---|
x | 변수의 값을 1 증가시킨 후에 해당 변수를 사용 |
x | 변수를 사용한 후에 변수의 값을 1 증가 |
x | 변수의 값을 1 감소시킨 후에 해당 변수를 사용 |
x | 변수를 사용한 후에 변수의 값을 1 감소 |
② 산술 연산자
종류 | 설명 |
---|---|
양쪽의 값을 더하는 연산자 | |
왼쪽 값에서 오른쪽 값을 빼는 연산자 | |
* | 두 개의 값을 곱 |
/ | 왼쪽 값을 오른쪽 값으로 나눔 |
% | 왼쪽 값을 오른쪽 값으로 나눈 나머지를 계산(정수만 가능) |
③ 시프트 연산자(Shift Operator) ⭐
종류 | 설명 |
---|---|
<< | 양쪽의 값을 더하는 연산자 |
>> | 왼쪽 값에서 오른쪽 값을 빼는 연산자 |
④ 관계 연산자(Relation Operator)
⑤ 비트 연산자(Bit Operator)
종류 | 설명 |
---|---|
& | 두 값을 비트로 연산하여 같은 비트의 값이 모두 1이면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(AND 연산자) |
| | 두 값을 비트로 연산하여 같은 비트의 값이 하나라도 1이면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(OR 연산자) |
^ | 두 값을 비트로 연산하여 같은 비트의 값이 서로 다르면 해당 비트 값이 1이 되고, 그렇지 않으면 0이 되는 연산자(XOR 연산자) |
~ | 모든 비트의 값을 반대로 바꾸는 반전 기능을 하는 연산자(NOT 연산자) ⭐ 부호를 반대로 바꾼 값에 1을 뺀 값 |
⑥ 논리 연산자(Logig Operator)
⑦ 삼항 연산자(Ternary Operator)
조건식 ? 참일때값 : 거짓일때값;
⑧ 대입 연산자(Assignment Operator)
if(조건문){
명령문;
}
switch (식){
case 값:
명령문;
break;
default:
명령문;
while(조건문){
명령문;
}
do{
명령문;
}while(조건문);
for (초기식; 조건식; 증감식){
명령문;
}
명령문;
① break 문
② continue 문
① 1차원 배열
int a[3] = {1, 2};
int 데이터가 들어갈 공간 = 배열값;
② 2차원 배열
int a[2][3] = {1, 2, 3, 4};
#include <stdio.h>
void main(){
char a[8] = "Hello";
printf("%s\n", a); // Hello
printf("%s\n", a+1); // ello
a[3] = NULL;
printf("%s\n", a+1); // el
printf("%s\n", a+4); // o
}
char a[8] = "Hello";
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
---|---|---|---|---|---|---|---|
H | e | l | l | o | NULL | NULL | NULL |
a[3] = NULL;
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] |
---|---|---|---|---|---|---|---|
H | e | l | NULL | o | NULL | NULL | NULL |
→ ⭐ printf는 NULL 직전 값까지 읽어서 출력
→ ⭐ printf("%s\n", a);
에서 a
대신에 &a[0]
으로, printf("%s\n", a+1);
에서 a+1
대신에 &a[1]
로 printf("%s\n", a+4);
에서 a+4
대신에 &a[4]
로 바꿔도 결과는 같음
#include <stdio.h>
void main(){
char a[2][8] = {"Hello", "Stranger"};
printf("%s\n", a[0]) // Hello
printf("%s\n", a[1]) // Stranger
printf("%s\n", a[1]+3) // anger
a[1][4] = NULL;
printf("%s\n", a[1]+2) // ra
char a[2][8] = {"Hello", "Stranger"};
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | |
---|---|---|---|---|---|---|---|---|
a[0] | H | e | l | l | o | NULL | NULL | NULL |
a[1] | S | t | r | a | n | g | e | r |
a[1][4] = NULL;
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | |
---|---|---|---|---|---|---|---|---|
a[0] | H | e | l | l | o | NULL | NULL | NULL |
a[1] | S | t | r | a | NULL | g | e | r |
→ ⭐ printf("%s\n", a[0]);
에서 a[0]
대신에 &a[0][0]
으로, printf("%s\n", a[1]);
에서 a[1]
대신에 &a[1][0]
로 printf("%s\n", a[1]+2);
에서 a[1]+2
대신에 &a[1][2]
로 바꿔도 결과는 같음
struct 구조체명{
자료형 변수명1;
자료형 변수명2;
···
};
구조체변수.변수명
형태로 값을 가리킴#include <stdio.h>
struct Student {
char gender;
int age;
};
void main(){
struct Student s = {'F', 21};
s.gender = 'M';
printf("%c", s.gender); // M
printf("%d", s.age); // 21
① main 함수
② main 함수 형태
자료형 main(파라미터){
명령어;
}
void main()
일 경우 반환할 값이 없으므로 return;
을 사용하거나 return 자체를 사용하지 않고, int main()
일 경우 return 반환값;
을 명시해주어야 함return
을 만나면 그 즉시 함수를 종료void main(){
return;
}
int main(){
return 반환값;
}
void
- 함수를 호출한 호출자에게 결괏값을 제공하지 않는다는 의미의 자료형
- void는 '존재하지 않음'이라는 뜻으로 반환 값이 없다는 의미로 사용
① 사용자 정의 함수(User-Defined Function)
② 사용자 정의 함수 선언
자료형 함수명(자료형 변수명, ···){
명령어;
return 반환값;
}
③ 매개변수 전달 방법
구성요소 | 설명 |
---|---|
전달인자 (Argument) | - 실 매개변수(Actual Parameters)로도 불림 - 함수를 호출하는 쪽에서 전달하는 변수의 값 또는 변수의 주솟값 |
매개변수 (Parameter) | - 형식 매개변수(Formal Parameters)로도 불림 - 함수를 호출하는 쪽에서 전달하는 변수의 값 또는 변수의 주솟값 |
#include <stdio.h>
int fn(int x, int y){ // → 매개변수
···
}
void main(){
int i, j;
···
fn(i, j); // → 전달인자
}
구성요소 | 설명 | 예시 |
---|---|---|
Call by Value | - 변수의 값을 넘겨주고, 이 값은 새로운 공간에 할당되어 사용하는 방식 - 형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음 | #include <stdio.h> int fn(int x, int y){ ··· } void main(){ int i, j; ··· fn(i, j); } |
Call by Reference | - 변수의 값이 아닌 변수가 사용 중인 메모리 공간의 주소를 넘겨주는 방식 - 실 매개변수의 주소를 형식 매개변수로 보냄 | #include <stdio.h> int fn(int* x, int* y){ ··· } void main(){ int i, j; ··· fn(&i, &j); } |
④ 재귀 함수
자료형 함수명(자료형 변수명, ···){
···
함수명(변수명, ···)
···
return 반환값;
① 문자열 함수 #include<string.h>
1. strcat(String Concatenate)
strcat(dest, src);
: src
의 문자열을 dest
문자열 뒤에 붙임strncat(dest, src, maxlen);
: src
의 문자열에서 maxlent
의 개수만큼 dest
문자열 뒤에 붙임2. strcpy(String Copy)
strcpy(dest, src);
: src
의 문자열을 dest
문자열에 복사strncpy(dest, src, maxlen);
: src
의 무자열에서 maxlent
의 개수만큼 dest
문자열에 복사 3. strcmp(String Compare)
strcmp(s1, s2);
: s1
, s2
의 대소를 비교strncmp(s1, s2, maxlent);
: maxlen
길이만큼만 s1
, s2
의 대소를 비교s1
이 s2
보다 크면 1을, s1
과 s2
가 같으면 0을, s1
이 s2
보다 작으면 -1을 반환4. strlen(String Length)
strlen(s);
: s의 길이를 알려줌5. strrev(String Reverse)
strrev(str);
: str 내에 문자열을 거꾸로 뒤집음6. strchr
strchr(str, c);
: str 내에 c가 존재하면 첫번째 c의 위치를 반환② 수학 함수 #include<math.h>
1. sqrt
sqrt(n)
; : 의 값을 계산양의 제곱근은 소수를 확인할 때도 사용한다. a라는 값의 소수를 확인할 때는 2 ~ (a-1)의 모든 정수들로 나눴을 때 나누어 떨어지지 않는지 확인하는 것이 정석이지만, sqrt를 이용하면 2 ~ 의 정수들만 나누어 떨어지지 않는지 확인하면 소수를 구할 수 있기 때문이다.
⭐ 2. ceil
ceil(n);
: 소수점 올림⭐ 3. floor
floor(n);
: 소수점 내림③ 유틸리티 함수
1. rand(Random) #include<stdlib.h>
rand();
: 임의의 정숫값 1개를 생성2. srand(Seed Random) #include<stdlib.h>
srand
를 사용하면 rand
함수를 사용할 때 해당 seed 값에 해당하는 난수 패턴으로 생성srand(seed);
: seed 값에 따라 난수 발생기를 초기화3. time #include<time.h>
time(NULL);
: time 함수에 파라미터를 NULL로 하면 현재 시간을 리턴#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void main() {
int a;
int i;
srand(time(NULL));
for(i=0; i<6; i++){
a = rand()%45+1;
printf("%d ", a); // 29 2 43 25 4
}
}
rand()
함수는 임의로 난수만 생성하기 때문에 여러 번 실행하면 동일한 숫자가 나올 수 있음
4. atoi(ASCII to Integer) #include<stdlib.h>
atoi(str)
: 문자열(str)을 정수(int)형으로 변환#include <stdio.h>
#include <stdlib.h>
void main() {
char *a = "1";
int num = atoi(a);
printf("%d ", num); // 1
}
문자열을 저장하기 위해서 일반적으로 배열을 사용하지만, 문자형 포인터를 생성하면서 문자열을 대입할 수 있음
5. atof(ASCII to Floating Point) #include<stdlib.h>
atof(str)
: 문자열(str)을 실수형(float, double)형으로 변환⭐ 6. itoa(integer to ASCII)
itoa(value, str, radix)
: value를 변환하여 str에 radix 진수로 저장자료형* 포인터_변수명 = &변수명;
#include <stdio.h>
void main() {
int a = 10;
int* b = &a;
printf("%d %d %d", a, *b, *(&a))); // 10 10 10
}
자료형 배열명[요소];
일 때 다음 코드는 동일① 1차원 배열과 1차원 포인터
#include <stdio.h>
void main() {
int a[3] = {1, 2};
int *p = a;
printf("%d %d %d\n", a[0], *b, *(&a))); // 10 10 10
}
② 2차원 배열과 1차원 포인터
#include <stdio.h>
void main() {
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int *p = a[1];
printf("%d %d %d\n", *a[0], *a[1], *a[2]); // 1 3 5
printf("%d %d %d\n", **a, **(a+1), **(a+2)); // 1 3 5
printf("%d %d\n", *p, *(p+1)); // 3 4
printf("%d %d\n", p[0], p[1]); // 3 4
}
③ 2차원 배열과 포인터 배열
#include <stdio.h>
void main() {
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int *p[3] = {a[2], a[0], a[1]};
printf("%d %d %d\n", a[0][0], a[1][0], a[2][0]); // 1 3 5
printf("%d %d %d\n", *a[0], *a[1], *a[2]); // 1 3 5
printf("%d %d %d\n", p[0][0], p[1][0], p[2][0]); // 1 3 5
printf("%d %d %d\n", *p[1], *p[2], *p[0]); // 1 3 5
}
④ 2차원 배열과 2차원 포인터
int **p, **q;
형태로 선언할 수 있으나 2차원 포인터 p, q는 2차원 배열에서 한 덩어리의 크기를 알 수 없기 때문에 열의 개수를 명시하는 형태로 포인터 변수를 선언자료형 (*포인터 변수)[열의 크기];
#include <stdio.h>
void main() {
int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int (*p)[2] = a;
int (*q)[2] = a+1;
printf("%d %d %d\n", a[0][0], a[0][1], a[1][0]); // 1 2 3
printf("%d %d %d\n", p[0][0], p[0][1], p[1][0]); // 1 2 3
printf("%d %d %d\n", q[0][0], q[0][1], q[1][0]); // 3 4 5
}
① 구조체 변수와 구조체 포인터
.
으로 접근하고, 구조체 포인터로 접근할 때는 ->
로 접근#include <stdio.h>
Struct Student{
char gender;
int age;
}
void main() {
struct Student s = {'F', 21};
struct Student *p = &s;
printf("%c %d\n", s.gender, s.age); // F 21
printf("%c %d\n", (&s)->gender, (&s)->age); // F 21
printf("%c %d\n", p->gender, p->age); // F 21
printf("%c %d\n", (*p).gender, (*p).age); // F 21
printf("%c %d\n", p[0].gender, p[0].age); // F 21
}
② 1차원 구조체 배열과 1차원 구조체 포인터 ⭐
#include <stdio.h>
Struct Student{
char gender;
int age;
}
void main() {
struct Student s[3] = {'F', 21, 'M', 20, 'M', 24};
struct Student *p = &s;
printf("%c %d\n", s[0].gender, s[0].age); // F 21
printf("%c %d\n", (*s)->gender, (*s)->age); // F 21
printf("%c %d\n", s->gender, s->age); // F 21
printf("%c %d\n", (s+1)->gender, (s+1)->age); // M 20
printf("%c %d\n", p[0].gender, p[0].age); // F 21
printf("%c %d\n", (*p).gender, (*p).age); // F 21
printf("%c %d\n", p->gender, p->age); // F 21
printf("%c %d\n", (p+1)->gender, (p+1)->age); // M 20
}
리턴타입 (*함수_포인터)(함수 파라미터);
#include <stdio.h>
void fn1(){
printf("fn1 함수\n");
}
int fn2(int a){
printf("fn2 함수: %d\n", a);
return 0;
}
void main(){
void (*pf1)();
int (*pf2)(int);
fn1(); // fn1 함수
fn2(5); //fn2 함수: 5
pf1 = fn1;
pf2 = fn2;
pf1(); // fn1 함수
pf2(2); //fn2 함수: 2