C_Express 7_ 반복문, 흐름제어 강의 필기 (수정중)
I. while(조건식) {반복되는 문장, 증감식}
1. 실행해야 할 문장들이 많다면 중괄호로 묶어줘야 같은 동작으로 처리가 된다
2. while조건문 바로 다음에 semi colon 을 붙이게 되면 조건문과 실행 문장이 아무런 관계가 없게 되어 버린다.
=> semi colon은 do while문 아니면 while 옆에 붙이지 않는다!
3.
4. 센티넬 : 알려지지 않은 입력 데이터의 끝
=> 예시코드 : while( 조건) 안에 입력 데이터의 끝이 뭔지 알 수 있게 함
-> while loop 빠져나온 후 계산 가능하게 코드 작성하면 돼
5. <limits.h> 헤더파일을 가르치심 : 시험 / 코드발표 때 써도 돼!
Ctrl + Z 누르면 EOF return = -1
NULL = 0
6. 조건식에는 무엇이든 들어갈 수 있음 : scanf()도 들어갈 수 있음
II. do{반복되는 문장;} while (조건식) ;
반복 대상 문장들을 일단 실행시키고 조건이 맞는지 확인한다
**난수 설정 설명하심 : rand() 함수 // 이때 <stdlib.h> 헤더파일 포함해야 함
난수 설명과 함께 time() 함수 // 이때 <time.h> 헤더파일 포함해야 함
=> rand(time()) 에서 항상 같은 수가 출력된다
: seed값이 동일하기 때문임
III. for ( 초기식 ; 조건식 ; 증감식) {반복되는 문장;}
for 안에서 int를 선언하는 것과 int를 선언하고 for 반복문을 쓰는 것이 뭐가 다를까 ?
=> 후자는 for문 뒤에서도 int를 사용할 수 있다 = 태어났기 때문에 메인 함수 내에서 내내 살아있다.
=> 전자는 for문 뒤에서 int를 사용했을 떄 error가 날 것이다 = for 안에서 태어나고 죽는다.
변수도 영향을 미칠 수 있는 범위가 있구나.
1. 증감식에는 덧셈, 뺼셈, 2 덧셈, ...등 어떠한 수식도 넣을 수 있다.
2. 초기식, 조건식, 증감식에는 아무거나 넣어도 되고, 심지어 아무것도 안 써도 된다.
이때 가운데의 세미콜론들은 무조건 두개 다 써야 함
3. 초기식 = 0, 조건식 = 0, 증감식 = 0이면 for문은 무한루프
4. 초기식을 비워놓으면
i값이 초기화되지 않아 임의의 i값에 대해 반복문을 수행한다.
5. 조건식을 비워놓으면
엥 항상 참이라는 얘기인가? 아니면 항상 수행하라는 얘기인가? 일단 실행해봅세
=> 급발진한다.
항상 수행하라는 얘기인 듯하다. 참이라고 하기엔, 어떠한 조건도 없기 때문에
6. 증감식을 비워놓으면
횟수를 나타내는 변수 (i)가 바뀌지 않기 때문에 무한루프가 될 듯하다.
=> 급발진한다.
초기값만 안 쓰는 경우를 제외하면, 세 식 중 하나라도 빼먹을 경우 항상 급발진한다.
7. 초기식에서 두 개 이상의 변수를 초기화할 수도 있고, printf나 scanf를 넣을 수도 있다. => 가능하다.
8. 중첩 반복문 : for 안에 for가 존재한다. 이때 안쪽의 for문은 바깥쪽 for문의 반복문장의 일부가 된다.
e.g. i =1일 때 j=1 부터 j = 10까지
IV. break;
반복문을 빠져나오는 데에 사용된다.
아예 끊어버리고 루프에서 빠져나옴. 얄짤없는 새기
1. break;는 자기가 속한 루프에서만 빠져나온다.
-> 루프 1 안에 루프 2가 있고 루프 2에 break;가 있다면, 루프 2에서만 반복문이 중단되고
루프 1은 해당 break;와 관계 없이 계속 시행된다.
V. goto
goto도 쓸 수는 있지만 동천교수님은 권하지 않음
근데 이해는 되는 게 순서대로 시행하라고 만든 게 코드인데
그 규칙을 어기고 여기저기 왔다갔다 하니까
디버깅할 때도 힘들고 코드 가독성이 떨어지겠지
VI. continue;
현재의 반복을 중단하고, 다음 반복을 시작해라
= "pass"와 같은 말 => 넘기다 와 같은 말
1. 반복문 속 continue 밑의 문장은 없는 셈 치고 진행한다.
2. while 속 continue가 있다면, continue 밑의 문장은 없는 셈 치고 다시 반복문을 수행하러 올라간다.
3. do while 속 continue가 있다면, continue 밑의 문장은 없는 셈 치고 while의 조건을 확인하러 내려간다.
4. for 속 continue가 있다면, continue 밑의 문장은 없는 셈 치고 증감식을 확인하러 올라간다.
**
+= 는 우변의 값을 좌변에 더해서 저장
-=는 우변의 값을 좌변에서 뺀 후 저장
*= 는 우변의 값을 좌변과 곱한 후 저장
/= 는 우변의 값으로 좌변을 나눈 후 저장
Q1. 1부터 n까지 합 계산하는 프로그램
1) for문 사용
#include <stdio.h>
int main(){
int i=0, n, sum = 0;
scanf("%d", &n);
for (i=0 ; i<=n ; i++){
sum = sum + i;
if(i == n){
printf("%d", sum);
break;
}
}
return 0;
}
- if( i>n)이라고 해놓아서 결과값이 안 나왔었다. 생각해보니 애초에 i <= n인 조건 상 실행되는 루프이기 때문에 당연히 semantic error임을 알 수 있었다.
- break는 for문 안에서만 사용 가능하다. 바깥으로 나가서 쓰게 되면 "중단할 것이 없는데요..?" 라고 뜸
- 생각해보니 break 안 써도 됐는데 뭐하러 썼나 싶다. 진짜 진짜 뭐하러 썼나 싶다 ㅋㅋ ㅋ ㅋ ㅋ ㅋㅋㅋㅋ
2) while문 사용
#include <stdio.h>
int main(){
int i=0, n, sum = 0;
scanf("%d", &n);
while ( i < n+1){
sum = sum + i;
i++;
}
printf("%d", sum);
return 0; }
- 처음에 i++안 썼었다. 무한루프를 만들고 싶었니?
- 코드 수정하면서 return 0;을 main함수 바깥에 놨었다. 계속 컴파일 에러 떠서 뭐가 에러인지 찾는 시간이 좀 오래 걸림
- while문에서는 조건식이랑 실행 내용만 필수 조건이기 때문에 이후 연산 뭐해야 되는지 안 쓰면 개같이 무한루프 된다는 거 명심
Q1-1 1부터 10까지 짝수 합 구하기
1) for문 사용
#include <stdio.h>
int main(){
int i, sum = 0;
for (i = 0 ; i <=10 ; i++) {
if(i%2 != 0){
continue;
}
sum = sum + i;
}
printf("%d", sum);
return 0; }
- 오 우왕 신기하다
- 근데 이건 continue 쓴거고, 사실 i++말고 i = i+2 쓰면 continue 안 써도 됨
- 이렇게
#include <stdio.h>
int main(){
int i, sum = 0;
for (i = 0 ; i <=10 ; i = i+2) {
sum = sum + i;
}
printf("%d", sum);
return 0; }
2) while문 사용
아하 i = 10일 때에도 조건을 만족해서 sum에 12를 더하게 됨
10까지만 더하고 싶다면 i<10으로 수정해야겠다.
Q2. 반복을 이용한 팩토리얼 구하기
1) for문 사용
#include <stdio.h>
int main(){
int i, n, f = 1;
scanf("%d", &n);
for (i = 1 ; i < n ; i ++) {
f = f * i;
}
printf("%d", f);
return 0;
}
와 내가 해냄ㅋ
2) while문 사용
#include <stdio.h>
int main(){
int i, n, f = 1;
scanf("%d", &n);
while ( i < n){
i++;
f = f* i;
}
printf("%d", f);
return 0;
}
while이든 for든 순서만 바뀌었고 사용 상황에서의 편리함 정도만 다르지
사실 반복한다는 것에서는 똑같다.
while에서 구현 가능한 프로그램이 for에서 구현 안 될리가 없고
그 반대의 경우도 마찬가지
**그런데 f 값은 int의 범위를 넘어갈 수 있으니 long 자료형의 형태로 선언하는 것이 나을 듯하다.
혹시 모르니까.
Q3. 소문자를 대문자로 변환
#include <stdio.h>
int main(){
char ltr;
scanf("%c", <r);
while (2){
if (ltr == 'Q'){
break;
}
if (ltr<'a'||ltr > 'z'){
continue;
}
ltr = ltr - 32;
printf("%c", ltr);
}
return 0;
}
히히 내가 해냄
근데 이제 교수님 코드를 보고 이해한대로 작성한 코드라
다시 한번 해봐야 체화될 것 같음
- while을 쓰는 이유는 무엇인가 ? => 입력된 수가 char일 때를 말하는 건가?
"어떠한 상황이 참일 때" 를 뜻하는 것 같음.
(모르겠으니까 맞는지 확인ㄱㄱ 근데 맞을걸)