본문 바로가기

C언어

20230220 C언어 공부 (if문, switch문) (+else if, else, goto)

abc입력 받고 가장 큰 수 출력하기 

문제 분석

1. abc 입력받는다
2. a>b 케이스 b>a 케이스 나눈다
3. a> b 인경우

-a>c면 a가 최대.

-아니면 c가 최대
b>a인 경우

-b>c면 b가 최대
-아니면 c가 최대

 

if문 이용

 

내가 작성한 코드

int main(void) {
	int a, b, c;
	printf("a,b,c를 입력하시오.");
	scanf("%d%d%d", &a, &b, &c);

	if (a > b) {
		if (a > c) printf("최대값은 %d", a);
		else printf("최대값은 %d", c);
	}
	if (b > a) {
		if (b > c) printf("최대값은 %d", b);
		else printf("최대값은 %d", c);
	}
}

 

강의에서 작성한 코드

int main(void) {
	int a, b, c;
	printf("a,b,c를 입력하시오.");
	scanf("%d%d%d", &a, &b, &c);

	if (a > b) {
		if (a > c) printf("최대값은 %d", a);
		else printf("최대값은 %d", c);
	}
	else { // 여기에 else if 쓰면 오류남. 왜..??
		if (b>c) printf("최대값은 %d", b);
		else printf("최대값은 %d", c);
	}
}

 

여기에서 식을 더 줄일 수 있다.

 

int main(void) {
	int a, b, c;
	printf("a,b,c를 입력하시오.");
	scanf("%d%d%d", &a, &b, &c);

	if (a > b) {
		if (a > c) 	printf("최대값은 %d", a);
		else printf("최대값은 %d", c);
	}
	else if (b>c) printf("최대값은 %d", b);  //else와 if(b>c)를 하나로 합쳐 else if로 함.	
	else printf("최대값은 %d", c); //위 두개를 다 충족하지 않으면 c를 출력하도록 else 사용.
}

그러나 이 식은 한번에 식을 이해하기 어려워서 비추!
무조건 짧게 한다고 능사는 아니다. 남이 볼 때 한번에 알 수 있게 정갈하게 짜는 게 좋다.

중괄호 같은 것만 잘 정리하기..

 

 if,else if, else 차이?

예를 들어
if문이 3개가 있으면 첫번째 조건이 참이더라도 나머지들도 다 확인하면서 내려옴. 나중에 프로그램을 짤 때 이렇게 짠다면 구동시간이 많이 길어질 것이다.
else if를 같이 쓰면 위의 if 조건이 맞지 않으면, 그 다음 것을 하나씩 확인하면서 내려오다가 맞는 조건에서 멈춤.
else는 if와 else if에 충족되지 않는 것들을 모두 출력시킴.

 

 

swich문 

>>>>~~~~~

 

문제 분석

ㅡ1,2,3,4 중 무엇을 누르느냐에 따라 다르게 출력문 나오도록 프로그램 작성
ㅡ일단 1,2,3,4 누르면 뭐에 해당하는지  각각 설명.
ㅡ사용자가 숫자 입력(scanf 이용,그 값 받으려는 정수 변수 먼저 선언.)
ㅡ사용자가 번호 누르면 해당 번호에 맞는 문장 출력

 

int main(void) {
	int num;
	printf("번호를 선택해 주세요.");
	printf("1 : ㄱ입니다.\n");
	printf("2 : ㄴ입니다.\n");
	printf("3 : ㄷ입니다.\n");
	printf("4 : ㄹ입니다.\n");

	scanf("%d", &num);

	switch (num) {
	case 1: printf("ㄱ"); break;
	case 2: printf("ㄴ"); break;
	case 3: printf("ㄷ"); break;
	case 4: printf("ㄹ"); break;
	default:break;
	}
}

 

break 유무에 따라 출력이 어떻게 다른가?

1.

int main(void) {
	int num;

	printf("번호를 선택해 주세요.");
	printf("1 : ㄱ입니다.\n");
	printf("2 : ㄴ입니다.\n");
	printf("3 : ㄷ입니다.\n");
	printf("4 : ㄹ입니다.\n");

	scanf("%d", &num);

	switch (num) {
	case 1: printf("ㄱ"); 
	case 2: printf("ㄴ"); 
	case 3: printf("ㄷ"); 
	case 4: printf("ㄹ"); break;  
	default:break;
	}
}
 >> 1을 누르면, 1의 해당하는 ㄱ이 출력됨.
 그런데  break가 없으므로 멈추지 않고 밑에 것까지 계속 읽으며 내려가서 줄줄이 출력하고
 ㄱ,ㄴ,ㄷ,ㄹ까지 출력하고 ㄹ에서 braek 걸려서 멈춤

2.

int main(void) {
	int num;

	printf("번호를 선택해 주세요.");
	printf("1 : ㄱ입니다.\n");
	printf("2 : ㄴ입니다.\n");
	printf("3 : ㄷ입니다.\n");
	printf("4 : ㄹ입니다.\n");

	scanf("%d", &num);

	switch (num) {
	case 1: printf("ㄱ"); 
	case 2: printf("ㄴ"); 
	case 3: printf("ㄷ"); 
	case 4: printf("ㄹ");
	default:break;
	}
}

>>1을 입력하면, ㄱㄴㄷㄹ 출력되고 
2를 입력하면 ㄴㄷㄹ 출력.... 
break가 없으므로 중간에 멈추는 게 없어서 그냥 아래까지 모조리 출력

3.

int main(void) {
	int num;

	printf("번호를 선택해 주세요.");
	printf("1 : ㄱ입니다.\n");
	printf("2 : ㄴ입니다.\n");
	printf("3 : ㄷ입니다.\n");
	printf("4 : ㄹ입니다.\n");

	scanf("%d", &num);

	switch (num) {
	case 1: printf("ㄱ"); break;
	case 2: printf("ㄴ"); 
	case 3: printf("ㄷ"); 
	case 4: printf("ㄹ");
	default:break;
	}
}

>>이런경우에 1을 입력하면 ㄱ만 출력되고 멈추지만
2를 입력했을 때는 마찬가지로 아래에 break가 없으므로 ㄴㄷㄹ이 출력된다

 

 

goto문을 이용해서 코드를 짤 수도 있음

int main(void) {
	int num;

	makenum:   >>키를 입력받는 작업을 makenum 으로 묶음

	printf("번호를 선택해 주세요.");
	printf("1 : ㄱ입니다.\n");
	printf("2 : ㄴ입니다.\n");
	printf("3 : ㄷ입니다.\n");
	printf("4 : ㄹ입니다.\n");

	scanf("%d", &num);

	switch (num) {
	case 1: printf("ㄱ"); break;
	case 2: printf("ㄴ"); 
	case 3: printf("ㄷ"); 
	case 4: printf("ㄹ");
	default:
		break;
		goto makenum; >>만일 케이스 외의 경우가 들어오면 기본값인 'goto makenum' 실행. 
                      다시 위로 올라가 makenum(키를 재입력)하게 함.
	}
}

 

그러나 goto문을 쓰게 되면 스파게티 코드가 될 수 있다고 하셨음.... 쓰지 말라고 하심 쓰지 말것.

그리고 소괄호랑 중괄호 구분해서 코드 잘 짤 것.

 

복습 끝