étude/C

C_Express 7_ 반복문, 흐름제어 강의 필기 (수정중)

mummoo 2022. 10. 11. 00:39

I. while(조건식) {반복되는 문장, 증감식}

1. 실행해야 할 문장들이 많다면 중괄호로 묶어줘야 같은 동작으로 처리가 된다

2. while조건문 바로 다음에 semi colon 을 붙이게 되면 조건문과 실행 문장이 아무런 관계가 없게 되어 버린다.

=> semi colon은 do while문 아니면 while 옆에 붙이지 않는다!

3. 

0=거짓 / 나머지는 모두 참 임을 이용한 코드. 근데 교수님은 별로 안 좋아하셔...흠

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값이 초기화되지 않아 임의의 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", &ltr);
	while (2){
		if (ltr == 'Q'){
			break;
		}
		if (ltr<'a'||ltr > 'z'){
			continue;
		}
		
		ltr = ltr - 32;
		printf("%c", ltr);
	} 
	return 0;
}

히히 내가 해냄

근데 이제 교수님 코드를 보고 이해한대로 작성한 코드라 

다시 한번 해봐야 체화될 것 같음

 

- while을 쓰는 이유는 무엇인가 ? => 입력된 수가 char일 때를 말하는 건가? 

"어떠한 상황이 참일 때" 를 뜻하는 것 같음.

(모르겠으니까 맞는지 확인ㄱㄱ 근데 맞을걸)