2주차. C언어

홍석범·2021년 12월 30일
0

CS50 2주차 C언어강좌 링크
이번 강좌는 C언어의 코드 위주로 진행되어 게시물도 코드 위주로 작성하였다. 오랜만에 C언어로 코딩을 했더니 뭔가 어색한듯....;;

C언어

#include <stdio.h>

int main(void)
{
	printf("Hello, world!\n");
}

이전 강의에서 스크래치프로그램을 통해 구현했던것처럼 C언어를 통해 "hello world"를 출력.
C에서는 컴퓨터에게 해당 함수가 어디에 구현되어 있는지, 혹은 어디에 저장되어있는지 알려줘야한다.(#include <stdio.h>)
해당 코드를 실행하기 위해서는 코드를 컴퓨터가 이해하도록 2진법(0과1)로 바꿔주는 작업이 필요한데 이러한 알고리즘/소프트웨어를 "컴파일러"라고 한다. 컴파일러는 소스코드를 머신코드로 바꿔주는 기능을 하게된다.

문자열

#include <stdio.h>
#include <cs50.h>

int main(void)
{
	string answer =get_string("What's your name?\n");
    printf("hello, %s\n",answer);
}

위의 코드를 통해 answer이라는 형식지정자를 컴퓨터에게 할당해준다.
문자열 형식지정자를 받기위해 %s를 사용하여 해당부분에 형식지정자가 들어갈것임을 알려준다.
get_string은 해당 강의의 cs50.h에서 가져온 사용자정의 함수이다.

조건문과루프

  • 조건문
#include <stdio.h>

int main(void)
{
	if(x<y){
		printf(“x is less than y \n”);
	}else if(x>y){
		printf(“x is not less than y \n”);
	}else{
 		printf(“x is equal to y \n”);
	}
}
  • 루프
#include <stdio.h>

int main(void)
{
	int i=-0;
	while(i<5){
		 printf(“hello, world \n”);
		i ++;
	}
}

자료형,형식지정자,연산자

  • 자료형
    bool,char,double,float,int,long,string,...
  • 형식지정자
    %c,%f,%i,%li,%s,....
  • (실습) 짝수/홀수 구분
#include <cs50.h>
#include <stdio.h>
// java 처음 배울때 실습했던 문제인데 새삼스럽네...
int main(void)
{
    int n = get_int("n: ");
    if (n % 2 == 0)
    {
        printf("even\n");
    }
    else
    {
        printf("odd\n")
    }
}

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

#include <stdio.h>

void cough(void){
	printf(“cough\n”);
}
 
int main(void){
	for(int i=0; i<3;i++){
		cough();
	}
}

사용자 정의함수를 정의함으로써 프로그래밍 시간을 단축,가독성을 향상 시킬수 있다.
(C에서는 코드를 위에서부터 순서대로 읽어들여서 cough함수가 main보다 아래 있을경우에는 오류가 발생;;; 옛날 언어라 그런가...당황스럽네)

하드웨어의 한계

컴퓨터는 RAM(랜덤 엑세스 메모리)라는 물리적 저장장치를 통해 모든 프로그램이 저장된다. RAM은 유한한 크기의 비트만 저장이 가능하기 때문에 가끔 부정확한 결과를 내기도 한다.

  • 부동 소수점 부정확성
#include <stdio.h>

int main(void)
{
    float x = 1;
    float y = 10;
    // 나눗셈 후 출력
    printf("x / y = %.50f\n", x / y);
}
  • 출력결과

    위와 같이 1을 10으로 나눈값을 소수점 50자리까지 출력했을때 부정확한 값이 출력된다.
    왜냐하면 컴퓨터의 메모리는 저장한계가 있기때문에 특정지점에서 한계에 도달하게된다. 즉, 컴퓨터는 저장할수 있는 값들중 0.1에 가장가까운 값을 저장하여 출력하게되는것이다.

  • 정수 오버플로우

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

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

    위와 같이 정수 1을 계속 2를 곱하여 출력했을때 정수(int)타입이 저장할 수 있는 비트수(32개의 비트)를 넘은 이후에는 오버플로우 에러와 함께 0이 출력된다. 즉, 32개의 비트를 넘는 순간 모든 비트들이 0이 되면서 결과값도 0이 출력되게된다.

강의완료!!💯


profile
코딩하는 주니어개발자

0개의 댓글