프로그래밍실습 제 7 강
강의 내용 while문을 사용하여 1/2 – 1/4 + 1/6 – 1/8 + … + 1/98 – 1/100 구하기 do while문을 사용하여 1/2 – 1/4 + 1/6 – 1/8 + … + 1/98 – 1/100 구하기 특별한 경우의 for, while 및 do while의 차이 점화식으로 주어지는 수열의 출력 break문과 continue문 break와 while을 사용한 1부터 100까지의 정수 합 continue의 사용(1부터 100까지의 숫자중 10의 배수를 제외한 수의 합) 초기화식, 조건식, 변화식 모두 생략된 for문 원 모양의 출력 소수(prime number) 판정 프로그램
while 문을 사용하여 다음 합을 구하라. 1/2 – 1/4 + 1/6 – 1/8 + … + 1/98 – 1/100 #include<stdio.h> main() { int i=2,sign=1; double s=0.; while(i<=100){ s+=(double)sign/(double)i; i+=2; sign*=-1; } printf("s=%f\n",s); 출력: s=0.341624
do while 문을 사용하여 다음 합을 구하라. 1/2 – 1/4 + 1/6 – 1/8 + … + 1/98 – 1/100 #include<stdio.h> main() { int i=2,sign=1; double s=0.; do{ s+=(double)sign/(double)i; i+=2; sign*=-1; } while(i<=100); printf("s=%f\n",s); } 출력: s=0.341624
참고: 특별한 경우의 for, while 및 do while의 차이 #include<stdio.h> main() { int i,s=0; for(i=2;i<=1;i++){ s+=i; } printf("s=%d\n",s); 출력: s=0 int i=2,s=0; while(i<=1){ i+=1; do{ } while(i<=1); 출력: s=2 주의: do while문의 경우 조건식의 참, 거짓 여부와 상관없이 반복될 부분을 일단 한 번 수행함.
1 for 문의 중첩을 사용하여 다음 출력이 나오는 프로그램을 작성하라. 12 123 1234 12345 123456 1234567 12345678 123456789 1234567890 12345678901 123456789012 1234567890123 12345678901234 123456789012345 1234567890123456 12345678901234567 123456789012345678 1234567890123456789 12345678901234567890
#include<stdio.h> main() { int i,j; for(i=1;i<=20;i++){ for(j=1;j<=20-i;j++) printf(" "); for(j=1;j<=i;j++) printf("%d",j%10); printf("\n"); }
점화식으로 주어지는 수열의 출력 다음 수열의 처음 20항을 모두 출력해 보자. a1 = 1, an+1 = (1/5) an + 1 (n = 1, 2, 3, ...) #include<stdio.h> main() { int i; double a=1.; for(i=1; i<=20; i++){ printf("a(%2d)=%.12f\n", i, a); a=0.2*a+1.; }
출력: a( 1)=1.000000000000 a( 2)=1.200000000000 a( 3)=1.240000000000 a( 4)=1.248000000000 a( 5)=1.249600000000 a( 6)=1.249920000000 a( 7)=1.249984000000 a( 8)=1.249996800000 a( 9)=1.249999360000 a(10)=1.249999872000 a(11)=1.249999974400 a(12)=1.249999994880 a(13)=1.249999998976 a(14)=1.249999999795 a(15)=1.249999999959 a(16)=1.249999999992 a(17)=1.249999999998 a(18)=1.250000000000 a(19)=1.250000000000 a(20)=1.250000000000
break문과 continue문 break문은 for, while, do while등의 순환문에서 강제로 벗어나게 할 때 사용한다. (switch문에서도 사용 한다.) continue문은 for, while, do while등의 순환문에서 블록의 끝으로 바로 이동한 뒤 반복을 계속하도록 한다.
break와 while을 사용한 1부터 100까지의 정수 합 #include<stdio.h> main() { int i=1,s=0; while(1){ s+=i; i++; if(i>100) break; } printf("s=%d\n",s); 출력: s=5050
continue의 사용 1부터 100까지의 숫자중 10의 배수를 제외한 수의 합 #include<stdio.h> 1부터 100까지의 숫자중 10의 배수를 제외한 수의 합 #include<stdio.h> main() { int k,sum=0; for(k=1;k<=100;k++){ if(k%10==0) continue; sum+=k; // k가 10의 배수일 때는 이 부분이 무시된다. } printf("합은 %d입니다.\n",sum); 출력: 합은 4500입니다.
참고(3): 다음 C 프로그램의 실행 결과는? #include<stdio.h> main() { int i=0,s=0; for( ; ; ){ // 초기화식, 조건식, 변화식 모두 생략됨 i++; s+=i; if(i==100) break; } printf("%d\n",s); 출력: 5050
참고(4): 다음 C 프로그램의 실행 결과는? #include<stdio.h> main() { int i,s; for(i=0,s=0; i<100; i++,s+=i) ; printf("%d\n",s); } 출력: 5050 (C코드: 05_01.c ~ 05_12.c 참조)
다음과 같은 원 모양을 출력해 보자. * ********************* ***************************** ************************************* ***************************************** ********************************************* ************************************************* *************************************************** ***************************************************** ******************************************************* ********************************************************* *********************************************************** *************************************************************
힌트: 줄 간격과 글자 간격이 다르므로 원의 방정식 대신 타원의 방정식을 생각한다. 타원 안에 들어오는 점은 '*', 그렇지 않은 점은 공백문자(' ')를 출력한다. C 코드의 주요부: char c; int x,y,i,j,a,b; ……… // (a와 b의 값을 정해 준다,) for(x=-a; x<=a; x++){ for(y=-b;y=b;y++){ if((double)(x*x)/(a*a)+(double)(y*y)/(b*b)<=1.) c='*'; else c=' '; printf("%c",c); } printf("\n");
C 코드: #include <stdio.h> main() { int x,y,xx; char c; int a,b,aa,bb; a=15; b=30; aa=a*a; bb=b*b; for(x=-a;x<=a;x++){ xx=x*x; for(y=-b;y<=b;y++){ if((double)xx/(double)aa+(double)y*y/(double)bb<=1.) // 타원 c='*'; else c=' '; printf("%c",c); } printf("\n");
소수(prime number) 판정 프로그램 1은 소수도 아니고 합성수도 아니다. 소수: 2이상의 정수 중 양의 약수가 1과 자기 자신 뿐인 수 (예: 2, 3, 5, 7, 13, 17, …) 합성수: 2이상의 정수 중 소수가 아닌 수 (예: 4, 6, 8, 9, 10, 12, 14, 15, …) 소수를 판정하는 가장 초보적인 방법: 판정하고자 하는 2이상의 정수 n에 대하여 k=2, 3, 4, 5, … ,n-1 을 이용하여 n을 k로 나누어 본다. 나누어 떨어지는 k가 하나라도 있다면 n은 합성수이고 그렇지 않다면 n은 소수이다.
C코드 #include<stdio.h> main() { unsigned number,k; char prime='Y'; printf("자연수 하나를 입력하십시오:\n"); scanf("%u",&number); if(number==1){ printf("==> 1은 소수도 아니고 합성수도 아닙니다.\n"); } else{ for(k=2;k<number;k++){ if(number%k==0){ prime='N'; break; if(prime=='Y') printf("==> %u은(는) 소수입니다.\n",number); else printf("==> %u은(는) 합성수입니다.\n",number);
실행: 입력 값으로 4,294,967,291(=-5)을 주는 경우 실행결과를 얻는데 매우 오랜 시간이 걸린다. 해결책: 예를 들어 64의 약수는 1, 2, 4, 8, 16, 32, 64 이므로 64의 양의 제곱근인 8까지만 나누어 보면 충분하다. 따라서 n < k*k 이면 더 이상 k로 나누어 볼 필요가 없다. 이 식에서 k가 크면 오버플로가 발생할 수 있으므로 이를 피하기 위하여 부등식을 변형하여 n/k < k 이면 for 루프를 벗어나게 한다.
개선된 C코드: n=-5일 때도 매우 빨리 계산 결과가 나온다. #include<stdio.h> main() { unsigned number,k; char prime='Y'; printf("자연수 하나를 입력하십시오:\n"); scanf("%u",&number); if(number==1){ printf("==> 1은 소수도 아니고 합성수도 아닙니다.\n"); } else{ for(k=2;k<number;k++){ if(number%k==0){ prime='N'; break; if(number/k<k) break; if(prime=='Y') printf("==> %u은(는) 소수입니다.\n",number); else printf("==> %u은(는) 합성수입니다.\n",number);
또 다른 개선된 C코드 #include<stdio.h> #include<math.h> main() { unsigned number,k,m; char prime='Y'; printf("자연수 하나를 입력하십시오:\n"); scanf("%u",&number); m=(int)(sqrt(number)+1.); if(number==1){ printf("==> 1은 소수도 아니고 합성수도 아닙니다.\n"); } else{ for(k=2;k<number;k++){ if(number%k==0){ prime='N'; break; if(k>m) break; if(prime=='Y') printf("==> %u은(는) 소수입니다.\n",number); else printf("==> %u은(는) 합성수입니다.\n",number);