실습 1-1 // 세 값의 최댓값
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #include <stdio.h> int main() { int a, b, c, max; printf("정수 1 입력 : "); scanf("%d", &a); printf("정수 2 입력 : "); scanf("%d", &b); printf("정수 3 입력 : "); scanf("%d", &c); /* 내가 짜본 코드 if (a > b) max = a; else max = b; if (c > max) max = c; */ max = a; if (max < b) max = b; if (max < c) max = c; printf("세 정수 중 최댓값은 %d\n", max); return 0; } | cs |
연습문제
//네 값의 최댓값을 구하는 함수 max4
1 2 3 4 5 6 7 8 | int max4(int a, int b, int c, int d) { int max = a; if (b > max) max = b; if (c > max) max = c; if (d > max) max = d; return max; } | cs |
//세 값의 최솟값을 구하는 함수 min3
1 2 3 4 5 6 7 8 | int min3(int a, int b, int c) { int min = a; if (b < min) min = b; if (c < min) min = c; return min; } | cs |
//네 값의 최솟값을 구하는 함수 min4
1 2 3 4 5 6 7 8 | int min4(int a, int b, int c, int d) { int min = a; if (b < min) min = b; if (c < min) min = c; if (d < min) min = d; return min; } | cs |
보충수업 1-4
//세 수 a,b,c의 대소 관계는 13가지? 계산해보기
a> ~인 경우 :
a>b>c : 6가지
a>b=c : 3가지
a= ~인 경우 :
a=b>c : 3가지
a=b=c : 1가지
----------------------
13가지
//중앙값을 구하는 알고리즘
생각해보기:
우선 앞의 두 수를 비교했을 때
-두 수의 크기가 다르다면
max=(a>b)? a:b;
min=(a<b)? a:b;
if(c<max)
if(c>min) med=c;//두 수 사이에 있으므로 중앙값은 c
else med=min;//c가 최솟값이므로 중앙값은 min
else
med=max;//c가 최댓값보다 크므로 중앙값은 max
-두 수의 크기가 같다면 그 값이 중앙값이다.
if(a==b) med=a;
위의 생각으로 짠 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int med3(int a, int b, int c) { int max, min, med; if (a == b) med = a; else { max = (a > b) ? a : b; min = (a < b) ? a : b; if (c < max) { if (c > min) med = c; else med = min; } else med = max; } return med; } | cs |
실습 1C-1//대소관계 트리에 따라서 구하는 프로그램
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <stdio.h> int med3(int a, int b, int c) { if (a >= b) if (b >= c) return b; else if (a <= c)//a>=b이고 b<c인 경우에 a,c의 대소 확인=>크지 않은 값 return a; else return c; else if (a > c)//a<b이고 a>c인 경우 : c<a<b return a; else if (b > c)//a<b이고 a<=c이고 b>c인 경우 : a<=c<b return c; else return b;//a<b이고 a<=c이고 b<=c인 경우 : a<b<=c } int main() { int a, b, c; printf("정수 입력 : "); scanf("%d", &a); printf("정수 입력 : "); scanf("%d", &b); printf("정수 입력 : "); scanf("%d", &c); printf("중앙값은 %d\n",med3(a,b,c)); return 0; } | cs |
연습문제
//아래 함수가 위의 실습 1C-1의 함수보다 효율이 떨어지는 이유
1 2 3 4 5 6 7 8 9 | int med3(int a, int b, int c) { if ((b >= a && c <= a) || (b <= a && c >= a))// c<=a<=b이거나 b<=a<=c인 경우 return a; else if ((a > b && c < b) || (a < b && c > b))// c<b<a이거나 a<b<c인 경우 return b; return c; } | cs |
//나의 코드를 다시 점검해 보자면
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | int med3(int a, int b, int c) { int max, min; if (a == b) return a; else { max = (a > b) ? a : b; min = (a < b) ? a : b; if (c < max) { if (c > min) return c; else return min; } else return max; } } | cs |
우선 med를 지우고 return으로 코드를 줄여봤다.
1. a==b인 경우를 걸러낸다
2. a!=b인 케이스에 한해
a,b중 큰 값을 max에, 작은 값을 min에 대입하는 과정에서 a와 b의 대소 판단을 반복했다.
-> 두 줄을 합쳐 작성해보았다. 한 번의 판단으로 가능해졌다.
1 | (a > b) ? (max = a, min = b) : (max = b, min = a); | cs |
그 이후로 반복되는 판단은 없다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int med3(int a, int b, int c) { int max, min; if (a == b) return a; else { (a > b) ? (max = a, min = b) : (max = b, min = a); if (c < max) { if (c > min) return c; else return min; } else return max; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> int med3(int a, int b, int c) { if (a >= b) if (b >= c) return b;//c<=b<=a else if (a <= c) return a;//b<=a<=c else return c; else if (a > c)//c<a<b return a; else if (b > c)//a<=c<b return c; else return b;//a<b<=c } | cs |
프로그램 순서도(Program Flowchart) 기호
평행사변형 -> 데이터의 입출력
직사각형-> 처리
좌우 테두리가 있는 직사각형 -> 미리 정의한 처리
마름모 -> 판단 :하나의 입구와 하나 이상을 선택할 수 있는 출구(스위치 기능)
쪼개놓은 팔각형 -> 루프(반복) 범위
선 -> 제어의 흐름
둥근 사각형 -> 단말 : 외부환경으로 나가거나 외부환경에서 들어오는 것 (ex- 프로그램 흐름의 시작과 종료)