-
CS50 2019 (3)변수, 조건->루프, 디자인적 관점, 연산자CS50 2021. 8. 9. 20:28
===
모두를 위한 컴퓨터 과학 (CS50 2019)
부스트코스 무료 강의
www.boostcourse.org
1.컴퓨팅사고
2.C언어
3.배열
4.알고리즘
5.메모리
6.자료구조
===
3)조건문과 루프
프로그램 실행할 땐 앞에 현재 폴더를 가리키는 ./ 를 입력! ./hello
□서버 내 폴더가 여러 개일 수도 있으니까요
===
@변수
스크래치에서 변수를 counter라고 이름 붙이고 처음에 0으로 설정,
C에선? counter = 0
이걸론 부족한게, 변수를 설정할 땐 컴퓨터에게 변수의 종류가 무엇인지 알려줘야 함. 아까는 string(단어저장변수)
이번엔 숫자저장하고싶음. C에서는 이런 정수데이터를 integer라고 부름. 줄여서 int
int counter = 0;
1)int형식의 변수를 선언.
2)그 변수를 counter라고 부른 뒤
3)그 값에 0을 저장(=는 할당연산자)
이제 변수에 다른 연산 수행 가능, 스크래치에서 했던 증가 기능 등
counter = counter +1 (오른쪽에서 왼쪽으로 할당)
끝에 ;붙여줘야하고, int선언은 윗줄에서 했으니까 괜찮.(counter라는 변수에 정수 값을 저장할 것이라고 말해준 것)
counter += 1;
라고 해도 똑같음 변수증가는 하도 흔한 연산이라서 다른 방법이 또 있는 것.
counter ++;
라고 해도 똑같음, 이는 프로그래밍에서 구문 설탕이라고 부르는데, 새로운 기능을 추가해주진 않지만 기존 기능을 더욱 보기 좋고 간결하게 활용할 수 있도록 해줍니다.
===
@조건
스크래치에서, 뭔가를 결정할 때 필요한 것, ex.뭔가가 참이면 이것을 해라
C에선,
if (x < y)
{
printf(“x is less than y\n”);
}
라고 함. C에서 조건을 추가할 때 사용하는 일종의 패턴.
네이버설명 :
스크래치의 조건문을 C로 표현했다
()안에 검사하고자 하는 조건이 들어간다
{}안에는 조건을 만족할 때 수행하고자 하는 작업이 들어간다
~이면이 있으면 아니라면 도 있을거아냐
그냥 밑에 else{}하면 됨
if (x < y)
{
printf(“x is less than y\n”);
}
else
{
printf(“x is not less than y\n”);
}
조건과 같은 애들은 세미콜론 안 붙이고, 함수가 들어간 줄들은 세미콜론으로 끝냄.
if (x < y)
{
printf(“x is less than y\n”);
}
else if (x > y)
{
printf(“x is greater than y\n”);
}
else if (x == y)
{
printf(“x is equal to y\n”);
}
도 있다.
등호 표시 2개(==)(일치 연산자)가 같은거다. 이미 등호 표시를 할당 연산자로 써서 저렇게 약속함.
불리언표현은 예/아니오, 참/거짓, 혹은 1/0의 만 답할 수 있고,
모든 경우는 작거나, 크거나, 같다인데, 엄밀히 생각하면 두개를 물어봤으면 나머지 하나는 굳이 물어볼 필요는 없다.
마지막 else if (x == y)는 그냥 else라고 해도 된다.
->더 적은 메모리, CPU컴퓨터의 뇌용량을 사용해서 코드가 일을 수행하는지와 같은 디자인 품질이라는 것이 있다
===
@루프
while
{
}
로 표현. 스크래치의 forever와 비슷.
계속 반복하는 상황을 나타내기 위해 옛사람들이 정함.
+불리언 표현에도 답해야 한다.
C에서 루프를 구현하고 싶다면 성립 조건을 정해줘야 함.
(답이 네, 참, 1로 나올 수 있는 질문을 던져줘야 한다.)
(프로그래머에게 네, 참, 1은 다 같다)
5는 5와 같다. 2는 1보다 크다 등 아무거나 가져와도 되지만 그냥 true라고 쓰면 됨.
정의에 따라 true는 언제나 참이고 false는 언제나 거짓
while (true)
{
}
===
50번 반복하기?
int counter = 0; 프로그래머들은 뭔가를 셀 때 정수를 나타내는 i로 표현
int i = 0;
여기에 어떤 질문을 계속 물어보는 것임
int i = 0;
while ( i < 50 )
{
printf(“hello, world\n”);
i = i + 1; (-> i++; 로 만들 수 있음)
}
위에서 i를 만들어놓고, 반복문안에서 그 i에 1씩 더해
===
@for
특정 횟수만큼 반복될 때 더 자주 사용, 훨씬 더 기계적
for 루프는 for () 괄호 안에 3개의 입력을 받음,
-변수 선언 : https://dojang.io/mod/page/view.php?id=206
-계속해서 묻고자 하는 불리언,
-변수를 어떻게 수정할까
for (int i = 0; i < 50; i = i + 1;) -- -> 또는 i += 1, i++
{
printf(“hello, world\n”);
}
(네이버 설명엔 변수초기화; 변수 조건; 변수 증가; 라고함,
변수초기화하고 i가 50인지 매번 검사하고, 이를 만족하면
{ }안의 내용을 수행한 후 i를 1씩 증가시키는다는 의미)
이러면 네줄만에 코드를 완성, 코드를 몇 줄을 줄일 수 있다.
#include <stdio.h>
int main(void)
{
for(int i = 0; i<50; i++;)
▽왜 세 번째건 ;안해?? c언어의 for문에서 ;는 i=0, i<10, i++ 이 세개의 조건을 구분하기 위한 것으로 마지막 i++에는 필요하지 않습니다.(문법이므로 이렇게 이해하시면 될 것 같습니다.)
while의 (i<10)도 같은 맥락에서 이해하시면 좋겠습니다.
=====================
4)자료형, 형식 지정자, 연산자
C의 데이터타입은 정수나 문자열 외에도 있다.
bool : 참/거짓의 값을 가짐, while(true)와 같이 사용 : (True, False, 1, 0, yes, no)
char : 딱 한 개의 문자, yes/no를 나타내는 y나 n이 그 예시
double : 소수점 뒤에 더 많은 숫자를 가질 수 있는 실수들.(부동소수점을 포함한 더 큰 실수)
float : 실수, 소수점이 있는 수들.(부동소수점을 갖는 실수)
int : 정수(특정 크기 또는 특정 비트까지의 정수)
long : int는 특정 크기를 가지지만(정해진 수까지만 셀 수 있음, 보통 40억), 더 많은 비트 사용, 더 높은 정수
string : 쌍따옴표 안에 들어간 한 개 이상의 문자들, 보통 char하나하나 보다 큼
…
예를 들어 CS50라이브러리의 get함수들, 모두 사용자에게 특정값을 물어보고 그들이 입력한 값을 사용할 수 있도록 해줌
get_string
get_long
get_int
get_float
get_double
get_char
…
형식지정자는? printf 에선 문자열에 %s를 썼지.
%c
%f : float, double
%i : int
%li : long
===
@연산, int.c 만들기
#include <cs50.h>
#include <stdio.h>
int main(void) 이건 나중에 알려줄게 뭔지
{
int age = get_int(“What’s your age?\n”); [What~는 사용자에게 보일 프롬프트
(prompt:결정을 내리도록 하다)
여기서 사용자가 입력한 값은 오른쪽에서 왼쪽으로 복사되어 age라는 변수에 저장됨.]
int days = age * 365;
printf(“You are at least %i days old.\n”, days); 형식지정자니까 뒤에 , 하고 써줘야해
}
->이걸 아래처럼 더 잘 설계 할 수 있다
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int age = get_int(“What’s your age?\n”);
int days = age * 365; 없애고
printf(“You are at least %i days old.\n”, age * 365); 를 넣으면 됨.
}
->이걸 아래처럼 다르게 설계 할 수 있다
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int age = get_int(“What’s your age?\n”); 없애고
printf(“You are at least %i days old.\n”, get_int(“What’s your age?\n”);); 를 넣으면 됨.
[▽이렇게 해도 되는구나?]
[변수가 꼭 필요한 건 아님, 한 함수의 출력을 다른 함수의 입력으로 넣어서 변수를 굳이 만들지 않아도 됨]
[근데 이 코드는 너무 길어서 가독성이 너무 떨어짐, 왼쪽에서 오른쪽으로 읽기(좌우로 길어서)보다 시선이 위에서 아래로 읽을 수 있는게 디자인적 관점으로 좋은 코드(라고 말하는데 취향차이일수도 있다고 한다), 읽기편하고 이해하기 쉬운 코드가 좋은 코드다]
}
===
@float.c 만들기
#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); [메사추세스 부가세 6.25%]
}
이때 100달러 넣으면 106.250000 나오는데 저번에 배웠던 것처럼(▽그랬나?)컴퓨터는 특정 수의 비트를 사용해서 숫자를 저장하고, 그 비트를 활용하면 이만큼의 숫자를 소수점 뒤에 나타낼 수 있기 때문.
%f대신 %.2f를 넣으면(책이나 관련 문서를 찾아봐야만 알 수 있는 방법.) 소수점 뒤 2자리만을 보여줌.
이게 바로 printf 의 f, 뭔가를 화면에 출력할 때 이런식으로 형식화할 수 있음. ▽format이겠지
===
@parity.c 만들기 : parity는 어떤 숫자가 홀수인지 짝수인지를 나타낸대(Parity Bit 검색)
#include <cs50.h> : 파일 추가
#include <stdio.h> : 파일 추가
int main(void)
{
int n = get_int(“n: ”);
(1)
if(n == 1)…처럼 1이면 홀, 2면 짝, 3이면 홀….. 다 쓸 수도 있겠지만
(2)
if (n % 2 == 0) : %는 연산자, 곱셈 나눗셈 아니고 나눈 나머지를 나타내는 연산자.
{
printf(“even\n”);
}
else if (n % 2 == 1) : 그냥 else만 써도 되겠지
{
printf(“odd\n”);
}
}
get_string이나 get_int 같은 함수들은 사용자로 하여금 우리가 원하는 값을 입력하도록 강제함
에러를 미연에 방지하기 위해. 다른값 입력하면 같은 질문을 다시 물어봄
===
@conditions.c
// : 프로그래밍에서 말하는 주석, 기능적으로는 아무 의미 없는, (▽나중에 다 까먹었을)자신이나 친구나 조교를 위한 설명, 이 코드가 무슨 일을 하는지 설명하는 내용, 버그가 있어서 코드가 제대로 돌아가지 않더라도 말이죠.
코드가 수백 수천줄이면 주석이 없다면 부분 부분마다 어떤 일을 하는지 찾기 힘들 것, 타인 말고 자기 자신에게도 해당. 작성한 사람조차도 한달 뒤, 일년 뒤에 보면 새롭기 때문. 주석으로 설명하는 습관이 중요
(앞서 배웠지만)라이브러리 : 우리가 사용하려고 하는 다른 사람이 작성한 코드
===
텍스트 기반의 터미널 창에서는 폴더를 더블클릭으로 열수 없기 때문에
ls를 누르면 디렉토리 안에 있는 파일들이 보이고
src1/가 있는데 끝에 /가 붙여져 있는 건 폴더다.
(*가 실행 가능한 머신코드 임을 알려줬던 것처럼 컴퓨터의 표현)
그 디렉토리로 변경해야 하는데 더블클릭은 할 수 없다. 대신! cd src1라고 칠 수 있음. cd는 디렉토리 변경이라는 뜻(change directory겠지). pwd라고 치면 현재 주소가 나옴.
현재 내가 어디있는지 헷갈릴 수가 있음 탐색기처럼 돼 있는게 아니니까.
cd라고만 치면 기본 설정 디렉토리로 감.
===
@agree.c
get_char를 쓸 수 있다.
수직바두개 | | (엔터키위에 shift누르고 하면) : or : 이 질문 또는 이 질문을 하고 둘 중 하나 이상 유효하다면 이것
if (c == ‘Y’ || c == ‘y’)
&& : 그리고. 질문 두 개를 한꺼번에 물어보고 두 답 모두 사용 : and
Y나 y말고 다른걸 쓴다면? 아무일도 안 일어남
|| : 또는
/ : 나누기
% : 나머지
// : 주석
참고) #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 처럼 미리 설치가 된 곳이 아니면 따로 설치를 하여야만 사용이 가능합니다. 설치하는 방법은 현재 수준에서 필요한 것이 아니기 때문에 아래 첨부된 CS50 라이브러리 문서를 참고해 주세요.(https://cs50.readthedocs.io/libraries/cs50/c/)
추가로 CS50 라이브러리의 get_int, get_float 등의 함수로 좀 더 쉽게 입력을 받아 보았는데요, 일반적으로 사용되는 입력을 받는 함수도 아래의 참고자료를 통해 학습하실 수 있게 준비해 두었으니 참고하시면 좋을 것 같습니다.(https://opentutorials.org/module/3921/23575)'CS50' 카테고리의 다른 글
CS50 2019 (6)배열 (0) 2021.08.09 CS50 2019 (5)컴파일(4단계), 디버깅, 코드의 디자인 (0) 2021.08.09 CS50 2019 (4)사용자정의함수(vs루프), 추상화, 프로토타입, 오버플로우 (0) 2021.08.09 CS50 2019 (2)C, .c, #include, .out, -o, 문자열, printf, %, 표준라이브러리, 라이브러리 사용, make (0) 2021.08.09 CS50 2019 (1)컴퓨터 과학은 문제해결 상자, 정보표현, 내 문제해결을 기계에게 번역 (0) 2021.08.09