C Visual Basic Programming - 루프

Cugain 2007.02.21 11:34 조회 수 : 331 추천:86

sitelink1 http://myhome.hanafos.com/~log0/visual_basic.htm 
sitelink2  
extra_vars5  
extra_vars6  

 

비베강좌(6)<--루프

 

 


 

 


비베 한달이면 한국불패만큼 한다. - 6. 루프 -

어제하던 강좌를 계속이어서 오늘은 루프에 대해서 설명하겠습니다.

설명하기전 제가 중학시절 그러니까 5년전에 있었던 이야기를 하나 해드리겠습니다.

중1때 저희 담임선생님은 물리 선생님이셨는데 베이직언어에 조회가 있는 분이였습니다.

1991년 까지는 국어, 영어, 수학 모두 25점이였는데 1992년 부터인가 교육부에서 국어를 발전시킨다는 목적으로

국어의 점수를 27점으로 바꾼적이 있었습니다.

년도가 정확한지는 모르겠네요.

아무튼 이일때문에 당시 계산기로 성적 처리를 하던 저희 학교에서는 업무의 속도가 몇배나 느려 졌습니다.

100점으로 환산하는 과정이 훨씬 복잡해 졌기 때문이죠.

그전 같으면 25점 만점이므로 (점수)*4를 하면 100점 만점으로 환산이 되었지만

27점 만점인경우에는 (점수/27) *100을 해서는 반올림 까지 해야 했기때문이죠.

이때 저희 담임선생님께서는 학교에 있던 유일한 컴퓨터 였던 패미콤(1984년 금성에서 출시한 8비트 컴퓨터)로

이 문제를 해결 하셨습니다.

뭐 큰학교에서는 컴퓨터로 이미 성적처리를 하고 있었고.

16비트가 교육용컴퓨터로 정해진지도 몇년이 지난때 였지만 저희 학교는 그런 상황이였죠.

FOR~NEXT 문을 사용해서는 아마 이런 식의 코드였지 않을까 하는데요.

10 FOR I=1 TO 27
20 RESULT=INT(((I/27)*100)+0.5)
30 LPRINT I;" =====> "; RESULT
40 NEXT I

이런 식으로 표를 만들었던 거죠 여기서 LPRINT는 프린트기로 인쇄하라는 명령어 입니다.

그리고 100점 만점으로 환산한 점수에 더하기 0.5를 한뒤 INT함수를사용해 소수점 이하를 제거한것은 반올림을 하기위해서
이고요.

이렇게 표를 만들어서는 여러개를 인쇄해 선생님들 한분당 하나씩 돌렸고요.

그래서 작업시간이 많이 단축 되었던 일이 있었습니다.

위 프로그램의 실행 결과는 이렇습니다.

1 ====> 4
2 ====> 7
3 ====> 11
4 ====> 15
5 ====> 19
6 ====> 22
7 ====> 26
8 ====> 30
9 ====> 33
10 ====> 37
11 ====> 41
12 ====> 44
13 ====> 48
14 ====> 52
15 ====> 56
16 ====> 59
17 ====> 63
18 ====> 67
19 ====> 70
20 ====> 74
21 ====> 78
22 ====> 81
23 ====> 85
24 ====> 89
25 ====> 93
26 ====> 96
27 ====> 100

컴퓨터를 이용해 작업을 하는 이유중에 하나는 이렇게 단순 반복작업을 빠르고 정확하게 하기 위한 것입니다.

루프는 단순 반복 작업을 컴퓨터로 시키는 방법입니다.

DO~LOOP문이나 DO~WHILE문등 많이 있지만 FOR~NEXT 문만을 설명 드리겠습니다.

FOR루프는 정해진 횟수만큼 루프를 반복하려 할때에 매우 유용합니다.

내부적인 제어가 필요없는 단순한 작업에 FOR문을 사용하십시오.

그대신 조건에따라서 루프를 탈출해야 할 상황이 발생하는 경우에는 WHILE루프를 사용 하십시오.

FOR -> ~동안 이란 뜻이란걸 모두 아시죠.
NEXT -> 신해철이 만든 구릅 이름 이기도 하지만 다음이란 뜻도 있습니다.

FOR I=1 TO 10 'I값이 1에서 10으로 가는 동안 반복해라
A=A+1 'A값을 1씩 증가시켜라
NEXT I '다음 을 반복하라
PRINT A 'A를 찍어라

실행을 하면 10이 찍힙니다.

이때 주의 해야할 사항은요 FOR I=1 TO 10 STEP 1이라고 해주지 않아도

루프가 반복되는 동안 I값은 1씩 증가 하며 I값이 10이되면 루프가 끝난다는 것입니다.

그리고 필요에 따라 STEP값을 2나 100등의 임의의수로 하실수 있으며 I값이 감소하면서 루프를 반복시키고 싶으시다면

STEP을 음수로도 할 수 있습니다.

FOR I=10 TO 1 STEP -1
A=A+1
NEXT I
PRINT A

역시 10이 인쇄 됩니다.

이번에는 1부터 10까지 합을 구하는것을 루프를 사용해 해보겠습니다.

A=A+1+2+3+4+5+6+7+8+9+10을
FOR I=1 TO 10
A=A+I
NEXT I

로 바꿀 수 있습니다.

다중루프란 루프가 두개이상 중첩되어 있는 경우를 말하는데요.

FOR I=1 TO 9
FOR J=1 TO 9
PRINT I;" * ";J;" = ";I*J
NEXT J
NEXT I

이런식으로 루프를 구성하면 구구단이 출력 됩니다.

다음은 '프로그래밍 완전정복'의 한구절 입니다.


루프의 중첩은 될 수 있는한 3단계 이하로 줄이 십시오.

루프를 4단계이상 중첩하면 프로그래머가 루프를 이해하는 수준이 현격히 떨어진다고 합니다.

그리고 루프의 길이도 15~20줄 보다 긴것은 좋지 않습니다.

모니터로 나타낼수 있는 줄수가 25줄 정도이기때문에 긴 루프의 경우 검토가 불편하며 코드는 단순할 수록 좋기때문에

긴 루프는 바람직 하지 못합니다.

----- 중략 ------

가령, 여러분이 보험 회사에서 사용할 프로그램을 작성하고 있다고 생각합시다.

그리고, 생명 보험료 테이블이 하나 있는데, 보험료는 나이와 성별에 따라 변동됩니다.

여러분이 할일은, 어떤 그룹의 생명 보험료의 총계를 계산하는 루틴을 작성하는 것입니다.

이 때, 여러분은 목록에 들어 있는 사람들의 보험료를 읽어 들여 더하는 루프가 필요할 것입니다.

이 루프를 작성하는 과정은 다음과 같습니다.

첫 번째. 주석문(COMMENT)을 사용하여, 여러분이 필요로 하는 루프의 몸체를 단계별로 작성 합니다.

아직 문법이나 루프의 색인, 배열색인 등을 생각해 보지 않았다면, 작업 내용을 그냥 글로 쓰는 것이 훨씬 편리할 것입니다.

1단계
{ 테이블에서 보험료를 읽어 옴.}
{ 보험료를 모두 더하여 총계를 구함. }

두 번째. 주석문을 루프의 몸체에 들어갈 코드로 가능한 한 완벽하게 변환합니다.

즉, 루프를 제외한 모든 코드를 완성하는 것입니다.

예제의 경우, 각 사람의 보험료를 읽어 들인 뒤 더해서 총계를 구하는 코드가 바로 그것입니다.

이때, 추상적인 표현 보다는, 명쾌하고 알기 쉬운 표현을 사용하십시오.

2단계
Rate = Table() '아직은 색인(index)이 사용되지 않은 상태임.
TtlRate = TtlRate + Rate

이 예제에서는, Table이 보험료 데이타를 수록되어 있는 배열(array)이라고 가정하고 있습니다.

그리고, 처음에는 배열 색인을 걱정할 필요가 없습니다.

Rate는 보험료 테이블에서 읽어 들인 보험료 값을 저장하는 변수입니다.

TtlRate는 보험료의 총합을 저장하는 변수 이고요.

다음 단계는, 배열 Table에 색인을 추가하는 과정입니다.

3단계
Rate = Table(Census_Age,Census_Sex)
TtlRate = Ttl + Rate

다음 단계는, 이미 작성된 문장을 루프로 둘러싸는 과정입니다.

이루프는 그룹내의 각 사람의 보험료를 사용하여 계산하도록 되어 있으므로, 루프에는 개인 단위로 색인이 붙여져야 합니다.

4단계
FOR Person = FirstPerson to LastPerson
Rate = Table(Census_Age,Census_Sex)
TtlRate=TtlRate + Rate
NEXT Person

이단계에서 여러분이 할일이라고는, 이미 만들어져 있는 코드를 for 루프로 둘러싸고,

기존의 코드를 안으로 들여 쓰고, next 문을 추가 하는 것뿐입니다.

그리고 Person루프의 색인에 의존하는 변수들이 올바르게 일반화되었는가 확인하면 됩니다.

이 예제의 경우, 변수 Census가 Person에 의해 좌우되므로, 이변수가 올바르게 일반화 되어야 합니다.

5단계
For Person = FirstPerson to LastPerson
Rate = Table( Census_Age(Person),Census_Sex(Person) )
TtlRate = TtlRate + Rate
Next Person

만일 이 Person루프에 또 다른 루프를 중첩해야 한다면, 지금까지의 과정을 반복 하기만 하면 됩니다.

이 방법의 기본 개념은 확실한 것부터 시작하고, 한번에 한 가지씩만 걱정하며, 단순한 것부터 루프를 완성해 간다는 것입니다.

보다 복잡하고 일반적인 루프를 만들 때에는, 이해할 수 있는 만큼씩만 단계를 정하세요.

이렇게 하면, 각 단계에서 추가해야 할 코드의 분량이 줄어들게 되므로, 에러가 일어날 확률도 줄어들게 됩니다.


이상은 인용된 글입니다. 그리고 코드는 파스칼로 작성된것을 제가 베이직으로 바꾼 것이고요.

중복된 내용등은 삭제했습니다. 오늘은 여기까지 하겠습니다.^^ 도움 되었으면 합니다.

궁금한 사항은 메일 주시면 자세히 가르쳐 드리겠습니다.  

--------------------------------------------------------------------------------