VBA의 루프. VBA 루프(1부)

루프 문

VBA에서 루프에는 카운터(파라메트릭)가 있는 루프와 조건(반복)이 있는 루프의 두 가지 주요 유형이 있습니다.

카운터가 있는 루프는 특정 작업을 특정 횟수만큼 수행해야 하는 경우에 사용됩니다.

조건 루프는 특정 조건이 충족될 때까지 프로그램의 일부 작업을 반복해야 할 때 사용됩니다.

매개변수가 있는 주기에 대한 ... 다음

사이클 구조:

을 위한 Loop_Parameter = 초기_값에게 최종_값

[단계 단계]

연산자

[출구]

다음 [루프 매개변수]

어디서 예어 VBA (from), 주기의 시작을 나타냅니다.

루프 카운터로 정의된 loop_parameter 변수;

Start_Value 주기 매개변수의 초기값을 지정하는 숫자.

키워드로 VBA (전) 나누기

Start_Value 및 End_Knowledge;

End_Value 루프 매개변수의 값을 지정하는 숫자,

주기가 끝나는 시점;

단계 키워드 VBA (단계)에 사용

루프 단계 지정, 선택적 인수;

단계는 주기 단계를 지정하는 숫자입니다. 값

매개변수 값 증가(또는 감소)

모든 단계에서 순환하십시오. 이 숫자는

부정적인;

종료 대상 루프 조기 종료 연산자(선택 사항);

다음 예어 VBA (다음) 표시

주기의 끝.

사이클 작업:

1단계 먼저 루프 매개변수를 결정하고 이 변수의 시작 및 종료 값을 계산하여 저장합니다.

2단계 루프 매개변수에 초기값이 할당됩니다.

3단계 루프 매개변수의 시작 값과 종료 값을 비교합니다.

루프 매개변수가 종료 값보다 크면 프로그램은 즉시 루프를 종료하고 루프 다음에 오는 코드 행으로 이동합니다.

4단계 루프 본문이 실행됩니다.

5단계 루프 본문을 실행한 후 루프 매개변수에 다음 값이 할당됩니다. 3단계로 이동합니다.

메모.

1. 키워드를 사용한 경우단계 , 이 단어 뒤에 지정된 번호에 따라 주기 매개변수가 변경됩니다. 만약 단어단계 누락된 경우 단계 값은 1과 같습니다.

예 1

I = 0에서 10인 경우 단계 2(값 I 2) 증가합니다.

2. For…다음 루프 조건에 도달하면 조기에 종료될 수 있습니다. 이렇게 하려면 루프의 올바른 위치에 연산자를 배치해야 합니다.에 대해 종료합니다.

예 2

Dim S As Integer

Dim j를 정수로

S=2

j = 1에서 10인 경우

에스 = 에스 + 제이

S > 6인 경우

종료 대상 (값이 S > 6)

종료

다음 j

MsgBox(들)

조건 루프(반복)

어떤 동작(여러 동작)을 여러 번 수행해야 하지만 사전에 몇 번인지 알 수 없고 조건에 따라 달라지는 경우에는 사전 조건 또는 사후 조건이 있는 루프를 사용해야 합니다.

VBA에서 두 가지 주요 주기가 있습니다 DO...루프 키워드로 입력된 조건으로하는 동안 , 그리고 키워드에 의해 소개된 조건으로까지 . 둘 다 전제 조건 또는 사후 조건이 될 수 있습니다.

통사론:

여기서 수행 키워드(하다);

하는 동안 키워드(아직);

까지 키워드(한정);

고리 주기의 끝을 나타내는 키워드;

<условие>진위 여부를 확인하는 논리식

루프 본문의 각 실행 시작 시;

<тело_цикла>임의의 연산자 시퀀스;

할 일...공사 중 읽기: 조건이 충족되는 동안 수행합니다. 디자인에서할 일 ... 동안

Do … When 구조는 다음과 같이 읽습니다. 조건이 충족될 때까지 계속하십시오. 디자인에서할 … 때까지 단계를 늘리려면 특수 연산자를 작성해야 합니다. 그 안에 디자인과 달리을 위한 , 이것은 자동으로 수행되지 않습니다.

키워드 뒤에 쓰여진 조건까지 , 각 반복이 끝날 때(루프 본문 실행 후) 확인됩니다. 여기서는 루프에서와 동일하게 작동하지 않습니다.하는 동안 . 조건이 참이면(진실 ), 루프가 종료됩니다. 조건이 충족되지 않는 경우(거짓거짓 ) 루프 본문이 다시 실행됩니다.

예 1

문제의 공식화. 서브루틴 절차를 사용하여 유한 계열의 합을 계산합니다.

작업 실행 기술:

1. 초기 데이터:나는 Z

결과: S  R .

2. 사전 조건이 있는 루프를 사용하여 다음 사용자 절차를 프로젝트의 표준 모듈에 입력합니다.하는 동안:

서브섬마()

Dim S As Integer

Dim i As Integer

S=0

나는 = 1

나는 동안 할<= 10

S=S+i^2

나는 = 나는 + 1

고리

MsgBox(들)

엔드 서브

3. 사전 조건이 있는 루프를 사용하여 다음 사용자 절차를 프로젝트의 표준 모듈에 입력합니다.까지 :

서브섬마()

Dim S As Integer

Dim i As Integer

S=0

나는 = 1

i > 10이 될 때까지 수행

S=S+i^2

나는 = 나는 + 1

고리

MsgBox(들)

엔드 서브

4 사후 조건이 있는 루프를 사용하여 다음 사용자 프로시저를 프로젝트의 표준 모듈에 입력합니다.하는 동안:

서브섬마()

Dim S As Integer

Dim i As Integer

S=0

나는 = 1

S=S+i^2

나는 = 나는 + 1

i 동안 루프<= 10

MsgBox(들)

엔드 서브

5 사후 조건이 있는 루프를 사용하여 다음 사용자 프로시저를 프로젝트의 표준 모듈에 입력합니다.까지 :

서브섬마()

Dim S As Integer

Dim i As Integer

S=0

나는 = 1

S=S+i^2

나는 = 나는 + 1

i > 10이 될 때까지 반복

MsgBox(들)

엔드 서브

의사 결정 구조 외에도 사이클이라는 또 다른 유형의 제어 구조가 있습니다.

주기- 이것은 문 블록의 다중 반복이 구현되는 알고리즘 구조입니다.

Visual Basic에는 For:Next, Do:Loop 및 While:Wend 구문을 사용하여 구현되는 세 가지 주요 유형의 루프가 있습니다.

For:Next 루프. 주어진 문 블록의 반복 횟수를 미리 알고 있을 때 사용합니다. 이 디자인은 다음과 같습니다.

For 카운터 = 시작 값 종료 값 Statements1 Statements2 Next [카운터]

위의 문장이 처음 실행되면 카운터 변수에 초기값이 할당되고 그 후에 두 가지 옵션이 가능합니다. 조건 카운터 > 최종 값을 확인한 결과 True 값을 얻으면 루프가 종료되고 블록 statements1 및 statements2는 실행되지 않습니다. 반면에 조건 테스트의 결과가 False이면 이 경우 문 블록이 처음으로 실행된 후 루프 시작 부분으로 전환됩니다. 다음으로 카운터 변수의 값은 Step 키워드 뒤에 위치한 단계만큼 증가합니다(없으면 단계 = 1로 설정됨). 이후 다시 조건 카운터 > 최종값 등의 진위를 확인하고, 이 확인 결과가 참이 되는 순간 루프를 종료한다.

일부 추가 조건이 충족되면 종종 루프를 "중단"해야 합니다. 이 경우 루프 내에서 일반적으로 제어 구조에 있는 서비스 구 Exit:For를 사용해야 합니다. 예를 들면 다음과 같습니다.

If 조건 Then Exit For

조건 테스트의 결과가 True이면 루프 실행이 종료되고 statement1 블록이 다시 실행되고 statement2 블록은 실행되지 않습니다.

해야 할 일:루프. 루프 본문 문의 반복 횟수를 미리 알 수 없을 때 사용합니다. 이 디자인에는 네 가지 변형이 있습니다. 처음 두 개를 사용하면 루프가 여러 번 실행되거나 전혀 실행되지 않습니다.

Do When 조건 루프 문

조건 검사 결과가 False이면 블록 문을 실행하고, 그렇지 않으면 Loop 서비스 단어 뒤에 있는 문으로 천이합니다. 반면 조건의 첫 번째 테스트가 True로 평가되면 루프가 실행되지 않습니다.

Do While 조건 루프 문

조건이 참이면 문 블록이 실행되고, 거짓이면 즉, 검사 결과가 거짓이면 루프가 한 번도 실행되지 않습니다.

마지막 두 구성이 사용되는 경우 루프가 적어도 한 번 실행됩니다.

Do 문 루프 조건까지

조건 테스트 결과가 False이면 블록 문이 실행되고, 그렇지 않으면 루프가 종료됩니다.

Do 문 루프 While 조건

조건이 거짓이면 블록 문이 실행되고 참이면 즉, 검사 결과가 True이면 치클이 종료됩니다.

동안:웬드 루프. 루프 본문의 명령문 반복 횟수를 미리 알 수 없는 경우에도 사용되며 구문은 다음과 같습니다.

While 조건 Wend 문

조건 확인 결과 True이면 문 블록을 실행하고, 그렇지 않으면 Wend 서비스 단어 뒤에 있는 문으로 천이합니다. 반면 조건의 첫 번째 테스트가 False로 평가되면 루프가 실행되지 않습니다.

연산자 구문:

을 위한카운터= 시작 영형[단계단계]

문_블록

다음카운터

여기에 표시되어 있습니다.

을 위한을 위한 (필수 VB 키워드);

에게~ 전에 (필수 VB 키워드);

문_블록호출된 하나 이상의 연산자 사이클 바디;

카운터 -실행할 사이클의 수를 세는 정수 변수;

시작, 끝 -카운터의 초기 및 최종 값;

단계단계(키워드 VB);

단계 -카운터 체인지 단계; 부정적일 수 있습니다. 매개변수는 선택적입니다. 단계가 1인 경우 단계를 수행할 수 있기 때문입니다. 단계낮추다;

다음 - 다음(필수 VB 키워드, 루프 문 항목의 끝).

카운터 값 (시작, 종료)될 수 있다 정수 또는 실수 유형의 숫자 ​​상수 또는 변수는 음수 또는 양수가 될 수 있습니다. 루프 본문이 적어도 한 번 실행되려면 다음과 같아야 합니다. 시작 ≤ 끝,만약에 단계> 0 및 시작 ≥ 끝,만약에 단계< 0. 그것이 밝혀지자마자 카운터>끝 (만약에 시작< Конец), 루프 실행이 종료됩니다. 만약에 시작 =끝,루프는 한 번 실행됩니다.

예 9.1 .기능 평가와이 = 2 – 1.5 죄악범위에서 0.2 단위로 X를 변경할 때.

Y를 계산하고 인수 X와 함수 Y를 출력하는 프로그램의 일부:

X = 0에서 2.4인 경우 단계 0.2

Y = 2 - 1.5*사인(X)

이 루프가 어떻게 작동하는지 이해하기 위해 다음을 사용하여 만든 유사한 루프에 대한 프로그램이 있습니다. 운영자이동, 레이블, 연산자만약에그 다음에.

M1:X=X+0.2

만약 X<= 2.4 Then

Y = 2 - 1.5*사인(X)

이 프로그램이 어떻게 작동하는지 분석해 봅시다. 첫 번째 계산 Y는 비표준이므로 루프에서 벗어납니다. 컨트롤 GoToM1이 레이블 M1로 처음 전송된 후 루프가 시작됩니다. M1이라고 표시된 줄에서 인수 X가 0.2씩 증가하고 X의 새 값이 최종 값 2.4를 초과하지 않는지 즉시 확인합니다. 초과하지 않으면 이 새 X를 사용하여 Y 계산을 반복합니다. 그런 다음 GoToM1 연산자가 다시 실행되어 레이블이 M1인 줄로 제어를 전송합니다. Y를 계산하는 이러한 반복(주기)은 X가 2.4를 초과하는 즉시 종료됩니다.

이제 If 프로그램은 For…Next 루프와 비슷합니다.

X = 0에서 2.4인 경우 단계 0.2

두 줄 교체

M1:X=X+0.2

만약 X<= 2.4 Then

For 루프에서 실행되는 코드의 마지막 두 줄이지만 우리는 이것을 볼 수 없습니다. 문자열 cFor...로 인코딩했습니다. 코드 라인 GoTo M1은 단어 Next X(문자 그대로 다음 X)로 인코딩됩니다. 그 결과 콤팩트한 디자인이 탄생했습니다.

For…Next 루프를 사용할 때 다양한 문제를 해결할 때 루프 카운터를 사용하는 방법을 배워야 합니다. 카운터를 사용하여 문제를 해결하는 방법을 알아내려면 다음을 수행해야 합니다. 문제 설명을 분석하고 문제의 일부 매개변수에서 변화 패턴을 찾습니다.

예 9.2 . 시리즈 요소의 합 결정: .

프로그램 조각:

S = 0 'S는 시리즈의 합입니다.

For i = 1 To 16 ' 카운터 i는 분수의 분모입니다.

S = S + 1/i ' 누적 합계

인쇄 "S="; S ' 합계 S의 출력을 다음 형식으로

카운터 i의 각 값에 대해 식 1/i는 1부터 시작하여 시리즈의 요소를 순차적으로 형성합니다.

예 9.3 . 일련의 요소의 합 계산
.

프로그램 조각:

S = 0 'S는 시리즈의 합입니다.

For i = 1 To 18 ' 카운터 i - 분자

S = S + i/(i + 1) ' 분모가 분자보다 1만큼 큽니다.

인쇄 "S="; S ' 합계 S의 출력을 다음 형식으로

예 9.4 . 합계 계산: 5 + 8 + 11 + ... + 32 + 35

프로그램 조각:

S = 0 'S는 시리즈의 합입니다.

For i = 5 To 35 3단계 ' 산술 구하기 _

분모가 3인 진행

인쇄 "S="; 에스

예 9.5. 주어진 x에 대한 합계 계산:

문제를 분석하면 X에서의 정도가 1에서 10으로 변합니다. 이 경우 X에서의 계수의 분자는 정도보다 1만큼 크고 분모는 2만큼 큽니다. 정도의 값은 다음과 같이 형성됩니다. 카운터 사용 i. 그런 다음 다음 프로그램(단편)을 작성할 수 있습니다.

S = 1 'S는 시리즈의 합입니다.

i = 1에서 10'인 경우 카운터 i로 X에서 정도가 변경됩니다.

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

인쇄 "S="; 에스

주기을 위한다음에 사용입출력 그리고배열 처리 .

예 9.6. 배열 요소 값의 입출력 B(N).

프로그램 조각:

' 변수에 값 N 할당 생략, _

텍스트 필드 txtN의 양식에 입력:

B(i) = InputBox("요소 B(" & i & ") 입력", _

"입력 배열 B(" & N & ")"))

인쇄 " "; B(i);

기능 입력 상자() 닫기 버튼, 주어진 메시지, 입력 필드, 버튼이 있는 대화 상자를 표시합니다. 좋아요,취소,헤더(또는 헤더 없음). 숫자 12(배열 N의 크기)를 입력하면 이 예에서 처음 나타날 때 이 창이 다음과 같이 표시됩니다.

메시지는 보시다시피 요소 B(1) 입력텍스트 상자에 첫 번째 요소의 값을 입력하라는 메시지가 표시됩니다. 배열에 12개의 요소가 포함되어 있으므로 이 창은 12번 나타납니다. 이것은 양식 헤더에서 이어집니다. 프롬프트에서 요소 B(i)의 인덱스는 1에서 12까지 다양합니다.

양식에 B(N) 배열 요소의 값만 표시해야 하는 경우 루프 본문은 하나의 명령문으로 구성됩니다.

배열 요소에 대한 작업을 수행하기 위해 배열 요소를 보는 것도 For…

가져오자 1차원 배열 처리의 예.

예제 9.7 . 배열의 최대 요소 결정 B().

초기 데이터 입력 및 결과 출력을 제외하고 알고리즘을 간략하게 설명합니다.

    배열의 첫 번째 요소의 값을 입력할 변수 Bmax와 배열의 첫 번째 요소의 인덱스인 1을 할당할 변수 Imax를 선언해 봅시다.

    루프에서 For…Next 연산자를 사용하여 두 번째부터 시작하여 배열의 모든 요소를 ​​살펴봅니다. If…Then 연산자를 사용하여 해당 값을 Bmax 변수에 저장된 값과 비교합니다.

    배열 요소의 값이 Bmax보다 큰 것으로 판명되면 Bmax에 이 요소의 값이 할당되고 Imax의 값이 이 배열 요소의 인덱스가 됩니다.

루프 종료 후 변수 Bmax는 최대 요소의 값을 포함하고 Imax는 인덱스(숫자)를 포함합니다.

알고리즘의 이 부분의 프로그램입니다.

Bmax = B(1): Imax = 1

B(i) > Bmax이면 Bmax = B(i): Imax = i

예 9.8. 양수 배열 요소의 합, 곱 및 수 결정().

변수: S, P, K는 각각 양수 요소의 합, 곱 및 수입니다.

연산이 정의:

    변수 S와 K에 0을 할당하고 변수 P에 1을 할당합니다. 원칙적으로 합계가 누적되는 변수, 여기서 S와 k는 주기 전에 0으로 재설정되고 1은 제품이 계산되는 변수.

    For…Next 루프를 사용하여 배열의 모든 요소를 ​​살펴보고 양수(D(i) > 0)인지 확인합니다.

    요소가 양수인 것으로 밝혀지면 해당 값을 합계 S 값에 더하고 새 합계를 동일한 변수에 저장합니다. 변수 P에 요소의 양수 값을 곱하고 변수 P에도 저장합니다. 그리고 변수 K에 1을 더하고 새로운 값을 같은 변수에 저장합니다.

프로그램알고리즘의 이 부분은 다음과 같습니다.

S=0: P=1: K=0

D(i) > 0이면

S = S + D(i) ' 합계 _의 누적 방식입니다.

배열 요소의 양수 값 D(i)

P = P*D(i) ' 양수 곱의 정의

' 배열 요소

K = K + 1 ' 이 연산자는 COUNTER라고 합니다.

' 양수 배열 요소의 수를 결정합니다.

예 9.9. 홀수 배열 요소의 합, 곱, 수 및 평균 결정().

우리는 그러한 정의의 프로그램 일부를 제시합니다.

S=0: P=1: K=0

D(i) 모드 2인 경우<>0 그럼

Ssr = S/k ' 홀수 요소의 평균 계산

이 프로그램 조각을 예제 9.8의 프로그램과 비교하십시오. 이 프로그램은 이전 프로그램을 거의 완전히 반복합니다. If 문의 조건만 변경되었습니다. 조건 D(i) 모드 2<>0은 2로 나누어지지 않는 배열 D(i)의 요소, 즉 홀수 ​​요소를 찾고 있음을 의미합니다. 조건 D(i) Mod 2 = 0을 확인하면 배열의 짝수 요소를 선택합니다.

아시다시피 분할 모드결과적으로 정수로 나눈 나머지를 제공합니다. 예를 들어 연산자 d= 34Mod4를 실행한 후 변수 d는 2가 됩니다. 따라서 4의 배수인 배열 요소를 선택하려면 조건 D(i) Mod 4 = 0을 확인해야 합니다. 조건은 다른 숫자의 배수인 요소를 찾는 경우 유사합니다. 4 대신 다른 숫자가 기록됩니다.

예 9.10. 배열 요소 쓰기아르 자형(N) 다른 배열로 5로 나눌 수 있고 양식에 새 배열을 표시합니다.

다른 배열은 예를 들어 R5(N)으로 표시됩니다. 극한의 경우 모든 요소가 5의 배수가 될 수 있으므로 이 새 배열의 크기는 원래 배열과 동일하다고 가정해야 합니다.

작업 알고리즘:

    카운터 k를 재설정합니다. For…Next 루프 연산자를 사용하여 R(N) 배열의 모든 요소를 ​​살펴봅니다.

    If…Then 연산자를 사용하여 각 요소의 다중도가 5인지 확인하고 배열 요소를 Mod로 나눕니다.

    요소가 5의 배수이면 k=k+ 1과 같은 카운터를 사용하여 1부터 시작하여 배열 R5(N)의 인덱스를 형성하고 다른 배열 –R5(N)에 씁니다.

    k가 0이 아닌 경우 arrayR5()를 형식으로 출력합니다.

    k가 0이면 "5의 배수인 요소가 없습니다"를 출력합니다.

프로그램 조각:

R(i) Mod 5이면 k = k + 1: R5(k) = R(i)

만약 k<>0 그럼

"5로 나눌 수 있는 요소 없음" 인쇄

루프는 다른 루프 내에 중첩될 수 있습니다.

작품을 시연해보자 중첩 루프 . 아래에서 프로그램은 사이클 카운터 i, j 및 k 값의 출력을 구성합니다. i,j,k의 출력에서 ​​중첩 루프가 실행되는 방식이 명확해집니다.

비공개 서브 frmCycle_DblClick()

ScaleMode = 4 '단위 - 기호

For i = 1 ~ 3' 외부 루프

인쇄 "i = "; 나;

For j = 1 To 4 '첫 번째 중첩 루프

CurrentX = TextWidth("i = 1") + 5

인쇄 "j="; 제이;

CurrentX = TextWidth("i = 1 j = 1") + 7

k = 1 ~ 5'의 경우 두 번째 중첩 루프

표시된 형식(그림 1)은 외부 루프 - counter i, 첫 번째 중첩 루프 - counterj 및 두 번째 가장 안쪽 루프 - counterk의 세 루프 모두의 카운터를 표시한 결과를 보여줍니다. 우리가 보는 바와 같이, 외부 루프의 "가장 느린" 카운터(포이), 그리고 "가장 빠른"은 가장 안쪽 루프의 카운터입니다(에 따라케이).

frmCicli 양식을 마우스 왼쪽 버튼으로 더블 클릭하면 프로그램이 실행됩니다.

CurrentX, CurrentY - Print 메서드에 의한 정보 출력 시작점의 X, Y 좌표를 지정하는 양식 속성입니다(그림 1의 양식에서 X 및 Y축 위치 참조).

TextWidth()는 함수에 주어진 텍스트의 너비를 큰따옴표 안에 인수로 반환하는 함수입니다.

중첩 루프는 2차원 배열(행렬)을 처리할 때 사용됩니다. 그러나 일부 작업에서는 2차원 배열 요소의 입력 및 출력을 제외하고 자신을 한 주기로 제한할 수 있습니다. 매트릭스 프로그래밍의 몇 가지 예를 고려하십시오.

예 9.11. 정수 행렬(2차원 배열)의 입출력인타(N).

행렬을 입력할 수 있습니다. 행별 및 열별 . 양식에 대한 배열 요소의 출력이 입력 직후 프로그래밍되는 경우 한 줄씩 더 쉽습니다.

매트릭스 입력 및 출력한 줄씩 - 조각 1.

Dim M을 정수로, N을 정수로, i를 정수로, j를 정수로

Dim intA() As Integer ' 동적 배열 선언

M = Val(txtN.Text) ' M은 줄 수

N = Val(txtN.Text) ' N은 열의 수입니다.

ReDim intA(M, N) As Integer ' 배열 재정의

For i = 1 To M ' i는 완전히 끝날 때까지 그 값을 유지할 것입니다.

'j의 중첩 루프는 실행되지 않습니다.

인쇄 " "; intA(i, j); ' 한 줄씩 출력

인쇄 ' 새 줄의 시작 부분으로 이동

열별로 행렬을 입력하려면 j(열 번호 설정)에 외부 루프를 만들고 i(행 번호 설정)에 내부 루프를 만들어야 합니다.

매트릭스 입력 및 출력열 기준 조각 2.

PrY = 2500: CurrentY = PrY ' PrY는 시작의 Y 좌표를 설정합니다.

' 양식의 각 열의 첫 번째 요소 출력

For j = 1 To N ' j는 완전히 끝날 때까지 값을 유지합니다.

'i의 중첩 루프는 실행되지 않습니다.

intA (i, j) = InputBox("요소 입력 intA(" & i & "," & j & ")", _

"매트릭스 입력 intA(" & M & "," & N & ")")

인쇄 탭(6 * j); intA(i, j) ' 열별로 표시

CurrentY = PrY ' 첫 번째 요소 표시

' 다음 열

프로그램의 이 두 번째 조각은 첫 번째 조각의 처음 5줄을 반복하지 않습니다. Tab(6 * j) 함수는 양식의 왼쪽 가장자리에서 시작하여 줄(문자)에 출력 시작을 설정합니다. 여기서 PrY 좌표는 2500 트윕이지만 다른 값을 선택할 수 있습니다.

예제 9.12 . 배열 요소 값 정렬V(N) 오름차순.

배열을 정렬하기 위한 몇 가지 알고리즘이 있습니다. 다음은 그 중 하나입니다. 중첩 루프 사용을 위한다음첫 번째 요소부터 두 번째 요소까지 선택하고 각 요소를 후속 요소와 비교합니다. 다음 요소가 선택한 요소보다 작은 것으로 판명되면 교체하십시오.

이 알고리즘을 구현하는 프로그램의 일부:

i = 1에서 N - 1까지

j = i + 1에 대해 N

만약 V(j)< V(i) Then P = V(i): V(i) = V(j): V(j) = P

이 프로그램 조각에 대해 설명하겠습니다.

카운터 i가 있는 외부 루프의 도움으로 후속 요소와 비교하기 위해 요소 V(i)를 선택합니다. 카운터 j가 있는 내부 루프는 비교를 위해 V(j)의 후속 요소를 선택합니다. j의 초기값은 i + 1입니다. 이것은 다음의 첫 번째 요소입니다.

V(i) 및 V(j) 요소의 값을 교환하기 위해 배열 요소 중 하나의 값을 일시적으로 "숨기는" 변수 P를 도입합니다(프로그램에서 이것은 V(i )). 그런 다음 요소 V(i)에는 요소 V(j)의 값이 할당되고 요소 V(j)에는 변수 P에 저장되는 값 V(i)가 할당됩니다. P에서 V(j)의 값을 "숨기면" 값 교환 코드는 P = V(j): V(j) = V(i): V(i) = P가 됩니다. 결과는 변경되지 않습니다.

에게 배열을 내림차순으로 정렬, 검증 조건을 V(j) > V(i) 형식으로 작성하면 됩니다. 즉, 부등식 기호를 다른 기호로 변경하면 됩니다.

배열이 숫자가 아니라 문자열이고 배열 요소가 성으로 채워진 경우 예제 9.12의 프로그램을 사용하여 성 목록을 알파벳순으로 정렬할 수 있습니다. 사실은 컴퓨터에서 사용되는 알파벳 문자에 대해 부등식이 참이라는 것입니다.< Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

예제 9.13 . 행렬의 홀수 열에 대한 양수 요소의 합 계산에프(, N) 양식에 합계를 표시합니다.

프로그램 알고리즘:

    단계가 2인 외부 루프를 사용하여 첫 번째 열부터 시작하여 행렬의 홀수 열 인덱스를 형성합니다.

    양수 요소의 합이 누적되는 합 S를 재설정합니다.

    내부 루프에서 배열 요소의 부호를 확인합니다.

    배열 요소가 양수(> 0)이면 합계 S를 계산합니다.

    내부 루프가 끝난 후 합계 S를 형식으로 출력합니다.

파편 프로그램들:

j = 1에서 N까지 단계 2

F(i, j) > 0이면 S = S + F(i, j)

"열 합계"를 인쇄하십시오. 제이; ":"; S ' j는 열 번호입니다!

중첩된 루프를 사용하면 구성할 수 있습니다. 옵션 열거 분석적으로 해결할 수 없는 문제를 해결합니다. 열거의 결과 솔루션이 얻어지며 그 중에서 문제의 조건을 충족하는 하나 이상의 솔루션이 선택됩니다.

예 9.14. 1801 루블이 있습니다. 31 루블에 초콜릿을 몇 개 살 수 있습니까? 모든 돈을 완전히 사용하기 위해 각각 18 루블의 롤.

프로그램:

금액 = 1801

AllChocolates = 합계 \ 31: 모든 빵 = 합계 \ 18

i = 1의 경우 AllChocolates에

j = 1인 경우 AllBulki로

가격 = i * 31 + j * 18 '총 구매 가격

가격 = 1801이면

인쇄 "초콜릿: "; 나; 탭(19); "불록: "; 제이

러시아어로 명명된 변수를 사용하는 프로그램을 설명하겠습니다.

먼저 전체 수량에 대해 구입할 수 있는 초콜릿만 또는 롤만 최대 몇 개인지 결정합니다. 획득한 VseChocolate 및 VseBulki 값은 초콜릿 및 롤 수로 검색 수를 제한하는 데 사용됩니다. 초콜릿 수(i)와 롤 수(j)의 각 값에 대해 총 구매 가격을 결정합니다. 계산된 가격이 1801이면 선택한 옵션이 문제에 대한 솔루션 중 하나입니다.

Tab() 함수는 이 함수 다음의 정보가 표시될 양식 가장자리의 위치를 ​​지정합니다. Tab(19)이면 19번째 위치부터.

프로그램은 3가지 가능한 구매 옵션을 표시합니다.

초콜릿 7, 롤 88

초콜릿 25, 롤 57

초콜릿 43, 롤 26

모호하지 않은 대답을 하고 싶다면 추가 조건을 공식화해야 합니다. 예를 들어, "초콜릿보다 빵을 덜 샀다." 그렇다면 유일한 해결책은 세 번째 옵션입니다.

중첩 루프 프로그래밍을 반복함으로써 간단히 해결되는 수학적 문제가 많이 있습니다.

마지막 업데이트: 2015년 10월 30일

제어 구조의 또 다른 유형은 루프입니다. VB.NET은 여러 종류의 루프를 사용합니다.

For...Next 루프

이 루프는 특정 횟수만큼 실행되며 이 숫자는 카운터에 의해 설정됩니다.

For i As Integer = 1 To 9 Console.WriteLine("(0)의 제곱은 (1)입니다", i, i * i) 다음

여기서 변수 i는 카운터 역할을 합니다. 말씀 후 에게카운터의 최대 값을 넣습니다. 매 사이클마다 카운터 값이 1씩 증가합니다. 그리고 이 값은 이후의 값과 비교됩니다. 에게. 이 두 값이 같으면 루프가 종료됩니다.

루프로 작업할 때 각 패스마다 카운터의 값을 하나뿐 아니라 일반적으로 임의의 숫자만큼 늘릴 수 있습니다. 이렇게 하려면 키워드를 사용하거나 단계그 후에 카운터 값이 증가할 루프의 단계를 지정하거나 루프에서 직접 카운터를 증가시킬 수 있습니다.

For i As Integer = 1 To -9 Step -1 For j As Integer = 1 To 9 Console.WriteLine("i와 j의 곱은 (0)", i * j) j += 1 Next Next

음수 값은 첫 번째 루프의 단계로 선택되고 카운터 값은 패스할 때마다 하나씩 감소합니다. 내부 루프에서 카운터 j는 기본적으로 1씩 증가하고 루프에서도 명시적으로 1씩 증가하기 때문에 반복할 때마다 2씩 증가합니다. 결과적으로 내부 루프는 5회 작동하고 외부 루프는 9회, 즉 실제로 45사이클을 얻습니다.

For Each...Next 루프

For Each 루프는 배열이나 컬렉션과 같은 특정 그룹의 요소를 반복합니다. Integer 유형의 배열이 있고 이 배열을 임의의 값으로 초기화한 다음 모든 요소를 ​​화면에 표시해야 한다고 가정합니다.

"다섯 개의 숫자 배열 만들기 Dim nums(4) As Integer Dim r As New Random() "배열 For i As Integer = 0 To nums.Length - 1 nums(i) = r.Next(100) Next " 요소 표시 array For Each i As Integer In nums Console.Write("(0) ", i) Next

For Each 문에서 먼저 배열 요소의 값을 사용할 변수를 지정합니다. 그리고 키워드 뒤에 ~ 안에모든 요소를 ​​정렬할 그룹을 지정합니다.

while 루프

While 루프에서는 While 뒤에 지정된 특정 조건이 충족되는 동안 실행됩니다.

Dim j As Integer = 10 While j > 0 Console.WriteLine(j) j -= 1 End While

루프 수행

Do 루프는 While 루프와 마찬가지로 특정 조건이 충족되는 한 실행됩니다. 그러나 그것은 다른 형태를 가지고 있습니다. 따라서 다음 예제에서는 먼저 조건을 확인한 다음 루프에 정의된 코드 블록을 실행합니다.

Dim j As Integer = 10 Do While j > 0 Console.WriteLine(j) j -= 1 루프

이 경우 j 값이 0보다 큰 동안 루프가 실행됩니다. 그러나 단어 대신 While이라는 단어가 사용된 또 다른 항목이 있습니다. 까지, 특정 조건이 충족될 때까지, 즉 j 값이 0보다 작아질 때까지 루프가 실행됩니다.

Dim j As Integer = 10 j까지 수행< 0 Console.WriteLine(j) j -= 1 Loop

처음에 루프에 지정된 조건이 거짓이면 루프가 작동하지 않습니다. 그러나 루프의 끝에서 검사를 정의할 수 있으므로 루프가 적어도 한 번 실행됩니다.

Dim j As Integer = -1 Do Console.WriteLine(j) j -= 1 j까지 반복< 0 "либо Do Console.WriteLine(j) j -= 1 Loop While j > 0

계속 및 종료 문

주기가 끝날 때까지 기다리지 않고 특정 조건이 충족되면 즉시 주기를 종료해야 하는 경우가 종종 있습니다. 이렇게 하려면 연산자를 사용하십시오. 출구, 종료할 루프 유형(예: Exit Do(Exit While)):

Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 To 100 num -= 1 If num< 50 Then Exit For Next Console.WriteLine(num)

또 다른 작업이 있습니다. 루프가 아니라 현재 패스 또는 반복에서 종료하고 다음 단계로 이동하는 것입니다. 이렇게 하려면 계속 문을 사용합니다. 그 후에 종료되는 루프 유형(예: 계속 동안 계속)을 나타냅니다.

Dim r As New Random() Dim num As Integer = r.Next(100) For i As Integer = 0 ~ 10 num -= 7 If num< 50 AndAlso num >25 그런 다음 End If Console.WriteLine(num) 다음으로 계속 진행

이 경우 루프의 각 패스에서 num에서 숫자 7을 뺀 다음 숫자 num이 25에서 50 사이의 간격에 속하는지 확인합니다. 그렇다면 루프의 새로운 반복으로 이동합니다. 그렇지 않은 경우 화면에 표시합니다.

코드 블록을 여러 번 실행해야 하는 상황이 있을 수 있습니다. 일반적으로 명령문은 순차적으로 실행됩니다. 함수의 첫 번째 명령문이 먼저 실행된 다음 두 번째 명령문이 실행되는 방식입니다.

프로그래밍 언어는 보다 복잡한 실행 경로를 제공하는 다양한 제어 구조를 제공합니다.

루프 문을 사용하면 문 또는 문 그룹을 여러 번 실행할 수 있습니다. 다음은 VBA의 루프 문의 일반적인 보기입니다.

VBA는 루핑 요구 사항을 처리하기 위해 다음 유형의 루프를 제공합니다. 세부 정보를 확인하려면 다음 링크를 클릭하십시오.

for 루프

for 루프는 개발자가 특정 횟수만큼 실행해야 하는 루프를 효율적으로 작성할 수 있도록 하는 반복 제어 구조입니다.

통사론

다음은 VBA의 for 루프 구문입니다.

카운터의 경우 = 시작에서 종료까지 .... .... 다음

흐름도

다음은 루프 모드의 제어 흐름입니다.

  • 첫 번째 단계가 완료되고 있습니다. 이 단계를 통해 루프 제어 변수를 초기화하고 단계 카운터 변수를 증가시킬 수 있습니다.
  • 둘째, 조건이 평가됩니다. 참이면 루프 본문이 실행됩니다. false이면 루프 본문이 실행되지 않고 제어 흐름이 For 루프 직후의 다음 명령문으로 계속됩니다.
  • for 루프가 실행된 후 제어 흐름은 다음 문으로 이동합니다. 이 명령문을 사용하면 모든 루프 제어 변수를 업데이트할 수 있습니다. 만보기 값을 기준으로 업데이트됩니다.
  • 이제 조건이 다시 평가됩니다. 이것이 참이면 루프가 실행되고 프로세스가 반복됩니다(루프 본문, 단계 증가, 조건 다시). 조건이 거짓이 되면 For 루프가 종료됩니다.

버튼을 추가하고 다음 기능을 추가합니다.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 MsgBox "The value is i is: " & i Next End Sub

위의 코드를 컴파일하고 실행하면 다음과 같은 결과가 생성됩니다.

값은 i입니다: 0
값은 i입니다: 2
값은 i입니다: 4
값은 i입니다: 6
값은 i입니다: 8
값은 i입니다: 10

명령문 시퀀스를 여러 번 실행하고 루프 변수를 제어하는 ​​코드를 줄입니다.

for...루프

For each 루프는 배열 또는 컬렉션의 각 요소에 대해 명령문 또는 명령문 그룹을 실행하는 데 사용됩니다.

For each 루프는 For 루프와 유사합니다. 그러나 루프는 배열 또는 그룹의 각 요소에 대해 실행됩니다. 따라서 이 루프 유형에는 걸음 수 카운터가 존재하지 않습니다. 주로 배열과 함께 사용되거나 재귀적으로 작동하는 파일 시스템 개체의 컨텍스트에서 사용됩니다.

통사론

다음은 VBA의 For Each 루프 구문입니다.

그룹의 각 요소에 대해 .... 다음

Private Sub Constant_demo_Click() "fruits is an array fruits = Array("apple", "orange", "cherries") Dim fruitnames As Variant "For each 루프를 사용하여 반복합니다. fruit의 각 항목별 fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub

위의 코드가 실행되면 한 줄에 하나의 요소로 모든 과일 이름을 인쇄합니다.

사과
주황색
체리

그룹에 하나 이상의 요소가 있는 경우 실행되며 그룹의 각 요소에 대해 반복됩니다.

while..wend 루프

While While ... Wend 루프에서 조건이 True이면 Wend 키워드를 만날 때까지 모든 명령문이 실행됩니다.

조건이 거짓이면 루프가 종료되고 컨트롤이 Wend 키워드 뒤의 다음 명령문으로 이동합니다.

통사론

다음은 VBA의 While..Wend 루프 구문입니다.

while 조건 ... Wend

흐름도

Private Sub Constant_demo_Click() Dim 카운터: 카운터 = 10 동안 카운터< 15 " Test value of Counter. Counter = Counter + 1 " Increment Counter. msgbox "The Current Value of the Counter is: " & Counter Wend " While loop exits if Counter Value becomes 15. End Sub

위의 코드가 실행되면 메시지 필드에 다음과 같이 출력됩니다.

카운터의 현재 값: 11
카운터의 현재 값: 12
카운터의 현재 값: 13
카운터의 현재 값: 14
카운터의 현재 값: 15

루프 본문을 실행하기 전에 조건을 확인합니다.

do..while 루프

do...while 루프는 조건이 참인 동안 일련의 명령문을 반복하려는 경우에 사용됩니다. 조건은 루프 시작 또는 루프 끝에서 확인할 수 있습니다.

통사론

다음은 VBA에서 Do...While 루프의 구문입니다.

Do While 조건 ... ... 루프

흐름도

다음 예제에서는 Do ... while 루프를 사용하여 루프 시작 시 상태를 확인합니다. 루프 내부의 명령문은 조건이 True가 되는 경우에만 실행됩니다.

Private Sub Constant_demo_Click() Do While i< 5 i = i + 1 msgbox "The value of i is: " & i Loop End Sub

i의 값은 다음과 같습니다. 1
i의 값: 2
i의 값은 다음과 같습니다. 3
i의 값: 4
i의 값: 5

대체 구문

루프 끝에서 상태를 확인하는 Do ... while 루프에 대한 대체 구문도 있습니다. 이 두 구문의 주요 차이점은 다음 예제에서 설명합니다.

Do ... ... 루프 while 조건

다음 예제에서는 Do ... while 루프를 사용하여 루프 끝에서 상태를 확인합니다. 루프 내부의 명령문은 조건이 False인 경우에도 한 번 이상 실행됩니다.

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox "i의 값: " & i Loop While i< 3 "Condition is false.Hence loop is executed once. End Sub

위의 코드가 실행되면 메시지 상자에 다음과 같이 출력됩니다.

i의 값: 11

do..While 문은 조건이 True인 동안 실행됩니다. (즉) 루프는 조건이 False가 될 때까지 반복되어야 합니다.

do..intil 루프

Do ... intil 루프는 조건이 거짓인 동안 일련의 명령문을 반복하려는 경우에는 사용되지 않습니다. 조건은 루프 시작 또는 루프 끝에서 확인할 수 있습니다.

통사론

다음은 VBA에서 Do..Until 루프의 구문입니다.

할 때까지 조건 ... ... 루프

흐름도

다음 예제에서는 Do ... Before Loop를 사용하여 루프 시작 시 조건을 테스트합니다. 루프 내부의 명령문은 조건이 거짓인 경우에만 실행됩니다. 조건이 true가 되면 루프를 종료합니다.

Private Sub Constant_demo_Click() i = 10 i>15 "조건이 False일 때까지 수행합니다. 따라서 루프가 실행됩니다. i = i + 1 msgbox ("i의 값: " & i) Loop End Sub

위의 코드가 실행되면 메시지 상자에 다음과 같이 출력됩니다.

i의 값: 11
i의 값: 12
i의 값: 13
i의 값: 14
i의 값: 15
i의 값: 16

대체 구문

루프 끝에서 조건을 테스트하는 대체 Do ... Before Loop 구문도 있습니다. 이 두 구문의 주요 차이점은 다음 예제에서 설명합니다.

Do ... ... 루프 종료 조건

흐름도

다음 예제에서는 Do ... Before Loop를 사용하여 루프 끝에서 조건을 확인합니다. 루프 내부의 명령문은 조건이 True인 경우에도 한 번 이상 실행됩니다.

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 msgbox "i의 값: " & i까지 반복 i more15 "조건이 True입니다. 따라서 루프는 한 번 실행됩니다. End Sub

위의 코드가 실행되면 메시지 상자에 다음과 같이 출력됩니다.

i의 값: 11

do..Until 문은 조건이 False인 동안 실행됩니다. (즉) 루프는 조건이 참일 때까지 반복되어야 합니다.

루프 제어 레코드

루프 제어문은 정상 시퀀스에서 실행을 변경합니다. 실행 범위를 벗어나면 다른 모든 루프 문이 실행되지 않습니다.

제어문 및 설명

운영자 종료

exit for는 특정 기준에 따라 For 루프를 종료하려는 경우에 사용됩니다. Exit For가 실행되면 제어는 For 루프 바로 뒤의 다음 명령문으로 넘어갑니다.

통사론

다음은 VBA에서 Exit For 문 구문입니다.

흐름도

다음 예제에서는 Exit For 를 사용합니다. 카운트가 4에 도달하면 For 루프가 종료되고 제어가 For 루프 바로 뒤의 다음 명령문으로 전달됩니다.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 "i는 카운터 변수이며 2씩 증가합니다. MsgBox ("The value is i is: " & i) If i = 4 Then i = i * 10 "이것은 i=4인 경우에만 실행됩니다 MsgBox ("값은 i입니다: " & i) Exit For "i=4일 때 종료 End If Next End Sub

위의 코드가 실행되면 메시지 상자에 다음과 같이 출력됩니다.

값은 i입니다: 0
값은 i입니다: 2
값은 i입니다: 4
값은 i입니다: 40

For 루프 문을 종료하고 루프 바로 뒤의 문으로 실행을 전송합니다.

나가기

Exit Do 문은 특정 기준에 따라 Do 루프를 종료하려는 경우에 사용됩니다. Do Do ... While 및 Do ... Before 루프 모두에서 사용할 수 있습니다.

Exit Do가 실행되면 제어는 Do 루프 바로 뒤의 다음 명령문으로 전달됩니다.

통사론

다음은 VBA에서 Exit Do 문의 구문입니다.

다음 예제에서는 Exit Do 를 사용합니다. 카운터가 10에 도달하면 Do 출력 라인이 종료되고 제어가 For 루프 바로 뒤의 다음 명령문으로 전달됩니다.

Private Sub Constant_demo_Click() i = 0 Do While i<= 100 If i >10 Then Exit Do " Loop Exits if i>10 End If MsgBox ("i의 값: " & i) i = i + 2 Loop End Sub

위의 코드가 실행되면 메시지 상자에 다음과 같이 출력됩니다.

i의 값: 0
i의 값: 2
i의 값: 4
i의 값: 6
i의 값: 8
i의 값: 10

Do While 문을 종료하고 루프 직후 문으로 실행을 전송합니다.