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

Posted at 2009.12.28 15:52 | Posted in About Programing/02. 준비운동
크리에이티브 커먼즈 라이선스
Creative Commons License
[문제 4/9]
1-100 까지의 홀수 합을 구하시오.(단, 3의 배수와 5의 배수 제외)

1. System chart

2. 수작업의 이해

숫자

1

2

3

4

5

6

7

홀수판단

×

×

×

3의 배수가 아닌가

×

×

5의 배수가 아닌가

×

1

1

1

1

1

1

8

3. 처리 과정

1. 100번 반복한다.
   1.1 수를 센다.
   1.2 홀수인지 판단한다.
        1.2.1 3의 배수인지 판단한다.
        1.2.2 5의 배수인지 판단한다.
        1.2.3 합을 구한다.
2. 합을 출력한다.
3. 끝낸다.

4. 자료명세서

number

입력받을 숫자

정수형

plus

양수 count

정수형

odd

음수 count

정수형

even

짝수 count

정수형

minus

홀수 count

정수형

remainder

나머지

정수형

i

반복제어변수

정수형


5. NS-Chart

6. NS-Chart 검토표

 

초기

 

 

 

 

 

 

 

 

number

?

1

2

3

4

5

6

7

sum_odd

0

1

 

 

 

 

 

8

tree_remainder

?

1

 

0

 

2

 

1

five_remainder

?

1

 

3

 

0

 

2

remainder

?

1

0

1

0

1

0

1

i

?

1

2

3

4

5

6

7


7. 소스화


#include <stdio.h>

#define MAX 100

typedef unsigned short UShort;

UShort	GetSumOdd	(void);
void	Display		(UShort sum_odd);

int main (int argc, char *argv[])
{
	UShort sum_odd;
	sum_odd = GetSumOdd ( );

	Display (sum_odd);

	return 0;
}

UShort GetSumOdd (void)
{
	UShort sum_odd = 0;
	UShort number, tree_remainder, five_remainder, remainder, i;

	for(i=1 ; i <= MAX ; i++)
	{
		number		= i;
		remainder	= number % 2;

		if(remainder==1)
		{
			tree_remainder = number % 3;
			five_remainder = number % 5;

			if(tree_remainder != 0 && five_remainder != 0)
			{
				sum_odd += number;
			}
		}
	}

	return sum_odd;
}

void Display (UShort sum_odd)
{
	printf ("%d\n", sum_odd);
}


8. 결과
저작자 표시 비영리 변경 금지
신고
  1. 좀 자주 좀 업뎃하라능. 버럭버럭!
  2. 비밀댓글입니다

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

Posted at 2009.12.09 16:34 | Posted in About Programing/02. 준비운동
크리에이티브 커먼즈 라이선스
Creative Commons License

[문제 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

부분에서 숫자를, 테스트하기 적당한 숫자로 바꿔주시면 될것입니다.
저작자 표시 비영리 변경 금지
신고
  1. %연산자가 없으면 n - n/2 하면된다능.

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

Posted at 2009.08.20 00:57 | Posted in About Programing/02. 준비운동
크리에이티브 커먼즈 라이선스
Creative Commons License
[문제 2/9]
1부터 100,000 사이에 (100,000포함) 7의 배수가 몇 개 있는지 구하시오.

1.
System chart


 C프로그래밍을 몇번 해보신 분이라면, 왜 단순 출력만 해주는 Display라는 함수를 따로 만들어야 되는지 의문을 가지실 겁니다. 그냥 main 함수에서 출력해주는게 쉽지 않냐고 말씀하실수도 있습니다.
 하지만, 지금부터 연산부분과 출력부분(Form부분)을 분리해서 코딩하는 습관을 들여놓으시면, 나중에 편하실겁니다. 여러가지 장점이 있지만, 제가 느낀 가장 큰 장점은 다른언어로 옮길때 엄청난 편의가 있다는 점입니다.

2. 수작업의 이해

 숫자  1 2 ... 
 7의배수  X ○  ...
 count  0 ...

3. 처리 과정

1. 100,000번 반복한다.
    1.1 수를 세린다.
    1.2 7의 배수를 세린다.

2. 7의 배수의 수를 출력한다.

3. 끝낸다.

4. 자료명세서

 number  숫자 정수형 
 seven_doublenumber_count  7의 배수 Count 정수형
 remainder  나머지 정수형
 i  반복제어변수 정수형

5. NS-Chart

 NS Chart를 자세히 보신 분이라면, 왜 나머지를 구하는데 %연산자를 쓰지않고 remainder라는 변수를둬서 나머지를 구하는지 의야해 하실겁니다. 이유는 간단합니다. NS Chart에는 %연산자가 없습니다^-^;; 우선 여기엔 remainder 변수를 사용하여 나머지를 구하고, 실제 소스화 할때는 %연잔자를 사용하도록 하겠습니다.

6. NS-Chart 검토표

  초기값                 
 number  ? 1 ... 
 seven_doublenumber_count  0 0 ...
 remainder  ? ...
 i  ? ...

초기값 부분에 ?로 표시되어 있는 부분은, 초기화가 되지 않아서 쓰레기값이 있다는걸 표시합니다.

7. 소스화


#include <stdio.h>

#define DOUBLE_NUMBER 7

typedef unsigned long int UShort;

UShort	GetSevenDoubleNumberCount	(UShort seven_numberdouble_count);
void	Display			(UShort seven_numberdouble_count);

int main (int argc, char *argv[])
{
	UShort seven_numberdouble_count = 0;
	
	seven_numberdouble_count = GetSevenDoubleNumberCount(seven_numberdouble_count);
	
	Display(seven_numberdouble_count);
	
	return 0;
}

UShort GetSevenDoubleNumberCount (UShort seven_numberdouble_count)
{
	UShort i;
	UShort number = 1;
	UShort remainder;
	
	for(i=1 ; i<=100000 ; i++)
	{
		number = i;
		remainder = number % DOUBLE_NUMBER;
		
		if(remainder == 0)
		{
			seven_numberdouble_count++;
		}
	}
	
	return seven_numberdouble_count;
}

void Display (UShort seven_numberdouble_count)
{
	printf("7의 배수 : %d개\n", seven_numberdouble_count);
}


8. 결과

저작자 표시 비영리 변경 금지
신고
  1. NS Chart 라니 무... 무섭군요;;
  2. 저도 들렸다 갑니다.
  3. 방명록이 열려있지 않은것 같아 여기다 쓰고 가네요ㅎㅎㅎㅎ; 에공[..] 테터툴즈끼리인데 뭐 어떻게 안되려나<...말이죠 ㅋㅋ
  4. NS 차트 실제로 쓰는사람 첨봤다능
    읭읭
  5. 그냥 http://codepad.org/btTHvwlk 하면 안돼냐능.
    • 2009.12.10 08:28 신고 [Edit/Del]
      우와+_+
      신기한 방법 입니다만,
      갯수에서 2개가 더 많이 나오네요 ㅋ

      이렇게 구한 값에 2를 빼면 돼지 않냐고
      말씀하실수도있지만,
      그럼 문제의 본질적인 개념에서 좀 벗어나는
      느낌입니다 ㅋ

      그래도 흥미로운 방법 제시해주신건 감사합니다^-^ㅋ
  6. 차이가 나는게 더신기하네.
    빠진숫자 2개는 어디있으려나.
    • 2009.12.10 19:21 신고 [Edit/Del]
      헉...ㅠ
      제가 혹시나 해서 다른분들이 같은 문제 풀어놓으신것도
      확인을 했는데요ㅠ
      14285 개가 맞습는걸로 생각됩니다ㅠ
      이거, 일일히 세려볼수도없고;;ㅋ

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

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

Posted at 2009.07.15 01:46 | Posted in About Programing/02. 준비운동
크리에이티브 커먼즈 라이선스
Creative Commons License
[문제 1/9]
1+3+5+…의 등차수열에서 얼마까지 합하면 그 값이 1,000을 처음으로 초과할 때
마지막 항과 초과된 값을 구하시오.

1. System chart


 큰 틀을 정하는 작업입니다. 다들 알고 계시는 Main문을 중심으로, 합을 구하는 Sum이라는 함수와 구한 값을 출력해주는 Display라는 함수를 사용할 생각입니다.
 Sum 함수에서는 입력값은 없고, 출력값으로 합(sum)과 마지막 숫자(last_number)가 있어야 할것 같군요. 출력값이 2개 이니까, return으로는 불가능합니다. 이때, 포인터(*)를 사용하면 됩니다.
 Display 함수는 결과를 출력하는 함수이니, 출력값은 필요없을것같네요. 대신 합(sum)과 마지막숫자(last_number)이 입력이 되야 출력을 하겠죠? 이때는 단순한 값의 전달이기때문에 포인터(*)를 사용하지 않습니다.

2. 수작업의 이해
 숫자  1   3   5   7   9  ...
 합  1  4  9  16  25  ...

 이 작업은 컴퓨터 보다 노트에 손으로 해보시길 추천합니다. 프로그래밍을 하기전에 어떤 식으로 풀어나가야할지 끄적끄적 거려보는 작업입니다. 끄적이면서 문제의 본질과 어떤식으로 풀어야 겠다는 생각을 할 수 있습니다.

3. 처리 과정

1. 1,000까지 반복한다.
      1.1 숫자를 세린다.
      1.2 숫자를 합한다.
      1.3 숫자를 2 증가시킨다.

2. 합과 마지막항을 출력한다.

3. 끝낸다.

 C언어는 절차지향적입니다. 어떤 순서로 프로그래밍을 해야할지 전체적으로 정리를 하는 과정입니다. 처리과정 정리만 잘 해 놓아도 프로그래밍하기가 한결 수월해집니다.

4. 자료명세서

 number  숫자 정수형 
 last_number  마지막 항 정수형
 sum  숫자의 합 정수형

 어떤 변수가 쓰일것인지 정리를 합니다. 정리가 잘 되어 있으면 가독성이 높아집니다. 그리고 쓸데없는 변수를 색출해 낼수도있으며, 변수의 기능 분화가 확실히 됩니다. 한가지 변수로 여기도 썼다가, 저기도 썼다가 하는 일을 방지할수 있습니다.

5. NS-Chart

 다소 생소한 Chart일껍니다. NS-Chart라고 불리며, 절차 지향적으로 어떤식으로 연산할지 정리합니다. 실제 코드로 옮길때는 NS-Chart를 보고 그대~로 옮기면 됩니다. 바로 코드로 옮기지 않고 궂이 왜 이런 번거로운 작업을 거치냐는 생각을 할수도있는데, NS-Chart는 어떤 언어로든 옮길수 있습니다. 그리고 위에 처리과정 정리한것을 좀 더 방법적으로 정리할수있는 기회입니다. 이 과정을 통해서 무조건 에러나 워닝을 보고 내가 뭘틀렸는지 알아버리는, 컴퓨터에 의존하는 프로그래밍은 자제할수 있습니다.

6. NS-Chart 검토표
  초기값             ...
 number   1  1  ...
 sum   0  1 16  25   ...
 last_number  ? ?  ... 

 NS-Chart에 값들의 변화를 직접 적어봅니다. 이렇게 확인을 하고 코드화에 들어가야 한번에 성공하는 쾌감을 맛볼수 있습니다.

7. 소스화

//58page_1.c
#include <stdio.h>

#define MAX_NUMBER 1000

typedef unsigned short int UShort;

void Sum (UShort *last_number, UShort *sum);
void Display (UShort last_number, UShort sum);

int main (int argc, char *argv[])
{
	UShort sum = 0;
	UShort last_number;

	Sum(&last_number, &sum);
	Display(last_number, sum);

	return 0;
}

void Sum (UShort *last_number, UShort *sum)
{
	UShort number = 1;

	while(*sum<MAX_NUMBER)
	{
		*sum += number;
		number += 2;
	}

	*last_number = number-2;
}

void Display (UShort last_number, UShort sum)
{
	printf("마지막 항 : %d\n", last_number);
	printf("초과된 값 : %d\n", sum);
}

Line 3 : #define 으로 자주 쓰이는 숫자를 정해 놓으면, 나중에 수정할 일이 생겼을때, 해당 숫자를 일일히 찾아서 수정할 필요 없이, 저 값만 수정하면 전체가 바뀝니다. 지금은 괜찮지만, 나중에 소스가 길어지면 길어질수록 매우 유용하게 쓰입니다.

Line 5 : 그냥 정해져있는 자료형을 쓰면돼지, 왜 궂이 UShort라는 새로운 자료형을 쓰느냐. 사실 저도 명확한 이유를 설명드리기엔 애매한 부분이 좀 있습니다. 처음 배울때 저렇게 배워서인지, 이게 편합니다^-^ 이렇게 해야 다양한 환경에 이식을 해도 잘 돌아간다고 배웠습니다^-^

Line 10 : main 함수가 익숙하지 않으실껍니다. 보통 int main (void)라고 사용하는데, MSDN을 참고하시면, 엄연히 main 함수의 형태가 정해져있습니다. 빌게이츠가 제공해준 그대로 사용합시다^-^ㅋㅋ





저도 아직 부족한 점이 많습니다. 실력이 뛰어나지도 않습니다.
혹시 제 글을 읽으시다가, 이건 아닌데, 이 점은 고쳤으면 좋겠다 는 생각이 드시는 고수분들의 수많은 태클 환영합니다. 많이 배우고 반영하겠습니다.
그리고 왜 궂이 이런식으로 프로그래밍을 해야되는지 의야해 하시는 분들도 계실껍니다.
이렇게 간단한 예제부터 절차적으로 설계해서 푸는 연습을 해야, 나중에 규모가 커져도 당황하지 않고 프로그래밍을 할수있기에, 간단한 문제도 설계부터 꼼꼼히 풀이해보았습니다.

메모리 맵과 디버깅 작업은 생략하였습니다.
이 부분에 대해선 추후에 추가하도록 하겠습니다.
저작자 표시 비영리 변경 금지
신고
  1. sum[n] = n**2
    num[n] = sum[n] - sum[n-1]
    sum[n] >= 1000
    sum[n-1] < 1000

    그러므로.
    n = (1000**0.5).ceil = 32
    num[n] = 32**2 - 31**2 = 63

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

입문자를 위한 책 추천입문자를 위한 책 추천

Posted at 2009.07.14 01:51 | Posted in About Programing/01. 시작하기 전에
크리에이티브 커먼즈 라이선스
Creative Commons License

<열혈강의 C프로그래밍>
장점 : 저자의 열정이 느껴지는 내용과 동영상 강의. 초보자를 위한 친절하고 쉬운 설명.
단점 : 쉽게 쉽게 설명하다 보니, 잘 하시는 분들이 볼땐 사알짝 개념적으로 엇난 부분도 있다고 함.
         (나는 잘 모르겠음)




<C로 배우는 쉬운 자료구조>
장점 : 처음 자료구조 공부를 시작하면 개념잡는데 시간이 많이 걸리기 마련인데, 그림과 짧은 예제로 잘 설명되어
         있음.
단점 : 글쎄...다른 책은 본적이 없어서...





<열혈강의 C++프로그래밍>
장점 : C프로그래밍과 마찬가지로 쉽게 설명되어있음. 강의 내용도 충실함.
단점 : 가끔 별 의미가 없다고 생각되는 예제가 있음.




<윈도우즈 API 정복 1권>
장점 : API에 대한 설명을, Visual Studio 버전에 따라 나눠 설명해놨음.
단점 : 비싼 가격. MSDN을 번역해 놓은랑 다를바 없어서, MSDN 사용이 익숙해지면 거의 안봄.




제가 여태 보면서 공부했던 책입니다.
장점과 단점은 지극히 제 주관적인 입장에서 작성한 것임을 알려드립니다.
다른 견해가 있거나, 더 좋은 책이 있다면 태클 환영합니다^-^
저작자 표시 비영리
신고
  1. 생각보다 몇권 없네요? 더 있으신거 아닌가요? ㅋ

    저는 그냥 책은 많아가지고 -_-;; 그리 보지는 않았으면서 ㄷㄷ 다 보긴 봐야 하는데 ㅠㅠ

    한 책을 깊게 파시는 타입이신가봐요?
  2. 자료구조 저책 아니자나 내한테 추천해준거!!

    이 사기꾼아!!!
  3. 멀티시그
    성민이 여기서 노네 ㅋㅋㅋㅋ

Name __

Password __

Link (Your Website)

Comment

SECRET | 비밀글로 남기기

티스토리 툴바