[Visual Basic]제어문과 반복문 - 2부






Select Case문

다중 If문을 대신 사용할 수 있는 Select Case문을 사용합니다. Select Case문은 [상수]

따라 선택적으로 분기하므로 소스를 이해하기 편하고 작성도 용의합니다.

형식

Select Case 변수

Case 상수1 : 문장1

Case 상수2 To 상수3 : 문장2

Case 상수4, 상수5 : 문장3

.

.

.

Case Else: 문장4

End Select


[변수]는 선택적으로 분기하여 처리하기 위한 변수입니다. [변수]값과 일치하는 [상수]로 분기하여 콜론(:) 다음의 [문장]을 실행합니다. [변수]값이 [상수1]과 같으면 [문장1]을 실행하고, [변수]값이 [상수2][상수3]사이이면 [문장2]를 실행하고 [변수]값이 [상수4]와 같거나 [상수5]와 같으면 [문장3]을 실행합니다. [문장4]Case문에 선언한 [상수]와 일치하는 것이 없으면 [문장4]을 실행합니다.



Private Sub Command1_Click()

Dim Last_Day As Integer

Last_Day = Val(Text1.Text)

Select Case Last_Day

Case 2: Label1.Caption = "28"

Case 1, 3, 5, 7, 8, 12

Label1.Caption = "31"

Case 4, 6, 9, 10, 11

Label1.Caption = "30"

End Select

End Sub 


실행 결과 : Text1에 '1'을 입력하면 Label1에 '28'이 출력되고 Text1에 '1', '3', '4', '7', '8', '12' 숫자 중에 하나를 입력하면 Label1에 '28'이 출력되고 '4', '6', '9', '10', '11' 숫자 중에 하나를 입력하면 Label1에 '30'이 출력됩니다.


Case 상수 다음에 나오는 콜론(:)은 생략할 수 있습니다위 소스와 같이 [문장]을 다음라인에 작성하는 경우입니다같은 라인에 [문장]을 넣으면 콜론(:)을 생략하면 안 됩니다.


Private Sub Command1_Click()

Dim My_Num As Integer

My_Num = Val(Text1.Text)

Select Case My_Num

Case 1 To 10

Label1.Caption = "1에서 10사이입니다."

Case Else

Label1.Caption = "범위 밖의 숫자입니다."

End Select

End Sub

실행 결과 : Text1에 1에서 10사이의 숫자를 입력하면 Label1에 '1에서 10사이입니다.'가 출력되고 Text1에 그 외의 숫자를 입력하면 Label1에 '범위 밖의 숫자입니다.'가 출력됩니다.


[
실습] 간단한 성적 프로그램 만들기

비주얼베이직에서는 한글 변수명을 사용해도 오류없이 잘 처리되므로 예제 프로그램에서는 한글로 변수를 처리하여 만들어 보았습니다.


<폼 작성 화면>


번호

컨트롤종류

컨트롤명

속성

설정

1

Form1

Caption

"성적처리 프로그램"

2

라벨

Label1

Caption

"국어"

2

Label2

Caption

"수학"

3

Label3

변경사항

없음

 

4

Label4

5

Label5

6

Label6

1

텍스트

박스

Text1

Text

""

1

Text2

Text

""

1

명령

버튼

Command1

Caption

확인"

<폼 디자인 구성표>


' 1 폼의 Load이벤트

Private Sub Form_Load()

Label3.Caption = ""

Label4.Caption = ""

Label5.Caption = ""

Label6.Caption = ""

End Sub

' 2 명령버튼의 Click이벤트

Private Sub Command1_Click()

Dim 국어수학 As Integer

Dim 총합반올림평균 As Integer

Dim 평균 As Double

Dim 평균학점 As String

국어 = Val(Text1.Text)

수학 = Val(Text2.Text)

총합 국어 수학

Label3.Caption = "총점 : " & 총합

평균 총합 / 2

Label4.Caption = "평균 : " & 평균

반올림평균 = Int(평균 + 0.5)

Label5.Caption = "반올림평균 : " & 반올림평균

Select Case 반올림평균

Case 90 To 100

평균학점 = "A"

Case 80 To 89

평균학점 = "B"

Case 70 To 79

평균학점 = "C"

Case 0 To 70

평균학점 = "F"

End Select

Label6.Caption = "평균학점 : " & 평균학점

End Sub


실행 결과 : [평균]은 정수가 아닌 부동 소수점 형식으로 처리해야 하므로 Double형식으로 선언하였습니다. [평균]을 이용하여 학점을 구하려면 부동 소수점 형식을 정수형식으로 변환하여 처리해야 합니다.


비주얼베이직에 있는 반올림 함수를 사용하면약간의 문제가 생깁니다우선 비주얼베이직에서 지원하는

반올림 함수를 알아보도록 합시다.



함 수

설 명

Cint(변수)

부동 소수점 형식을 반올림하여 Integer형식으로 반환합니다.

) Cint(81.56) ' 81값을 갖습니다.

CLng (변수)

부동 소수점 형식을 반올림하여 Long형식으로 반환합니다.

) Cint(56786.7) ' 56787값을 갖습니다.

Round (변수, 소수점자리)

지정한 [소수점 자리]에서 반올림한 수를 반환합니다.

) Round(56.3467, 2) ' 56.35값을 갖습니다.


소수점 이하 부분이 0.5이면 CInt, CLng, Round 함수는 0.5인 경우에는 0으로 반올림하고 1.5인 경우에는 2로 반올림을 합니다. 여기서 문제가 발생합니다. 예를 들면, 국어 점수가 80이고 수학 점수가 81이면 평균은 80.5가 됩니다. 반올림을 하면 81점이 되어야 하는 데, 80점이 되어 버립니다.

만약, 80.580으로 되게 한다면 문제가 없을 것입니다. 80.5와 같은 점수를 81점으로 처리하고 싶다면, 다음과 같이하면 됩니다.


반올림평균 = Int(평균 + 0.5)

81 = Int(80.5 + 0.5)

80 = Int(80.3 + 0.5)

92 = Int(92.1 + 0.5)


Int
함수를 사용한 것은 소수부분을 잘라내고 정수부분만을 반환하기 위해서 사용합니다. 생략을 하면 안됩니다.

실제적으로 Double형식으로 처리한 결과를 Integer형식의 변수에 값 넣으면 자동으로 소수 부분이 삭제가 됩니다그러나 특정 수에 대해서는 잘못 처리되는 경우가 있으므로 정확하게 처리하기 위해서는 Int함수를 사용합니다.

[위 소스]Select Case문을 if문으로 다음과 같이 바꿀 수 있습니다.


If 반올림평균 >= 90 And 반올림평균 <= 100 Then

평균학점 = "A"

ElseIf 반올림평균 >= 80 And 반올림평균 <= 89 Then

평균학점 = "B"

ElseIf 반올림평균 >= 70 And 반올림평균 <= 79 Then

평균학점 = "C"

ElseIf 반올림평균 >= 0 And 반올림평균 <= 70 Then

평균학점 = "F"

End If


다중 if문을 사용하는 것보다는 Select Case문을 이용하는 것이 사용이 편리하고 소스도 이해하기 편합니다.



 For 문

형식

For 변수 = 시작 값 To 최종 값 [Step 증가 값]

문장

[Exit For]

문장

Next [반복 변수]

For문은 [변수][시작 값]에서 [증가 값] 만큼씩 증가를 해서 [최종 값]까지 반복하는 반복문 중에 하나입니다.

Private Sub Command1_Click()

Dim i, My_Total As Integer

My_Total = 0

For i = 1 To 100

My_Total = My_Total + i

Next i

Label1.Caption = My_Total

Label2.Caption = i

End Su

실행결과 : Label1에는 '5050'이 출력되고 Label2에는 '101'이 출력됩니다.


For문을 반복할 때 사용한 변수를 For문 다음 문장에서 출력하면 1증가한 값이 출력됩니다그 이유는 For문 반복 후에 1이 증가되기 때문입니다주의하기 바랍니다.

Dim i, Total1, Total2 As IntegerPrivate Sub Command1_Click()

Total1 = 0: Total2 = 0

' 10부터 -2씩 감소하여 0까지 반복

For i = 10 To 0 Step -2

Total1 = Total1 + i

Next i

Label1.Caption = Total1

' 0부터 2씩 증가하여 10까지 반복

For i = 0 To 10 Step 2

Total2 = Total2 + i

Next i

Label2.Caption = Total2

End Sub


실행 결과 : Label1과 Label2는 모두 '30'을 출력합니다. 10부터 -2씩 감소하여 0까지 반복하는 것과 0부터 2씩 증가하여 10까지 반복하는 것은 동일하게 처리하기 때문입니다.


형식


For 변수1 = 시작 값 To 최종 값 [Step 증가 값]

문장

For 변수2 = 시작 값 To 최종 값 [Step 증가 값]

문장

[Exit For]

문장

Next 변수2

[Exit For]

문장

Next 변수1


이중 For문은 안쪽의 For문과 바깥쪽의 For문이 쌍을 이루어 반복을 수행합니다형식은 다음과 같습니다.

 

[실습] 이중 For문 다루기


[폼 작성 화면]



번호

컨트롤 종류

컨트롤명

속성

설정

1

Form1

Caption

"문자열 다루기"

2

텍스트 박스

Text

Caption

""

MultiLine

True

[폼 디자인 구성표]


' 1 폼의 Load이벤트

Private Sub Form_Load()

Dim i, j As Integer

For i = 1 To 7

For j = 1 To 5

Text1.Text = Text1.Text & Str(j)

Next j

Text1.Text = Text1.Text & vbCrLf

Next i

End Sub



이중 For문은 바깥쪽 For과 안쪽 For문이 쌍으로 이루어져서 반복을 합니다그러므로 안쪽은 For문의 j와 안쪽에 있는 Next의 j가 동일해야 하고 바깥쪽의 For문의 i와 바깥쪽의 Next의 i가 동일해야 합니다.

vbCrLf상수는 안쪽의 For문이 반복을 마친 후 다음 라인에 출력하기 위해서 사용합니다. vbCrLf상수와 그 외에 사용할 수 있는 상수는 다음과 같습니다.


상수

같은 값

설명

vbBack

Chr(8)

백 스페이스 문자, 왼쪽으로 한 칸 이동합니다.

vbCr

Chr(13)

캐리지 리턴 문자로 다음 라인으로 이동합니다.

vbCrLf

Chr(13) + Chr(10)

캐리지 리턴 수행한 후 라인 피드를 수행합니다.

vbLf

Chr(10)

라인 피드 문자로 왼쪽 끝에 문자를 출력합니다.

vbTab

Chr(9)

탭 문자로 9칸을 이동합니다.


위 소스를 입력하고 실행하기 텍스트박스
(Text1) 컨트롤의 속성을 속성창에서 MultiLine속성을 True로 변경해야 합니다.



MultiLine속성이 True이면 텍스트박스에서 여러 라인의 문자열을 출력하지만 False이면 한 라인의 문자열을 출력하게 되므로 다음라인을 출력하는 vbCrLf상수가 적용되지 않습니다.


[실행 결과]






Reactions

댓글 쓰기

0 댓글