모두를 위한 컴퓨터 과학(CS50 2019) - 2. C언어

CS50 Sandbox 사용안내받으며 사전 확인을 하는데 자꾸 오류가 나서 울뻐누ㅜㅜ
확실히 오류안내를 해주지만 영어로 하기때문에 영어가 확실히 익숙해질 필요는 있음 ㅜㅜㅜㅜ
print를 사용하는 것만 익숫해서 printf....가 손에 안익는다 ; 도 빼먹지 말기

c언어의 기초

들어가기 전에

그래픽 인터페이스로 상호작용성이 좋은 스크래치로도 간단한 프로그래밍을 할 수 있지만, 텍스트 기반의 프로그래밍 언어를 이용해도 컴퓨터에게 동일한 일을 하게 할 수 있습니다. 가장 널리 쓰이는 프로그래밍 언어중 하나인 C의 기초를 배워보겠습니다.

학습 목표

C로 “hello, world”를 출력하는 프로그램을 만들 수 있습니다.

핵심 단어

stdio.h
clang
컴파일러

c언어는 아주오래되고 전통적인 순수텍스트 기반의 언어
기계어에 가까운 언어라 인간에게 친숙하지는 않다

지난 수업 스크레치와 내용이 거의 동일하다

int main(void) 는 스크래치의 “초록색 깃발을 클릭했을 때” 블록과 같은 역할을 합니다. 즉 '시작한다'의 의미를 가지고 있다고 보면 됩니다. 시작하는 역활을 가지고 있다.
앞으로 우리가 작성할 코드 모두는 이 int main(void) { }의 중괄호 사이에 작성하게 될 것 입니다.

C에서는 스크래치에서의 say라는 함수는 없습니다. 대신에 printf라는 함수가 있습니다. say 대신에 printf를 사용
printf(“hello, world\n”) 은 스크래치의 “‘hello, world’라고 말하기” 블록과 같은 역할을 합니다.

글자나 단어, 문장을 적을 때는 언제나 텍스트에 " " 쌍따옴표로 감싸야 합니다.

그리고 우리가 일상에서 문장의 끝에 마침표(.)를 붙이는 것 처럼 C에서는 세미콜론(;)을 붙여야 합니다. 작성한 토드 {}안에 적용하는 법
c언어 작성시 자주 뺴먹는 것.

(아래 사진파일에는 나와있지 않지만 \n은 줄바꿈의 기능을 합니다. 키보드에서 ENTER의 기능과 동일합니다.)

위의 여러가지 기능들은 C에서 중요하게 사용되는 기본적인 내용이므로 꼭! 기억해주세요.

#include <stdio.h>는 “stdio.h”라는 이름의 파일을 찾아서 “printf” 함수에 접근할 수 있도록 해줍니다.
c에서 스크래치의 블록과 같은 함수를 사용하기 위해서는 컴퓨터에게 그 함수가 어디에 구형되어 있는지 또는 어디에 저장되어있느지 알려줘야 함
즉 해당 파일이 무슨 파일이든 함수를 구현하기 위해서 파일을 찾아서 파일을 들어다 봐알

이게 무슨 말일까? 라고 생각이 드실 거라고 생각이 듭니다.

하지만 이것은 지금 크게 중요하지 않습니다.

오늘 제일 중요한 것은 중간에 있는 printf("hello, world")입니다. 이분이 중요

각자의 컴퓨터 환경이 다를 태니 샌드박스cs50를 사용
위의 부분은 실제 코드를 작성하ㅡㄴㄴ 부분 또를 파일을 새로 생성하고 저정하는 곳
아래는 터미널창( 일종의 옛날 인터페이스/ 프롬프트에 입력하고 엔터치면 실행가능)
명령어 입력방식

우리가 Word로 문서를 저장했을때 "문서.docx"와 같이 .docx가 붙는 것 처럼,

C로 작성한 코드는 “파일이름.c”로 저장해야 합니다. (확장자 “.c”는 C로 작성된 코드라는 의미입니다.)

마이크로소프트의 Word 처럼 자동적으로 붙여주지 않기 때문에 C의 경우에는 직접 .c를 붙여줘야 합니다.

컴파일러 (프로그램을 실행하기 위해 반드시 있어야 하는 것)

우리가 직접 작성한 코드는 “소스 코드” 라고 불립니다. 이를 2진수로 작성된 “머신 코드”로 변환해야 컴퓨터가 이해할 수 있도록 2진법으로 변경하는 작엄 컴파일러라는 프로그램이 수행해줍니다.

c언어로 된 소스코드를 입력받아 머신코드(컴퓨터가 실제로 이해하는 0과 1로 이루어하는 것)으로 출력하는 프로그램(소프트위어 알고리짐)이 이를 컴파일러

터미널차에서 입력할 명령어
터미널창의 명령어 프롬프트에서 “$” 기호 옆에우리가 원하는 명령어를 입력하면 됩니다.

clang hello.c 라는 명령어는 “clang”(코드를 컴파일하는 프로그램의 이름) 이라는 컴파일러로 “hello.c”라는 코드를 컴파일하라는 의미입니다.

그 결과 a.out 이라는 파일이 생성됩니다. 안에는 머신코드가 있음.2진법
이과정에서 a.out에 해당되는 파일을 명을 바꿀 수가 있다 처음 컴파일할때
$clang -o hello hello.c 를 실행하면
hello명으로 머신코드로 저쟝된 파일이 생성된다.

./a. out 이라는 명령어를 실행하면 컴퓨터가 현재 디렉토리에 있는 a.out이라는 프로그램을 실행하게 해줍니다.
(./a. out에서 제일 앞에 있는 .은 지금 있는 현재 폴더를 나타냅니다.)

hello, world$ $는 프롬프트에 지나지 않음 보기 좋지 않음
c는 시키는 일만 함.
\n를 입력함으로 $를 아래로 보내ㄴ다.

ls는 리스트의 약자 파일리스트를 보여준다.
*의 이미는 실행가능하는 뜻 컴퓨터가 이해가능한 머신코드라는 뜻
즉ls를 통해서 머신코드와 소스코드를 구분할 수 가 있다.

rm 파일을 지울때 사용 > 물어봄 > 답함 > 실행이됨

간단한 명령어 마우스와 ul로 가능할걸 명령어로 가능함을 의미함

참고) 왜 저는 줄바꿈 할때 (백슬래시)가 ₩(원화)로 보이는 것이죠?
-> 해당 문제는 '한글 윈도우' 운영체제에서만 생기는 현상입니다.
한글 윈도우에서는 \를 ₩로 표시를 해주기 때문입니다. 따라서 ₩로 표시가 되어도 문제 없습니다.

실습 hello, boostcourse를 c로 출력하기

문자열

들어가기 전에

문자열을 다루기 위해서는 문자열 형식을 가진 변수가 필요합니다. 사용자로부터 문자열을 입력받고 이를 다른 문자열과 합쳐서 출력하는 프로그램을 C로 작성해보겠습니다.

학습 목표

C로 문자열 형식을 가진 변수를 선언하고 출력하는 프로그램을 만들 수 있습니다.

핵심 단어

형식지정자
string
make

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

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

사용자의 이름을 받아서 저장할 변수를 스크래치와 같이 answer이라고 정해보겠습니다.

이때 변수는 xyz, name 등과 같이 여러분 마음대로 정하셔도 무관합니다.

하지만 여기서 유의해할 점은 C는 오래된 언어이기 때문에 변수가 저장하는 데이터의 종류를 아주 정확하게 명시해줘야 합니다.

그래서 우리는 저장하고자 하는 값의 종류가 문자열(string)이라는 것을 알려줘야 합니다. 이때 string을 형식지정자라고 합니다.

왜냐하면 너무나 당연하게 이름은 숫자가 아닌 문자이기 때문에 컴퓨터에게 "answer에 들어갈 것들은 문자야!"라고 말해주는 것이죠

string 이외에도 여러가지 종류가 있지만 그 것은 다음에 알아보도록 하겠습니다.

세미클론은 반드시 하기!!

우리가 일반적으로 사용하는 =은 같다 입니다.

하지만 프로그래밍 언어에서는 오른쪽에서 왼쪽으로 가는 화살표와 비슷하다고 생각해주시면 좋습니다.

쉽게 말하자면 오른쪽에 있는 것을 왼쪽에 지정한다는 것이죠. 이를 할당 연산자라고 합니다.

get_string 함수가 사용자의 이름을 반환하면 그 이름을 anwser이라는 변수에 저장하는 것입니다.

오른쪽에서 왼쪽으로 말이죠

이제 컴퓨터의 메모리 어딘가에 사용자의 이름이 저장되어 있는 것입니다.

그럼 이 것을 printf 함수(뭔가를 화면상에 출력하고 싶을 때 사용하는 함수로 출력을 해보도록 하겠습니다.

이때 유의할 점은 printf("hello, answer");이 아니라는 점입니다.

이 코드를 실행한다면 answer이 출력이 되어 hello, answer이 그대로 결과로 나옵니다.

우리는 answer이라는 변수에 들어있는 이름을 출력을 해야하기 때문에 %를 사용해 줍니다.
사용자의 입ㅈ력과 함쳐야됨
형식 지정자를 사용. - 화면상에 출력하고자 하는 구절이나 문장을 적는데 그 값이 뭔지 아직 모른다ㅏ면 %와 문자열을 의미하는 s를 적어 형식 지정자를 사용. 아직 누가 사용할지 모르기 때문 - 미래에 누군가 어느때에 사용해도 작동이 되도록 설정
%s

c언어는 인자를 하나 또른 무 또는 여러개를 받을 수 잇는데 이떄 구분하는 것이,다.
이 때도 어떤 종류의 인자를 받는지 말해줘야 합니다.

우리는 이름이라는 문자열을 받기때문에 string에서의 s를 %뒤에 붙여서 인자를 받아줍니다.

그래서 최종적으로는 printf("hello, %s\n", answer);이 되는 것입니다.

오른쪽에서 왼쪽으로 바깥쪽에서로 안쪽으로 살펴보면 코드를 유추할 수 가 있음.

입력하고자 하는 값이 문자열이라면 모든 형식 지정자에 %s가 필요함.

문자열이란 "" 안에 들어간 0개 이상의 문자

오류가 생기는데 이는 아직 이 상테에서 c 에 문자열이 없기 때문
가장 위에 포함된 cs50.h 파일 안에 string이라는 문자열 형식과 get_string 이라는 함수에 대한 코드가 포함되어 있습니다. 이 파일을 포함해야만 전체 코드를 컴파일 하고 실행할 수 있습니다.

위의 소스코드에 #include<cs50.h>를 입력해야됨
문자열과 위의 함수를 컴퓨터가 몰랐기에 생기는 오류

아직도 버그가 존재.
켓스트링을 정의되지 않았음CS50와 연결하기
-lcs50를 터미널에 붙이기 다시 한번 알려주기 즉 컴퓨터가 해당파일을 참고하여 다시 한 번 추가 할 수 있도록 도움

위의 과정은 복잡. 개념만 이해하고 명령어를 모두 외지 말기
string를 만들기 > 터미널이 make string입력
make는 알아서 어떤 인자를 사용해야할지 파일명은 무엇으로 할지 다른 사람들은 어떤 라이브러리나 코드를 연결했는지 등을 찾아줌

make+프로그램 이름 > 컴부터가 찾음 (파일이 아님

터미널창에 아래 명령어를 입력하여 컴파일을 할 수 있습니다.

생각해보기

"좋아하는 동물을 알려주세요"로 질문하여 동물 이름을 animal이라는 변수에 저장하고, 이를 "내가 좋아하는 동물은"으로 출력해주는 코드를 작성해보세요.

#include <cs50.h>
#include <stdio.h>
int main(void){
 animal string =  get_string("좋아하는 동물을 알려주세요\n");
 printf("내가 좋아하는 동물은 %s \n", animal);
 }
 
 make string
 clang -o string string.c

조건문과 루프

들어가기 전에

스크래치에서 블록으로 표현했던 조건문과 루프 또한 C로 동일하게 구현할 수 있습니다. 스크래치에서 여러 기능을 가진 블록들을 이어붙였던 것 처럼 C의 다양한 문법을 이용하면 조건문과 루프를 더 간단한 텍스트 형식으로 표현할 수 있습니다.

학습 목표

조건문과 루프를 c로 작성할 수 있습니다.

핵심 단어

int
if
while
for

좋은 웹페이지 즐겨찾기