정보처리기사/[수제비] 정보처리기사 실기

VI. 프로그래밍 언어활용_02. C언어

web_seul 2023. 3. 3. 21:59
반응형

02. C언어

1) C언어 기본

C언어 기본 구조 : 본문 전에 처리하는 전처리 부분과 본문으로 구성되어 있음, 헤더는 xxx.h파일로 되어있고 헤더 안에는 프로그래밍에 필요한 함수들이 포함되어 있음

전처리기(Preprocessor) : 실행 파일을 생성하는 과정에서 소스 파일내에 존재하는 전처리 지시문을 처리하는 작업

전처리기 종류

#include C언어 프로그램에 헤더 파일을 포함할 때 사용하는 전처리기
#define 매크로를 정의할 떄 사용하는 전처리기,
상수값을 지정하기 위한 예약어로 구문의 상수로 치환할 때 사용하는 전처리기
#include<stdio.h>	//STanDard Input Output
#defineA 5	//A를 5로 바꿈
int main(){	//int : 반환타입, 정수형
  printf("수제비%d",A);	//""내부를 출력, A->5로 치환, %d에 대입 :: 수제비 5
  return 0;
}
void main(){	//반환타입 없음 -> return 불필요
  printf("수제비%d");
  //return
}

 

2) 자료형

자료형(Data Type) : 프로그래밍 언어에서 실수값, 정수값과 같은 여러 종류의 데이터를 식별하는 형태, 메모리 공간을 효율적으로 사용하고 2진수 데이터를 다양한 형태로 사용하기 위해 존재

자료형 종류

문자(Character) 문자 하나를 저장하고자 할 때
메모리에 저장은 숫자로 저장됨
char
정수(Integer) 정수값을 저장하고자 할 때 int
부동 소수점(Floting Point) 소수점을 포함하는 실수값을 저장하고자 할 때 float(4bite), double(8bite)

 

3) 식별자

식별자 : 변수, 상수, 함수 등 서로 구분하기 위해 사용되는 이름

식별자 명명 규칙

구분 규칙 사용 가능 예시 사용 불가능 예시
사용 가능 문자 영문 대문자/소문자, 숫자, 밑줄(`_`) 사용 가능 a, A, a1, _, _hello ?a, <a
변수 사용 규칙 첫 자리에는 숫자 사용 불가 _1, a1, a100 1, 1a, 1A, 1234
변수 이름의 중간에는 공백 사용 불가 my_student my student
변수 의미 부여 이미 사용되고 있는 예약어의 경우 변수로 사용 불가 For, If, While int, short, long, for, while, do, continue, break, if, else

 

식별자 표기법

카멜 표기법(Camel Case) 첫단어 시작만 소문자, 각 단어의 첫글자는 대문자로 지정 numCal
파스칼 표기법(Pascal Case) 각 단어의 첫글자는 대문자로 지정 NumrCal
스네이크 표기법(Snake Case) 단어 사이에 언더바 사용 num_cal
헝가리안 표기법(Hungarian Case) 두어에 자료형 추가, int=n, char=c, 문자열=sz nNumCal

 

4) 변수

변수(Variable) : 저장하고자 하는 값이 있을 때 그 값을 주기억장치에 기억하기 위한 공간

int a = 10;	//변수: a

 

변수 선언

초기화하지 않는 경우 자료형 변수명; int a;
초기화하는 경우 자료형 변수명 = 초기값; int a = 10;

 

변수 유효범위

전역변수
(Global Variable)
어떤 블록에도 속하지 않는 변수
프로그램이 시작시 변수 생성, 프로그램 종료시 변수 소멸
초기화하지 않으면 정수형은 0, 실수형은 0.0, 문자형은 NULL(아스키코드 0)로 초기화
변수는 어디서든 사용가능 
지역변수
(Local Variable)
블록 내에서 선언하는 변수
블록이 시작되는 부분에서 선언, 중괄호가 닫히는 시점에 소멸
해당 블록내에서만 사용 가능
static 변수
(Static Variable)
블록 내외부 상관없이 선언가능한 변수
변수 선언시 static이라는 키워드를 붙임
블록 내외부 상관없이 프로그램 시작시 변수 생성, 종료시 변수 소멸
전역 변수로 선언시 프로그램 전체 사용가능, 블록내 선언시 블록내 선언 가능
#include<stdio.h>
int a=5;	//전역변수
void fn(){	//3. 실행
  a=a+3;	//a=10+3=13
}
void main(){	//1. main함수 먼저 실행
  a=a+5;	//a=5+5=10;
  fn();	//2. fn함수 호출
  print("%d", a);	//결과 a=13 출력
}
-----------------------
#include<stdio.h>
void main(){
  int a=3, b=4;	//블록변수
  {
    int a=5;	//블록변수
    printf("%d %d\n", a, b);	//a=5, b=4
  }
  printf("%d %d\n", a, b);	//a=3, b=4
}
------------------------
#include<stdio.h>
void fn(){
  static int a=3;	//static 변수
  a=a+1;	//a=3+1=4
  printf("%d\n", a);	//a=4 ←
}
void main(){
  fn();	//a=4+1=5
  fn();	//a=5+1=6
}

 

5) 표준 입출력 함수

이스케이프 문자

\n new line 커서를 다음줄 앞으로 이동(개행)
\t tab 커서를 일정 간격만큼 수평 이동
printf("Hello");
printf("C World");
//출력 : HelloC World : 개행 문자가 없을 경우 일자 출력됨

 

포맷 스트링

printf(포맷_스트링이_포함된_문자열, 인자, ...);
%c Character 문자 1글자에 대한 형식 : 'A'
%s String 문자가 여러개인 문자열에 대한 형식: "A"
%u Unsigned Decimal 부호없는 10진수 정수
%d Decimal 10진수 정수
%o Octal 8진수 정수
%x, %X Hexa(6) Decimal(10) 16진수 정수
%e, %E Exponent 지수표기 1.24e+02 = 124(1.24X10²), 1.24E+02 구별
     
     
#include<stdio.h>
void main(){
  int a=4, c=5;
  char b='A';
  printf("a는 %d, b는 %c입니다.", a, b);	//a는 4, b는 A입니다.
  printf("%d", a+c);	//9
}
//a는 4, b는 A입니다.9

 

포맷 스트링을 이용한 변수 상세 출력

%[-][0][전체자리수].[소수점자리수]스트링	//[]생략가능
[-] [-]를 붙이면 왼쪽 정렬
[-]를 붙이지 않고 [전체자리수]가 정해진 경우 오른쪽 정렬
[0] [0]을 붙이면 전체 자리수에서 앞 빈공간만큼 0으로 채움
[전체자리수] [전체자리수]만큼 공간 확보
소수점(.)도 한자리수로 포함됨
.[소수점자리수] [소수점자리수]만큼 소수점이 출력됨
실수형일때만 적용됨
#include<stdio.h>
void main(){
  float a=1.234;
  int b=10;
  printf("%.2f\n",a);	//소수점 2자리 표현 : 1,23 ←
  printf("%5.1f\n",a);	//5자리에서 소수점 1자리 표현 : (우측정렬) 1.2 ←
  printf("%05.1f\n",a);	//5자리에서 소수점 1자리 표현, 나머지 0으로 채움 : 001.2 ←
  printf("%-05.1f\n",a);	//5자리에서 소수점 1자리 표현, 좌측정렬 : 1.2 ←
  printf("%5d\n",b);	//5자리 출력 : 10
  printf("%05d\n",b);	//5자리 출력, 나머지 0으로 채움 : 00010
  printf("%-5d\n",b);	//5자리 출력, 좌측정렬 : 10
  printf("%-05d\n",b);	//5자리 출력, 나머지 0으로 채움(좌정렬로 빈공간없음), 좌측정렬 : 10
}

 

표준 입력 함수

scanf(포맷_스트링이_포함된_문자열, 변수의_주소값, ...);
#include<stdio.h>
void main(){
  int a;
  char b;
  scanf("%d %c", &a, &b);	//%d: 10진수, %c:문자열, &:주소값
  printf("a는 %d, b는 %c입니다.", a, b);	//a는 5, b는 A입니다.
}

 

6) 연산자

연산자 : 프로그램 실행을 위해 연산을 표현하는 기호

 증감연산자 > 산술연산자 > 시프트연산자 > 관계연산자 > 비트연산자 > 논리연산자 > 삼항연산자 > 대입연산자 

증감 산술 시프트 관계 비트 논리 삼항 대입
++, -- +, -, *, /, % <<(우항수만큼 x2), >> (우항수만큼 /2) >, <, >=, <=, ==, !=
1: true
0 : flase
&, |,
^(같으면 0, 다르면 1),
~ (not, 단항)
&&, ||,
! (단항)
조건 ? true : false =, +=, -=,
*=, /=, %=
    2진수 계산   2진수 계산      

 

7) 조건문

if문 : 조건이 참인지 거짓인지에 따라 경로를 선택하는 명령문

if(조건문){
  명령문;
}
else if(조건문){
  명령문;
}
else{
  명령문;
}

 

switch 문 : 조건에 따라 여러개의 선택 경로 중 하나를 취하고자 할 때 사용하는 명령어

switch(식){
case 값:
  명령문;
  break;	//break문을 만날때까지 switch문 실행
  
  default:
  명령문;
}

 

8) 반복문

while문 : 조건이 참인 동안에 해당 분기를 반복해서 실행하는 명령문, 무한루프 주의

while(조건문){
  명령문;
}

 

do while문 : 참, 거짓과 관련없이 무조건 한번은 실행, 그 후는 조건이 참인 동안 해당 분기를 반복해서 실행하는 명령문

do{
  명령문;
}while(조건문);

 

for문 : 초기식, 조건식, 증감식을 지정하여 반복하는 명령어

for(초기식; 조건식; 증감식){
  명령문;
}
//1. 초기식

//2. 조건식
//3. 명령문
//4. 증감식

//5. 조건식
//6. 명명문
//7. 증감식
//..

 

루프제어 명령어

break 반복문을 중지하도록 하는 명령어
continue 다음 반복으로 넘어갈 수 있도록 하는 명령어

 

9) 배열

배열 : 같은 타입의 변수들로 이루어진 집합

int a[3]={1,2};	//a : 데이터가 들어갈 공간, {1,2} : 배열값
//a[0] : 1
//a[1] : 2
//a[2] : 0
초기값이 없는 경우 타입 배열명[배열 수];
초기값이 있는 경우 타입 배열명[배열 수] = {초기값};

 

2차원 배열

int a[2][2]={1};	//a : 데이터가 들어갈 공간, {1,2} : 배열값
//a[0][0] : 1
//a[0][1] : 0
//a[1][0] : 0
//a[1][1] : 0
초기값이 없는 경우 타입 배열명[행의 개수], [열의 개수];
초기값이 있는 경우 타입 배열명[행의 개수], [열의 개수] = {초기값};

 

10) 문자열

1차원 배열과 문자열

- 문자열 초기화시 마지막에 NULL문자가 삽입되므로 초기화하는 글자수보다 1이상 큰값으로 배열을 선언

- 초기화시 배열의 크기를 명시하지 않으면 문자열의 문자수+1만큼 자동 생성

- printf 함수를 %s를 이용하여 문자열을 읽고 출력, printf 파라미터로 문자를 읽기 시작할 시작 주소를 알려주면 시작 주소부터 NULL직전 값까지 읽어서 출력

#include<stdio.h>
void main(){
  char a[7] = "Hello";	//a[0]="H", a[1]="e", a[2]="l", a[3]="l", a[4]="o", 
  						//a[5]=NULL, a[6]=NULL
  
  printf("%s\n", a);	//[]를 제외하면 포인터 -> 주소를 찾아감a[0] -> a : Hello ←
  printf("%s\n", a+1);	//a+1은 a[1]의 주소를 가리키는 포인터 -> a+1 : ello ←
  
  a[4] = NULL;	//a[0]="H", a[1]="e", a[2]="l", a[3]="l", a[4]=NULL, 
  				//a[5]=NULL, a[6]=NULL
  printf("%s\n", a+1);	//a+1의 주소를 찾아감, NULL값을 가진 a[4]직전까지 출력 : ell
}

//& : 주소값을 가리킴
//&a[0] : a[0]의 주소값, ==a (6행의 a로 사용함(&, [0]생략))
//&a[1] : a[1]의 주소값, ==a (7행의 a+1로 사용함(&, [1]생략))

 

2차원 배열 : 문자열을 여러개 정의할 때 2차원 배열 사용

#include<stdio.h>
void main(){
  char a[2][8] = {"Hello", "Soojebi"};
  	//&a[0][0] ="H"		a[1][0]="S"
  	//&a[0][1] ="e"		a[1][1]="o"
  	//&a[0][2] ="l"		a[1][2]="o"
  	//&a[0][3] ="l"		a[1][3]="j"
  	//&a[0][4] ="o"		a[1][4]="e"
  	//&a[0][5] = NULL	a[1][5]="b"
  	//&a[0][6] = NULL	a[1][6]="i"
  	//&a[0][7] = NULL	a[1][7]= NULL
  	//&a[0][8] = NULL	a[1][8]= NULL
    
  printf("%s\n", a[0]);	//2차원배열은 []가 2개 있어야하는데 1개만 있으므로 주소값을 나타냄 == &a[0][0]
  						//a[0][0]부터 NULL직접값까지 : "Hello" ←
  printf("%s\n", a[1]);	//== &a[1][0]
  						//Soojebi ←
  
  a[0][4] = NULL;	//&a[0][4] ="o"	-> NULL(= \0)
  	//&a[0][0] ="H"		a[1][0]="S"
  	//&a[0][1] ="e"		a[1][1]="o"
  	//&a[0][2] ="l"		a[1][2]="o"
  	//&a[0][3] ="l"		a[1][3]="j"
  	//&a[0][4] = NULL	a[1][4]="e"
  	//&a[0][5] = NULL	a[1][5]="b"
  	//&a[0][6] = NULL	a[1][6]="i"
  	//&a[0][7] = NULL	a[1][7]= NULL
  	//&a[0][8] = NULL	a[1][8]= NULL
  printf("%s\n", a[0]+2);	//a[0][2]의 주소값 : &a[0][2]부터 NULL전까지 : "ll" ←
  printf("%s\n", a[1]+3);	//a[1][3]의 주소값 : &a[1][3]부터 NULL전까지 : "jebi" ←
}

 

11) 구조체

구조체 : 사용자가 기본 타입을 가지고 새롭게 정의할 수 있는 사용자 정의 자료형

struct 구조체명{	//정의
  자료형 변수명1;
  자료형 변수명2;
  ..
};
struct 구조체명 구조체변수;	//선언
#include<stdio.h>
struct Student{
  char gender;
  int age;
}

void main(){
  struct Student s = {'F', 21};	//구조체 student = s
  								//s.gender = 'F', s.age = 21
  s.gender = "M";	//s.gender = 'M', s.age = 21
  printf("%c", s.gender);	//s.gender = 'M'                              
  printf("%d", s.age);	//s.age = 21
}

 

12) 함수

main 함수 : 프로그램이 실행하는 모든 프로그램의 시작점, main함수에 있는 명령어 실행

자료형 main(파라미터){
  명령어;
}
void main int main
void main(){
  ...
  return;
}
int main(){
  ...
  return 0;
}

 

사용자 정의 함수 : 사용자가 직접 새로운 함수를 정의하여 사용하는 방법, 사용자 정의 함수에서 매개변수나 생성된 변수는 사용자 정의 함수가 종료되면 없어짐

자료형 함수명(자료형 변수명, ...){
  명령어;
  return 반환값;
}

 

매개변수 전달방법 : 함수가 필요로 하는 값을 매개변수로 만들면 함수를 호출하는 쪽에서 매개변수를 사용하여 해당 함수에게 변수의 값, 변수의 주소값을 전달하는 방식

구성요소 전달 인자
(Argument)
실 매개변수(Actual Parameters)로도 불림
함수를 호출하는 쪽에서 전달하는 변수의 값 또는 변수의 주소값
매개 변수
(Parameter)
형식 매개변수(Formal Parameters)로도 불림
함수를 호출하는 쪽에서 전달받는 변수의 값 또는 변수의 주소값
#include<stdio.h>
int fn(int x, int y){	//매개변수, parameter
  ...
}
void main(){
  int i, j;
  
  fn(i, j);	//전달인자, argument
}

 

종류 Call-by-Value 변수의 값을 넘겨주고 이 값은 새로운 공간에 할당되어 사용하는 방식
형식 매개변수의 어떠한 변화도 실 매개변수에 아무런 영향을 미치지 않음
Call-by-Reference 변수의 값이 아닌 변수가 사용중인 메모리 공간의 주소를 넘겨주는 방식
실 매개변수의 주소를 형식 매개변수로 보냄
//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);	//&:변수의 주소
 }

 

재귀함수(Recursive Function) : 함수 자신이 자신을 부르는 함수

자료형 함수명(자료형 변수명, ...){
  ...
  함수명(변수명, ...)
  ...
  return 반환값;
}

 

문자열 함수 #include<string.h>

strcat(string concatenate) 함수 : 문자열끼리 연결하는 함수

strcat(dest, src); src의 문자열을 dest문자열 뒤에 붙임
strncat(dest, src, maxlen); src의 문자열에서 maxlen의 개수만큼 dest 문자열 뒤에 붙임

 

strcpy(string copy) 함수 : 문자열을 복사하는 함수

strcpy(dest, src); src의 문자열을 dest문자열에 복사
strncpy(dest, src, maxlen); src의 문자열에서 maxlen의 개수만큼 dest문자열에 복사

 

strcmp(string compare) 함수 : 문자열을 비교하는 함수

strcmp(s1, s2); s1, s2의 (아스키코드)대소 비교
strncmp(s1, s2, maxlen); maxlen 길이만큼만 s1, s2의 대소 비교

 

strlen(string length) 함수 :  문자열의 길이를 알려주는 함수

strlen(s); s의 길이를 알려줌

 

strrev(string reverse) 함수 : 문자열을 거꾸로 뒤집는 함수

strrev(str); str내에 문자열을 거꾸로 뒤집음

 

strchr 함수 : 문자열 내에 일치하는 문자가 있는지 검사하는 함수

strchr(str, c); str내에 c가 존재하는지 알려줌

 

sqrt 함수 : 양의 제곱근을 계산하는 함수

sqrt(n); √n의 값을 계산

 

ceil 함수 : 소수점 올림 함수floor 함수 : 소수점 내림 함수

ceil(n); n을 소수점 올림
floor(n); n을 소수점 내림

 

rand 함수 : 임의의 값을 생성하는 함수

rand(); 임의의 정수값 1개를 생성

 

srand 함수 : 난수 생성 알고리즘에 사용하는 seed를 정해주는 함수, srand를 사용하면 rand함수를 사용할 떄 해당 seed값에 해당하는 난수 패턴으로 생성

srand(seed); seed의 값에 따라 난수 발생기를 초기화

 

time 함수 : 현재시간을 가져오는 함수, 1970년 1월 1일 이후로 몇초가 경과했는지 나타냄

time(NULL); time함수에 파라미터를 NULL로 하면 현재 시간을 반환

 

atoi (ASCII to Integer) 함수 : 문자열을 정수형으로 변환하는 함수

atoi(str); str을 정수형으로 반환

 

atof (ASCII to Floating Point) : 문자열을 실수형으로 변환하는 함수

atof(str); str을 실수형으로 반환

 

itoa 함수 : 정수형을 문자열로 변환하는 함수

itoa(value, str, radix); value를 변환하여 str에 radix 진수로 저장

 

13) 포인터

포인터 : 변수의 조소값을 저장하는 공간

자료형*포인터_변수명 = &변수명;

 

배열과 포인터

배열의 i번지 주소 배열명+i == &배열명[i]
배열의 i번지 값 *(배열명+i) == 배열명[i]

 

1차원 배열과 1차원 포인터

- 1차원 배열에서 배열명만 단독으로 사용할 경우 1차원 포인터와 동일

- 1차원 배열일때 배열명[요소]형태 *(배열명+요소), 1차원 포인터일때 포인터[요소] 형태, *(포인터+요소)일 경우 값을 가리킴

 

2차원 배열과 1차원 포인터

- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일

- 2차원 배열일때 배열명[요소]형태, *(배열명+요소)는 1차원 포인터와 동일하고 1차원 포인터에 대해 *과[]을 이용해야 값을 가리킬 수 있음

 

2차원 배열과 2차원 포인터

- 2차원 배열에서 배열명만 단독으로 사용할 경우 2차원 포인터와 동일

- 2차원 배열일때 배열명[요소][요소], *배열명[요소], **(배열명+요소)일 경우 값을 가리킴

 

구조체와 포인터 : 구조체는 일반 구조체 변수로 접근할 때는 .로 접근하고 구조체 포인터로 접근할 때는 ->로 접근

 

1차원 구조체 배열과 1차원 구조체 포인터

- 1차원 구조체 배열에서 배열명만 단독으로 사용할 경우 1차원 구조체 포인터와 동일

- 1차원 구조체 배열일 때 배열명[요소], 변수명 형태, (*(배열명+요소)).변수명, 배열명->변수명 형태, (배열명+요소)->변수명 형태로 값을 가리킴

- 1차원 포인터일 때 포인터[요소], 변수명 형태, (*(초인터+요소)).변수명, 포인터->변수명 형태, (포인터+요소)->변수명 형태로 값을 가리킴

 

함수 포인터 : 함수의 주소를 저장하고 해당 주소의 함수를 호출하는데 사용하는 포인터

리턴타입(*함수_포인터)(함수 파라미터);

 

반응형