본문 바로가기
스터디 하드/방통대 컴퓨터과학과

2016년 1학기 방송대 C프로그래밍 대체시험 문제 및 답안

by 피타칩스 2016. 10. 5.

방송대 C프로그래밍 중간평가는 출석수업 또는 출석수업대체용 과제를 제출하는 것으로 이루어집니다. 30점 만점이에요. 저는 이번에 만점을 받았습니다^_^


방송대 과제는 교재와 워크북, 강의에서 나왔던 내용과 거의 유사하게 나오기 때문에, 만점을 받는게 그렇게 어렵지만은 않기 때문에 저 말고도 많은 분들이 좋은 성적 얻었을거라고 생각합니다.


그럼 이번 학기 대체 과제로 출제된 문제를 먼저 보겠습니다. 두 개의 문제가 나왔습니다.


문제 1. 다음의 CASE 함수를 사용한 프로그램을 IF 함수를 사용하는 프로그램으로 변경하시오.


제출내용(반드시 출력물로 제출)

1) 프로그램 소스의 각 라인에 주석을 달고, 프린트하여 제출

2) 실행 결과 화면을 캡쳐하여 프린트하여 제출

3) 순서도(flowchart)를 작성하고 프린트하여 제출



이 문제에 대한 저의 답안은 다음과 같았습니다.


1) 프로그램 소스의 각 라인에 주석을 달고, 프린트하여 제출


#include <stdio.h>
// 프리프로세스되는 부분으로, 기본적으로 제공되는 stdio.h 헤더파일(라이브러리)의 내용을 현재 프로그램에 include 시킴

// 반환형이 int이며, 인자가 없는 main함수의 시작. C프로그램의 기본적 형태.
int main(void)
{
char op; // char형 변수 op 선언
int x, y, result; //int형 변수 x, y, result 선언
printf("수식을 입력하시오\n (예: 2 + 5) \n >>"); // 따옴표 안의 내용을 포맷이 있는 형태로 출력
scanf("%d %c %d", &x, &op, &y);
    // 사용자로부터 숫자, 문자, 숫자를 순서대로 입력받아 x, op, y 변수에 각각 대입

// 만약 op의 값이 +라면 result는 x+y의 값을 갖도록 함
if (op == '+'){
result = x + y;
}
// 만약 op의 값이 -라면 result는 x-y의 값을 갖도록 함
else if (op == '-'){
result = x - y;
}
// 만약 op의 값이 *라면 result는 x*y의 값을 갖도록 함
else if (op == '*'){
result = x * y;
}
// 만약 op의 값이 /라면 result는 x/y의 값을 갖도록 함
else if (op == '/'){
result = x / y;
}
// 만약 op의 값이 %라면 result는 x%y의 값을 갖도록 함
else if (op == '%'){
result = x % y;
}
// 만약 op의 값이 +,-,*,/,% 어느 것에도 해당되지 않는다면 "지원되지 않는 연산자입니다." 라는 문구가 출력되도록 함 
else {
printf("지원되지 않는 연산자입니다. \n");
return 0;
}
// 이 else 블록의 경우, 앞의 경우들과는 달리 result가 초기화(initialize)되지 않았으므로, result의 값을 이용하여 연산의 전체모습을 출력하는 line 36로 진행하게되면 에러발생 위험이 있으므로, 여기에서 프로그램을 종료시키는 것이 안전함. 따라서 주어진 문제에 이 부분을 추가함.

printf("%d %c %d = %d \n", x, op, y, result);
// 연산의 전체 모습이 출력되도록 함. 예를 들어, 3 + 4 = 7 또는 5 * 2 = 10 과 같이 출력됨. 
return 0; //프로그램 종료
}



2) 실행 결과 화면을 캡쳐하여 프린트하여 제출


다섯가지 기본연산(+, -, * /, %)와 지원되지 않는 연산이 있다는 걸 보여줄 수 있도록 총 6가지 스크린샷을 종류별로 찍어서 제출했습니다. 이런식으로요.



3) 순서도를 작성하고 프린트하여 제출

이거 하느라 가장 시간이 많이 들었습니다. 순서도를 지금까지 한번도 그려본 적도 없거니와... 그렇게 복잡한 프로그램이 아닌데 어느정도로 자세하게 그려야하는지 감이 잘 안잡혀서 좀 힘들었고, 보수적으로 최대한 자세하게 그리는 바람에 시간이 많이 들었습니다.



이렇게 1번이 끝났습니다. 다음은 2번입니다. 여기서도 순서도 그리라는 게 문제였습니다...

문제 2. 아래 프로그램 소스를 분석하여 어떤 동작을 하는 프로그램인지 설명하고, 순서도(flowchart)를 작성하시오.


제출내용(반드시 출력물로 제출)
1) 프로그램에 어떻게 동작하는지 설명하고
2) 프로그램 소스의 각 라인에 주석을 달고, 프린트하여 제출
3) 순서도(flowchart)를 작성하고 프린트하여 제출



1) 프로그램dl 어떻게 동작하는지 설명

이 프로그램은 사용자가 입력한 정수가 소수(prime number)인지 아닌지 판단하여 출력해주는 프로그램입니다. 

main 함수가 실행되면서 int형 변수 n과 result가 선언되고, 바로 다음엔 함수 abc가 호출됩니다. 함수 abc는 사용자로 하여금 정수를 입력하도록 하여, 입력된 값을 리턴하는 역할을 합니다. 즉, 사용자가 입력한 정수는 앞서 선언된 main함수 내의 변수 n에 리턴됩니다. 

그 다음엔 n을 인자로 하여 함수 xyz를 호출합니다. 함수 xyz는 정수 n이 소수인지 아닌지를 판단하는 핵심 함수입니다. 만약 n이 소수라면 1을, 소수가 아니라면 0을 리턴하는 함수입니다. 이 값은 앞서 선언된 main 함수 내의 변수 result에 리턴됩니다.

마지막으로, result의 값이 1이라면, 사용자가 입력한 n의 값이 **(소수)입니다 라는 문구가 출력되고, result의 값이 1이 아니라면 사용자가 입력한 n의 값이 **(소수)가 아닙니다 라는 문구가 출력되고, 프로그램은 종료됩니다.

뭔갈 주저리주러지 길게 써놨는데 제가 읽어봐도 가독성이 떨어지네요... 


2) 프로그램 소스의 각 라인에 주석을 달고, 프린트하여 제출

#include <stdio.h>
// 프리프로세스되는 부분으로, 기본적으로 제공되는 stdio.h 헤더파일(라이브러리)의 내용을 현재 프로그램에 include 시킴

int xyz(int); // int형 변수 하나를 인자로 받고, int형을 반환하는 함수 xyz의 선언
int abc(void); // 인자를 받지 않고, int형을 반환하는 함수 abc의 선언

int main(void) // 반환형이 int이며, 인자가 없는 main함수의 시작. C프로그램의 기본적 형태.
{
int n, result; // int형 변수 n, result 선언
n = abc(); // 함수 abc를 호출하여 함수의 결과값을 n에 대입
result = xyz(n); // n을 인자로 하여 함수 xyz를 호출한 후, 그 결과값을 result에 대입
if (result == 1)
printf("%d은 **입니다.\n", n);
//만약 result의 값이 1이라면 좌측의 내용을 출력. **에 적당한 말은 '소수(prime number)'임.
else
printf("%d은 **가 아닙니다.\n", n);
//만약 result의 값이 1이 아니라면 좌측의 내용을 출력. **에 적당한 말은 '소수(prime number)'임.

return 0; // 프로그램 종료
}

int abc(void) // 함수 abc의 정의
{
int n; // 함수 abc 내의 지역변수 n을 선언
printf("정수를 입력하시오: "); //좌측의 내용을 화면에 출력
scanf("%d", &n); // 숫자를 입력받아 그 값을 n에 저장
return n; // n을 반환
}

int xyz(int n) //함수 xyz의 정의
{
int d = 0, i; // 함수 xyz 내의 지역변수 d를 0으로 초기화하고, 지역변수 i를 선언.
for (i = 1; i <= n; i++) // i가 1인 경우부터, i가 n보다 작거나 같을때까지 i를 1씩 증가시켜가면서 루프를 돌음.
{
if (n % i == 0)
d++; // 만약 n을 i로 나눈 나머지가 0이라면, d를 1 후위증가시킴.
}
return (d == 2);
// 앞의 for루프를 빠져나온 결과, d의 값이 2라면 true에 해당하는 1을 반환하고, 그 외의 경우라면 false에 해당하는 0을 반환.
}


3) 순서도(flowchart)를 작성하고 프린트하여 제출



for 루프를 저렇게 박스처리하는건 정보처리기사 공부하면서 배웠던 스킬인데 여기서 써먹게 돼서 기뻤습니다 ㅎㅎ 꽤나 답안이 기네요.


내년엔 어떤 문제가 나올지 기대되네요. 좋은 성적 얻으시길 바랍니다~!



공감♥은 제게 큰 힘이 됩니다 감사합니다.


댓글