[혼공C] 3주

자경·2024년 7월 21일
0

혼공C

목록 보기
2/4
post-thumbnail
  • chapter 5 선택문
  • chapter 6 반복문

제어문

제어문~-> 선택문(if,switch), 반복문(while), 분기문(break,continue,goto,return)

조건에 따라 명령을 제어한다.

if문

  1. 단독
    return ;

  2. if-else

if(a==b) return a;
else return b;

이때 else에는 조건을 쓰지 않는다.

  1. if-else if-(else)
if(a==b) return a;
else if(a!=b) return b;
else return c;

switch case

switch(a){
	case 1: 
    	a=1; break;
	case 2:
    	a=2; break;
    default :
    	a=1024;
}
  • switch() 괄호 안에는 값이 들어간다.
  • case들은 일종의 if조건문이며 괄호안의 값과 일치한지 확인한다.
  • break;를 쓰지 않는다면 조건이 참이 되는 부분부터 쭈우욱 실행된다.
  • default는 위의 모든 이 이뤄지지 않았을때 실행되고 마지막에 오기에 break는 필요가 없다

도전예제

계산기 프로그램

#include <stdio.h>

int main(){
	int a,b,answer;
    char op;
    printf("사칙연산 입력(정수) : ");
    scanf("%d%c%d",&a,&op,&b); //입력
    
    switch(op){ 
    	case '+': answer=a+b; break;
        case '-': answer=a-b; break;
        case '*': answer=a*b; break;
        case '/': answer=a/b; break; //피연산자가 전부 정수라서 정수값 반환
    }
    
    printf("%d%c%d=%d",a,op,b,answer); //출력
    
	return 0;
}

//또다른 풀이
#include <stdio.h>

int main(){
	int a,b,answer;
    char op;
    printf("사칙연산 입력(정수) : ");
    scanf("%d%c%d",&a,&op,&b); //입력, 같다.
    
    answer = (op=='+')?a+b:(op=='-')?a-b:(op=='*')?a*b:(op=='/')?a/b: -4444; //-4444는 예외처리

	printf("%d%c%d=%d",a,op,b,answer); //출력

}




반복문

종류 : while, for, do-while


while - 조건 강조
	
for - 실행 횟수 강조
	- 분기문(break(주변에 블록하나를 깨트림)
    		continue(블록끝에서 실행)
		
do~while - 한 번 무조건 실행을 강조

확인문제(😘)

x자 별모양 출력

1.첫번째 풀이

int main(){
	printf("*   *");
    printf(" * * ");
    printf("  *  ");
    printf(" * * ");
    printf("*   *");
    
    return 0;
}

이렇게 쓸 수 있지만 문제의 목적에 맞지 않으므로 풀이가 틀린답이겟져.?😢


2. 두번째 풀이

#include <stdio.h>

int main(){
	for(int i=0; i<5; i++){
    	for(int j=0; j<5; j++){
        	if((i+j)==4 || i==j)
            	printf("*");
            else
            	printf(" ");
        }
        printf("\n");
    }
    return 0;
}

도전실전예제 - 소수 출력 프로그램(prime num)

  1. 첫 시도 [실패]
#include <stdio.h>

int main(){
	int number;
    printf("2 이상의 정수를 입력하세요 : ");
    scanf("%d",&number);
    
    int br=0;
    for(int i=2; i<number; i++){
    	if(number%i){
    		int cnt = 0;
    		for(int D=2; D<i; D++){
    			if(D%i)
					cnt ++;	
			}
			if(!cnt==0)
				printf("%2d   ",i);
        }
    }
    
    return 0;
}

코드해석

  • br = 줄바꿈
  • flow
    number에서 입력된 수 만큼 for문을 돌린다.
    만약 증가하는 i와 number가 0으로 나눠진다면(?)
    for문을 다시 i만큼 중첩으로 돌린다.
    그 후 증가하는 D와 i가 서로 나눠서 0이 된다면(?)
    cnt를 증가한다.
    cnt가 0이면 소수다(?)

이유

  • 소수가 나오는 형태를 이해하지 못했다.
  • 코드의 흐름을 보면 세울 알고리즘을 정리 못한 듯하다(말이 안된다).

문제 재정의

예제의 목표 : 입력한 수까지의 소수를 전부 출력한다. (2이상)
소수란 : 1과 자신만을 약수로 가지는 수

HOW : for문으로 입력한 수까지 증가하면서 해당 숫자가 1과 자기 자신을
약수로 가지고 있는지 확인해야한다.

HOW2 : 어떻게 1과 자기 자신을 약수로 가졌는지 확인할 것인가?
1. 해당 수를 범위로 for문을 돌리며 나누었을때(해당 수와 증가값) 0으로 나눠지면 안된다.
-> 중첩문 사용!


  1. 두번째 시도도도 도도새
#include <stdio.h>
#include <stdbool.h>

int main(){
	int n; 
	printf("숫자 입력 : ");
	scanf("%d",&n);
	
	//*n과 i의 인과관계는 없다. 
    
	int br = 0; //줄바꿈 
	for(int i=2; i<n; i++){
		bool flag = true; //나눠지는 지 여부를 조사하는 flag // 소수라는 가정으로 true 
		for(int j=2; j<i; j++){
			if(i%j==0)
				flag = false;
		}
		if(flag){
			printf("%2d  ",i);
			br++;
			if(br%5==0)
				printf("\n");
		}
	} 
    return 0;
}

주목점 : for문에 증가하는 i는 n과 인과관계가 없다. -> n은 for문의 범위이다.

flow :
1. 전체 for문은 입력된 숫자 n만큼 2부터 증가한다.
2. 전체 for문 안에서 flag를 사용하여 판별 여부를 알 수 있다.
3. i를 입력 받았다면 i가 소수인지 판별한다. (약수가 1과 자신외에 없는가?)
4. 있다면 flag를 false로 바꾼다. 있다면 조건문에 의해 출력된다.

위의 경우와 같이 줄바꿈을 하는 경우 flag 조건문에서 br을 판별해야한다.
전체 for문 블록이며 flag 판별 if문 아래에 넣었는데 결과가 완전 이상하게 나왔다🫥🫥😶‍🌫️😶‍🌫️

0개의 댓글