본문 바로가기

About Programing/02. 준비운동

C언어의 간단한 예제를 설계부터 코드화까지 (3/9)

[문제 3/9]
100 장의 카드에 숫자가 입력될 때 양수의 개수와 음수의 개수를 구하고 양수 중에서 홀수와 짝수의 개수도 구하시오.

1. System chart

 main 함수에서 *100 이라고 표시되어있는, 자기 자신을 가리키는 화살표는, 숫자만큼 반복한다는 뜻입니다.

2. 수작업의 이해

입력 수

1

2

3

-1

-2

-3

양수

1

2

3

×

×

×

홀수

1

×

2

×

×

×

짝수

×

1

×

×

×

×

음수

×

×

×

1

2

3

3. 처리 과정

1. 100번 반복한다.
   1.1 숫자를 입력받는다.
   1.2 0인지 판단한다.
        1.2.1 양수, 음수를 판단한다.
                1.2.1.1 양수, 음수를 세린다.
                1.2.1.2 짝수, 홀수를 판단한다.
                          1.2.1.2.1 짝수, 홀수를 세린다.
2. 양수, 음수, 홀수, 짝수의 개수를 출력한다.
3. 끝낸다.


4. 자료명세서

number

입력받을 숫자

정수형

plus

양수 count

정수형

odd

음수 count

정수형

even

짝수 count

정수형

minus

홀수 count

정수형

remainder

나머지

정수형

i

반복제어변수

정수형

5. NS-Chart

 홀수와 짝수를 구분하는 기준은, 2로 나누었을때 나머지가 1이냐, 아니냐 라는 것은 누구나 알고있을 것입니다. 2/9번 문제에서 설명하였듯이, NS-Chart 에서는 %연산자가 없습니다. 그래서 반복문을 사용하여, 2로 계속 빼는 것입니다.

6. NS-Chart 검토표

 

초기값

 

 

 

 

 

number

?

0

1

-1

2

plus

0

0

1

0

2

odd

0

0

1

0

0

i

?

1

2

3

4

even

0

0

0

0

1

minus

0

0

0

1

1

reaminder

?

?

1

1

0


7. 소스화


#include <stdio.h>

#define MAX_INPUT_NUMBER 100

typedef signed long int SLong;
typedef unsigned short int UShort;

SLong	InputNumber	(void);
void	Grouping	(SLong number, UShort *plus, UShort *minus,
					 UShort *odd, UShort *even);
void	Display		(UShort plus, UShort minus, UShort odd, UShort even);

int main (int argc, char *argv[])
{
	SLong	number;
	UShort	plus	= 0;
	UShort	minus	= 0;
	UShort	odd		= 0;
	UShort	even	= 0;
	UShort	i;

	for (i=1 ; i<=MAX_INPUT_NUMBER ; i++)
	{
		number = InputNumber ( );
		Grouping (number, &plus, &minus, &odd, &even);
	}

	Display (plus, minus, odd, even);

	return 0;
}

SLong InputNumber (void)
{
	SLong number;

	scanf("%d", &number);
	
	return number;
}

void Grouping (SLong number, UShort *plus,
			   UShort *minus, UShort *odd, UShort *even)
{
	UShort remainder;

	if(number != 0)
	{
		if(number > 0)
		{
			(*plus)++;
			remainder = number%2;

			if(remainder==1)
			{
				(*odd)++;
			}
			else
			{
				(*even)++;
			}
		}
		else
		{
			(*minus)++;
		}
	}
}

void Display (UShort plus, UShort minus, UShort odd, UShort even)
{
	printf("양수 : %d개\n", plus);
	printf("홀수 : %d개\n", odd);
	printf("짝수 : %d개\n", even);
	printf("음수 : %d개\n", minus);
}

8. 결과
 이번 문제는, 사용자로부터 숫자를 입력받는 형식이라, 결과 화면을 따로 표시하지 않겠습니다.
언제 숫자 100개를 다 입력하냐고 불평 하시는 분들은, 소스코드에서

#define MAX_INPUT_NUMBER 100

부분에서 숫자를, 테스트하기 적당한 숫자로 바꿔주시면 될것입니다.