1.while의 조건문은
참이라면 반복이 되는 것이고 거짓이라면 반복문을 종료하고 다음 줄로 넘어간다.
탈출 조건이라고도 하며 탈출을 못하면 무한루프가 되기에 이 조건식이 중요하다.
= "이 조건이 안되는 순간 빠져나간다"
예로 들어 증감식이 없으면 반복문 조건식의 들어가는 변수는 그대로 변동이 없이 참이 될 것이다.그러면 반복문 거치면 조건식에선 참이니깐 계속 반복하는 것임
증감식에 생긴게 비슷한 변수를 착각해서 쓸 경우 무한루프 현상이 일어나버림
증감식까지 실행이 되고 다시 while 조건문으로 올라가 참인지 거짓인지 판별을 하고 작동함
2.센티널
반복문 코드에 센티널을 입력해주면 입력한 데이터에 영향을 끼칠 것 같고 조건문에 반하는 값이기에 넣으면 안될 것 같지만 반복문의끝을 알리기위한 이 코드를 입력해주면 일단 데이터는 변해도 조건문에 거짓이 되기에 탈출이 되며 변한 데이터값을 원 상태로 복구하기위해 다음 줄에 별도의 코드를 쳐줘야한다.
데이터에 -1을 더했던 것을 다시 빼주는 것(-(-1))
이때 만약 평균 프로그램 같은 경우는 횟수 변수인 n도 있을탠데 n도 증감식으로 1 빼줘서 조절해줘야된다(n--;)
3.while문을 이용한 최대공약수 구하기
약수: 각 두 수가 나누어 떨어지는 수
공약수 : 두 수의 약수 중에서 공동으로 가지고 있는 약수
최대공약수 : 공약수 중 최대인 수
최소공약수 : 공약수 중 최소인 수
이걸 프로그램을 만들때 로직을 떠오르기 쉽지않다.
일단은 거르는 방식으로 코드를 짜야되는데
탈출조건은 작은수 변수인 y에 0을 넣으면 안되니깐 (0으로 떨어지는건x) 조건을 y != 0 으로 설정
(y가 0이 아닐때는 무조건 돌거다 이건데 반복문 내용에는 일단 임시로 저장해놓을 애(r)인 다른 선언된 변수를 써놓기
(이 안에는 x를 y로 나눈 나머지라는 연산식인 x % y를 넣는다.이걸 왜 하냐면 큰수에서 작은수를 나눴을때 나머지가 뭘 의미하냐면 일단 얜 나누어 떨어지지않는다는걸 의미하고 그 말은 즉 나머지가 0은 아니란 소리다.
근데 우리가 지금 구하는건 두 수에 동시에 나누어 떨어져야되는 공약수다. 일단 x % y의 값이 나오면 안됨. 이때 유클리드 알고리즘이란걸 사용해주는 것이다. 이게 나머지를 계속 연산해서 공약수로 구하는 방식이다.
유클리드 알고리즘
ㄱ. 두 수 가운데 큰 수를 x, 작은 수를 y라 한다.
ㄴ. y가 0이면 공약수는 x와 같다.
-> 이걸 이용해 y가 0인 순간 반복문이 종료되면서 로직을 탄 형식지정자의 데이터를 x에 담아 최대공약수를 출력하는것
ㄷ. r <- x % y
ㄹ. x <- y
ㅁ. y <- r
ㅂ. y가 0이 나올때까지 로직을 탄 y의 값이 0이 아니면 반복문을 다시 도는데 주의할 건 로직을 탈때마다 나오는 y값으로 반복조건을 따지는 것이고 x에서 그 수를 나누는 것이다.
결국은 y를 나머지 없이 딱 떨어질때까지 반복해주고 그 시점에 x에서도 약수가 되는게 최대공약수임
다른방식으론 for문으로 1에서부터 n까지 일일히 다 나눠보는 방식으로 약수 구하는 방법도 있음.
5.while문은 반복문이니깐 무조건 여러번 실행된다(x)
while문은 조건이 만족되야만 여러 번 반복 실행된다.(o)
6.조건문 옆에 ;를 쓰면 안되는 이유
;는 코드를 끝내버리는의미니깐
비정상실행이 되는데 정상 실행되어도 그냥 끝나는거임
7.do while은 왜 있는걸까
실행 먼저하고 조건을 따지는 식인데 while은 무조건 실행되는게 아니라 조건에 따른데 내가 만약 첫번째는 무조건 실행시키고 싶고 그담부터 조건에 따랐음 좋겠어 할때 이걸 사용하는 것이다.그러면 한번 코드 타면 마지막에 조건을 보고 위로 돌아올 것이니깐
do를 "그냥 아래에 있는걸 한번은 실행하고 싶어!"로 외우자
주의할 점 do while의 while 조건문은 ;이 붙는다.
안찍어주면 컴퓨터가 밑에 또 뭐가 있나한다.
8.for문과 while문의 차이
똑같은 기능이긴한데 for문은 정해진 횟수만큼 반복하는 구조다.while문도 임의의 횟수만큼 돌았다고 표현하지만 그건 조건이 명시되어있어서 돈 것이고 그거에 따라 횟수가 달라질 수도 있다.
이 2개는 구성품도 같다.
이 2개가 그렇다고 명시적과 반복적으로 표현을 서로 못하나? 그것도 아니다.
그럼 똑같은 것을 뭐하러 2개나 만들었나?
이 2개는 어느쪽에 조금 더 기능적으로 편하냐에 따라 갈라지는 차이다.for문 포멧이 정해져있어 왠만한 정해진 숫자만큼 돌때는 이거 쓰고 while문은 구성품들이 멀리 떨어져있어 얼마나 돌릴지 불명확해서 좀 아리까리할 때 일단 조건식 박아놓고 while문으로 짜는 것
쉽게 말하면 반복되는 횟수가 있을땐 for가 편한거고
조건이 있을땐 while이 편한것
만약 무한으로 돌리고싶을때는?? 사실 우리가 쓰는 프로그램은 대부분 종료 버튼을 누를때까지 무한루프를 돌고있다.결국 2개다 많이 쓰이고 중요하다.대부분의 반복은 for문으로 가능하기에 for문으로 쓰고 while은 무한루프 구현할 때 많이 쓰인다.
9.for문 안에 증감식 옆에 ;이 없는 이유는 )라는 괄호가 문장이 끝난 구분 역할을 대신해주고 있기 때문이다.
10.for문 순서 주의
초기화 - 조건식 - 증감식 (x)
초기화 - 조건식 - 반복내용 - 증감식 - 조건식 (o)
이때 조건식이 거짓이면 얘도 while처럼 종료함
그리고 초기화는 첫 실행에 한번만 실행되는것!! 그러니깐 다시 초기화로 가진않는다.
11.for문에서 아래 두가지 경우가 존재하는데 아래와 같다.
두번째처럼 for문안에서 할 경우, 특징이 있는데
첫번째는 for문이 끝나도 선언한 변수는 살아있다.(재활용이 가능)
근데 두번째 경우에 있는 변수는 for문 밖에서 못쓴다는 소리다.
이런걸 '변수의 생명주기'라고 하는데 변수가 경우에 따라 살아있는게 다르다는 소리다.또 다르게 생각하면 중괄호를 기준으로 변수의 생명주기가 정해지는 것임.
두번째의 경우 변수는 지역변수다.(지역은 곧 중괄호 안을 의미)
첫번째 경우의 변수의 지역은 메인함수 중괄호 내부
두번째 경우의 변수의 지역은 for문 중괄호 내부
-> 두번째 경우를 쓰는걸 추천받았다.for문에서 쓰인 변수를 다른 함수에서 쓸 일이 없기때문이다.
근데 첫번째 경우는 어쩔때 쓰이냐 바로 for문 반복이 어디까지 갔는지 혹은 프로그램을 중단하고싶어 중단점이 궁금할때인데 하다가 break으로 중단을 하면 위에 변수는 살아있으니깐 printf로 그 변수를 출력해보면 값이 나오고 그걸 보고 알 수 있다.
12.while문과 for문에 증감식이 무조건 있는건 아니다!
없어도 탈출할 수 있는 방법이 존재한다.
14.for문안에 초기화식이 없다는건 위에 식이 있다는 소리임
(보기에 불편하니 가능하면 이렇게 치지않기)
15.중첩반복문
if안에 if쓰는건 이해했는데 반복문 안에 반복문을 또 왜 쓰는걸까?
: 첫 메인 for문 안에 조건이 참이 되면 안에 있는 for문이 종료될때까지 여러번 실행이 될 것인데 이 여러번 실행될 때 안에 있는 for문의 변수는 계속 변하지만 첫번째 for문의 변수는 그대로 일 것이다.안에 있는 for문이 다 돌아가고나서야 첫번째 for문의 변수가 변한다.즉 별짓기(한문장이 x 그 안 반복요소글자들 y)나 구구단 같을때에 쓰임
-> 뭔가 반복해야되는 요소가 2개가 필요할 때 (미지수 2개가 따로 따로 반복해야될때가 있기 때문에 무조건은 아님) 미지수2개가 연관되어 하나가 증가할 때 하나가 어떻게 도는지 관련이 있을때 쓰인다는 소리다.
하나는 변환주기를 크게하고 하나는 변환주기를 짧게하고싶을때 쓰는 느낌
삼중첩은 거의 안쓰임
사중첩은 코드 잘못짠거임
16.단골문제인 별짓기 문제
개행 = 강제 줄 넘김이라는 뜻
y부터 쓴 이유는 배열이라는 자료구조때문에 그렇게 쓴건데 x부터써도 상관은 없다.(나중에 자료구조할 때)
for문 속 for문(샘플엔 여긴 별갯수반복문)이 끝나면 밑에 개행인
printf("\n");가 작동(개행코드까지가 반복내용)
개행을 * 옆에다가 안쓰는 이유는 찍으면 별하나치고 다음줄 넘어가서안됨
17.break문
break문을 쓰는 두 가지 경우는 ㄱ.반복문 ㄴ.switch문 임
마찬가지로 반복 루프를 빠져 나오는데 사용된다.만나면 조건에 관계없이 바로 나옴(이때 중간에 나가기에 사용된 변수의 값을 저장할 필요가 있어 for문 바깥에 쓰는 경우도 있음)
18.while조건식에 1이나 0이 있어도 당황하지말기
숫자 중에 참 거짓에 대응되는 숫자 코드가 1 혹은 0아 아닌 수(true)과 0(false)이다.
1이 있단 이유는 탈출 조건이 들어가야되는데 참을 넣었다는 것은 이 반복문은 참이기에 계속 반복된다는 소리로 안끝난다는거임
즉 무한루프를 표현할 땐 while(1)을 많이 쓴다.그리고 이 문엔 무조건 브레이크가 무조건 있다.없으면 전원선 뽑아야됨
프로그램에서 종료버튼 생각하면된다.
while문 안에 if문이 있을 수도 있는데 이걸 "어떤 if조건을 만족할때만 브레이크가 걸릴거야"라고 해석하면된다.
break도 무조건 쓰면 반복루프의 의미가 없어지기에
= 무한루프의 센티널은 break;이다.
19.double의 형식지정자는 %lf임
20.루트(제곱근) = sqrt
함수의 일종으로 우리가 수학 관련된 함수를 쓰고싶으면, #include<math.h>을 인클루드하여 써줘야된다.거기 들어있는 함수임
21.continue문
=약한 break문으로 보면됨.(현재의 반복문을 중단하고 다음 반복문을 실행해라)
반복문에서 continue를 만나면 break처럼 중단이 되긴되는데 아래로 안가고 위 증감식으로 돌아간다.
for문이 100번 돈다고하면 어떤 특정 조건에 continue가 걸리면 그거는 실행하지않고 바로 넘어가는 것
for( i = 0;i < 100; i++)
{
if(i % 2 == 1)
continue;
sum += i;
}
가 있으면 나머지가 1일때는 컨티뉴를 실행해라인데 이때 for문을
중단한다.그리고 아랫줄 실행안하고 바로 증감식으로 간다.
홀수인걸 의미하고 이게 참일 경우는 컨티뉴가 넘어가라고 하는 것 그럼 아래식의 변수는 짝수로만 합이 누적되는 것임
컨티뉴는 반복문에서만 쓰이면서 속의 위치에 따라 결과가 달라질 수 있다. 만약 sum += i;가 위로 올라가면 다 더하게되니깐
어느 타이밍에 넣는지 생각하자