프로그래밍실습 제 5 강
강의 내용 최댓값의 계산 논리연산자 두 양의 정수의 평균을 구하여 출력하는 프로그램 거스름돈 계산 제어문 if … else if … else 의 사용 배수 판정 조건문의 중첩 C언어 에서의 참과 거짓 실수끼리 비교하는 것은 매우 위험 이차방정식의 실근을 구하는 예 거스름돈 지폐 및 동전의 수 계산 제어문 switch의 사용 switch 문 사용시 주의 사항 break를 의도적으로 생략한 switch문 물음표연산자
(최댓값의 계산) 4개의 정수를 입력받아 그 중 최댓값을 출력하는 프로그램을 작성하여보자. 입출력 예: 4개의 정수를 입력하시오: 12 36 77 -98 최댓값: 77 #include<stdio.h> main() { int a,b,c,d,max; printf("4개의 정수를 입력하시오: "); scanf("%d %d %d %d",&a,&b,&c,&d); if(a>b) max=a; else max=b; if(c>max) max=c; if(d>max) max=d; printf("최댓값: %d\n",max); }
논리연산자 && : “그리고(and)”의 의미. &&의 앞 뒤가 모두 참이어야 참이 된다. || : “또는(or)”의 의미. ||의 앞 뒤 식중 하나라도 참이면 참이 된다. ! : “부정(not)”의 의미. ! 뒤에 나오는 식의 참, 거짓을 바꾼다. #include<stdio.h> main() { int a,r,s; printf("양의 정수를 입력하십시오: "); scanf("%d",&a); r=a%2; s=a%3; if(r==0 || s==0) // 논리연산자의 사용 printf("입력한 수는 2의 배수이거나 3의 배수입니다.\n"); else printf("입력한 수는 2의 배수도 아니고 3의 배수도 아닙니다.\n"); }
다음 프로그램은 어떤 일을 하는지 생각해 보자. #include<stdio.h> main() { int num1,num2,sum; double average; printf("두 양의 정수를 입력하십시오: "); scanf("%d %d",&num1,&num2); if(num1>0 && num2>0){ sum=num1+num2; average=(double)sum/2.; printf("두 수의 평균: %.1f\n",average); } else printf("오류: 입력이 잘못 되었습니다.\n"); 두 양의 정수의 평균을 구하여 출력하는 프로그램
(거스름돈 계산) 100원짜리 동전 하나를 가지고 1원부터 100원까지의 범위에 있는 물건을 하나 구입하는 경우 거스름돈이 얼마인지 계산하는 프로그램을 작성하여 보자. 몇 가지 입출력 예를 보면 다음과 같다. 물건 가격을 입력하십시오.(1-100): 46 거스름돈: 54원 물건 가격을 입력하십시오.(1-100): 100 거스름돈: 0원 물건 가격을 입력하십시오.(1-100): 110 입력 오류.
#include<stdio.h> main() { int price,change; printf("물건 가격을 입력하십시오.(1-100): "); scanf("%d",&price); if(price>100 || price<0) printf("입력 오류.\n"); else{ change=100-price; printf("거스름돈: %d원\n",change); }
제어문 if … else if … else 의 사용 #include<stdio.h> main() { int score; char grade; printf("점수를 입력하십시오: "); scanf("%d",&score); if(score>=90) grade='A'; else if(score>=80) grade='B'; else if(score>=70) grade='C'; else grade='F'; printf("학점은 %c입니다.\n",grade); }
(배수 판정) 정수 하나를 입력 받아 입력된 정수가 2의 배수인지, 3의 배수인지, 6의 배수인지 판별하는 프로그램을 작성해 보자. 다음은 입출력의 다양한 예이다. 정수 입력: 12 6의 배수 정수 입력: 9 3의 배수 정수 입력: 14 2의 배수 정수 입력: 23 => 2의 배수도 아니고 3의 배수도 아님
#include<stdio.h> main() { int a,r1,r2; printf("정수 입력: "); scanf("%d",&a); r1=a%2; r2=a%3; if(r1==0 && r2==0) printf("=> 6의 배수\n"); else if(r1==0) printf("=> 2의 배수\n"); else if(r2==0) printf("=> 3의 배수\n"); else printf("=> 2의 배수도 아니고 3의 배수도 아님\n"); }
(조건문의 중첩) 앞의 예는 조건문을 중첩 사용하여 다음과 같이 바꿀 수도 있다. #include<stdio.h> main() { int a,r1,r2; printf("정수 입력: "); scanf("%d",&a); r1=a%2; r2=a%3; if(r1==0) if(r2==0) // if문의 중첩 사용 printf("=> 6의 배수\n"); else printf("=> 2의 배수\n"); else if(r2==0) printf("=> 3의 배수\n"); printf("=> 2의 배수도 아니고 3의 배수도 아님\n"); }
(C언어 에서의 참과 거짓) C언어에서 0은 거짓을 나타내며, 0이 아닌 모든 수는 참을 나타낸다. #include<stdio.h> main() { int a=3,b=0; if(a==3) printf("출력1\n"); if(!a==3) printf("출력2\n"); // ! :참, 거짓을 반대로 바꿈 if(1) printf("출력3\n"); // 0이 아닌 수는 참을 나타냄 if(0) printf("출력4\n"); // 0은 거짓을 나타냄 if(3) printf("출력5\n"); // 0이 아닌 수는 참을 나타냄 if(b=0) printf("출력6\n"); // b에 저장된 0은 거짓을 나타냄 if(a=3) printf("출력7\n"); // a에 저장된 3은 참을 나타냄 } 실행 결과: 출력1 출력3 출력5 출력7
주의: C언어에서 실수끼리 비교하는 것은 매우 위험하다. #include<stdio.h> main() { double a; a=0.1+0.7; if(a==0.8) // 실수끼리 비교하는 것은 위험하다. printf("0.1+0.7은 0.8입니다.\n"); else printf("0.1+0.7은 0.8이 아닙니다.\n"); } 출력: 0.1+0.7은 0.8이 아닙니다. 이유: C언어는 내부적으로 2진수를 사용한다. 10진수에서 유한소수인 실수가 2진수에서는 무한소수가 될 수 있다. 이 경우 반올림 오차가 발생한다.
이차방정식의 실근을 구하는 예 아래 예는 이차방정식 ax2 + bx + c = 0 의 실근을 구하는 프로그램이다. #include<stdio.h> #include<math.h> main() { double a, b, c, D, r1, r2; printf("a, b, c 입력: "); scanf("%lf %lf %lf",&a,&b,&c); D=b*b-4.*a*c; //판별식 if(D>0.){ r1=(-b+sqrt(D))/(2.*a); r2=(-b-sqrt(D))/(2.*a); printf("두 실근: %g, %g\n",r1, r2); } else if(D==0.){ // 실수끼리 등호(==)로 비교하는 것은 좋지 않음 r1=-b/(2.*a); printf("중근: %g\n",r1); else printf("실근이 존재하지 않습니다.\n");
앞의 C코드를 다음과 같이 개선해 보자. #include<stdio.h> #include<math.h> main() { double a, b, c, D, r1, r2, epsilon=1.e-10, sqD; printf("a, b, c 입력: "); scanf("%lf %lf %lf",&a,&b,&c); D=b*b-4.*a*c; if(D>=epsilon){ sqD=sqrt(D); // 반복되는 복잡한 식은 한 번만 계산 r1=(-b+sqD)/(2.*a); r2=(-b-sqD)/(2.*a); printf("두 실근: %g, %g\n",r1, r2); } else if(fabs(D)<epsilon){ //등호(==)로 실수를 비교하는 것을 피함 r1=-b/(2.*a); printf("중근: %g\n",r1); else printf("실근이 존재하지 않습니다.\n");
거스름돈 지폐 및 동전의 수 계산 10,000원짜리 지폐 하나로 가격이 500원부터 10,000원까지의 범위에 있는 물건을 하나 구입하는 경우, 거스름돈이 얼마인지 계산하고 거스름돈의 1,000원짜리 지폐의 수와 500원짜리 동전의 수가 각각 몇 개인지도 계산하는 프로그램을 작성하여 보자. (단, 물건 가격은 500의 배수이며, 거스름돈은 1,000원짜리지폐와 500원 짜리 동전만 사용한다. ) 입출력 예를 보면 다음과 같다. 물건값을 입력하십시오.(500~10000, 500의배수): 3500 거스름돈: 6500원 1000원짜리 지폐: 6장 500원짜리 동전: 1개
힌트: int price,change,n1000,n500; price: 물건 가격 change: 거스름돈 n1000: 거슬러 줄 1000원짜리 지폐의 수 n500: 거슬러 줄 500원 동전의 수 change=10000-price; n1000=change/1000; n500=change%1000/500;
완성된(?) C코드 #include<stdio.h> main() { int price,change,n1000,n500; printf("물건값을 입력하십시오.(500~10000, 500의배수): "); scanf("%d",&price); change=10000-price; printf("거스름돈: %d원\n",change); n1000=change/1000; n500=change%1000/500; printf(" 1000원짜리 지폐: %d장\n",n1000); printf(" 500원짜리 동전: %d개\n",n500); }
개선된 C코드 #include<stdio 개선된 C코드 #include<stdio.h> main() { int price,change,n1000,n500; printf("물건값을 입력하십시오.(500~10000, 500의배수): "); scanf("%d",&price); if(price>10000 || price<0) printf("입력 오류.\n"); else if(price%500!=0) else{ change=10000-price; printf("거스름돈: %d원\n",change); n1000=change/1000; n500=change%1000/500; printf(" 1000원짜리 지폐: %d장\n",n1000); printf(" 500원짜리 동전: %d개\n",n500); }
앞의 예는 다음과 같이 바꿔도 된다. #include<stdio 앞의 예는 다음과 같이 바꿔도 된다. #include<stdio.h> main() { int price,change,n1000,n500; printf("물건값을 입력하십시오.(500~10000, 500의배수): "); scanf("%d",&price); if(price>=500 && price <=10000 && price%500==0){ change=10000-price; printf("거스름돈: %d원\n",change); n1000=change/1000; n500=change%1000/500; printf(" 1000원짜리 지폐: %d장\n",n1000); printf(" 500원짜리 동전: %d개\n",n500); } else printf("입력 오류.\n");
제어문 switch의 사용 #include<stdio.h> main() { int score; char grade; printf("점수를 입력하십시오: "); scanf("%d",&score); score/=10; switch(score){ case 10: grade='A'; break; case 9: case 8: grade='B'; case 7: grade='C'; default: // score가 9, 8, 7이 아닌 모든 경우 grade='F'; } printf("학점은 %c입니다.\n",grade);
switch 문 사용시 주의 사항 switch(정수식){ ……… } 의 형태이며 switch 다음 괄호 ( ) 안에는 정수식만 가능하다. 전체의 ……… 은 반드시 중괄호{ } 로 둘러싼다. 각각의 case는 정수식의 값에 따라 수행하며 해당되는 값이 없을 때는 default의 내용을 수행한다. 또한 각 case는 case 정수: 와 같이 끝에 콜론 : 을 붙여준다. 선택된 case를 수행한 뒤 switch를 벗어나려면 break;를 사용한다. break;가 없는 경우 break;를 만나기 전까지 나타나는 모든 내용을 수행하게 되므로 주의해야 한다. 각 case마다 수행해야 할 내용이 여러 줄이라도 중괄호{ }로 묶어줄 필요는 없다.
다음 프로그램의 내용이 무엇인지 이해해 보자. #include<stdio.h> main() { int a,r; printf("양의 정수를 입력하십시오: "); scanf("%d",&a); r=a%3; switch(r){ case 1: printf("a를 3으로 나눈 나머지는 1입니다..\n"); printf("a에 2를 더하면 3의 배수가 됩니다.\n"); break; case 2: printf("a를 3으로 나눈 나머지는 2입니다..\n"); printf("a에 1를 더하면 3의 배수가 됩니다.\n"); default: printf("a는 3의 배수 입니다..\n"); }
break를 의도적으로 생략한 switch문 #include<stdio.h> main() { int point,a; printf("보너스 포인트를 입력하십시오.\n"); scanf("%d",&point); if(point>=10000) a=3; else if(point>=5000) a=2; else if(point>=1000) a=1; else a=0; printf("사은품 내역:\n"); switch(a){ case 3: printf("김치 냉장고\n"); case 2: printf("전자레인지\n"); case 1: printf("주방 세제 및 비누, 치약 세트\n"); break; default: printf("없음(포인트가 부족합니다.)\n"); }
물음표연산자 x = (조건식) ? y : z의 형태 조건식이 참이면 y값을 x에 저장 조건식이 거짓이면 z값을 x에 저장 예: 두 수의 최댓값을 구하는 예 #include<stdio.h> main() { int a, b, max; scanf("%d%d",&a,&b); max=(a>b)?a:b; printf("a=%d b=%d max=%d\n",a,b,max); } C코드: 04_01.c ~ 04_09b.c