모두를 위한 컴퓨터 과학 Chapter 2. C언어

Ryoni·2021년 12월 27일
0
post-thumbnail

아직도.. 모든 글자와 코드 조차도 이해하지 못했다면요..?

C언어

  • 아주 오래되고 전통적인 순수 텍스트 기반의 언어
  • int main(void){} → 시작의 의미!
  • 출력문 : printf();
  • #include<stdio.h> : "stdio.h"라는 이름의 파일을 찾아서 printf 함수에 접근할 수 있도록 함

컴파일러

  • "$" 기호 옆에 우리가 원하는 명령어 입력
  • clang hello.c 라는 명령어는 컴파일러로 "hello.c"라는 코드를 컴파일 하라는 의미

💡 생각해보기

Q. 아래의 실습하기로 "hello. bootcourse"를 출력해보세요.

#include <stdio.h>

int main(void)
{
    printf("hello. bootcourse\n");
}

문자열

get_String

→ 자바의 Scanner sc = new Scanner(System.in); 역할

  • %s 를 이용해 String 타입의 문자열 반환

💡 생각해보기

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

#include<cs50.h>

#include<stdio.h>

int main(void)

{

string answer=get_string("좋아하는 동물을 알려주세요\n");

printf("내가 좋아하는 동물은, %s\n", answer);

}

조건문과 루프

조건문

if(x < y) {
printf("x는 y보다 작다\n");
}else if (x > y){
printf("x는 y보다 작지 않다\n");
}else{
printf("x와 y는 같다");

if - 단일 조건문
else if - 다중 조건문
else - 조건을 물어볼 필요가 없을 때 사용

루프

while(조건) {
	반복하여 실행할 문장 작성
}
for(int i = 0; i < 50; i = i+1){
	printf("hello, world\n");
}

💡 생각해보기

Q. 학습한 다양한 방법을 이용하여 "개발공부는 재미있다!"를 10번 출력하는 코드를 작성해보세요.

#include <stdio.h>

int main(void) {
for(int i=0; i<10;i++) {
	printf("개발공부는 재미있다!\n");
	}
}

자료형, 형식 지정자, 연산자

데이터 타입

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: 부동소수점을 포함한 더 큰 실수

형식 지정자

printf 함수에서는 각 데이터 타입을 위한 형식 지정자 사용 가능
%c : char
%f : float, double
%i : int
%li : long
%s : string

기타 연산자 및 주석

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

💡 생각해보기

Q. 짝수인지 홀수인지 알려주는 코드짜기에 자신의 스타일대로 주석을 달아보고 다른 수강생은 어떻게 주석을 달았는지 비교해보세요.

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

int main(void){
int n =get_int("n: ");//사용자 값을 받기

if(n%2==0){ //짝수인지 확인
	printf("even\n");
} else { // 홀수인지 확인
	printf("odd\n");
}
}

사용자 정의 함수, 중첩 루프

사용자 정의 함수


비어 있는 변수를 활용하여 함수 선언만 미리 해 두고 나중에 값을 넣음으로써 출력 진행의 방법

중첩 루프


화면에 여러 개의 이미지를 가로나 세로로 여러 개 이어서 출력하고 싶을 때 for 루프 이용하여 작성 진행
정수 값을 갖는 변수 n 선언 후 do{…} while()문 이용하여 조건이 만족할 때 까지 get_int 함수 이용하여 n에 저장
for 루프를 두 번 중첩해서 돌면서 "#" 출력
가로 n개, 세로 n개의 "#" 출력

💡 생각해보기

Q. 사용자 정의 함수를 사용하는 것의 장점은 무엇일까요?

  • 코드 재활용이 가능하고 코드의 가독성을 높일 수 있다. 유지보수에도 용이..!!

하드웨어의 한계

부동 소수점 부정확성

컴퓨터는 RAM(Random Access Memory)이라는 물리적 저장장치를 포함하고 있다
우리가 작성한 프로그램들은 구동 중 RAM에 저장되는데, 유한한 크기의 비트만 저장할 수 있기 때문에 부정확한 결과를 나타내기도 한다.

예를 들어 이런 결과.
정확한 결과는 0.1이 되어야 하지만, float에서 저장 가능한 비트 수가 유한하기 때문에 다소 부정확한 결과를 나타낸다

정수 오버플로우

int 타입이 저장할 수 있는 수를 넘은 이후에는 아래와 같은 에러가 나옴

정수를 계속 키우는 프로그램에서 10억을 넘기자 앞으로 넘어갈 1의 자리가 없어져 그 이상의 숫자는 저장 불가

Y2K문제

  • 새해가 오면 '99'에서 '00'으로 정수 오버플로우가 발생하고, 새해가 2000년이 아닌 1900년으로 인식 된다는 문제 발생
    보잉 787
  • 비행기 보잉 787에서 구동 후 248일이 지나면 강제로 안전 모드로 진입하여 모든 전력을 잃는 문제 발생
    소프트웨어의 변수가 248일이 지난 뒤에 오버플로우가 되어 발생했기 때문

💡 생각해보기

Q. Y2K와 보잉787과 같은 문제를 방지하기 위해서는 프로그램을 어떻게 설계해야 할까요?

  • 일정 값을 넘기게 되면 리셋하는 프로그램을 만든다!

자바와 비슷한 형식인지라 수월하게 진행 완료쓰
profile
비전공자 개발자는 술로 코딩한다

3개의 댓글

comment-user-thumbnail
2021년 12월 30일

업로드 속도 너무 빠른데요;;;
벡틱 3개(```)로 감싸서 코드블럭 만들수 있습니다. ^^

1개의 답글