Download presentation
Presentation is loading. Please wait.
1
프로그래밍실습 제 7 강
2
강의 내용 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) 판정 프로그램
3
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=
4
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=
5
참고: 특별한 경우의 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문의 경우 조건식의 참, 거짓 여부와 상관없이 반복될 부분을 일단 한 번 수행함.
6
1 for 문의 중첩을 사용하여 다음 출력이 나오는 프로그램을 작성하라. 12 123 1234 12345 123456
7
#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"); }
8
점화식으로 주어지는 수열의 출력 다음 수열의 처음 20항을 모두 출력해 보자.
a1 = 1, an+1 = (1/5) an (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.; }
9
출력: a( 1)= a( 2)= a( 3)= a( 4)= a( 5)= a( 6)= a( 7)= a( 8)= a( 9)= a(10)= a(11)= a(12)= a(13)= a(14)= a(15)= a(16)= a(17)= a(18)= a(19)= a(20)=
10
break문과 continue문 break문은 for, while, do while등의 순환문에서 강제로 벗어나게 할 때 사용한다. (switch문에서도 사용 한다.) continue문은 for, while, do while등의 순환문에서 블록의 끝으로 바로 이동한 뒤 반복을 계속하도록 한다.
11
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
12
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입니다.
13
참고(3): 다음 C 프로그램의 실행 결과는? #include<stdio.h> main() {
int i=0,s=0; for( ; ; ){ // 초기화식, 조건식, 변화식 모두 생략됨 i++; s+=i; if(i==100) break; } printf("%d\n",s); 출력: 5050
14
참고(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 참조)
15
다음과 같은 원 모양을 출력해 보자. * *********************
***************************** ************************************* ***************************************** ********************************************* ************************************************* *************************************************** ***************************************************** ******************************************************* ********************************************************* *********************************************************** *************************************************************
16
힌트: 줄 간격과 글자 간격이 다르므로 원의 방정식 대신 타원의 방정식을 생각한다.
타원 안에 들어오는 점은 '*', 그렇지 않은 점은 공백문자(' ')를 출력한다. 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");
17
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");
18
소수(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은 소수이다.
19
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);
20
실행: 입력 값으로 4,294,967,291(=-5)을 주는 경우 실행결과를 얻는데 매우 오랜 시간이 걸린다. 해결책: 예를 들어 64의 약수는 1, 2, 4, 8, 16, 32, 64 이므로 64의 양의 제곱근인 8까지만 나누어 보면 충분하다. 따라서 n < k*k 이면 더 이상 k로 나누어 볼 필요가 없다. 이 식에서 k가 크면 오버플로가 발생할 수 있으므로 이를 피하기 위하여 부등식을 변형하여 n/k < k 이면 for 루프를 벗어나게 한다.
21
개선된 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);
22
또 다른 개선된 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);
Similar presentations