Последний из описанных вариантов организации циклов часто применяют при обработке массивов.
Массив- совокупность переменных одинакового типа, имеющих одно имя и различные индексы, задающиеся последовательно. Массивы могут быть одномерными (вектора), двухмерными (матрицы) и многомерными.
Среди типовых задач, связанных с обработкой массивов, часто встречаются следующие: нахождение максимального (минимального) элемента массива и упорядочивание элементов в массиве по возрастанию (убыванию). Ниже рассмотрим возможные решения этих задач.
1)Пусть требуется найти максимальный элемент в одномерном массиве Х, состоящем из 12 элементов.
Возможное решение:
dimension x(12)
!так определяем массив Х из 12 элементов
C Следующие 4 строки - обслуживание ввода массива Х пользователем:
do i=1,12
!цикл по i от 1 до 12
write(*,*)' x(',i,')='
!пишем подсказку: "Х(...)="
read(*,*) x(i)
!считываем значение i-го элемента массива X
end do
!конец цикла
С собственно вот оно решение:
y=x(1)
!пусть Y=х(1) -максимальный элемент массива
do i=1,12
!задаем цикл по i от 1 до 12
if( x(i).gt.y) y=x(i)
!проверка: если текущий элемент X(i) больше Y, то y=x(i)
end do
!конец цикла
write(*,*)' maximal x=',y !после выполнения цикла пишем на экран ответ
end
!конец программы
2)Пусть требуется найти минимальный элемент и его индексы в матрице (двухмерном массиве) Х из трех строк и четырех столбцов.
Возможное решение:
dimension x(3,4) !определяется матрица Х 3 на 4 элемента
C Следующие 7 строк - обслуживание ввода массива Х пользователем:
write(*,*)' input values of x:'
do i=1,3
do j=1,4
write(*,*)' x(',i,',',j,')='
read(*,*) x(i,j)
end do
end do
C а вот и решение - следующие 12 строк!
y=x(1,1)
!пусть Y=min элемент стоит в первой строке, первом столбце
ii=1
jj=1
do i=1,3
!цикл по строкам
do j=1,4
!... и по столбцам
if( x(i,j).lt.y) then !и если текущий элемент массива x(i,j) меньше Y, то
y=x(i,j)
!корректируем текущие значения Y
ii=i
!и индексов ii и jj
jj=j
end if
!конец условного блока if
end do
!конец цикла по столбцам
end do
!конец цикла по строкам
write(*,*)' minimal x(',ii,',',jj,')=',y !выводим ответ на экран
end
3)Пусть требуется упорядочить по возрастанию одномерный массив Х, состоящий из 12 элементов.
Возможное решение:
dimension x(12)
C обслуживание ввода массива Х пользователем:
write(*,*)' input values of X:'
do i=1,12
write(*,*)' x(',i,')='
read(*,*) x(i)
end do
C далее - собственно решение, правда, не рациональное, но простое:
do j=1, 11
!делаем 11 переборок всего массива
do i=1, 11
!а в каждой переборке - сравниваем
if (x(i).gt.x(i+1)) then !x(i) с последующим x(i+1), и если x(i)>x(i+1),
y=x(i)
!копируем значение x(i) в буферную переменную Y
x(i)=x(i+1)
!присваиваем x(i)=x(i+1)
x(i+1)=y
!и значение x(i) из буферной Y присваиваем x(i+1)-му элементу
end if !
конец блока if
end do
enddo
C пишем результат на экран:
write(*,*)'***********result:*********'
do i=1, 12
write(*,*)' x(',i,')=',x(i)
end do
end
Что нерационального в приведенной выше программе? Конечно же принудительная переборка всего массива 11 раз.
Сделаем так, чтобы переборка повторялась только в том случае, если на предыдущем шаге были сделаны перестановки. Возможное решение:
dimension x(12)
write(*,*)' input values of X:'
do i=1,12
write(*,*)' x(',i,')='
read(*,*) x(i)
end do
j=1
do while(j.eq.1) !будем повторять переборку элементов до тех пор...
j=0
do i=1, 11
if (x(i).gt.x(i+1)) then
j=1
! j=1 - флаг, указывает на то, что перестановки были сделаны
y=x(i)
x(i)=x(i+1)
x(i+1)=y
end if
end do
enddo
!...до тех пор, пока на предыдущем шаге были сделаны перестановки
C пишем результат на экран:
write(*,*)'***********result:*********'
do i=1, 12
write(*,*)' x(',i,')=',x(i)
end do
end
то же на С то же на Basic то же на Pascal
аналог на JavaScript