아래 내용은 David J. Malan (데이비드 J. 말란) 교수님의
을 참고하였습니다
들어가기 전에
그래픽 인터페이스로 상호작용성이 좋은 스크래치로도 간단한 프로그래밍을 할 수 있지만, 텍스트 기반의 프로그래밍 언어를 이용해도 컴퓨터에게 동일한 일을 하게 할 수 있습니다. 가장 널리 쓰이는 프로그래밍 언어중 하나인 C의 기초를 배워보겠습니다.
학습 목표
C로 “hello, world”를 출력하는 프로그램을 만들 수 있습니다.
핵심 단어
Build software better, together
sandbox를 통해서 c언어를 자유롭게 다룰 수 있습니다.
int main(void)
는 스크래치의 초록색 깃발을 클릭했을 때 와의 동일한 역할을 합니다. 즉 시작한다의 의미를 가집니다.
그리고 일상에서 문장의 끝에 마침표를 붙이는 것 처럼 C에서는 세미콜론;을 붙여야 합니다.
printf 에서 f 는 formatic(형식화)입니다
#include <stdio.h>
int main(void)
{
printf("hello, world\n"); #;는 마침표의 역할을 합니다
}
#include <stdio.h> - 컴퓨터에게 함수가 어디에 구현되어있는지 혹은 어디에 저장되어있는지 알려줘야하므로? 필수적으로 있어야 하는 코드입니다.
command - rm, ls, mkdir, rmdir 등이 있습니다.
컴파일러
우리가 작성한 코드는 소스코드이며 이를 2진수로 작성된 머신코드로 변환하여 컴퓨터가 이해할 수 있도록 해야합니다. 이 작업을 컴파일러한다 라고 합니다.
명령어 clang hello.c 는 clang 명령어로 hello.c 를 컴파일하라는 의미입니다.
./a.out 은 a.out 을 실행시키라는 명령어 이며 여기서 a.out은 hello.c를 컴파일하게 되면 생성되는 머신코드입니다. 하지만 이름이 어려우므로 clang -o hello hello.c 를 통해 hello 라는 이름의 머신코드를 생성할 수 있으며 이또한 줄여 make hello 명령어를 통해 머신코드를 쉽게 생성할 수 도 있습니다.
들어가기 전에
문자열을 다루기 위해서는 문자열 형식을 가진 변수가 필요합니다. 사용자로부터 문자열을 입력받고 이를 다른 문자열과 합쳐서 출력하는 프로그램을 C로 작성해보겠습니다.
학습 목표
C로 문자열 형식을 가진 변수를 선언하고 출력하는 프로그램을 만들 수 있습니다.
핵심 단어
#include <stdio.h>
#include <cs50.h>
int main(void){
string animal = get_string("What kind of animal do you like?\n");
printf("I like %s\n", animal);
}
clang -o animal animal.c -lcs50
위 코드에서 변수가 저장될때 데이터 종류를 c언어의 경우 아주 정확하게 명시해줘야 합니다. animal은 데이터 종류가 string으로 string animal로 지정하였으며 이때 string 을 형식지정자라고 합니다.
-o animal 을 통해서 animal 로 파일을 호출할 수 있습니다.
lcs50을 통해 cs50 파일을 link 연결 하여 해당 파일에 접근을 합니다.
string - 문자라는 의미이며 c언어에서는 변수 값을 넣어줄 때 어떤 문자형식을 넣을지 알려줘야 합니다.
= 는 등호가 아닌 할당 연산자이며 오른쪽 내용을 왼쪽으로 옮기는 것입니다. 이때 컴퓨터 메모리 어딘가에 해당 데이터가 저장됩니다.
형식지정자는 %s 를 통해 사용합니다
printf("hello %s\n", animal); #animal 에 저장된 값 불러옴
terminal 창에 make hello 라고 입력하게 되면 hello.c 소스코드를 hello 라는 머신코드로 컴파일을 해줍니다. 즉 clang -o hello hello.c 의 역할을 해주는 것입니다.
들어가기 전에
스크래치에서 블록으로 표현했던 조건문과 루프 또한 C로 동일하게 구현할 수 있습니다. 스크래치에서 여러 기능을 가진 블록들을 이어붙였던 것 처럼 C의 다양한 문법을 이용하면 조건문과 루프를 더 간단한 텍스트 형식으로 표현할 수 있습니다.
학습 목표
조건문과 루프를 c로 작성할 수 있습니다.
핵심 단어
할당연산자 =
일치 연산자 ==
앞으로 다룰 내용들은 코드의 수준 정확성 즉 일을 잘 수행하느냐도 있지만 얼마나 효율적으로 코드를 작성했는지 혹은 얼마나 적은 메모리나 cpu 컴퓨터 뇌용량을 사용해서 코드가 일을 수행하는지와 같은 부분이 큽니다.
#include <stdio.h>
int main(void){
int i =0;
while(i <10){
printf("개발공부 굿\n");
i++;
}
}
while 문 위에 int i = 0;
로 초기화 하는거 잊으면 안됩니다.
놓쳤던 부분 !
int main(void) → 에서 {} 중괄호를 꼭 써주고 반드시 코드 내용을 그 안에다가 작성해야 합니다.
#include <stdio.h>
#include <cs50.h>
int main(void)
{
for (int i = 0; i < 50; i = i+1)
{
printf("hello\n");
}
}
for 문
들어가기 전에
C에서는 정수나 문자열 외에도 다양한 데이터 타입이 정의되어 있습니다. 또한 각 타입에 맞는 형식 지정자를 통해 적절한 포맷으로 출력하고, 다양한 연산자를 통해 조건문을 설정하거나 데이터 값을 계산할 수 있습니다.
학습 목표
다양한 데이터 타입과 형식 지정자를 나타내는 방법을 학습합니다.
다양한 연산자를 이용하여 조건문을 표현하는 방법을 학습합니다.
핵심 단어
데이터 타입에는bool(true, false),char(a,Z,등등),string(문자열),int(정수),long(큰 정수),float(실수),double(큰 실수)
가 있다 int 는 약 40억가지 셀 수 있습니다.
형식지정자로(place holder)는 %s, %f, %i, %li, %s 등이 있습니다.
printf 의 f 는 형식화하는 것입니다.
printf("total is %.2f", price * 1.0625) //소수점 2자리까지 출력
% - 나머지 연산자입니다.
라이브러리는 file of code 로서 다른 사람들이 이미 작성한 코드들을 가져와 사용할 때 사용하는 소스코드를 의미합니다.
명령어 cd 는 어딘지 모를때 default folder로 이동하게 해줍니다.
#include <cs50.h>
#include <stdio.h>
int main(void){
int age = get_int("what's your age?\n");
printf("Your age is almost %i days.\n", age*365);
}
나이 계산해주는 코드
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int n = get_int("number\n");
if(n%2 == 0)
{
printf("it is even\n");
}
else if(n%2 == 1)
{
printf("it is odd\n");
}
}
홀짝 계산해주는 코드
들어가기 전에
프로그래밍을 하다 보면 가끔 반복적으로 작성해야 하는 코드가 있습니다. 이런 코드를 여러번 쓰지 않고 함수 형태로 저장해두면 코드를 간결하고 이해하기 쉽게 만들 수 있습니다. 사용자 정의 함수를 사용 하는 방법을 배워봅니다. 더불어서 하나의 루프로 수행하기 힘든 작업을 중첩 루프를 이용하여 해결하는 방법도 배워 보겠습니다.
학습 목표
사용자 정의 함수와 중첩 루프를 작성할 수 있습니다.
핵심 단어
추상화 - 함수를 미리 만들어 가져다 쓰는 것, printf 처럼 stdio 라이브러리를 쓰는 것입니다.
사용자 정의 함수
예를들어 int get_positive_int(void) 에서 어떤 값을 받아와서 변수에 저장하고 반환하고 싶을때 함수를 사용할 수 있습니다.
이럴 경우 int get_positive_int(void)
파란색 int는 출력의 종류를 의미합니다 - 함수의 왼쪽
빨간색 void는 입력의 종류를 의미합니다 - 함수의 오른쪽
#include <stdio.h>
void cough(int n);
int main(void)
{
cough(3);
}
void cough(int n)
{
for (int i = 0; i < n; i++)
{
printf("cough\n");
}
}
cough함수를 main 함수보다 위에 정의해줌으로써 code가 main함수보다 밑에 있더라도 사용할 수 있도록 합니다. 이렇게 하는 이유는 가장 중요한 main 함수를 가장 위로 올리기 위함이며 이는 code의 가독성을 높여주는데 중요한 역할을 합니다.
do while
#include <cs50.h>
#include <stdio.h>
int get_positive_int(void);
int main(void)
{
int i = get_positive_int();
printf("%i\n", i);
}
int get_positive_int(void)
{
int n;
do
{
n = get_int("Positive Integer: ");
}
while (n < 1);
return n;
}
do while 의 좋은점은 조건을 확인하고 다시 루프를 돌지 체크하므로 조건만 확인하여 ok이면 do 밑으로 진행하는 것입니다. 그리고 do while을 사용하면 조건과 상관없이 최소한 한 번은 {}안의 내용ㅇㄹ 실행할 수 있습니다. 위 불리언 표현 while(n<1); 가 참일때 계속해서 질문을 반복하는 것입니다. 위에서는 조건이 양의 정수이므로 양의정수가 나올때까지 Positive integer 의 문구를 계속해서 반복하여 출력할 것입니다.
중첩루프
#include <stdio.h>
#include <cs50.h>
int get_positive_int(void);
int main(void)
{
int n;
n = get_positive_int();
for(int i=0; i<n; i++)
{
for(int j=0; j<n; j++)
{
printf("#");
}
printf("\n");
}
}
int get_positive_int(void)
{
int n;
do
{
n = get_int("Positive integer: ");
}
while(n<1);
return n;
}
위는 정사각형의 #을 만드는 코드이다
놓친 점
처음에는 아래와 같이
사용자 정의 함수를 line4에 선언을 하면 main 함수에서 동작할것이라 생각했지만 초기화 에러가 났다 왜냐하면 main 함수의 n과 get positive int 함수의 n이 다르기 때문이다. (main함수 밖에 변수를 선언하면 0으로 초기화가 된다고 한다) 그렇기 때문에 main 함수 안에 다시 n = get positive int(); 함수를 선언하여 우리가 할당하고싶은 n 값인 n 을 main 함수에 넣어줌으로써 초기화 에러를 없앨 수 있었다.
들어가기 전에
컴퓨터는 우리가 작성한 프로그램을 구동하기 위해 다양한 물리적 장치를 사용합니다. 그 중 하나는 메모리로, 프로그램이 필요한 정보가 저장되는 곳입니다. 메모리의 용량은 무한하지 않기 때문에, 때때로 프로그램에서 우리가 의도하지 않은 오류가 발생하기도 합니다.
학습 목표
메모리 용량이 프로그램의 구동에 미치는 영향을 설명할 수 있습니다.
핵심 단어
컴퓨터라고 해서 항상 완벽한 것은 아닙니다. 저장공간, 혹은 하드웨어로써 유한한 크기를 가지고 있으므로 때때로 부정확한 결과를 가져오기도 합니다.
#include <stdio.h>
#include <unistd.h>
int main(void)
{
for(int i=1; ; i*=2)
{
printf("%i\n", i);
sleep(1);
}
}
숫자가 10억이 넘어가게 되면 앞으로 넘어갈 1의 자리가 없어지므로 이후에는 error가 나오면서 그 이상의 숫자는 저장자체가 불가하여 0이 연속적으로 나오게 됩니다. 이는 int라는 숫자에 할당된 32비트에 대한 숫자표현을 넘어서므로 이후 숫자표현에 대해 overflow가 나오면서 error가 나게 되는것입니다.