printf( " 문자열 ", 값, 변수 )
인수가 두개임
1. 문자열의 형태
2. 값
%d : 서식문자
뒤에 나오는 값을 이 위치에 대체시킴 + 자료형 선언
뒤의 값을 그 위치에 대체하고 그 문자열을 출력
오류수정 및 디버깅
코드를 작성하다보면 한번에 프로그램이 완성되는 경우가 거의 없음
복잡할수록 알고리즘이 잘못돼서 오류 날 가능성 높음
오류수정하는 과정은 디버깅
오류의 종류
문법적 오류 논리적 오류
문법적 오류
찾기쉬움
비쥬얼스튜디오에 오류메세지뜨고 실행도안됨
논리적오류
디버깅이 어려울 수 있다
논리적오류는 결과를 모르면 틀렸는지 맞았는지 알 수 없음
이게 맞았는지 틀렸는지 알아보는 과정이 어려움
코드에서 어디가 잘못됐는지 trace해봐야 알 수 있음
컴파일시간오류
실행시간오류 :실행중에 0으로 나누는 연산
컴퓨터에서는 나눗셈연사
뺼셈은 보수를 취해서 더함
음수를 표현하는 방법은 2의 보수를 취하는것 보수를 취하면 원래 숫자의 음수형태가 나옴
4 - 3 --> 4 + (-3)
0으로 나눈다는 의미는 0으로 뺀다는것을 의미함 아무리뺴도 시간안에결과가나올 수 없음 그래서 실행시간오류를 발생시킴
논리적오류
결과가제대로나오지않는경우
오류를어떻게수정하냐 ?
실행을 시켜봐야함
문법적인오류는 대부분컴파일과정에서 걸러진다
논리적오류는 결과가 출력이 나오고 그 다음 확인할 수 있음 실행끝난 다음에 소스코드를 다시 살펴봐야함
성공했었던 다른프로그램을 실행시킨다는거임 마지막으로 성공한 빌드 는 엉뚱한거 실행한다는 의미
함수형태의 명령어들은 다 소문자임
디버거는 줄단위로 디버깅하는애임
printf scanf 여기서 f는 포맷임
디버거란?
프로그램을 중간에 멈춰야됨 함수단위로 실행시키겠다는
C프로그래밍 구성 요소
주석
변수
상수
함수
문장
출력함수
입력함수
산술연산
대입연산
프로그램을 이용해서 데이터를 처리해야됨
데이터를 처리하기위해 데이터를 입력받고 처리하고 출력함
우리가 제일 신경써야 하는 부분은 데이터의 입출력과 어떻게 처리할건지 이 세가지가 중요함
/* */ 이거는 주석처리
// 이것도 주석처리 주석은 부연설명하고싶을때 기호를 달아서 컴파일러는 해석안하는거임
그냥 사람에게 설명하고싶을때 쓰는거임
슬래시뒤에두개의문장은 끝까지 그냥 주석처리함
컴퓨터가 해석을 안함
들여쓰기란?
그냥 구조 보기 편하게 쓰는거임
중간 점검
주석
주석은 중첩할 수 없음
주석은 한 줄 이상이 될 수 있음
주석에는 코드에대한 내용을 씀
주석은 해석하지않는다
#include 전처리기 전처리부
전처리기는 메인함수 시작 전에 함수의 실행코드에 집어넣는것임
#include <stdio.h>
이거는 메인함수 시작 전에 함수의 실행코드에 집어넣는 부분 프로그램이 시작하기 전에 필요한 조치를 취함 프로그램코드속에는 라이브러리 함수 등 누군가 만들어놓은 코드도 포함 됨 그 함수의 실행코드를 포함시켜서 쓸 수 있음 라이브러리파일들을 포함시킨것이 #include 임
헤더파일의 종류가 다양함
표준라이브러리가 있음 다양한 헤더파일들을 필요할떄마다 추가함
헤더파일속에는 함수에대한 정의가 있음

이 정의들을 함수의 원형이라고 말 함
그리고 세미콜론 은 함수를 선언하기위해 붙임 그래서 중괄호 안붙음 헤더파일안에는 원형이들어가있고
이원형의 포맷대로 사용할 수 있음
함수의 실행코드는 숨겨놨음
printf--> stdio.h
전처리기는 뒤에나오는 헤더파일을 포함시켜라 라는 의미
함수는 특정 기능을 수행할 수 있는 코드의 집합 묶음 함수는 입력과 출력이 있기 떄문에 data type을 정해줘야됨
int printf()
특정프로그램을 위해서 함수는 모듈임
이 모듈을 한번 만들어놓으면 똑같은 기능을 다른프로그램에서 사용할때 함수를 그대로 갖다쓸 수 있음
그렇게 다른프로그램 짜기가 쉬워짐
프로그램에서 만든 함수들로 또 다른 프로그램을 만듦
프로그램을 함수화해서 작성하는것이 유지보수관리하기가 쉬움
함수의 구성
int main (void)
출력 datatype 함수의 이름 입력데이터type
{ 함수의 시작
} 함수의 끝
main함수에서의 return 은 os 에게 반환한다는 의미다
함수 호출 = 함수 실행
말그대로 함수를 불러서 실행하는것임
cpu가 실행하는 명령어는 메모리에 있으니까 메모리 주소를 넘겨주는 행위임
모든 함수는 실행이 끝나면 자신을 호출했던 주소로 return한다
main함수는 os에게, 다른 함수는 자신을 호출했던 그 주소로 값을 반환한다.
예를 들어, main함수 안에 printf함수가 있으면, os는 main함수를 실행하고 그 후 printf함수가 실행된 후, printf 함수가 종료되면 그것을 불렀던 main함수 내의 다음주소로 return한 후, main함수가 종료되면 main함수는 자신을 호출했던 os에게 반환하여 return하는 구조임
0뿐만 아니라 결과값을 반환한다
call 은 함수의 시작주소를 넘겨주는것을 의미한다.
그리고 나서, 다음의 명령들을 차례대로 실행하고 나서, 본 동작이 끝나면 자신을 불렀던 주소로 return하는것임
중간점검
메인함수
중괄호
모든문장(명령어)는 ;으로 끝난다.
변수란 ?
프로그램이 사용하는 데이터를 일시적으로 저장할 목적으로 사용하는 데이터공간
변수가 필요한 이유
컴퓨터프로그램을 이용해 처리할것은 데이터고, 데이터는 프로그램 코드 안에 저장되어 있음
프로그램은 HDD안에 저장되어있고, 얘를 실행시키기 위해선 cpu로 기계어 명령코드를 가져와야한다.
프로그램은 메인메모리에 저장되어 있고 명령어들을 순차적으로 가져와서 실행해야한다.
CPU와 HDD사이에는 RAM이 존재한다.
다이렉트로 HDD안의 명령어를 CPU로 가져오기엔 데이터 처리 속도가 달라 비효율적이므로
프로그램이 실행되면, HDD에서 RAM에 로딩하여 RAM에서 CPU로 한꺼번에 로딩함
RAM은 휘발성메모리로, 전원공급이 중단되면 데이터가 날아감
램에 저장할 떄, cpu가 연산의 중간과정을 저장함
변수 선언을 해야 하는 이유
왜냐면 변수는 메모리는 주기억장치를 사용해야하는데 주기억장치의 관리는 os가 하기 때문이다
운영체제에서 허락받아야 사용할 수 있음
필요한 메모리 용량을 알려줘야됨
필요한 용량을 변수선언을 통해 용량을 알려줌
램의 데이터를 저장하는 방법은 ?
변수는 데이터를 저장하는 공간이고 ram 에 생성된다
2진수 주소체계 사용하는데, 메모리의 관리는 os가 함
프로그램이 사용될 때 마다 RAM은 휘발성이므로 매번 주소가 바뀜
그렇게 바뀌는 주소를 숫자로 할 수 없어 가상의 변수명을 붙여 데이터를 처리해야한다
매번 바뀌는 주소를 기억하는건 너무 비효율적이기 때문
변수선언을 하면, RAM상에 데이터를 저장하는 공간의 data type만큼의 크기가 할당되고, 변수명과 첫 시작주소가 대치됨
지정한 변수명은 컴파일러에서 번역할 땐 메모리의 주소값으로 변환해서 처리함
실제 주소값은 관심없음
os는 프로그램이 실행될 때 변수명에 대치되는 주소의 메모리로 찾아가 할당하고 해당 공간만 사용하는것임
]
실제 이 주소값은 관심이없음
데이터의 type에 따라 램에 할당되는 공간의 크기가 달라짐 예를들어 int형으로 data type을 지정해주었음
int a;
변수선언
int
자료형 내가사용할 데이터를 저장하는 방법과 관련이 있음
정수형 실수형 등 저장방법이 다름
ex )
int x;
int y;
int sum;
-> 12B요청
int x ;
정수형 변수명
4B
ㅁㅁㅁㅁ
문자형 :
정수형 :
실수형 :
다양하게 자료형을 만든 이유는 메모리를 효율적으로 사용하기 위함임
메모리는 한정되어있고 효율적으로 쓰려면 자료에 맞게 알맞는 크기로 쓰기 위함
변수를 선언할 때 각각의그릇에 이름을 붙인것임
변수는 데이터를 담는 그릇임
변수는데이터를 담는 상자이다
선언방식
int x;
나중에 x라는 저장공간 안에는 int type을 저장함

변수선언 : 컴파일러에게 어떤 타입의 변수가 사용되는지를 미리 알리는것
digit의 값을 2진수의 크기로 나타냄
그 표기법은 바로 정수형
문자형도 마찬가지로 8bit

char
문자형을 나타내는 자료형
float
실수를 저장하는 방법
가수부
지수부
부호
세개를 저장할 때 32bit을 사용

변수를 선언하는 방법
자료형 변수이름 ;
자료형은 저장할 공간의 크기를 알려주는것
변수의 이름 : 식별자 : 변수나 함수의 이름
변수와 함수 이름짓는 방법이 같음
식별자를 만드는 규칙

예약어는 문법적으로 미리 사용하기 위해 정해놓은 단어들임
예약어와 똑같은 변수명은 쓸 수 없음
변수명은 길어도 노상관 최대한 짧게 써도됨

위의 단어들을 이용해서 문법적인 구조를 만드는데 얘네를 변수명으로 하면 안됨
영문 알파벳 대문자 소문자 구분 함
A와 a는 다른 문자 취급
변수이름에는 의미를 집어넣기
최대한 짧게
증긴잠감
변수이름만들때 지켜야하는 규칙
알파벳 대소문자 구분함
ㅇㅇㅇㅇㅇ
밑줄 맨앞 가능
알파벳 _는 맨앞가능 숫자는맨앞불가능

int x;
--> x라는 저장공간을 만들었는데 그 안에 뭐가 들었는지 모름 오류발생
int x = 10;
이거는 x라는 저장공간을 만들고 그 안에 10을 넣은거임
이렇게되면 뒤에서 연산을 할때 오류는 안생김 이 값은 초기값임
초기값을 집어넣는걸 초기화라고 말 한다
수식은 피연산자와 연산자로 구성된 식을 말 한다
수식은 결과값을 가진다
데이터를 처리하기위해 컴퓨터는 자료형을 가지고 있음
자료형은 다 이진수로 되어있음
숫자와 문자의 곱의 형태는 반드시 연산자를 써서 나타내주어야됨
5*x 이렇게 풀어서 써줘야한다
수학에서 =는 대입연산자이다
오른쪽의 RV (변수 수식 함수 상수)를 왼쪽에 대입
왼쪽은 무언가를 저장할 공간임
변수외에는 오면 안됨
수학에서의 같다의 의미는 == 을 사용
변수에 값 저장하기
x = 100;
x는변수, 100은 상수
숫자를 직접적으로 쓰면 상수이다
문자로 저장공간을 만드는것은 변수이다
대입연산자에의해 100을 x에 저장함
이걸쓰기위해선, 변수선언이 필요함
int x = 0;
x = 100;
산술연산

* asterisk
% modulus 나머지연산
13%3=1
int x,y;
int sum;
이렇게하면 저장공간이 마련됨
변수선언은 맨 앞에서 지정한 후 운영체제에 요청함
#include <stdio.h>
int main(){
}
sum = x + y;
중간점검
함수의 중간에서 변수를 선언할 수 있는가?
원래느 ㄴ안됨
int x=1, y=0;
하면 한꺼번에 선언됨
int x, y=0;
하면 int형 x 를 선언하고, int y에는 0을 대입한것임
x가 0으로 되는건 아님
_____________________________________
4-2
표준입력은 표준입력장치로부터 입력을 받는거임
표준입력장치는 키보드 , 표준출력장치는 화면
표준입력장치로부터 입력을 받게해주는 함수는 scanf함수 : 표준입력함수
표준출력장치로 받은 입력을 출력하게해주는것은 printf함수 : 표준출력함수
키보드로부터 입력을 받아서 프로그램이 어떤 데이터를 처리할 수 있게 해주고 프로그램에서 만들어진 데이터를 화면에 출력할 떄 사용
printf (" 문자열 ");
printf (" 문자열 %d ", 변수 상수 ); --> 서식문자, 형식지정자 필요함
문자의 출력
문자열 속에 특수문자 사용할 때에는 앞에 \ 붙여줘야함
컴파일러가 문자열을 찾을때에는
첫번째 따옴표와 다음 따옴표 사이에서 확인함
만약 문자열 중간에 따옴표를 사용하면 그거를 마지막 따옴표로 인식함
그래서 그것이 특수문자임을 알려주기 위해
" \" "
형식지정자에는 어떤것들이 있냐
자료형
문자형 %c(character) 단일문자 , %s(string) 문자열
정수형 %d(decimal)
실수형 %f(float)
변수와 형식지정자는 일대일로 대응되어야함
형식지정자와 변수의 자료형은 같아야함
사칙연산
키보드로부터 입력받아서 그것을 프로그램에서 사용하는 변수에 넘겨줌
scanf를 사용하기전까진 x가 입력된 데이터를 저장한 위치인지ㅁ는 모름
scanf의 의미는키보드로부터 입력받아서 프로그램에서 사용하는 변수에 넘겨줌
근데 scanf를 실행하기전까지 x가 저장되는 주솟값이 필요함
왜냐면 입력받은 값을 x라는 공간에 저장하려면 주소값이 필요함 키보드로부터 입력받은 값을 x에 저장해야하니까
그래서, scanf는 키보드로부터 입력받아서 그것을 프로그램에서 사용하는 변수에 넘겨주는거임
스캔f를 쓸 때, x의 저장공간에 값을 입력받아서 저장해야하니까 x의 직접적인 주솟값이필요하다. 따라서 &x라고 써야함
&x해서 실제주솟값을 미리 확보해야함
scanf에는 반드시 변수이름앞에 &를 붙여줘야됨
scanf는 지정된 형식의 데이터를 입력받아서 x의 주소에 저장하세요
%lf
정수형은 문제가 안되는데 실수형은 형타입이 두개임 float과 double
이거 두개의 차이는 정밀도가 다름
float 32bit
double 64bit float가 정밀도가 더 떨어짐
실제로 데이터를 읽을때 어떤 정밀도로 저장해야될지 명시해줘야됨
32.6 이리고 입력해도 이걸 더블로 저장할지 플랏으로 저장할지 형식지정자로 정할 수 있음
마이크로소프트의 c는 윈도우즈 이전에 dos시절에 만들어져서 버전업됨
이건 태생이 윈도우즈 1995년 무렵이후니까 c를 처음 설게할 때 네트워크와 보안에 대한 개념없이 만듦
그러다보니까 c라는 언어 자체가 아무리 보안을 해도 해킹이나 크래킹에 취약점을 드러냄
하다하다안되니까 그냥 사용하는 함수 자체를 scanf_s로바꿈
# define _CRT_SECURE_NO_WARNINGS 이거 집어넣으면 scanf만 써도 됨 이거 안쓸꺼면