조건문(if-else 문)
조건식을 평가하여 참이면 if와 else 사이의 종속문장1(블록1-종속문장1,2)을 수행하고 거짓이면 종속문장2(블록2-종속문장1,2)를 수행
// 예제
#include<stdio.h>
int main(void)
{
int num1, num2;
scanf("%d %d", &num1, &num2);
if (num1 > num2) // num1>num2이 참이면 아래의 문장을 실행
printf("참이므로 %d", num1 > num2);
else // num1>num2이 거짓이면 아래의 문장을 실행
printf("거짓이므로 %d", num1 > num2);
}
#include<stdio.h>
int main(void)
{
int su1, su2, max, min;
printf("정수 두 개를 입력하세요...");
scanf("%d%d", &su1, &su2);
if (su1 > su2)
{
max = su1; // 괄호가 없으면 if의 종속문장은 얘밖에 없다.
min = su2; // 얘 때문에 else가 if랑 매칭이 안 된다.
}
else
{
max = su2;
min = su1;
}
printf("\n max=%d min=%d", max, min);
}
#include<stdio.h>
int main(void)
{
int num1, num2;
scanf("%d %d", &num1,&num2);
if (num1>num2) // num1>num2이 참이면 아래의 if 종속문장 블록을 실행
{
printf("num1이 num2보다 큽니다.\n");
printf("%d>%d\n", num1, num2);
}
else // num1>num2이 거짓이면 아래의 else 종속문장 블록을 실행
{
printf("num1이 num2보다 크지 않습니다.\n");
printf("%d<=%d\n",num1,num2);
}
}
// 종속문장 블록의 내용이 조건과 일치해야 한다.
// 우리가 때로는 전체의 프로그램과 상관없는 확인용 코드를 넣을 때가 있다.
중첩된 if문
// 조건식 1과 조건식 2의 순서가 중요할까?
// 정답은 그때그때 다르다.
// 중첩 if문이 있는데, else가 없다고 하면 순서가 중요하지 않다.
// 하지만 else가 있다면 논리적으로 따져봐야 한다.
#include<stdio.h>
int main(void)
{
int su;
printf("정수 한 개를 입력하세요...");
scanf("%d", &su);
if (su >= 0)
{
if ((su % 2) == 0)
printf("%d : 양의 짝수", su);
else
printf("%d : 양의 홀수", su);
}
else
printf("%d : 음수", su);
printf("\n----- 프로그램 실행 끝 -----");
}
조건문 (다중-if)
여러 개의 조건 중에 맞는 부분을 찾아서 실행. 단순 if문으로도 똑같이 만들 수 있지만, 단순 if문은 흘러가는 느낌이라면 다중 if문은 조건 만족시 아예 다음 문장으로 넘어간다. 따라서 효율적이라 할 수 있다.
마지막 else는 절대필요요소는 아니다. 필요하지 않다면 생략해도 된다.
#include<stdio.h>
int main(void)
{
int kor, eng, mat, avr;
printf("3과목 성적을 입력하세요...");
scanf("%d%d%d", &kor, &eng, &mat);
avr = (kor + eng + mat) / 3;
if (avr < 70)
printf("\n불합격!!!");
else if (kor < 60)
printf("\n불합격!!!");
else if (eng < 60)
printf("\n불합격!!!");
else if (mat < 60)
printf("\n불합격!!!");
else
printf("\n합격!!!");
}
// 위의 예제를 논리 연산자를 이용하여 코딩수를 줄이시오
#include<stdio.h>
int main(void)
{
int kor, eng, mat, avr;
printf("3과목 성적을 입력하세요...");
scanf("%d%d%d", &kor, &eng, &mat);
avr = (kor + eng + mat) / 3;
if (avr < 70 || kor < 60 || eng < 60 || mat < 60)
printf("\n불합격!!!");
else
printf("\n합격!!!");
}
--------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
int main(void)
{
int kor, eng, mat, avr;
printf("3과목 성적을 입력하세요...");
scanf("%d%d%d", &kor, &eng, &mat);
avr = (kor + eng + mat) / 3;
if (avr > 0)
printf("0보다 크다\n");
else if (avr > 50)
printf("50보다 크다\n");
else if (avr >= 100)
printf("100보다 크다\n");l
}
// 버그가 생긴다. 맨 첫 조건이 다른 조건을 다 포함하기 때문에 다른 문장이 걸리지 않는다.
// 다중 if문을 조건식을 만들 때는
#include<stdio.h>
int main(void)
{
int kor, eng, mat, sum;
double avr;
printf("3과목 성적을 입력하세요...");
scanf("%d%d%d", &kor, &eng, &mat);
sum = kor + eng + mat;
avr = (double)sum / 3;
if (avr >= 100)
printf("100보다 크다\n");
else if (avr >= 50)
printf("50보다 크다\n");
else if (avr >= 0)
printf("0보다 크다\n");
}
--------------------------------------------------------------------------------------------------------------------------
// 문제(if)
// 1. 유원지에서 말을 태워주는데 처음 30분의 기본요금은 1인당 3000원이다. 이후에는 10분당 500원씩의 추가 요금을 받는다.
// 말을 탄 시간을 입력받아서 전체 금액을 계산하는 프로그램을 작성하여라.
#include<stdio.h>
int main(void)
{
int num, ex;
printf("말 탄 시간(분) 입력:");
scanf("%d", &num);
ex = (num - 30) / 10;
if (num > 30)
{
if (num % 10)
{
ex += 1;
printf("요금은 %d원입니다.\n", 3000 + ex * 500);
}
else
printf("요금은 %d원입니다.\n", 3000 + ex * 500);
}
else
printf("요금은 %d원입니다\n", 3000);
}
// T풀이 1
#include<stdio.h>
int main(void)
{
int time, money=3000;
printf("말 탄 시간(분) 입력:");
scanf("%d", &time);
time -= 30;
if (time > 0) // 초과 요금 발생 여부 확인 만일 거짓이면 기본요금입니다.
{
if (time % 10 == 0) // 말을 탄 시간이 10분 단위로 똑 떨어지는 경우 예) 40분, 50분
money = money + time / 10 * 500;
else // 분 단위로 떨어지는 시간 예) 41분, 45분, 56분
money = money + time / 10 * 500 + 500;
}
printf("요금은 %d원입니다\n", money);
}
// T풀이 2 (한번에 하는 방법)
#include<stdio.h>
int main(void)
{
int time, money = 3000;
printf("말 탄 시간(분) 입력:");
scanf("%d", &time);
time -= 30;
if (time > 0) // 초과 요금 발생 여부 확인 만일 거짓이면 기본요금입니다.
{
money = money + (time - 1) / 10 * 500 + 500;
}
printf("요금은 %d원입니다\n", money);
}
// 2. 배달도시락을 주문하는데 10개까지는 개당 2500원이고 10개를 초과하는 양에 대해서는 개당 2400원이다.
// 배달 도시락의 개수를 입력받아서 금액을 계산하는 프로그램을 작성하라.
#include<stdio.h>
int main(void)
{
int num;
printf("도시락 주문 개수 입력:");
scanf("%d", &num);
if (num > 10)
printf("총 금액은 %d입니다\n", 25000 + (num - 10) * 2400);
else
printf("총 금액은 %d입니다\n", num * 2500);
}
//// T풀이
#include<stdio.h>
int main(void)
{
int num, money;
printf("도시락 주문 개수 입력:");
scanf("%d", &num);
if (num > 10)
money = 2500 * 10 + (num - 10) * 2400;
else
money = num * 2500;
printf("총 금액은 %d입니다\n", money);
}
// 3. 디스켓 1통에 5000원한다. 그런데 한번에 10통 이상을 사면 전체 금액의 10%를 할인하여 준다.
// 그리고 100통 이상을 사면 전체 금액의 12%를 할인하여 준다.
// X통의 디스켓을 사려면 얼마가 있어야 하는가?
#include<stdio.h>
int main(void)
{
int num;
printf("디스크 구매 개수 입력:");
scanf("%d", &num);
if (num >= 100)
printf("총 %.2f의 금액이 필요합니다\n", num * 5000 * 0.88);
else if (num >= 10)
printf("총 %.2f의 금액이 필요합니다\n", num * 5000 * 0.9);
else
printf("총 %d의 금액이 필요합니다\n", num * 5000);
}
// T풀이
#include<stdio.h>
int main(void)
{
int disk, money;
printf("디스크 구매 개수 입력:");
scanf("%d", &disk);
if (disk >= 100)
money = disk * 5000 * 0.88;
else if (disk >= 10 && disk<100)
money = disk * 5000 * 0.9;
else
money=disk * 5000;
printf("총 디스크 구매금액은 %d원\n", money);
}
// 4. 세 과목의 성적을 입력 받아 합계와 평균을 구하고 평균이 90이상이면 A, 80이상이면 B, 70이상이면 C, 60 이상이면 D,
// 60 미만이면 F를 출력하시오.
#include<stdio.h>
int main(void)
{
int kor, eng, mat, sum;
double avg;
printf("세 과목의 점수를 차례로 입력하세요");
scanf("%d%d%d", &kor, &eng, &mat);
sum = kor + eng + mat;
avg = (double)sum / 3;
if (avg >= 90)
printf("A");
else if (avg >= 80)
printf("B");
else if (avg >= 70)
printf("C");
else if (avg >= 60)
printf("D");
else
printf("F");
}
// T풀이
#include<stdio.h>
int main(void)
{
int kor, eng, mat, sum;
double avg;
printf("세 과목의 점수를 차례로 입력하세요");
scanf("%d%d%d", &kor, &eng, &mat);
sum = kor + eng + mat;
avg = (double)sum / 3;
if (avg >= 90)
printf("총점:%d\n평균:%.2f\n학점 : A\n",sum,avg);
else if (avg >= 80)
printf("총점:%d\n평균:%.2f\n학점 : B\n", sum, avg);
else if (avg >= 70)
printf("총점:%d\n평균:%.2f\n학점 : C\n", sum, avg);
else if (avg >= 60)
printf("총점:%d\n평균:%.2f\n학점 : D\n", sum, avg);
else
printf("총점:%d\n평균:%.2f\n학점 : F\n", sum, avg);
}
--------------------------------------------------------------------------------------------------------------------------
조건문 (switch-case문)
다중 if문의 표현식과 비슷한 방법으로 실행 -> 잘못된 표현일 수 있다.
선풍기에서 스위치를 돌리는 듯한 느낌 (단계 조정)
default는 절대 필요요소는 아니다. 상수식이 모두 해당되지 않는 경우엔 default 로 간다.
// 예제
#include<stdio.h>
int main(void)
{
int num;
scanf("%d", &num);
switch (num)
{
case 1:
printf("1 입력\n");
break; // 종속되어있는 영역을 빠져나간다.
case 2:
printf("2 입력\n");
break;
default:
printf("1,2 제외한 나머지 입력\n");
}
}
// break는 소속된 영역 {}을 빠져 나온다.
// switch - case문, for, while의 영역에서 빠져나오는 것이고 if문은 제외다.
#include<stdio.h>
int main(void)
{
char ch;
scanf("%c", & ch);
switch(ch)
{
case 'a':
printf("a를 입력\n");
break;
case 'A':
printf("A를 입력\n");
break;
}
}
// 홀 따옴표는 문자 '상수식'이라서 case식에 사용할 수 있다. 문자열은 안 된다.
// 여기서 int는 되는지 확인해보자
// int ch로 하고 97, 65를 입력하면
#include<stdio.h>
int main(void)
{
int ch;
scanf("%d", &ch);
switch (ch)
{
case 'a':
printf("a를 입력\n");
break;
case 'A':
printf("A를 입력\n");
break;
}
}
// int로 변수설정을 하고 아스키코드 번호를 입력해도 실행되는 것을 알 수 있다.
// 그럼 double의 경우에는 어떨까?
// 다음의 경우를 보자.
#include<stdio.h>
int main(void)
{
double ch;
scanf("%lf", & ch);
switch(ch)
{
case 3.1:
printf("a를 입력\n");
break;
case 3.2:
printf("A를 입력\n");
break;
}
}
// 실행되지 않는다.
// switch 함수의 상수는 정수값만 가능한 것을 알 수 있다.
// 즉 문자열과 실수는 되지 않는다.
#include<stdio.h>
int main(void)
{
int num, ret;
scanf("%d", &num);
ret = num % 3;
switch (ret)
{
case 0:
printf("3의 배수\n");
break;
default:
printf("3의 배수가 아닙니다.\n");
break;
}
}
#include<stdio.h>
int main(void)
{
int num;
scanf("%d", &num);
switch (num % 3)
{
case 0:
printf("3의 배수\n");
break;
default:
printf("3의 배수가 아닙니다.\n");
break;
}
}
// 연산식도 가능하다. 단 정수로 떨어져야 한다.
// break문의 역할
// break가 절대요소는 아니다.
// 때에 따라서는 흘려 내려가야 할 필요가 있다.
// 다음 예제를 보자.
#include<stdio.h>
int main(void)
{
char ch;
printf("M:오전,A:오후,E:저녁\n");
scanf("%c", &ch);
switch (ch)
{
case 'M':
case 'm':
printf("Mornig \n");
break;
case 'A':
case 'a':
printf("Afternoon \n");
break;
case 'E':
case 'e':
printf("Evening \n");
break;
}
}
// C언어는 종속문을 비워둬도 없으면 에러 없이 그냥 타고 흘러 내려간다.
// 소문자, 대문자 구분없이 같은 결과를 유도할 수 있다.
// switch문과 if-else문의 비교
// 어떤 게 간결한지로 비교하기는 어렵다.
// if-else 문은 흘러 내려가면서 찾는 느낌이고
// switch 문은 바로 찾아간다.
// 범위에 관련된 건 switch문으로 만드는 데 한계가 있다.
#include<stdio.h> // print(). scanf()
#include<stdlib.h> // exit(), system()
#include<conio.h> // getch()
int main(void)
{
int num, data;
while(1) // 무한 반복하는 while문
{
printf("========================================\n");
printf("1. 정수 데이터를 입력하세요.\n");
printf("2. 정수 데이터를 출력합니다.\n");
printf("3. 프로그램을 종료합니다\n");
printf("========================================\n");
scanf("%d", &num);
switch (num)
{
case 1: printf("데이터를 입력하세요\n");
scanf("%d", &data); break;
case 2: printf("%d", data); getch(); break; // getch는 입력함수 getch는 키보드를 눌렀다가 떼자 마자 전달, 키 하나하나에 반응, scanf는 버퍼라는 기능을 이용해서 엔터를 쳐야 전송
case 3:exit(1); // exit대신 return;을 써도 된다.
// 입력함수는 프로세스를 잠시 중단하고 대기시키는 특성이 있다. getch는 특히 그런 역할을 수행한다.
}
system("cls");
}
}
#include<stdio.h>
#include<Windows.h>
void main()
{
int a;
while (1)
{
printf("1.계산기 2.그림판 3.노트패드 4.시스템 속성\n");
printf("선택 :");
scanf("%d", &a);
if (a == 1)
system("calc");
else if (a == 2)
system("mspaint");
else if (a == 3)
system("notepad");
else if (a == 4)
system("sysdm.cpl");
else
return;
system("cls");
}
}
// 실행파일
// .exe .com .bat 는 파일명만 작성해서 실행
// .msc .cpl 은 확장자까지 작성해서 실행
'IT&코딩 > C' 카테고리의 다른 글
C언어 2주차 복습-3 (0) | 2022.08.29 |
---|---|
C언어 2주차 복습-2 (0) | 2022.08.24 |
C언어 1주차 복습-4 (0) | 2022.08.17 |
C언어 1주차 복습-3 (0) | 2022.08.12 |
C언어 1주차 복습-2 (0) | 2022.08.10 |