티스토리 뷰

Computer Science/CS50

[CS50 2주차] C언어

JINSUKUKU 2021. 2. 12. 01:04

1. C 기초

Hello World!
#include <stdio.h>

int main(void){
  printf("Hello World!");
  return 0;
}

 

컴파일러

✔  작성한 코드를 컴퓨터가 이해할 수 있는 2진수의 머신코드로 변환해 실행할 수 있는 실행파일을 생성하는 과정

✔  실행 파일 : 컴퓨터가 이해할 수 있는 기계어 형태의 파일

 

 

2 . 문자열 출력

printf( )

✔  C언어의 표준 출력 함수로, 여러 종류의 데이터를 다양한 서식에 맞춰 출력할 수 있다.

✔  기본적으로 문자열을 출력하기 위한 함수로 문자열 외의 형태를 출력하고자 할 때에는 형식 지정자가 필요하다

 

 

3. 조건문과 루프

if 문

✔ 조건식이 참인 경우 내부의 코드가 실행

#include <stdio.h>

int main(void){
  int num = 2;
  if(n%2==0) {
  	printf("%d는 짝수입니다\n"),num //2는 짝수입니다 출력
  } else{
  	printf("%d는 홀수입니다\n"),num
  }
  return 0;
}

 

switch 문

✔  조건 식의 결과에 따라 매치되는 case문의 코드가 실행

#include <stdio.h>

int main(void){
  int num = 2;
  switch(num){
    case 1: printf("1입니다"); break;
    case 2: printf("2입니다"); break; //2입니다 출력
    case 3: printf("3입니다"); break;
    default: break;
  }
  return 0;
}

 

for 문

✔  특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행

✔  for문의 초기식에서 변수를 선언하는 것은 C99의 방식 → 변수를 반복 내에서만 사용 가능

✔  for문 외부에서 변수를 선언하고, for문에서 초기화하는 것은 C99 이전의 방식

✔  GCC에서는 C99가 기본 설정이 아니므로, for문의 초기식에서 변수 선언했을 때 컴파일 에러 발생

#include <stdio.h>

int main(){
  for (int i = 0; i < 10; i++){
  	printf("Hello, world!\n");
  }
  return 0;
}

 

while 문

✔  특정 조건을 만족할 때까지 계속해서 주어진 명령문을 반복 실행

✔  조건식이 참(true)인 경우 내부의 명령문을 실행

#include <stdio.h>

int main(){
  int i=0;
  while(i<10){
    printf("Hello World!\n");
    i++;
  }
  return 0;
}

 

 

4. 자료형, 형식 지정자

자료형
  bool   논리형   true, false, 1 , 0
  char   문자형   'a', 'Z', '?'
  string   문자열   "Hello World"
  int   정수형   5, 28, -3, 0 
  long   int보다 더 범위가 큰 정수   
  float   소수점을 갖는 실수   3.14, 0.0, -28.56
  double   float보다 더 범위가 큰 실수   

 

형식 지정자 (서식 지정자, 변환 문자)
형식 지정자 자료형 / 형태 형식 지정자 자료형 / 형태
%c    문자(char) %i   10진, 8진, 16진 정수(int)
%s    문자열(string) %li   10진, 8진, 16진 정수(long)
%d    10진 정수(int) %f   실수(float) 
%ld    10진 정수(long) %lf   실수(double)
%lld    10진 정수(long long) %p   주소 값, 포인터
%o    8진 정수 %e, %E   부동 소수점 표현 실수
%x    16진 정수 : 소문자 출력 %u   unsigned int
%X    16진 정수 : 대문자 출력 %lu   unsigned long

 

 

5. 사용자 정의 함수, 중첩 루프

int main(void) { 명령문; return 0; }

✔  int는 최종으로 함수가 반환할 값의 자료형을 의미

✔  아무것도 반환하지 않는다면 void를 사용

✔  괄호 안의 void는 입력의 종류를 뜻하며 입력이 없는 경우 void 사용

✔  main함수보다 뒤에서 선언/정의된 함수는 main함수에서 인지하지 못하므로

✔  선언은 main함수보다 위에, 정의는 main함수의 뒤에 하는것이 가독성이 높다

 

중첩 루프

✔ 반복문의 내부에 또 다른 반복문을 넣어 반복을 중첩 진행

#include <stdio.h>

int main(void){
	for(int i=0; i<5; i++){
    	for(int j=0; j<5; j++){
        	printf("*");
        }
        printf("\n");
    }
	return 0;
}

 

 

6. 하드웨어의 한계

✔  RAM은 유한한 크기의 비트만을 저장할 수 있기 때문에 때로는 부정확한 결과를 내기도 한다

✔  다루고자 하는 자료형의 범위를 유의해 프로그램을 작성하자

 

부동 소수점 부정확성

 float에서 저장 가능한 비트의 수가 유한하기때문에 부정확한 결과 반환

#include <stdio.h>

int main(void){
	printf("%.50f",1/10);  //0.10000000000000000555111512312578270211815834045410
	return 0;
}

 

정수 오버플로우

✔  선언한 자료형보다 크기가 큰 값을 저장한 경우, 오버플로우 발생

✔  자료형의 범위를 벗어난 값은 오히려 최소값이나 0과 같은 부정확한 결과 반환

#include <stdio.h>
#include <unistd.h>

int main(void){
    for (int i = 1; ; i *= 2){
        printf("%i\n", i);
        sleep(1);
    }
}

 

역사적 사건 ① Y2K 문제

✔  연도를 마지막 두 자리수로만 저장했던 관습

✔  새해로 넘어가며, 99가 00으로 정수 오버플로우가 발생

✔  2000년이 아닌 1900년으로 인식되는 문제

 

역사적 사건 ② 보잉 787 사건  

✔  비행기 보잉 787에서 구동 후 248일이 지나면 모든 전력을 잃는 문제

✔  강제로 안전모드에 진입하였기 때문

✔  소프트웨어의 변수가 248일이 지난 후, 오버플로우가 되어 발생한 문제

✔  이를 해결하기 위해 주기적으로 재가동을 하여 변수로 다시 0으로 리셋

 

 

 

 

[출처] 부스트코스 | 모두를 위한 컴퓨터 과학(CS50 2019)

'Computer Science > CS50' 카테고리의 다른 글

[CS50 5주차] 2. 포인터  (0) 2021.02.12
[CS50 5주차] 1. 메모리 주소  (0) 2021.02.12
[CS50 4주차] 알고리즘  (0) 2021.02.12
[CS50 3주차] 배열  (0) 2021.02.12
[CS50 1주차] 컴퓨팅 사고  (0) 2021.02.11
댓글
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
최근에 올라온 글
글 보관함
Total
Today
Yesterday