For 루프 문. 일반적인 작업


다음 문제를 해결하는 프로그램을 작성해 봅시다.
100에서 500 사이의 모든 정수의 합을 구합니다. 

이 문제를 풀면 합계를 찾기가 어려워집니다. 예를 들어 변수 s에 더한 결과를 간단히 쓰면 다음과 같습니다. <사업부 스타일="텍스트 정렬:센터">
s=100+101+102+103+...+500

컴퓨터가 산술식에서 줄임표를 사용하는 방법을 이해하지 못하고 100에서 500까지의 모든 숫자를 이 합계에 써야 하기 때문에 녹음 자체에 많은 시간이 걸립니다. 그리고 그러한 프로그램의 가치는 미미할 것입니다. 특히 숫자를 변경하고 다른 범위를 사용하려는 경우.

어떻게 해야 합니까?

위의 항목에 주의를 기울이면 "+"를 계속 사용합니다.
점차적으로 변수 s에 숫자를 추가할 수 있습니다. 예를 들어, 이 표기법을 사용하여
s := s + i;
우리가 여기서 한 일:
1) 오른쪽에 s+i, 표현을 넣습니다. 즉, 현재 메모리에 있는 변수 s의 값을 가져와 값을 추가합니다. 변수 i< 그것에 /strong>
2) 왼쪽에 변수의 이름을 설정합니다 s, 즉 오른쪽 계산의 전체 결과가 이 변수에 저장되므로 변수 값을 변경합니다. s. 

범위에서 숫자를 어디에서 얻을 수 있나요?

우리 범위에 속하는 100에서 500까지의 숫자는 i 변수에 하나씩 들어가야 합니다. 그리고 이것은 잘 알려진 for
루프를 사용하여 수행할 수 있습니다. 예를 들면 이런 식으로 <예비> 에스 := 0; // 처음에는 변수 s를 재설정해야 첫 번째 단계에서 숫자 100이 메모리에 있는 것이 아니라 0에 추가됩니다! for i := 100 to 500 do //변수 i가 1씩 증가하여 값을 100에서 500으로 변경하는 루프의 헤더 s := s + i; //변화하는 변수 i의 값을 변수 s에 점진적으로 추가하는 루프의 본문 // 결과는 변수 s에 다시 저장됩니다. 이 솔루션은 행동으로 합계를 계산하는 것과 매우 유사합니다
 s = 0 + 100 = 100
 s = 100 + 101 = 201
 s = 201 + 102  = 303
등.

주어진 숫자 중 최대 수

조건 연산자를 공부할 때 입력된 여러 숫자에서 최대 숫자를 찾는 주제를 다루었습니다. 문제 "최대 4개의 숫자"에서 다음 알고리즘을 사용했습니다.
1. 변수 M에 값을 4개의 변수 중 첫 번째 변수에 할당합니다.
2. 두 번째 변수의 값이 변수 M의 값보다 크면 변수 의 값을 두 번째 변수의 값으로 대체합니다.
3. 세 번째 변수의 값이 변수 M의 값보다 크면 변수 M의 값을 세 번째 변수의 값으로 대체합니다.< br /> 4. 네 번째 변수의 값이 M 변수의 값보다 크면 변수의 값을 네 번째 변수의 값으로 바꿉니다.

각  다음과 같이 변수 M과 비교한 숫자(X로 표시):
 
의사 코드
<예비> 입력 X (M < X)이면   M = X
이 코드에서 가장 중요한 것은 변수 M이 가질 초기 값을 결정하는 것입니다.
일반적으로 최대값 또는 최소값을 찾는 문제를 풀 때 변수 M의 초기 값은 첫 번째 숫자와 동일하게 할당됩니다.
따라서 위의 코드는 숫자의 개수보다 1배 적은 횟수로 실행되어야 합니다(변수 M의 초기값으로 첫 번째 숫자를 입력하여 저장해야 하므로).
키보드에서 설정한 숫자의 수가 있는 경우(예: 변수 n) 다음을 사용하여 순환(2에서 n까지)을 구성할 수 있습니다. 숫자 변수를 저장하는 동일한 숫자.

프로그램을 직접 작성해 보십시오.

모두가 아닌 최대

입력한 모든 숫자 중에서 최대값(최소값)을 찾아야 하는 경우가 아니라 특정 조건을 만족하는 숫자 중에서 최대값(최소값)을 찾아야 하는 경우 최대값의 초기값으로 취하는 첫 번째 숫자를 고려해야 합니다. (최소)가 항상 우리의 요구 사항을 충족하지는 않습니다.

예를 들어 최대 음수를 찾는 경우 데이터 세트는 다음과 같습니다. \(\{5, -2, 4, 2, -1, -3\}\ ) 우리는 최대 값의 초기 값에서 숫자 5를 얻을 것이며 양수이고 음수보다 큽니다. 따라서 조건 X > M는 항상 거짓입니다.

따라서 이전 문제의 알고리즘에 음수에 대한 검사를 한 번만 추가하는 것으로는 충분하지 않으며 첫 번째 숫자가 요구 조건을 충족하지 않을 수 있다는 사실(이 경우 음수가 될 수 있음)도 고려해야 합니다. ).

루프 내부에 다음 조건을 추가하여 이 문제를 해결할 수 있습니다.

의사 코드
<예비> X가 음수이면 M >= 0 또는 M < 엑스, 그럼 엠=엑스
지정된 코드에서  M >= 0 조건을 사용하면 변수는 처음에 나머지보다 분명히 큰 값을 포함합니다(예제에서 값은 5와 같음).

또한 숫자의 범위가 알려진 경우 지정된 범위의 최소(최대) 숫자를 최대(최소)의 초기 값으로 사용할 수 있습니다.

작업

N개의 숫자가 주어집니다. 시퀀스에서 두 번째로 큰 요소를 찾습니다.

이 문제는 두 가지 해석을 허용합니다.
예를 들어 \(10\ 15\ 20\ 35\ 14\ 35\ 10\)과 같은 일련의 숫자가 주어지면 답은 무엇이어야 합니까? ?
"두 번째로 큰 요소" 아래 또는 단순히 "두 번째 최대값"은 다음과 같이 이해될 수 있습니다.
1) 모든 값을 감소하지 않는 순서로 정렬(정렬)하면 두 번째 위치에 있는 값(각 다음 값은 이전 값보다 크거나 같음). 그런 다음 고려되는 숫자 집합에 대한 대답은 값 35가 됩니다.
2) 최대값보다 큰 요소의 값. 그렇다면 정답은 20번입니다.
숫자 집합에 최대 요소가 하나만 있는 경우(다른 모든 요소는 더 적음) 두 가지 해석이 동일하며 두 경우 모두 대답이 동일하고 그렇지 않으면 대답이 달라집니다.

첫 번째 경우를 고려하십시오(유사 코드).
답을 찾기 위해 두 가지 변수를 사용합니다.
1) maximum1 - 최대값(첫 번째 최대값);
2) maximum2 - 두 번째 최대값(답변).

값 변경 범위가 알려진 경우 초기 값으로 범위의 하한보다 분명히 작은 숫자를 사용합니다(예: -1000 범위). 에서 1000 - 숫자 가져오기 -1001)
값의 범위를 알 수 없는 경우 변수 max1max2의 초기 값에 처음 두 입력 숫자를 쓴 다음 이들을 비교할 수 있습니다. 두 가지 변수. <예비> 입력 N // 숫자의 수 입력 a, b 최대1 = 최대2 = b 만약 b > 그럼     최대1 = b     최대2 =
다음으로 다른 모든 요소를 ​​고려합니다(처음 2개는 이미 보았으므로 3번째부터 시작하겠습니다) <예비> i에 대한 nc는 3에서 n까지 입력 > maximum1 // maximum1보다 큰 값이 있음 저것 max2 = max1 //이전의 첫 번째 고가가 두 번째가 됨 max1 = a //새 요소가 첫 번째 최대값이 됩니다. 그렇지 않으면 //max1 이하의 다음 요소 // maximum2 값과 비교해야 함 > 최대 2 저것 max2 = a // 새 값으로 취함 max2 // 이 경우 max1은 변경되지 않습니다. 모두 모두 kts
이 알고리즘을 직접 구현해 보십시오.