2. 개요 ¶
- 카톡 회의 결과 초안으로 월 15~16/화 16~17시 진행 예정
- High-level의 programming skill보단 low-level의 HW적인 구조를 설명하여 low-level에서 접근하는 독특한(...) 코딩 스타일 전수
- 참고 자료: 손봉수 교수님 수업자료: http://cau.ac.kr/~bongbong/c10/
2.1. 1회차(2012 - 03 - 27) ¶
- 전원 참석
- C언어를 low-level의 관점에서부터 접근하기 위해 폰노이만 아키텍쳐부터 수업
- C언어는 UNIX 개발을 목적으로 만들어진 언어이기 때문에 OS의 기초가 되는 기초적인 컴퓨터시스템은 이해할 필요가 있다고 판단
- 포인터 개념이나 scanf에서 &가 쓰이는 이유 등 여러가지 keyword에 대해 설명하기 위함
- binary digit를 비롯한 컴퓨터 시스템의 기초적인 개념 또한 설명
- C언어는 UNIX 개발을 목적으로 만들어진 언어이기 때문에 OS의 기초가 되는 기초적인 컴퓨터시스템은 이해할 필요가 있다고 판단
- 즉석에서 코드를 작성해가며, Compile error, logical error, debug error의 개념에 대해 설명
- 추후 프로그래밍시 에러 이유와 대처방법 부연 설명
- 추후 프로그래밍시 에러 이유와 대처방법 부연 설명
- C언어의 특징 설명
- variable 및 main function의 역할 설명
- #include가 무엇인지 header file이 무엇인지 설명
- 컴파일러의 역할과 compile -> link -> build 과정 설명
2.1.1. 과제: 이 항목에 오늘 배운 내용을 정리하시오. ¶
- c 언어의 특징
- High-Level 언어의 특징과 Low-Level 언어의 특징을 모두 지니고 있다
- High-Level 언어에 가까울수록 사람이 이해하기 쉬워진다 (Human Friendly)
- High-Level 언어에 가까울수록 사람이 이해하기 쉬워진다 (Human Friendly)
- Low-Level 언어에 가까울수록 기계가 이해하기 쉬워진다 (Machine Friendly)
- High-Level 언어의 특징과 Low-Level 언어의 특징을 모두 지니고 있다
- High-Level 언어를 Low-Level 언어로 변환해주는 역할을 한다
- 현재 사용되는 모든 컴퓨터에 적용되는 범용 컴퓨터 구조
- 제어장치와 연산장치, 메모리, 입출력장치로 구성
- 제어장치와 연산장치, 메모리, 입출력장치로 구성
- bit
- 이진법으로 나타낼 수 있는 자릿수를 나타낸다
- 1bit=0,1 / 2bit=00,01,10,11 / 3bit=000,001,010,011,100 ...
- 1bit=0,1 / 2bit=00,01,10,11 / 3bit=000,001,010,011,100 ...
- 함수 (Function) 들의 집합
- 이미 존재하는 함수를 가져다 쓰려 할 때 헤더파일을 불러와서 사용한다
- 이미 존재하는 함수를 가져다 쓰려 할 때 헤더파일을 불러와서 사용한다
- 변수 (variable)
- int, float, char 등
- int는 정수를 나타내고자 할 때 사용하며 출력시 %d를 사용
- float는 소수점 아래의 숫자까지 표현하고자 할 때 사용하며 출력시 %f를 사용
- char는 문자를 나타내고자 할 때 사용하며 출력시 %c를 사용
- int는 정수를 나타내고자 할 때 사용하며 출력시 %d를 사용
- int: integer type, 4 bytes
- char: It used to express a character, but also used to express a integer. 1 byte
- float: 4 byte, floating type number. Specification in IEEE 754-2008
- function: input -> output
- Main function
- real part of program
- It has start and end point of a program.
- return 0; : 0 is a flag noticing OS that program is ended.
- real part of program
2.2. 2회차(2012 - 04 -05) ¶
- 수업내용: Variables, Data Types, Standard I/O
- Variables
- identifier -> 이름 짓기에도 규칙이 있다.
- keyword
- overflow
- escape sequence
- identifier -> 이름 짓기에도 규칙이 있다.
- Data Type
- Integer type: int(4 bytes), char(1 byte, be often used to express a character)
- float type: float, double (double is more correct than float)
- unsigned - MSB를 통해서 2배의 수를 더 많이 나타낼 수 있다는 개념 설명
- Maximum, minimum value of int(경우의 수 이용)
- Integer type: int(4 bytes), char(1 byte, be often used to express a character)
- Standard I/O
- format specifications
- printf, scanf
- scanf에서 왜 & 이 놈이 등장할까?
- format specifications
- preprocessor(전처리기)
- #define
- #define
- automatic type conversion
- Example Problem: Write a program that converts meter-type height into feet(integer),inch(float)-type height. Your program should get one float typed height value as an input and prints integer typed feet value and the rest of the height is represented as inch type. (1m=3.2808ft=39.37inch) (출처: 손봉수 교수님 ppt)
- Variables
2.2.1. 과제 ¶
- 배운 수업 내용 정리
- 2진법, 명제, 삼단논법 공부해오기
- 오늘 못 짠거 마저 다 짜오기
- 고1 수학 과정 제대로 공부해보기
- 변수의 이름은 반드시 문자나 underscore (_) 로 시작해야 한다
- 변수의 이름은 대소문자를 구분한다
- 컴파일러에 의해 이미 정해져 있는 이름 (identifier)
- 변수의 이름으로 사용할 수 없다
- C 언어에는 29 개의 키워드가 존재
- 변수에 저장할 수 있는 값보다 더 큰 값이 저장되었을 때 발생한다
- 2진법으로 수가 처리되는 과정에서 발생 (?)
- 입력한 것과 전혀 다른 값이 생겨나게 된다
- 특정한 기능을 수행하기 위한 알림으로써 \ (back slash) 로 표시
- 줄바꿈 (\n), 탭 (\t), 큰따옴표 (\"), 작은 따옴표 (\'), 역슬래시 (\\) 등.
- int : 4 byte. 정수를 표현. 소수점 아래로는 버린다
- char: 1 byte. 글자를 표현 (character).
- float, double: 4 byte, 8 byte. 실수를 표현하므로 소수점 아래 숫자까지 나타낼 수 있다
- double이 float보다 더 정확하게 수를 표현할 수 있다
- float => -1.0E+38 ~ 1.0E+38 / double => -1.0E+308 ~ 1.0E+308
- 1.0E?
- double이 float보다 더 정확하게 수를 표현할 수 있다
- unsigned ~ : 양수 부분만 표현함으로써 더 큰 범위의 수를 나타낼 수 있지만 음수를 표현할 수 없다
- 수를 이진법으로 표현 시 양수/음수를 구분하기 위해 사용되는 맨 앞자리 0을 수를 표현하는 데에 사용하여 두 배 많은 수를 표현
- 수를 이진법으로 표현 시 양수/음수를 구분하기 위해 사용되는 맨 앞자리 0을 수를 표현하는 데에 사용하여 두 배 많은 수를 표현
- 2^31-1=???
- 기본적인 입력 (Input) / 출력 (Output)
- 헤더 파일 <stdio.h>
- printf ("내용", argument);
- scanf("format specifier(s)", &argument);
- format specifications
- 배운 것 - %d (int), %f (float), %c (char)
- 배운 것 - %d (int), %f (float), %c (char)
- scanf의 & : 입력받는 값을 &뒤에 위치한 변수에 저장하기 위해 메모리에 존재하는 변수의 위치를 알리는 역할을 한다
- #define 으로 사용
- 자신이 지정하는 문자열에 특정한 값 등을 지정해두고 사용할 수 있다
#include <stdafx.h> #include <stdio.h> int main () { float meter=0; scanf("%f",&meter); int feet=meter*3.2808; float inch=(((meter*3.2808)-feet)/3.2808)*39.37; printf("%d feet %f inch\n",feet,inch); return 0; }
2.3. 3회차 (2012 - 04 -09) ¶
- Operators
- arithmetic operators: binary, unary
- priority
- precedence
- arithmetic operators: binary, unary
- assignment operator
- decrements / increments : postfix / prefix
- 축약 연산자
- bitwise operator
- Binary numeral system
- Binary numeral system
- 2's complement: 음수 표시방법
#include<stdio.h> int main() { int input, output; scanf("%d", &input); output = ~input; output ++; printf("%d\n", output); return 0; }
2.3.1. 과제 ¶
- 당연히, 오늘 배운 내용 정리(별로 없지?)
- 특정한 수를 입력받고 and operator를 이용하여 그 수 보다 작은 짝수 중 가장 큰 짝수를 출력하라(scanf, printf 이용)
- shift operator를 이용하여 128(=2^5)을 출력하고, 128을 특정 변수(variable)에 저장하여 그 변수와 left shift operator를 이용하여 32를 출력하라
- 다음 계산의 값을 예상하라
- 1110 0111 ^ 1101 0001 = ?
- 1110 0111 | 1101 0001 = ?
- 1110 0111 ^ 1101 0001 = ?
- Assignment operator
- Equal sign (=) 은 Assignment operator 를 나타낸다
- 변수에게 값을 주기 위해 사용된다
- 계산 순서 : 오른쪽 -> 왼쪽
- Equal sign (=) 은 Assignment operator 를 나타낸다
- Decrement / Increment : postfix / prefix
- Decrement는 --로, Increment는 ++로 나타낸다
- 증감값은 1
- Postfix 일 경우 변수 뒤에 Decrement/Increment operator를 사용하며 다른 계산이 끝난 후 적용된다
- Prefix 일 경우 변수 앞에 Decrement/Increment operator를 사용하며 다른 계산을 실행하기 전에 적용된다
- Decrement는 --로, Increment는 ++로 나타낸다
- 축약 연산자 (Shorthand Operators)
- 계산 과정에 같은 변수가 포함되어 있을 경우 축약 연산자를 사용할 수 있다
- +=, -=, *=, /=, %=
- Ex. (A = A + B)는 (A += B ) 로 표현 가능
- Ex. (A = A + B)는 (A += B ) 로 표현 가능
- 계산 과정에 같은 변수가 포함되어 있을 경우 축약 연산자를 사용할 수 있다
- 비트 연산자 (Bitwise Operators)
- 2진법으로 표현되는 Bit를 계산하여 표현
- 2진법 (Binary numeral system)
- 1과 0만을 이용해 숫자를 나타내는 방법.
- 컴퓨터에서 2진법의 1은 true, 0은 false로 나타나는 경우가 있다
- 2진수를 10진수로 바꾸려면 2진수의 자릿수에 따라 2^(n-1)을 곱해주면 된다
- 10진수를 2진수로 바꾸려면 10진수를 2로 나누어 나머지가 있다면 1, 없다면 0을 적어넣으면 된다
- 2진법 (Binary numeral system)
- Left shift : a<
- a의 모든 비트를 왼쪽으로 n 칸 옮기며, 새로 생겨난 비트는 0이 된다
- a의 모든 비트를 왼쪽으로 n 칸 옮기며, 새로 생겨난 비트는 0이 된다
- Right shift : a>>n
- a의 모든 비트를 오른쪽으로 n 칸 옮기며, 새로 생겨난 비트는 0이 된다
- a의 모든 비트를 오른쪽으로 n 칸 옮기며, 새로 생겨난 비트는 0이 된다
- And 연산 : a & b
- a와 b의 비트를 비교하여 서로 다르면 0, 서로 같다면 1로 표현한다
- a와 b의 비트를 비교하여 서로 다르면 0, 서로 같다면 1로 표현한다
- Or 연산 : a | b
- a와 b의 비트를 비교하여 하나라도 1이라면 1로 표현한다
- a와 b의 비트를 비교하여 하나라도 1이라면 1로 표현한다
- XOR 연산 : a ^ b
- a와 b의 비트를 비교하여 서로 다르다면 1, 서로 같다면 0으로 표현한다
- a와 b의 비트를 비교하여 서로 다르다면 1, 서로 같다면 0으로 표현한다
- 1's complement : ~a
- a의 비트를 모두 반전시킨다 : 1->0, 0->1
- a의 비트를 모두 반전시킨다 : 1->0, 0->1
- 2진법으로 표현되는 Bit를 계산하여 표현
- 2's complement
- Bit 계산으로 음수를 표현
- A를 -A로 나타내려면, A의 비트를 1's complement로 반전시킨 후 1을 더해주면 된다
- A를 -A로 나타내려면, A의 비트를 1's complement로 반전시킨 후 1을 더해주면 된다
- Bit 계산으로 음수를 표현
#include <stdio.h> int main () { int num ; int temp1 ; printf ("enter a number : "); scanf ("%d", &num); temp1 = num & 1 ; if (temp1 == 1) { printf ("%d\n", num - 1); } else if (temp1 == 0) { printf ("%d\n", num - 2); } return 0; }
#include <stdio.h> int main () { int num = 1 ; num = num<<7; printf ("%d\n", num); int num2 ; num2 = num ; num2 = num2>>2; printf ("%d\n", num2); return 0; }
- 1110 0111 ^ 1101 0001 = 0011 0110
- 1110 0111 | 1101 0001 = 1111 0111