ch08 조건에 따른 흐름의 분기

암영·2022년 4월 23일
0

c언어

목록 보기
6/21

08-1 조건적 실행과 흐름의 분기

흐름의 분기가 필요한 이유

if 문을 이용한 조건적 실행

if문의 구성

#include <stdio.h>
int main()
{
	int num;
	printf("정수입력");
	scanf_s("%d", &num);

	if (num<0)//num1dl 0보다 작으면 아래의 중괄호를 실행한다.
	{
		printf("입력값은 0보다 작다 \n");
	
	}
	if (num > 0)//num1이 0보다 크면 아래의 중괄호를 실행한다.
	{
		printf("입력값은 0보다 크다 \n");

	}
	if (num == 0)//num1이 0이면 아래의 중괄호를 실행한다. 이때, 비교 연산자 ==사용!!
	{
		printf("입력값은 0이다 \n");

	}
	return 0;
}

사칙연산이 선택적으로 가능한 계산기 프로그램

#include <stdio.h>
int main()
{
	int opt;
	double num1, num2;
	double result;
	printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n");
	printf("번호를 선택하시오");
	scanf_s("%d", &opt);
	printf("두개의 실수 입력");
	scanf_s("%lf %lf", &num1, &num2); //double 입력 lf

	if (opt == 1)
		result = num1 + num2; //실행줄이 한줄이면 중괄호 생략가능

	if (opt == 2)
		result = num1 - num2;
	if (opt == 3)
		result = num1 * num2;
	if (opt == 4)
		result = num1 / num2;

	printf("결과:%f \n", result);

	return 0;
}

이 프로그램의 문제점: 어떤 숫자가 입력되는 조건검사(비교연산)이 모두 실행됨!
해결책:조건을 만족하는 if문이 발견되면 나머지 if문을 건너뛰게 하기!!= if~else문

if~else문을 이용한 흐름의 분기

키워드 else는 if와 함께 쓰여 하나의 문장을 구성하는 형태
if절 조거니 참이면 if블록 실행, 거짓이면 else블록 실행


#include <stdio.h>
int main()
{
	int num;
	printf("정수 입력");
	scanf_s("%d",&num);
	if (num < 0)
		printf("입력값은 0보다 작다\n");
	else
		printf("입력값은 0보다 크다 \n");
	return 0;
}

if...else if ...else 구성

세개의 블록중 하나를 선택해서 실행하는 구조

#include <stdio.h>
int main()
{
	int opt;
	double num1, num2;
	double result;
	printf("1.덧셈 2.뺄셈 3.곱셈 4.나눗셈 \n");
	printf("번호를 선택하시오");
	scanf_s("%d", &opt);
	printf("두개의 실수 입력");
	scanf_s("%lf %lf", &num1, &num2); //double 입력 lf

	if (opt == 1)
		result = num1 + num2; //실행줄이 한줄이면 중괄호 생략가능

	if (opt == 2)
		result = num1 - num2;
	else if (opt == 3)
		result = num1 * num2;
	else if (opt == 4)
		result = num1 / num2;

	printf("결과:%f \n", result);

	return 0;
}

위에서 if로만 구성했던 것보다 훨씬 효율적이다!

if...else if...else = if~else문 중첩시킨 형태..!!

#include <stdio.h>
int main()
{
	int num;
	printf("정수 입력");
	scanf_s("%d",&num);
	if (num < 0)
		printf("입력값은 0보다 작다\n");
	else if (num > 0)
		printf("입력값은 0보다 크다 \n");
	else
		printf("입력값은 0이다 \n");
	}
		
	return 0;
}

#include <stdio.h>
int main()
{
	int num;
	printf("정수 입력");
	scanf_s("%d",&num);
	if (num < 0)
		printf("입력값은 0보다 작다\n");
	else {
		if (num > 0)
			printf("입력값은 0보다 크다 \n");
		else
			printf("입력값은 0이다 \n");
	}
		
	return 0;
}

위의 두개는 동일하게 출력된다

조건 연산자:피연산자가 3개인 삼항연산자

if~else문을 대체하는 연산자, 처음에는 어색하지만 쓰다보면 코드는 간결하게 하는 데 한 몫한다.

#include <stdio.h>
int main()
{
	int num,abs;
	printf("정수 입력");
	scanf_s("%d",&num);
	
	abs = num > 0 ? num : num * (-1);
	//num>0dl 참이면 num출력, 거짓이면 num*(-1)출력!
	printf("절댓값 %d\n", abs);
	return 0;
}

문제 08-1

1.1이상 100미만의 정수중에서 7의배수와 9의 배수를 출력하는 프로그램을 작성해보자. 단!7의 배수이면서 9의 배수인 정수는 한번만 출력해야한다.
2.두개의 정수를 입력받아서 두수의 차를 출력하는 프로그램을 구현해보자. 단, 무조건 큰수에서 작은수를 뺀 결과를 출력해야한다. 예를 들어서 입력된 두수가 순서에 상관없이 4와 16이라면 12가 출력 되어야 한다. 즉 출력 결과는 무조건 0이상이 되어야 한다.
3.학생 전체 평균점수에 대한 학점을 출력하는 프로그램을 구현해보자 90점 이상이면 A 80점 이상이면 B 70점 이상이면 C 50점 이상이면 D그리고 그 미만이면 F이다. 프로그램 실행시 국어, 영어,수학의 점수를 입력받는다. 그리고는 평균을 구한다음 그에 적절한 학점을 출력하면 됨.
4.위의 문제 2를 조건연산자를 이용하는 형태로 변경해보자.

정답

1.

#include <stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 100; i++)
	{
		if ((i % 7 == 0) || (i % 9 == 0))
			printf("7또는 9의배수 %d \n", i);
	}
	return 0;
}

참고로 위의 예제에서 if문은 이렇게 변경가능!

#include <stdio.h>
int main()
{
	int i = 1;
	for (i = 1; i <= 100; i++)
	{
		if (!(i % 7) || !(i % 9))
			printf("7또는 9의배수 %d \n", i);
	}
	return 0;
}

!연산자는 논리 연산자로 참을 거짓으로 거짓을 참으로 변경한다. 따라서 %연산의 결과로 거짓에 해당하는 0이 반환되어야 if문의 조건은 참이되어 printf함수 호출문을 실행하게 됨

2.1)내가 쓴것(맞음)

#include <stdio.h>
int main()
{
	int num1, num2;
	printf("두개의 정수를 입력하시오");
	scanf_s("%d %d", &num1, &num2);
	if (num1 > num2)
		printf("두수의 차는 %d이다.", num1 - num2);
	else
		printf("두수의 차는 %d이다.", num2 - num1);

	return 0;
}

2)정답

#include <stdio.h>
int main()
{
	int num1, num2;
    int result;
	printf("두개의 정수를 입력하시오");
	scanf_s("%d %d", &num1, &num2);
	if (num1 > num2)
		result=num1-num2;
	else
		result=num2-num1;
    
    printf("뺄셈결과 %d \n",result);

	return 0;
}

3.

#include <stdio.h>
int main()
{
	int sub1, sub2,sub3;
	double result;

	printf("국어 영어 수학의 점수를 입력하시오");
	scanf_s("%d %d %d", &sub1, &sub2,&sub3);

	result = (sub1 + sub2 + sub3) / 3;

	if (result >= 90)
		printf("학점이 %f 이므로 A입니다",result);
	else if (result >= 80)
		printf("학점이 %f 이므로 B입니다",result);
	else if (result >= 70)
		printf("학점이 %f 이므로 C입니다",result);
	else if (result >= 50)
		printf("학점이 %f 이므로 D입니다",result);

	else
		printf("학점이 50점 미만이므로 F입니다.");

	return  0;
}

4.

#include <stdio.h>
int main()
{
	int num1, num2;
	int result;
	printf("두개의 정수를 입력하시오");
	scanf_s("%d %d", &num1, &num2);
	result = num1 > num2 ? num1 - num2 : num2 - num1;

	printf("뺄셈결과 %d \n", result);

	return 0;
}

08-2 반복문의 생략과 탈출 contiune&break

break

반복문을 탈출할때(빠져나올때) 사용하는 키워드로서 break문이 실행되면 가장 가까이서 감싸고 있는 반복문하나를 빠져 나오게 된다.
절대 if문을 빠져나오는게 아니다!!

#include <stdio.h>
int main()
{
	int sum = 0, num = 0;
	while (1)
	{
		sum += num;
		if (sum > 5000)
			break; //break문 실행! 따라서 반복문 탈출

		num++;

	}

	printf("sum: %d \n", sum);
	printf("num: %d \n", num);
	return 0;
}

contiune!

break문과 같이 반복문안에 삽입이 되며, 반복문안에서 위의 문장을 실행하게 되면 실행중인 위치에 상관없이 반복문의 조건검사 위치로 이동한다. 그리고 검사결과 반복조건이 여전히 참이라면 반복영역을 다시 실행하게 된다.

#include <stdio.h>
int main()
{
	int num;
	printf("start! \n");
	for (num = 1; num < 20; num++)
	{
		if (num % 2 == 0 || num % 3 == 0)
			continue;
		printf("%d \n", num);
	}
	printf("end! \n");
	return 0;
}

if문의 조건이 만족되면 아래 printf를 실행하지 않고 다시 조건 검사를 위해 if문으로 증가한다. 당연히 num은 0으로 초기화 되는 것이 아니고 printf문만 건너 뛴다음 1증가 한 상태에서 반복영역을 다시 실행한다.

문제 08-2

  1. 구구단을 출력하되 짝수단(2단 4단 6단 8단)만 출력하도록하자, 또한 2단은 2x2까지 4단은 4x4까지 6단은 6x6까지, 8단은 8x8단 까지만 출력되도록 프로그램을 구현해보자. 이렇게 어수선한 문제를 제시하는 이유는 continue와 bresk문의 사용법을 익히기 위해서다. 그러니 가급적이면 contiune와 break문을 사용해서 이 문제를 해결해보자.
    2.다음식을 만족하는 모든 A와 Z를 구하는 프로그램을 작성해보자.
    AZ +ZA=99
    참고로 가능한 모든수의 시도하기 반복문을 중첩시켜야한다.

정답

1.

1)내가쓴것-정상출력

#include <stdio.h>
int main()
{
	int dan = 1;
	int i = 1;
	for (dan = 1; dan < 9; dan++)
	{
		if (dan % 2 == 1)//단이 홀수이면 아래 내용 건너뛰고 dan++한다음 다시 검사
			continue;

		for (i = 1; i <= dan; i++)
		{
			printf("%d x %d =%d \n", dan, i, dan * i);
			if (i > dan)
				break;
		}
		i = 1;
	}
	return 0;
}

2)정답

#include <stdio.h>
int main()
{
	int i, j;
	for (i = 1; i < 10; i++)
	{
		if (i % 2 != 0) //i%2의 나머지가 0이 아닐때!! i%2==1일때
			continue;

		for (j = 1; j < 10; j++)
		{
			if (i < j)
				break;
			printf("%d x %d= %d \n", i, j, i * j);
		}
		
		printf("\n");
		

	}
	return 0;
}

08-3 switch문에 의한 선택적 실행과 goto문

switch문의 구성과 기본기능

#include <stdio.h>
int main()
{
	
	int num;
	printf("1이상 5이하의 정수입력");
	scanf_s("%d", &num);
	switch (num)
	{
	case 1:
		printf("1은 one \n");
		break;

	case 2:
		printf("2는 two \n");
		break;

	case 3:
		printf("3는 three \n");
		break;
	case 4:
		printf("4는 four \n");
		break;
	case 5:
		printf("5는 five \n");
		break;

	default:
		printf("i don't know! \n");
	}

	return 0;
}
  • switch(n)에서 n은 switch문으로 전달되는 인자의 정보이다
  • case 1 : n을 통해 전달된 정수의 값이 1이면 case 1의 영역을 실행한다.
  • case에 있는 값이 입력되지 않은 경우,default영역이 실행된다.
  • 중간에 끼어있는 break문의 역할: break문이 끼어 있지 않으면 일치하는 케이스가 있더라도 코드를 전부실행한다.따라서 케이스에 맞지 않는 값도 전부 출력한다. 하지만 break문이 있으면, 일치하는 케이스가 있으면 일치하는 값만 출력후 즉시 switch문을 빠져 나온다. 즉, break문은 실행영역을 묶기위해 존재한다.
profile
just do! -얼레벌레 굴러가는 공대생

0개의 댓글