Последний из описанных вариантов организации циклов часто применяют при обработке массивов.
Массив- совокупность переменных одинакового типа, имеющих одно имя и различные индексы, задающиеся последовательно. Массивы могут быть одномерными (вектора), двухмерными (матрицы) и многомерными.
Среди типовых задач, связанных с обработкой массивов, часто встречаются следующие: нахождение максимального (минимального) элемента массива и упорядочивание элементов в массиве по возрастанию (убыванию). Ниже рассмотрим возможные решения этих задач.
1) Пусть требуется найти максимальный элемент в одномерном массиве Х, состоящем из 12 элементов.
Возможное решение:
#include <stdio.h>
main()
{
float x[12], max;
/* Определяем массив, состоящий из 12 вещественных (float) элементов и вещественную переменную max, которой присвоим значение наибольшего элемента массива Х. */
int i; // описываем переменную целого типа - i, понадобится для цикла
for(i=0; i<=11; i++)
// цикл по i от 0 до 11 : ввод массива.
{
printf(" X(%d)=", i); /* пишем подсказку пользователю: какой элемент Х надо ввести:
элементы массива нумеруются последовательно от Х[0] до X[11] */
scanf("%f", &x[i]); // считываем введенное значение i-го элемента массива X, т.е. x[i]
}
/* cобственно вот оно решение - следующие три строчки */
max=x[0];
//пусть x[0] -максимальный элемент массива; присвоим max=X[0]
for(i=0; i<=11; i++) // цикл по i от 0 до 11 : перебор элементов массива.
if(x[i]>max) max=x[i]; // проверка: если текущий элемент X[i] больше max, то max=X[i]
printf(" max X=%2.2f", max);
// после выполнения цикла пишем на экран ответ
}
2) Пусть требуется найти минимальный элемент и его индексы в матрице (двухмерном массиве) Х из трех строк и четырех столбцов.
Возможное решение:
#include <stdio.h>
main()
{
float x[3][4], min; // определяем двухмерный массив Х 3 на 4 элемента
int i,j,ii,jj;
// i,j -для организации цикла, ii,jj -индексы min элемента
for(i=0; i<=2; i++) // обслуживание ввода массива Х пользователем
for(j=0; j<=3; j++)
{
printf(" X(%d,%d)=", i,j);
scanf("%f", &x[i][j]);
}
/* а вот и решение - следующие 8 строк */
min=x[0][0]; ii=0,jj=0; // пусть min элемент стоит в строке 0, столбце 0
for(i=0; i<=2; i++)
// цикл по строкам
for(j=0; j<=3; j++)
// ... и по столбцам
if(x[i][j]<min)
// и если текущий элемент массива x[i][j] меньше Y, то
{
// открываем блок операторов, в которых
min=x[i][j];
// корректируем текущие значения min
ii=i; jj=j;
// и индексов ii и jj
}
// конец условного блока if
printf(" min X(%d,%d)=%2.2f", ii,jj, min); //выводим ответ на экран
}
3) Пусть требуется упорядочить по возрастанию одномерный массив Х, состоящий из 12 элементов.
Возможное решение:
#include <stdio.h>
main()
{
float x[12], y;
// y- "буферная" переменная
int i, j;
for(i=0; i<=11; i++) // обслуживание ввода массива Х пользователем
{
printf(" X(%d)=", i);
scanf("%f", &x[i]);
}
/* далее - собственно решение, правда, не рациональное, но простое: */
for(j=0; j<=10; j++) // делаем 11 переборок всего массива
for(i=0; i<=10; i++) // а в каждой переборке - сравниваем
{
if(x[i] > x[i+1])
// 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]-му элементу
}
// конец блока if
}
/* пишем результат на экран: */
printf("************* result: ************\n");
for(i=0; i<=11; i++)
printf("\n X(%d)=%1.2f", i, x[i]);
}
Что нерационального в приведенной выше программе? Конечно же принудительная переборка всего массива 11 раз.
Сделаем так, чтобы переборка повторялась только в том случае, если на предыдущем шаге были сделаны перестановки. Возможное решение:
#include <stdio.h>
main()
{
float x[12], y;
int i, j;
for(i=0; i<=11; i++)
{
printf(" X(%d)=", i);
scanf("%f", &x[i]);
}
do{
// будем повторять переборку элементов...
j=0;
for(i=0; i<=10; i++)
if(x[i] > x[i+1])
{
j=1;
// (j=1 - флаг, указывает на то, что перестановки были сделаны)
y=x[i];
x[i]=x[i+1];
x[i+1]=y;
}
} while (j==1); /* ...повторять, если на предыдущем шаге были сделаны перестановки */
printf("************* result: ************\n");
for(i=0; i<=11; i++)
printf("\n X(%d)=%1.2f", i, x[i]);
}
то же на Fortran то же на Basic то же на Pascal
аналог на JavaScript