배열

① 메모리

 

C에는 아래와 같은 여러 자료형이 있고, 각각의 자료형은 서로 다른 크기의 메모리를 차지한다.

  • bool: 불리언, 1바이트
  • char: 문자, 1바이트
  • int: 정수, 4바이트
  • float: 실수, 4바이트
  • long: (더 큰) 정수, 8바이트
  • double: (더 큰) 실수, 8바이트
  • string: 문자열, ?바이트

컴퓨터 안에는 아래 사진과 같은 RAM 이라고 하는 물리적 칩이 메모리 역할을 한다.

쉽게 생각하면 아래 사진에서 여러 개의 노란색 사각형이 메모리를 의미하고, 작은 사각형 하나가 1바이트를 의미한다고 볼 수 있음

예를 들어 char 타입의 변수를 하나 생성하고, 그 값을 입력한다고 하면 위 사진에서 한 사각형 안에 그 변수의 값이 저장되는 것

 

 

 

② 배열

아래와 같이 세 개의 점수를 저장하고 그 평균을 출력하는 프로그램이 있다.

만약 점수의 개수가 더 많아진다면 이 프로그램은 많은 부분을 수정해줘야 하는데, 이 때 활용할 수 있는 것이 배열의 개념이다.

배열은 같은 자료형의 데이터를 메모리상에 연이어서 저장하고 이를 하나의 변수로 관리하기 위해 사용! 

위 코드는 배열을 이용하면 아래와 같이 바꿀 수 있다.

 

 

  • int scores[3]; 이라는 코드는 int 자료형을 가지는 크기 3의 배열을 scores 라는 이름으로 생성하겠다는 의미
  • 배열의 인덱스는 0부터 시작하기 때문에, scores의 인덱스는 0, 1, 2 세 개
  • 이 인덱스를 변수명 뒤 대괄호 [ ] 사이에 입력하여 배열의 원하는 위치에 원하는 값을 저장하고 불러올 수 있음
  • 하지만 위와 같은 코드는 여전히 점수의 개수가 바뀌는 상황에서 제약이 많다.

 

④ 전역변수

 

  • 아래 코드에서 scores 배열의 크기를 정해주는 N이라는 변수를 새로 선언
  • 만약 N이 고정된 값(상수)이라면 그 값을 선언할 때 const를 앞에 붙여서 전역 변수, 즉 코드 전반에 거쳐 바뀌지 않는 값임을 지정해줄 수 있다.
  • 관례적으로 이런 전역 변수의 이름은 대문자로 표기한다.
  • scores의 크기로 전역 변수를 선언하였기 때문에 점수 개수가 바뀌었을때 수정해야 하는 코드가 조금 줄었다.
  • 하지만 여전히 일일이 배열의 인덱스마다 점수를 지정해줘야 하는 불편함이 있다.

 

④ 배열의 동적 선언 및 저장

 

아래 코드에서와 같이 루프와 함수를 선언하여 좀 더 동적인 프로그램을 작성할 수 있습니다.

 

  • 여기서는 배열의 크기를 사용자에게 직접 입력 받고, 배열의 크기만큼 루프를 돌면서 각 인덱스에 해당하는 값을 역시 사용자에게 동적으로 입력 받아 저장한다.
  • 그리고 average 라는 함수를 따로 선언하여 평균을 구한다.
  • average 함수length 와 array[], 즉 배열의 길이와 배열을 입력으로 받고, 함수 안에서는 배열의 길이만큼 루프를 돌면서 값의 합을 구하고 최종적으로 평균값을 반환한다.
  • 이 방법을 통해 임의의 점수 개수와 점수 배열에 대해서 동적으로 평균값을 구하는 프로그램을 작성할 수 있다.

컴파일링

make나 clang을 사용해서 프로그램을 실행할 때 아래 네 개의 단계를 거칩니다.

우리가 명령어를 실행할 때 정확히 어떤 일이 일어나는지 알아보도록 하겠습니다.

 

전처리(Precompile)

컴파일의 전체 과정은 네 단계로 나누어볼 수 있습니다. 그 중 첫 번째 단계는 전처리인데, 전처리기에 의해 수행됩니다. # 으로 시작되는 C 소스 코드는 전처리기에게 실질적인 컴파일이 이루어지기 전에 무언가를 실행하라고 알려줍니다.

예를 들어, #include는 전처리기에게 다른 파일의 내용을 포함시키라고 알려줍니다. 프로그램의 소스 코드에 #include 와 같은 줄을 포함하면, 전처리기는 새로운 파일을 생성하는데 이 파일은 여전히 C 소스 코드 형태이며 stdio.h 파일의 내용이 #include 부분에 포함됩니다.

 

컴파일(Compile)

전처리기가 전처리한 소스 코드를 생성하고 나면 그 다음 단계는 컴파일입니다. 컴파일러라고 불리는 프로그램은 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일합니다.

어셈블리는 C보다 연산의 종류가 훨씬 적지만, 여러 연산들이 함께 사용되면 C에서 할 수 있는 모든 것들을 수행할 수 있습니다. C 코드를 어셈블리 코드로 변환시켜줌으로써 컴파일러는 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램으로 만들어 줍니다. 컴파일이라는 용어는 소스 코드에서 오브젝트 코드로 변환하는 전체 과정을 통틀어 일컫기도 하지만, 구체적으로 전처리한 소스 코드를 어셈블리 코드로 변환시키는 단계를 말하기도 합니다.

 

어셈블(Assemble)

소스 코드가 어셈블리 코드로 변환되면, 다음 단계인 어셈블 단계로 어셈블리 코드를 오브젝트 코드로 변환시키는 것입니다. 컴퓨터의 중앙처리장치가 프로그램을 어떻게 수행해야 하는지 알 수 있는 명령어 형태인 연속된 0과 1들로 바꿔주는 작업이죠. 이 변환작업은 어셈블러라는 프로그램이 수행합니다. 소스 코드에서 오브젝트 코드로 컴파일 되어야 할 파일이 딱 한 개라면, 컴파일 작업은 여기서 끝이 납니다. 그러나 그렇지 않은 경우에는 링크라 불리는 단계가 추가됩니다.

 

링크(Link)

만약 프로그램이 (math.h나 cs50.h와 같은 라이브러리를 포함해) 여러 개의 파일로 이루어져 있어 하나의 오브젝트 파일로 합쳐져야 한다면 링크라는 컴파일의 마지막 단계가 필요합니다. 링커는 여러 개의 다른 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐줍니다. 예를 들어, 컴파일을 하는 동안에 CS50 라이브러리를 링크하면 오브젝트 코드는 GetInt()나 GetString() 같은 함수를 어떻게 실행할 지 알 수 있게 됩니다.


이 네 단계를 거치면 최종적으로 실행 가능한 파일이 완성됩니다.

 

디버깅

 

① 버그와 디버깅

버그(bug)는 코드에 들어있는 오류입니다. 버그로 인해 프로그램의 실행에 실패하거나 프로그래머가 원하는 대로 동작하지 않게 됩니다. 버그를 만들고 싶지 않겠지만 모든 프로그래머들은 버그와 마주하게 되어있습니다. 디버깅(debugging)은 코드에 있는 버그를 식별하고 고치는 과정입니다. 프로그래머는 디버거라고 불리는 프로그램을 사용하여 디버깅을 하게 됩니다.

 

디버깅의 기본

프로그램은 일반적으로 인간보다 훨씬 빠르게 연산을 수행합니다. 그래서 프로그램을 실행시켜보는 것만으로는 무엇이 잘못됐는지 찾아내기 어렵습니다. 디버거는 프로그램을 특정 행에서 멈출 수 있게 해주기 때문에 버그를 찾는데 도움이 됩니다. 프로그래머는 멈춰진 그 지점에서 무슨 일이 일어나는지 볼 수 있습니다. 프로그램이 멈추는 특정 지점을 중지점이라고 합니다. 또한 프로그래머가 프로그램을 한번에 한 행씩 실행할 수 있게 해줍니다. 이로써 프로그래머는 프로그램이 내리는 모든 결정들을 단계별로 따라갈 수 있게 됩니다.

 

디버깅의 종류

 

help50

make 앞에 help50 을 붙여서 실행하면 다시 컴파일시 생기는 오류를 해석해줍니다.

 

 

② printf

디버깅의 다른 방법으로 직접 의심이 가는 변수를 출력해서 확인해 볼 수 있습니다.

아래와 같이 변수 i를 출력해보겠습니다.

그 결과 i가 0에서 시작하기 때문에 for 루프의 i <= 10 이라는 조건은 실제로 11번 만족한다는 사실을 알 수 있습니다.

따라서 이를 i < 10 으로 수정해주면 우리 의도대로 #이 10번 출력되겠죠

 

 

③ debug50

CS50 IDE를 사용하면 debug50이라는 프로그램도 사용할 수 있습니다.

아래와 같이 소스 코드에 직접 브레이크포인트를 지정하고 소스파일을 컴파일한 후에 “debug50 파일명” 으로 실행하면, 오른쪽 패널을 통해 변수의 값을 확인하거나 브레이크포인트부터 한 줄씩 코드를 실행해 볼 수 있습니다.

디버깅 종료를 위해서는 Ctrl + c를 누르면 됩니다.

 

 

코드의 디자인

규모가 큰 프로그램을 작성할 때는 보통 한 사람이 아닌 여러 사람들이 함께 작업을 진행하게 됩니다. 이 때는 내가 기여한 부분이 프로그램에 오류를 발생시키지 않도록 주의를 기울여야 합니다. 또한 코드의 내용 뿐만 아니라 그 형식도 신경써야 합니다. 같은 내용이라 하더라도 어떻게 표현하느냐에 따라 코드를 이해하고 수정하는 속도가 달라질 수 있기 때문입니다. = 효율성의 문제

 

check50

check50 프로그램을 이용하면 과제를 잘 수행했는지 자동으로 검사할 수 있습니다.

물론 이 프로그램은 cs50 강의를 위해서만 작성되었지만, 실제로 많은 사람들이 함께 작업하는 환경에서 이와 같은 자동 검사 프로그램은 많은 도움이 됩니다. 여러 사람들이 각자 한 부분을 맡아 코드를 작성할 때 각자가 수정한 코드가 전체 프로그램의 정확성을 해치지 않는지 쉽게 확인할 수 있기 때문입니다.

 

style50

style50 프로그램을 이용하면 코드가 심미적으로 잘 작성되어 있는지 검사할 수 있습니다.

공백의 수나 줄바꿈과 같은 것들은 코드의 실행에 직접적으로 영향을 주지는 않지만 코드를 작성하는 사람들이 코드를 읽고 이해하는데 영향을 주기 때문입니다. 많은 회사들은 사내에서 코드를 작성할 때 특정한 스타일 가이드를 따르도록 합니다.

여러 사람들이 코드를 작성하기 때문에 서로 불필요한 오해를 없애고, 코드를 이해하는 데 드는 비용을 최소화하기 때문입니다.

 

고무 오리

때로는 코드에 포함된 오류를 해결할 때 앞서 소개한 help50, debug50, check50과 같은 프로그램들이 존재하지 않거나, 있다 하더라도 디버깅에 큰 도움이 안 될 수 도 있습니다.

이 때는 먼저 한숨 돌리고 직접 곰곰히 생각해보는 수 밖에 없습니다.

한가지 유명한 방법으로 ‘고무 오리’와 같이 무언가 대상이 되는 물체를 앞에 두고, 내가 작성한 코드를 한 줄 한 줄 말로 설명해주는 과정을 거쳐볼 수 있습니다. 이를 통해 미처 놓치고 있었던 논리적 오류를 찾아낼 수도 있습니다.

 

 


출처 : https://www.boostcourse.org/cs112/lecture/119013?isDesc=false 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

 

 

데이터 타입

변수의 데이터 타입으로 사용할 수 있는 것들

  • bool: 불리언 표현, (예) True, False, 1, 0, yes, no
  • char: 문자 하나 (예) 'a', 'Z', '?'
  • string: 문자열
  • int: 특정 크기 또는 특정 비트까지의 정수 (예) 5, 28, -3, 0
  • long: 더 큰 크기의 정수
  • float: 부동소수점을 갖는 실수 (예) 3.14, 0.0, -28.56
  • double: 부동소수점을 포함한 더 큰 실수

* int는 대략 40억까지 셀 수 있기 때문에 40억게 이상의 데이터를 가진 일부 거대 기업과 같은 상황이 아닌 일반 사용자들은 대부분 정수에 int를 사용

 

CS50 라이브러리 내의 get 함수

  • get_char
  • get_double
  • get_float
  • get_int
  • get_long
  • get_string

 

형식 지정자

printf 함수에서는 각 데이터 타입을 위한 형식 지정자를 사용할 수 있다. 데이터 타입 마다 사용되는 형식 지정자를 적절히 사용해야 한다.

  • %c : char
  • %f : float, double
  • %i : int
  • %li : long
  • %s : string

 

기타 연산자 및 주석

그 외에도 아래 목록과 같이 다양한 수학 연산자, 논리 연산자, 주석 등이 기호로 정의되어 있다.

  • +:  더하기
  • -: 빼기
  • *: 곱하기
  • /: 나누기
  • %: 나머지
  • &&: 그리고
  • ||: 또는
  • //: 주석

 

정수와 실수를 받아서 출력해보기

① get_int ( 정수 값을 받아오는 CS50 라이브러리에 있는 함수 )

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

int main(void)
{
	int age = get_int("what's your age?\n");
	printf("Your are at least %i days old.\n",age*365);
}
  • 사용자의 나이는 오른쪽에서 왼쪽으로 복사되어 age라는 변수에 저장
  • 그 변수의 종류는 int 정수 → printf 함수에 이번에는 문자가 아닌 정수이기 때문에 %i로 days의 인자를 받아주고 출력
  • 이 사람의 나이를 일 수로 환산하면? 위와 같은 코드로 작성 가능 !

 

 

get_float (실수(float)값을 받아오는 CS50 라이브러리에 있는 함수)

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

int main(void)
{
	float price = get_float("what's the price?\n");
	printf("Your total is %f\n",price*1.0625);
}
  • get_float 함수를 사용하여 물건의 가격을 물어보고 가격을 받아 price에 저장
  • 그런 다음 세금을 포함한 값을 계산해서 출력 (메사추세츠의 부가세는 6.25%)
  • 총액은 실수(float)이므로 %f를 사용
  • 코드를 실행해서 가격을 100으로 넣으면 → 결과 값으로 105.250000이 나온다.
  • 하지만 소수점이 6번째 자리까지 나와 보기에 안 좋다. 
  • 소수점 2번째 자리까지 나오게 하려면 ? 아래 코드와 같이 %f → %2f 로 바꿔주기. 
printf("Your total is %2f\n",price*1.0625);

 

짝수인지 홀수인지 알려주는 코드짜기

 

 

  • get_int로 사용자들에게 정수인 숫자를 받아서 n에 저장
  • 2로 나누어 나머지가 0이냐 1이냐를 통해 홀수와 짝수를 구분해 줌 (* 짝수면 나머지가 0이 될 것이고 홀수면 1이 될 것)
  • if ( n % 2 == 0 ) 을 풀어 쓰면 n을 2로 나누었을 때 나머지가 0이면 printf("even\n"); → even(짝수)을 출력
  • 홀수를 출력하는 것은 왜 else if (n % 2 == 1)으로 하지 않았을까? 짝수 아니면 홀수 이기 때문에 else로도 충분하기 때문

 

주석

C에서는 //로 주석을 달 수 있다.

주석은 왜 다는 것일까?

 

  • 주석은 이 코드가 무슨 일을 하는지 설명하는 것
  • 여러분의 친구, 동료, 혹은 조교 등 여러분들이 짠 코드를 처음보는 사람들에게 설명이 필요하기 때문
  • 만약 코드가 수 백, 수 천줄이 되면 주석이 없다면 부분 부분마다 어떤 일을 하는지 찾기 힘들 것
  • 자신이 짠 코드라고 해도 한달 뒤, 일년 뒤에 보면 새롭기 때문에 꼭 타인이 아닌 자기 자신에게도 해당
  • 그렇기 때문에 주석으로 잘 설명하는 습관이 중요

 

 

 

※ 참고) #include<cs50.h> 는 무엇인가요?

 

CS50 수업을 위해 만들어진 라이브러리 입니다. 라이브러리는 여러 함수들을 모아둔 것이라고 볼 수 있습니다. CS50 수업에서는 여러분들께서 좀 더 쉽게 코딩을 짤 수 있게 CS50 라이브러리 안에 여러 함수(get_int, get_double, get_float 등등)를 만들어 두었습니다.

반면에 C에는 표준 라이브러리도 있습니다. 우리가 처음부터 사용한 #inclue<stdio.h>가 표준 라이브러리 중 하나 입니다. 가장 많이 쓰고 가장 보편적으로 사용하는 라이브러리입니다. 그 밖에도 <math.h>, <time.h> 등 자신이 코딩하는데 필요한 함수들을 그때 그때 라이브러리를 불러와서 다른 사람들이 만들어둔 함수를 사용할 수 있습니다. 

그렇다면 sandbox.cs50.io가 아닌 Visual Studio 같은 곳에서 CS50 라이브러리를 바로 사용이 가능할까요? 답은 사용할 수 없습니다. 표준 라이브러리는 기본적으로 설치가 되어 있기 때문에 사용이 가능하지만 앞서 말씀드렸듯이 CS50 라이브러리는 수업을 위해 만들어진 라이브러리 입니다. 그래서 sandbox.cs50.io 처럼 미리 설치가 된 곳이 아니면 따로 설치를 하여야만 사용이 가능합니다. 

 


출처 : https://www.boostcourse.org/cs112/lecture/119008/?isDesc=false 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

1) 조건문

① counter 라는 변수를 생성하고 0을 저장하기 

int counter = 0;
  • C는 오래된 언어라 저장하고자 하는 변수의 종류를 꼭 알려줘야 한다
  • counter라는 변수에 숫자를 저장
  • int 는 변수가 정수(integer)라는 것을 알려주는 것이고, counter는 변수의 이름, 0은 그 값에 0을 저장(초기화)하는 것
  • 코드의 마지막은 세미콜론(;)
  • 여기서 등호(=)는 같다는 의미가 아닌, 오른쪽에 있는 값을 왼쪽에 할당한다는 의미

 

변수의 값을 1씩 증가시키기

counter = counter + 1;
counter += 1;
counter++;
  • 즉, counter에 1을 더한 값을 다시 counter에 저장(할당)한다
  • 위와 같이 3가지 방식으로 구현 가능

 

③ 조건문 만들기

if (x < y)
{
	printf("x is less than y\n");
}
else if (x > Y)
{
	printf("x is greater than y\n");
}
else (x == y)
{
	printf("x is equal to y\n");
}
  • if ( ) 의 괄호 안에는 검사하고자 하는 조건이 들어가고, { } 안에는 조건을 만족할 때 수행하고자 하는 작업이 들어간다.
  • 일치 연산자 " == " : 오래전 사람들이 합의하길 =을 2개 사용하여 같다를 표현하자라고 정한 것
  • if, else, else if 뒤에는 세미콜론(;)이 붙지 않음. 보통 조건과 같은 것들의 끝에는 세미콜론을 붙이지 않는다.

 

2) 루프

C에서도 while 이나 for 을 통해서 루프를 구현할 수 있다.

 

① while

While (true)
{
	printf("hello, world\n");
}
  • while ( )의 괄호 안에 조건을 넣고 { } 안에 수행할 작업을 포함시킨다.
  • C에서 루프를 구현하고 싶다면 성립 조건을 정해줘야 한다. (답이 네, 참, 혹은 1로 나올 수 있는 질문을 던져줘야 함)
  • 답이 참으로 나오게 하는 가장 간단한 방법은 그냥 true를 적는 것ㅇ
  • 윗 코드에서는 true라는 항상 참이 되는 조건을 통해 while 루프가 영원히 수행되도록 했다. 따라서 위의 코드는 계속해서 "hello, world"를 무한정 출력하게 될 것 !

 

만약 특정 횟수만큼 작업을 수행하고 싶다면 ?

int i = 0;
while (i < 50)
{
	printf("hello world\n");
	i = i + 1;
}
  • 변수명은 맘대로 적어도 문제 없지만, 프로그래머들은 무언가를 셀 때 간단하게 정수를 나타내는 i를 사용한다.
  • 이번에는 i<50이라는 조건을 추가
  • 처음에 i를 0이라고 정해주었고 while는 계속해서 i가 50보다 작은지를 물어볼 것
  • 이 코드가 정상적으로 작동하려면 i를 증가시켜야 한다. (i = i + 1, i += 1, i++ 모두 같은 결과를 냄.)
  • 진행 순서 : i는 0으로 설정 → i는 50보다 작은가? → 작다 → hello world를 출력한다 → i를 1증가시킨다 → i가 50보다 작은가?
    → (반복) → i가 50보다 작은가? → 작지 않다 → 종료

 

③ for

for (int i = 0; i < 50; i++)
{
	printf("hello world\n");
}
  • 따로 변수를 선언해도 되지만 위와 같이 for 를 사용하면 for ( ) 안에 각각 (변수 초기화; 변수 조건; 변수 증가) 에 해당하는 코드를 넣어서 간단하게 표현할 수 있다.
  • 즉, 가장 먼저 정수 값을 가지는 i라는 변수를 0으로 초기화하고, i가 50인지 매번 검사를 하고, 이를 만족하면 { } 안의 내용을 수행한 후에,  i를 1씩 증가시킨다는 의미
  • while문과 비교하여 코드가 엄청 간단해진 것을 확인할 수 있다.

 

 

 

 

C언어

  • 아주 오래되고 전통적인 순수 텍스트 기반의 언어
  • 벨 연구소에서 1971년경부터 리치(D.M.Ritchie) 등에 의해서 설계 개발된 시스템 기술용의 프로그래밍 언어
  • 컴퓨터의 구조에 밀착한 기초 기술이 가능한 것과 간결한 표기가 될 수 있는 것이 특징
  • C 언어는 프로그램 오류를 쉽게 발견하기 위한 기능은 부족하지만, 고수준 언어에서 자주 볼 수 있는 기술상의 제약이 적기 때문에 오히려 프로그래밍하기 쉬운 편리한 언어로 평가됨

1) C 기초

 

검은색 바탕에 있는 이상한 글씨들은 아래의 스크래치 블록과 결과적으로 정확히 같다.

 

 

  • int main(void) : 스크래치의 “초록색 깃발을 클릭했을 때” 블록과 같은 역할. 즉 '시작한다'의 의미.
  • int main(void) { }의 중괄호 사이에 코드 작성 
  • printf(“hello, world\n”) : 스크래치의 “‘hello, world’라고 말하기” 블록과 같은 역할 ( \n은 줄바꿈의 기능)
  • 글자나 단어, 문장을 적을 때는 언제나 텍스트에 " " 쌍따옴표로 감싸야 한다.
  • 우리가 일상에서 문장의 끝에 마침표(.)를 붙이는 것 처럼 C에서는 세미콜론(;)을 붙여야 한다.
  • #include <stdio.h>는 “stdio.h”라는 이름의 파일을 찾아서 “printf” 함수에 접근할 수 있도록 해준다.
  • 우리가 Word로 문서를 저장했을때 "문서.docx"와 같이 .docx가 붙는 것 처럼 C로 작성한 코드는 “파일이름.c로 저장해야 한다. (확장자 “.c”는 C로 작성된 코드라는 의미.) 

 

컴파일러

  • 우리가 직접 작성한 코드는 “소스 코드” 라고 한다. 이를 2진수로 작성된 “머신 코드”로 변환해야 컴퓨터가 이해할 수 있는데, 이런 작업을 컴파일러라는 프로그램이 수행해준다.

 

 

 

  • 터미널창의 명령어 프롬프트에서 “$” 기호 옆에우리가 원하는 명령어를 입력한다.
  • clang hello.c 라는 명령어는 “clang” 이라는 컴파일러로 “hello.c”라는 코드를 컴파일하라는 의미
  • 그 결과 a.out 이라는 파일이 생성됨
  • ./a. out 이라는 명령어를 실행하면 컴퓨터가 현재 디렉토리에 있는 a.out이라는 프로그램을 실행하게 해준다.

      (./a. out에서 제일 앞에 있는 .은 지금 있는 현재 폴더를 나타냄)

 

2) 문자열

CS50 Sandbox에서는 스크래치의 ask함수와 가장 비슷한 것은 get_string 함수

※ String은 단어나 구절, 문장을 부르는 말 (숫자와는 다른 종류의 데이터)

 

① get_string 함수로 변수 지정하고 저장하기

get_string 함수로 변수 지정하기

 

  • 사용자의 이름을 받아서 저장할 변수를 스크래치와 같이 answer이라고 지정 (이때 변수는 마음대로 정해도 무관)
  • 여기서 유의해할 점은 C는 오래된 언어이기 때문에 변수가 저장하는 데이터의 종류를 아주 정확하게 명시해줘야 한다는 점
  • 그래서 우리는 저장하고자 하는 값의 종류가 문자열(string)이라는 것을 알려줘야 한다. 이때 string형식지정자라고 한다.
  • 우리가 일반적으로 사용하는 =은 같다 이지만, 프로그래밍 언어에서는 오른쪽에서 왼쪽으로 가는 화살표와 비슷하다고 생각해야 한다.
  • 오른쪽에 있는 것을 왼쪽에 지정한다는 것. 이를 할당 연산자라고 한다.
  • get_string 함수가 사용자의 이름을 반환하면 그 이름을 anwser이라는 변수에 저장하는 것

 

② printf 함수로 출력하기

 

printf 함수로 출력하기

 

  • 그럼 이 것을 printf 함수로 출력을 해보자. 이때 유의할 점은 printf("hello, answer");이 아니라는 점!
  • 이 코드를 실행한다면 answer이 출력이 되어 hello, answer이 그대로 결과로 나온다.
  • 우리는 answer이라는 변수에 들어있는 이름을 출력을 해야하기 때문에 %를 사용해 준다.
  • 이 때도 어떤 종류의 인자를 받는지 말해줘야 한다. 우리는 이름이라는 문자열을 받기때문에 string에서의 s를 %뒤에 붙여서 인자를 받아준다.
  • 그래서 최종적으로는 printf("hello, %s\n", answer);이 되는 것
  • 가장 위에 포함된 cs50.h 파일 안에 string이라는 문자열 형식과 get_string 이라는 함수에 대한 코드가 포함되어 있다. 이 파일을 포함해야만 전체 코드를 컴파일 하고 실행할 수 있기 때문!

 

 

③ 터미널창에 아래 명령어를 입력하여 컴파일하기

 

  • 여기서 -o string 은 string.c 를 string.out 이라는 머신코드로 저장하도록 하는 명령어
  • -lcs50은 “link”라는 의미를 지닌 -l 이라는 인자에 우리가 추가로 포함한 “cs50” 파일을 합친 것
  • 이를 통해 컴파일시 cs50 파일을 연결하도록 알려줄 수 있다.

다소 복잡한 이런 과정 대신에, 아래 make 명령어를 통해 간단하게 컴파일을 수행할 수도 있다.

 

이와 같이 작성한 코드를 컴파일 하고 실행하면, 사용자에게 입력값을 받고 문장 내에 포함하여 출력하는 프로그램이 되는 것 ! 

 


출처 : https://www.boostcourse.org/cs112/lecture/119007?isDesc=false 

 

모두를 위한 컴퓨터 과학 (CS50 2019)

부스트코스 무료 강의

www.boostcourse.org

 

+ Recent posts