[정처기 실기] 프로그래밍 문제 이론 - C언어

728x90

[정처기 실기] 프로그래밍 문제 이론 - C언어

> 1 C언어

2 JAVA

3 Python

1. C언어

C언어 값

정수 / 정수 = 정수값만 취함 ex. 5 / 2 = 2

정수 / 실수 = 실수 ex. 5 / 2.0 = 2.5 

 

참 값 : 1로 표현

거짓 값 : 0로 표현

 

실수 > 정수로 형변환 시 소수점 버림 ex. (int) 6.75 = 6

 

(1 Byte = 8 Bit)

char : 1 Byte

int : 4 Byte

float : 4 Byte

double : 8 Byte

bool : 1 Byte

주소값 : 8 Byte (int*, char* 등)

struct : 가장 큰 메모리 값을 기준으로 구역을 나눠서 더함

ex. struct test { char a; int b; } : int형이 4 Byte이므로 기준이 4 Byte로, char도 4 Byte로 2구역, 총 8 Byte

ex. struct test { char a; char b; int c; } : int형이 4 Byte이므로 기준이 4 Byte로, char도 4 Byte, 이때, a와 b가 모두 4 Byte 안에 포함가능 하므로 2 구역이면 충분, 총 8 Byte

ex. struct test { char a; int c; char b; } : int형이 4 Byte이므로 기준이 4 Byte로, char도 4 Byte, 이때, 순서가 char int char 이므로 char를 한 구역에서 사용할 수 없으므로 3구역이 필요, 총 12 Byte

ex. struct test { char a; int b; char c; char d; char e; char f; char g; } : int형이 4 Byte이므로 기준이 4 Byte로, char도 4 Byte, a, b, cdef, g 이렇게 4 구역이 필요, 총 16 Byte

ex. struct test { char a; int c; double b; } : double형이 8 Byte이므로, char도 8 Byte, 이 때, c도 8 Byte 안에 포함가능 하므로, 2구역이면 충분, 총 16 Byte

 

unsinged char : 부호 비트가 없는 값 8 Bit

char : 맨 앞이 부호 비트인 값 8 Bit,  (1 : -, 0 : +)

 

char에서 문자열을 넣을 때 자동으로 추가로 널문자(\0) 삽입

ex. char ch[5]; : ch의 sizeof는 5, char str[] = "abcde"; : str의 sizeof는 6

 

sizeof : 메모리의 크기 구하는 것 ex. int a[ ] = {95, 75, 100, 50};일 때, sizeof(a) : 4 Byte * 4 = 16, sizeof(int) : 4 Byte = 4

 

전역 변수, 정적 변수, int형 배열로 선언할 때 기본적으로 각 요소에 0 들어감

 

%s : 해당하는 주소값부터 널문자 만날 때까지 출력, %c : 한 글자만 출력

 

C언어 함수

strstr(str1의 주소, str2의 주소) : str1 문자열에서 str2 문자열과 일치하는 문자열이 있으면 해당 위치의 포인터를 반환

 

strcat(str1, str2) : str1 문자열에 str2 문자열 이어 붙이기

strncat(str1, str2, n) : st1 문자열에 str2 문자열 n개만큼 이어 붙이기

 

strcpy(str1, str2) : str2 문자열에 str1을 복사

strncpy(str1, str2, n) : str2 문자열 n개 공간에 str1 문자열 n개를 복사

  

, 연산자

, 연산자는 오른쪽 값 대입 ex. (10, (20, 30), 40) = 40

 

~ 비트 반전 연산자

양수 : 절댓값으로 변환 후, 1 더하고 - 부호 붙이기 ex. 5 > 6 > -6

음수 : 절댓값으로 변환 후, 1 빼고 + 부호 붙이기 ex. -5 > 5 > 4

 

프로그램 작성 순서

선언 > 입력 > 처리 > 출력

 

프로그램 수행 순서

전처리기(preprocessor) > 컴파일러(compiler) > 어셈블러(assembler) > 링커(linker)

 

변수 종류

전역변수 : 모든 함수 위에 선언되어 모든 곳에서 수행, 프로그램 종료될 때까지 메모리상에 존재

정적 변수 : 함수 안에 선언되어 해당 함수 안에서만 수행, 프로그램 종료될 때까지 메모리상에 존재

지역 변수 : 함수 안에 선언되어 해당 함수 안에서만 수행, 해당 함수 안 중괄호가 끝나면 메모리에서 삭제

 

10진수를 2진수로 변환

- 2진수 > 8진수(o)

뒤에서 3개씩 4, 2, 1 구역으로 나누고, 1이 있는 구역의 숫자 쓰기

ex. 2진수 10000를 8진수로 변환

0(4) 1(2) 0(1) / 0(4) 0(2) 0(1)

/ 기준으로 앞에서 1이 있는 2가 선택, 뒤에서는 1이 없으니 0이 선택

20

 

- 2진수 > 16진수(x)

뒤에서 4개씩 8, 4, 2, 1 구역으로 나누고, 1이 있는 구역의 숫자 쓰기

ex. 2진수 10001를 16진수로 변환

0(2) 1(1) / 0(8) 0(4) 0(2) 1(1)

/ 기준으로 앞에서 1이 있는 1이 선택, 뒤에서는 1이 있는 1이 선택

11

<반대로>

ex. 0x11를 2진수로 변환

0(8) 0(4) 0(2) 1(1) / 0(8) 0(4) 0(2) 1(1)

/ 기준으로 앞에서 1이 선택된 구역을 1로, 뒤에서 1이 선택된 구역을 1로 변경

10001

ex. 0x0f를 2진수로 변환

0(8) 0(4) 0(2) 0(1) / 1(8) 1(4) 1(2) 1(1)

/ 기준으로 앞에서 0이므로 모든 구역을 0으로, 뒤에서 f이므로 모든 구역을 1로 변경

1111

 

ex. (char) 0x15213F10 >> 4

0x : 16진수란 의미

15213F10 : 한 숫자 당 4 Bit

>> 4 : 4 Bit 버리기

= 15213F1

(char) : 8 Bit 공간이므로, 뒤에서 8 Bit만 가져오기

= F1

 

ex. char형인 0xF1를 10진수로 변환, unsigned char형인 0xF1를 10진수로 변환

11110001

- char형

맨 앞 1은 부호 비트, (1 : -, 0 : +)

1(-)1110001 > 음수이므로 2의 보수로 표현 

우선 1의 보수로 표현 : 1(-)0001110

2의 보수로 표현(1을 더한다) : 1(-)0001111를 10진수로 변

15

- unsigned char형

부호 비트X

11110001를 10진수로 변환

241

 

- 10진수(d) > 2진수 

정수 부분 : 2의 제곱수 나열하여, 큰 수부터 빼기

소수 부분 : 1이 될 때까지 2 곱하기

ex. 10진수 45.1875를 2진수로 변환

정수 부분 : 45

  45 = 32 + 8 + 4 + 1

  1(32) 0(16) 1(8) 1(4) 0(2) 1(1)

소수 부분 : 0.1875

  0.1875 × 2 = 0.375, 101101.0

  0.375 × 2 = 0.75, 101101.00

  0.75 × 2 = 1.5, 101101.001

  0.5 × 2 = 1, 101101.0011

101101.0011

 

#define

#define (상수명) (상수값) ex. #define VALUE1 1 : 앞으로 VALUE1 값은 1로 고정

 

공용체

메모리를 공유하여 제일 큰 기억공간 하나만 사용

ex. union data { int a; float b; double c; } : int(4Byte), float(4Byte), double(8Byte) 중 가장 큰 8 Byte가 공용체 기억공간의 크기

ex. union { int arr1[2]; char arr2 = { 16, 17, 18, 19, 20, 21, 22, 23 }; }

: arr2가 8 Byte 사용하고 있을 때, arr2의 0인덱스는 16, 17, 18, 19이고, arr2의 1인덱스는 20, 21, 22, 23이 됨

 

fork( )

자식 프로세스 하나 더 생성함, 부모 프로세스랑 같은 프로세스를 한 벌 더 생성된다고 생각하면 됨

 

fork( )의 값 : 양수(부모에 대한 값), 0(자식에 대한 값), 음수(실패한 경우) 3가지

ex. pid_t pid; pid = fork( ); : pid의 값이 양수, 0, 음수로 나올 수 있음

이때, fork( )의 값이 양수(부모에 대한 값)부터 실행하고, 그다음 0(자식에 대한 값)을 실행

ex. if (pid > 0) 먼저 수행하고, 그 다음 else if (pid == 0) 수행, 실패 시 else (pid < 0) 실행

 

fork( )가 n번 수행 시 현재 수행 중인 프로세스의 개수 : 2ⁿ개

 

엔디안(endian)

리틀 엔디안 : 뒤에서부터 출력

빅 엔디안 : 앞에서부터 출력

 

 

 

 

 

 

 

728x90