2022.9.15.(木)
CS50
C언어로 만세 삼창하는 프로그램 만들기
// CS50 강의에서 사용하는 특별 라이브러리를 사용한다.
#include <stdio.h>
#include <cs50.h>
int main (void)
{
printf("만세!\n");
printf("만세!\n");
printf("만세!\n");
}
와! 너무 비효율적이다...
복합 할당 연산자를 이용한 카운트를 써보자.
#include <stdio.h>
#include <cs50.h>
int main (void)
{
// i라는 변수에 0을 할당하고, 3미만이 될때까지 1씩 더하며 만세를 출력한다.
for (int i = 0; i < 3; i++)
{
printf("만세!\n");
}
}
아까보단 괜찮지만, 더 나은 방법이 있을지도...
만세를 출력하는 함수를 따로 만들어보자.
#include <stdio.h>
#include <cs50.h>
// 만세!를 출력하는 함수
void hooray(void)
{
printf("만세!\n");
}
// 3번 카운트하며 hooray 함수를 실행
int main (void)
{
for (int i = 0; i < 3; i++)
{
hooray();
}
}
뭔가 핵심인 main 함수를 가장 위로 올리고 싶다.
그러나 그대로 올리면 오류가 발생하는데, 이유는 C가 좀 멍청해서다...
순서대로 읽어나가면서 처리하는 C는 hooray 함수가 아래 행에 있으면 알아먹지 못한당
방법은 main 함수 위에 한번 얼굴을 비춰주면 된다.
이를 프로토타입 이라고 한다.
#include <stdio.h>
#include <cs50.h>
// 얼굴 한번 비춰주기 (프로토타입)
void hooray(void);
// 3번 카운트하며 hooray 함수를 실행
int main (void)
{
for (int i = 0; i < 3; i++)
{
hooray();
}
}
// hooray 함수의 본체는 여기다
void hooray(void)
{
printf("만세!\n");
}
이제 내가 원하는 만큼 만세하는 프로그램을 만들어보자
아예 hooray 함수에 카운트도 넣고, main함수에서 hooray 함수의 횟수를 지정하게 한다.
#include <stdio.h>
#include <cs50.h>
// 프로토타입
void hooray(int n);
// 만세 함수를 n번 실행한다.
int main (void)
{
hooray(n); // n에 내가 원하는 횟수를 입력하면 그만큼 만세를 부른다.
}
// 만세를 n번 카운트하고 출력하는 함수
void hooray(int n)
{
for (int i = 0; i < n; i++)
{
printf("만세!\n");
}
}
그러고보니
함수 앞뒤로 붙은 void와 자료형은 무슨 뜻일까
void main(void)
앞은 출력(out, 반환)의 종류를 명시한다.
뒤는 입력(input)의 종류를 명시한다.
아무것도 출력하지 않거나 입력하지 않는다면 void를 넣는다.
사용자정의 함수 예제
양의 정수만을 입력받아 다시 출력하는 프로그램을 만들기
#include<stdio.h>
#include<cs50.h>
// 양의 정수를 입력받는 함수의 프로토타입
int get_positive_int(void);
// 출력하는 기능을 메인 함수로 만들자
int main(void)
{
int i = get_positive_int();
printf("%i는 양의 정수가 맞습니다. 잘했어요 ^^\n",i);
}
// 양의 정수를 입력받는 사용자정의 함수의 본체는 여기다!
// do while 문을 사용하여 양의 정수를 받을 때까지 계속 물어봄
int get_positive_int(void)
{
int n; // 뭐가 될지 모르니 변수 n을 선언해둔다.
do // 일단 아래를 실행하기
{
n= get_int("양의 정수를 입력하시오 : "); // 참고로 get_int는 cs50 라이브러리에 있는 함수
}
// 입력받은 값이 1보다 작을 동안(while) 계속 하라는(do) 뜻
// 그러다 더 이상 1보다 작지 않다면, n을 반환한다.
while(n<1);
return n;
}
루프를 중첩 시킬 수도 있쥐
입력받은 정수 크기에 비례한 n x n 블록을 생성하는 프로그램
#include <cs50.h>
#include <stdio.h>
int main(void)
{
int n;
do
{
// n x n 형태의 블록을 만들거임, 정수의 n값을 입력받음
n = get_int("블록크기 : "); // 참고로 get_int는 CS50 라이브러리에 있는 함수
}
// 양의 정수만 받을거임, 0이나 음수라면 블록을 만들 수 없으니까...
// 그래서 루프를 만들었다. 사용자가 양의 정수를 입력해주지 않는 한 나갈수 없는!
// 얌전히 양의 정수를 입력하시지!
while (n<1);
// 입력받은 정수 만큼 줄바꿈하고 아래의 블록을 나열하는 루프문을 실행함
for (int i = 0; i <n; i++)
{
// 입력받은 수 만큼의 ㅁ블록을 나열하는 for루프문
for (int j = 0; j<n; j++)
{
print("ㅁ");
}
printf("\n");
}
}
사용자 정의 함수의 좋은 점
- 코드가 간결하다
- 뵈기 좋다
- 가독성이 좋다
- 협업 및 유지보수에 용이하다
- 반복적 작업에 특히 용이하다
모던 Javascript 튜토리얼
<기본 연산자와 수학>
단항, 이항, 피연산자
- 피연산자 : 연산 되어지는 대상, 인자라고도 불린다.
- 단항 연산자 : 피연산자를 하나만 받는 연산자
- 이항 연산자 : 피연산자가 2개
나머지 연산자 %
alert(5 % 2); // 5를 2로 나누고 나머지인 1을 출력!
거듭제곱 연산자 **
alert(2 ** 4); // 16 (2*2*2*2)
+와 문자열 연결
alert("안녕"+"하세요"); // 안녕하세요
alert("1"+2); // 12 (하나가 문자열이면 다른 하나도 문자열로 변환됩니당)
alert(1+1+"1"); // 21 (앞의 연산을 정상적으로 하고 뒤에 1을 붙여주는 형식이 됩니다.
[형변환 챕터 참고]
- / * 는 숫자로 변환후 수학연산을 진행한다.
let test = 1+1+"1";
alert(typeof test); // string
+와 숫자형으로의 변환
+는 단항연산자로도 사용될 수 있다. 숫자에 영향을 미치지 않으나
숫자형이 아닌 것을 숫자형으로 바꿔준다!
alert(+true); // 1
alert(+"") //0
let a = "1";
let b = "2";
alert (a+b); // 12
alert (+a + +b); // 3
// 이게 되는 이유 : 단항 덧셈 연산자의 우선 순위가 (이항)덧셈 연산자보다 높아서
할당 연산자
let x = 1; // x 상자에 1을 할당한다!
체이닝도 가능
let a,b,c;
a = b = c = 1+1;
alert (a); // 2
alert (b); // 2
alert (c); // 2
복합 할당 연산자
let n = 2;
n = n+2;
n = n*2;
alert(n); // 8
// 위와 같은 복합 할당 연산자는...
let n = 2;
n += 2;
n *= 2;
alert(n); // 8
(복합)할당 연산자는 대부분 다른 연산자가 실행된 뒤에 실행되는 낮은 우선순위를 갖는다.
let n = 2;
n *= 1 + 3; // 1+3이 먼저 실행된 후 복합 할당연산자가 실행된다.
alert(n); // 8 출력
증가/감소 연산자
변수에만 사용가능!
- ++ : 1 증가
- -- : 1 감소
let counter = 2;
counter++;
alert(counter); // 3
let counter = 2;
counter--;
alert(counter); // 1
5++ // 에러
- counter++ : 후위형
- ++counter : 전위형
후위형과 전위형은 반환에서 차이가 드러난다
let counter = 1;
let a = ++counter;
alert(a); //2
let counter= 1;
let a = counter++;
alert(a); // 1
//counter를 증가시키긴 하지만, 기존값을 반환합니다.
증가/감소 연산자 의 우선순위는 꽤 높아서 대부분의 산술 연산자보다 평가가 이루어진다.
코드 한줄엔 특정 동작 하나만
let counter =1;
alert( 2 * counter);
counter++
비트 연산자
인수를 32비트 정수로 변환하여 이진 연산을 수행한다.
- 비트 AND &
- 비트 OR |
- 비트 XOR ^
- 비트 NOT ~
- 왼쪽 시프트 <<
- 오른쪽 시프트 >>
- 부호없는 오픈쪽 시프트 >>>
쉼표 연산자
보기 드믄 연산자, 우선순위가 할당연산자보다도 낮음
let a = (1+2, 3+4);
alert(a); // 7 (3+4의 결과)
복잡한 구조에서 코드를 짧게 쓰려는 의도로 사용되며 가독성이 떨어진다.
왠만해선 쓰지말아요...
- \t : 수평탭
- \n : 줄바꿈
prompt 함수는 사용자입력을 문자열로 반환함
이거 고쳐보기
let a = prompt("첫번째 숫자",1);
let b = prompt("두번째 숫자",2);
alert(a+b); // 12가 아니라 3이 나오게 고쳐보자
고친 거
let a = prompt("첫번째 숫자",1);
let b = prompt("두번째 숫자",2);
alert(+a + +b); // 3
let a = prompt("첫번째 숫자",1);
let b = prompt("두번째 숫자",2);
alert(Number(a)+Number(b)); // 3
let a = +prompt("첫번째 숫자",1);
let b = +prompt("두번째 숫자",2);
alert(a+b); // 3