Download presentation
Presentation is loading. Please wait.
1
C언어 응용 제1주 실습 해보기
2
연습문제 27번(84쪽) 1부터 500까지의 완전수를 출력하고 마지막에 완 전수의 개수를 출력하는 프로그램을 작성하시오. 완전수(complete number)는 자신의 약수를 모두 더한 값이 자신과 같은 수를 말한다.
3
문제 이해 1부터 시작하여 1씩 증가 시키면서 500까지의 수 에 대해서 완전수인지를 판단하고 완전수이면 그 수를 출력하고 완전수의 개수를 하나 증가 시킨다. 이에 대한 자연어 의사코드는 다음과 같이 쓸 수 있겠다.
4
자연어 기술 1부터 500까지 변화 시킬 수를 변수 n 이라고 한다. 완전수의 개수를 저장할 변수를 count 라고 한다.
n이 완전수 이면 n을 출력하고 count를 1증가 시킨다. count를 출력한다.
5
의사 코드 기술 n ← 1; count ← 0; for ( n ← 1; n <= 500; n++) do { if (isComplete(n)) then { write n; count ← count + 1; } } write count;
6
완전수 인지의 판단 자신의 약수의 모든 합이 자신과 같아야 한다. 자신의 반보다 큰 약수는 없다.
따라서 1 부터 자신의 반보다 자거나 같은 수까지 1씩 증가 시키면서 약수 인지를 판단하여 약수 이 면 모두 더한다. 모두 더한 결과 가 자신과 같으면 완전수이다.
7
완전수 판단 자연어 기술 주어진 수를 n 이라고 한다. 주어진 수의 반을 half 라고 한다.
1부터 half 까지 변하는 수를 k라고 한다. 약수의 합을 sum 이라고 한다. sum에 0을 대입한다. k를 1부터 half 까지 1씩 증가 시키면서 다음을 반복한다. n을 k로 나눈 나머지가 0이면(약수이면) sum에 k를 더 한다. sum 이 n 과 같으면 완전수이다.
8
완전수 판단 의사코드 기술 isComplete(int n) half ← n/2; sum ← 0; for ( k ← 1; k <= half; k++) do { if ( n mod k = 0) then { sum ← sum + k; } } if (sum = n) then { return true; } return false; End isComplete(n)
9
프로젝트 생성 및 소스 작성 위에서 설명한 내용이 이해가 되면 이제 프로그램 을 작성할 준비가 된 것이다.
이해가 되지 않은 경우에는 처음부터 반복해서 읽 어서 이해하도록 한다. 몇 번을 읽었는데도 이해가 가지 않으면 질문하러 오시기 바랍니다.
10
Eclipse 실행 D:\Lec_hwl\CApp\y2014
11
Eclipse 실행
12
Workspace 확인 D:\Lec_hwl\CApp\y2014
13
CDT Perspective 확인 Dl 버튼을 클릭해서 수정 Java EE 로 되어 있음
14
CDT Perspective 확인 C/C++ 선택
15
CDT Perspective 확인 C/C++ 로 되어 있음
16
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
17
프로젝트 명 설정 Ch02Ex27 Empty Project Cygwin GCC
D:\Lec_hwl\capp\y2014\Ch02Ex27
18
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
19
생성된 빈 프로젝트
20
메인 소스 추가 프로젝트명 우클릭 -> New -> C File
21
파일명 설정 ex27.c 확장자 c를 꼭 사용해야 함. Default C source template
22
생성된 빈 소스 파일
23
기본 main 함수 작성
24
코드 작성 앞 알고리즘 작성에서 주어진 수가 완전수인지를 판단하는 함수 isComplete(n) 을 사용하므로 이 함수에 대한 원형을 먼저 선언해야 한다. 이 함수 는 정수를 하나 매개변수로 받아서 이 수가 완전수 이면 참(정수 값 1) 아니면 거짓(정수 값 0)을 돌려 주면 된다. 따라서 함수의 원형은 다음과 같이 하 면 된다. int isComplete(int n); main 함수 다음에 이 함수의 구현을 추가한다.
25
isComplete 함수가 추가 된 소스 main 함수는 아무 일도 하지 않고 바로 종료 한다.
이 코드는 우리가 작성한 알고리즘을 위해서 필요한 함수들만 작성한 것이다. 아직 실제로 알고리즘을 구현한 것은 없다.
26
main 함수 알고리즘 구현 변수 선언 줄넘김을 위하여 삽입
27
빌드 및 실행 여기 까지 작성한 코드는 isComplete() 함수가 항 상 거짓(0값)을 돌려 주므로 완전수를 하나도 출력 하지 않을 것이다. 즉 아직 정상적인 코드는 아니 다. 지금까지 작성한 코드가 빌드와 실행에 문제가 없 는지 테스트 해본다.
28
빌드 프로젝트명 우클릭 -> Build Project
빌드하기 전에 Save All 버튼을 클릭해서 수정 된 소스를 저장한다.
29
빌드 성공 메시지 확인
30
실행 프로젝트명 우클릭 -> Run As ->Local C/C++ Application
31
결과 확인 예상한 바대로 출력된 완전수는 없고 완전수의 개수는 0이라고 출력한다. 이는 아직 isComplete() 함수를 제대로 작성하지 않았기 때문이다.
32
isComplete 함수 수정
33
빌드 및 실행 결과 출력된 완전수는 6, 28, 496이고 따라서 완전수의 개수는 3이라고 출력한다. 6과 28은 비교적 확인하기 쉽지만 496dms 그리 쉽지 않다. 그러나 6과 28을 완전수로 제대로 찾아준 것과 같은 알고리즘으로 496을 찾은 것이므로 496은 완전수임이 확실하다.
34
도전 문제 사용자가 입력한 수까지의 완전수를 출력하고 완 전수의 개수를 출력하는 프로그램으로 수정하시오.
35
연습문제 28번(85쪽) 크기가 10인 정수형 배열에 양의 정수를 입력 받 아 최대 값을 제외한 나머지 9개의 정수에 대한 평 균을 구하여 출력하는 프로그램을 작성하시오.
36
문제 이해 우선 사용자로부터 10개의 양의 정수를 받아들이 고, 이 배열을 검사하여 최대 값을 제외한 나머지 9개의 수를 모두 더한 후 9로 나누어 평균을 구하 여 출력한다. 다음과 같이 두 단계로 나눌 수 있다. 사용자로 부터 10개의 양의 정수를 받아들인다. 배열의 최대값을 제외한 9개의 수의 합을 구한 후 9로 나누어 평균을 계산하여 출력한다. 이에 대한 자연어 의사코드는 다음과 같이 쓸 수 있겠다.
37
자연어 기술 사용자로부터 10개의 정수를 받아서 배열에 저 장한다. 최대값을 제외한 수의 평균을 구한다.
38
의사 코드 기술 inputArray(A); avg ← avgExceptMax(A); write avg;
이제 두 개의 함수, inputArray(A)와 avgExceptMax(A) 를 구현하면 된다.
39
inputArray(A) 설명 사용자로부터 양수를 입력 받아서 배열에 저장해 야 하므로 받아들인 수를 저장할 배열을 매개 변수 로 받아야 한다. 단, 배열의 크기는 10개라고 했으 므로 고정 크기의 배열을 사용하면 된다. 또한 입력을 받는 함수 이므로 리턴값은 필요없다. 따라서 리턴타입은 void 로 한다.
40
inputArray(A) 자연어 기술 0부터 9 까지 변하는 수를 k라고 한다.
사용자로부터 양수 n을 받아서 A(k)에 저장한다.
41
inputArray(A) 의사코드 기술 inputArray(int *A) for ( k ← 0; k <= 9; k++) do { read n; A[k] ← n; } End inputArray(int* A)
42
avgExceptMax(A) 설명 주어진 배열의 최대값을 제외한 수의 평균을 구하 는 것이므로 매개변수로 배열이 주어져야 하고, 구 한 평균값을 리턴해야 한다. 정수라고 하더라도 평 균은 실수 값이 될 수 있으므로 리턴 값은 실수로 한다.
43
avgExceptMax(A) 자연어 기술
합을 저장하는 변수를 sum, 최대값을 max, 평 균을 avg라 한다. 0부터 9 까지 변하는 수를 k라고 한다. max 를 -1로 sum 을 0으로 설정한다. k를 0부터 9 까지 1씩 증가 시키면서 다음을 반 복한다. sum에 A(k)를 더한다. A(k)가 max 보다 크면 max 를 A9K)로 설정한다. sum에서 max를 뺀다. avg를 sum/9로 설정한다.
44
avgExceptMax(A) 의사코드 기술
avgExceptMax(int *A) sum ← 0; max ← -1; for ( k ← 0; k <= 9; k++) do { sum ← sum + A[k]; if(A[k] > max) then { max = A[k]; } } sum ← sum – max; avg ← sum/9: return avg; End avgExceptMax(int* A)
45
프로젝트 생성 및 소스 작성 위에서 설명한 내용이 이해가 되면 이제 프로그램 을 작성할 준비가 된 것이다.
이해가 되지 않은 경우에는 처음부터 반복해서 읽 어서 이해하도록 한다. 몇 번을 읽었는데도 이해가 가지 않으면 질문하러 오시기 바랍니다.
46
Eclipse 실행 D:\Lec_hwl\CApp\y2014
47
Eclipse 실행
48
Workspace 확인 D:\Lec_hwl\CApp\y2014
49
CDT Perspective 확인 Dl 버튼을 클릭해서 수정 Java EE 로 되어 있음
50
CDT Perspective 확인 C/C++ 선택
51
CDT Perspective 확인 C/C++ 로 되어 있음
52
새 프로젝트 생성 File->New->C Project 반드시 C Project를 택할 것
53
프로젝트 명 설정 Ch02Ex28 Empty Project Cygwin GCC
D:\Lec_hwl\capp\y2014\Ch02Ex27
54
프로젝트 구성 설정 Debug 버전과 Release 버전 모두 사용
55
생성된 빈 프로젝트
56
메인 소스 추가 프로젝트명 우클릭 -> New -> C File
57
파일명 설정 ex28.c 확장자 c를 꼭 사용해야 함. Default C source template
58
생성된 빈 소스 파일
59
기본 main 함수 작성 main 함수는 아무 일도 하지 않고 바로 종료 한다.
60
코드 작성 앞 알고리즘 작성에서 양의 정수 10개를 받아들이 는 함수 inputArray(A)와 최대값을 제외한 평균을 계산하는 avgExceptMax(A) 함수의 원형은 각각 다음과 같다. void inputArray(int * A); double avgExceptMax(int *A); main 함수 다음에 이 함수들의 구현을 추가한다.
61
필요한 함수가 추가 된 소스 필요한 함수의 원형 선언 main 함수는 아무 일도 하지 않고 바로 종료 한다.
inputArray(A) 함수는 아무 일도 하지 않고 리턴한다. avgExceptMax(A) 함수는 아무 일도 하지 않고 0을 리턴한다. 이 코드는 우리가 작성한 알고리즘을 위해서 필요한 함수들만 작성한 것이다. 아직 실제로 알고리즘을 구현한 것은 없다. 현재는 자리만 만든 것이다.
62
main 함수 알고리즘 구현 변수 선언
63
빌드 및 실행 여기 까지 작성한 코드는 inputArray(A) 함수가 아 무 일도 하지 않고 항상 avgExceptMax(A) 함수가 항상 0을 돌려 주므로 출력은 항상 0이 될 것이다. 즉 아직 정상적인 코드는 아니다. 지금까지 작성한 코드가 빌드와 실행에 문제가 없 는지 테스트 해본다.
64
빌드 프로젝트명 우클릭 -> Build Project
빌드하기 전에 Save All 버튼을 클릭해서 수정 된 소스를 저장한다.
65
빌드 성공 메시지 확인
66
실행 프로젝트명 우클릭 -> Run As ->Local C/C++ Application
67
결과 확인 예상한 바대로 0이라고 출력한다. 이는 아직 inputArray(A) 함수와 avgExceptMax(A) 함수를 제대로 작성하지 않았기 때문이고, 출력된 결과는 avgExceptMax(A) 가 돌려준 0 값이다.
68
inputArray(A) 함수 수정 Eclipse CDT의 버그 때문에 printf 에 의해 출력된 것이 화면에 나타나지 않는 문제를 해결하기 위하여 추가함. 다른 툴을 사용할 때는 필요 없음.
69
avgExceptMax(A) 함수 수정
70
빌드 및 실행 결과 1부터 10까지의 정수를 입력하면 평균을 5.0이라고 출력해준다. 이는 1부터 9까지의 합 45를 9로 나눈 결과로 맞게 계산해 주는 것을 알 수 있다.
71
도전 문제 동일한 일을 하는 프로그램인데 다만 최대수가 두 개 이상인 경우에는 모두 제외한 수의 평균을 구하 도록 하시오.
동일한 일을 하는 프로그램인데 다만 최대수가 두 개 이상인 경우에는 모두 제외한 수의 평균을 구하 도록 하시오. 사용자로부터 10개의 양의 정수를 입력 받아서 최 대값과 최소값을 제외한 나머지 수의 평균을 구하 여 출력하는 프로그램을 작성하시오. 단, 최대, 최 소 수 가 여러 개 있어도 하나만 제하고 평균을 계 산하도록 하시오.
Similar presentations