Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
книги / 277.pdf
Скачиваний:
12
Добавлен:
07.06.2023
Размер:
1.06 Mб
Скачать

Говоря об операторах цикла, нельзя не сказать и о возможностях, позволяющих изменить привычный ход выполнения операторов цикла. Один из таких операторов, а именно оператор break, уже использовался в операторе выбора. Если оператор break встречается в теле цикла, то управление передается следующему за оператором цикла оператору, т. е. приводит к досрочному выходу из цикла:

for (i=1; i<=n; i++) if(a[i]) k++;

else break;

Выход из цикла произойдет, когда i станет больше n или когда встретится нулевое a[i].

Другим оператором, изменяющим обычный ход выполнения оператора цикла, является оператор continue. Этот оператор приводит к пропусканию той части тела цикла, которая расположена после оператора continue, и перехода на новую итерацию цикла:

for (i=1; i<=1000; i++) {if(i%13) continue ; printf("i=%d\n»,i);

}

В данном примере будут выведены числа, кратные 13 и меньшие

1000.

Обработка массивов

В программировании используется следующее определение массива: массив - это совокупность однотипных элементов данных.

Массив - не простой тип данных, а структурированный, т. е. имеет один или более компонент и построен на основе других типов. Компоненты массива называют элементами. Все элементы массива имеют общее имя. Обращение к конкретному элементу производится с помощью индекса. Важной отличительной чертой массива является однотипность элементов массива. В качестве типа используется любой простой или структурированный тип (т. е. возможна вложенность типов). В языке С++ количество элементов массиве фиксировано и определяется во время трансляции. Это является недостатком языка, поскольку не во всех задачах можно заранее определить количество элементов в массиве (возможность использования динамических массивов рассматривается в разд. 4.4).

82

Обработка одномерных массивов

Одномерные массивы имеют аналогию с таким понятием в математике, как вектор. Описание переменной типа массив задается следующим образом:

<тип> <идентификатор массива>[<t>]; Здесь <тип> - тип элементов массива (любой тип языка С++); <имя массива> - правильный идентификатор;

<t> - количество элементов массива.

Ниже приведены примеры описания одномерных массивов: float b[5];

int months[12]; char mas[100];

В языке программирования С++ индексы элементов массива изменяются от 0. Индекс последнего элемента на единицу меньше количества элементов в массиве. Размерность массива - величина произвольная, но суммарная длина внутреннего представления любого массива не может быть больше 65520 байт. Так как память выделяется под массив во время компиляции программы, границы изменения индексов должны быть константами, или константными выражениями.

При определении массивов возможна их инициализация, т.е. присвоение начальных значений их элементам. По существу (точнее по результату), инициализация – это объединение определения объекта с одновременным присваиванием ему конкретного значения. Использование инициализации позволяет изменить формат определения массива. Например, можно явно не указывать количество элементов одномерного массива, а только перечислить их начальные значения в списке инициализации. Если в определении массива явно казан его размер, то количество начальных значений не может быть больше количества элементов в массиве. Если количество начальных значений меньше, чем объявленная длина массива, то начальные значения получат только первые элементы массива (с меньшими значениями индекса):

float b[5]={1.0, 2.5, 3.0, 3.4, 1.5};

int months[ ]={1,2,3,4,5,6,7,8,9,10,11,12}; char mas[100]={'a', 'b', 'c'};

Обращение к элементам массива осуществляется по их индексам: b[3]=1.13;

months[0]=1;

mas[99]='a';

При обработке массивов возникают такие задачи, как ввод элементов массива, нахождение суммы, произведения, среднего и т. д., поиск некоторого элемента в массиве, сортировка элементов массива, вывод элементов массива.

83

На рис.22 представлена схема алгоритма формирования элементов массива с помощью датчика случайных чисел, вывод элементов массива на экран, вычисление суммы всех элементов. Программа приведена в примере pr17.

Рис. 29

//Пример pr17 #include <stdio.h> #include <conio.h> #include <stdlib.h> void main ()

{ const int N1=100; int a[N1], i, n, sum;

printf ( «\nВведите число элементов массива:"); scanf ( «%d», &n);

sum = 0;

for (i = 0; i<n; i++)

84

{ a[i] = rand(); sum = sum+a[i]; }

printf ( «Сформированный массив:\n» ); for (i = 0; i<n; i++) printf ( «%5d «, a[i] ); printf ( «\n s = %d», sum );

getch ();

}

В приведенном примере в качестве исходных данных вводится размер массива. Константа N1 делает программу более универсальной, позволяя работать с целочисленными массивами размерностью от 1 до 100. Если будет введено число, меньшее 1 и большее 100, то возникнет ошибка. В языке С++ принято для идентификаторов констант использовать заглавные буквы. Для формирования массива (во всех случаях, когда требуется перебор всех элементов массива) лучше всего подходит оператор цикла со счетчиком. В каждой итерации оператора цикла очередному элементу массива (индекс элемента является переменной цикла) присваивается псевдослучайное число с помощью функции rand(). Функция rand() определена в заголовочном файле stdlib.h и служит для генерирования псевдослучайного числа от 0 до 215-1 (32768). Результатом работы программы является сформированный массив и сумма элементов этого массива.

На рис. 23 приведена графическая схема алгоритма определения максимального элемента массива и произведения положительных элементов, а также замены максимального элемента массива произведением положительных элементов массива (программа pr18).

85

Рис. 30

//Пример pr18 #include <stdio.h> #include <conio.h> #include <stdlib.h> void main()

{

const int N1 = 100; //Максимальный размер массива int a[N1], // Mассив

i, //Индекс элемента массива

n, p, //Количество элементов в массиве и их

 

//произведение

imax;

//Индекс максимального элемента

printf ("\nВведите число элементов массива:"); scanf ("%d»,&n);

printf ("Введите элементы массива");

86

for ( i = 0; i<n ; i++ ) scanf ( «%d», &a[i] ); p = 1;

imax = 0; //Пpедполагаем, что пеpвый элемент максимальный} for ( i = 0; i<n; i++ )

{//Если элемент положительный, то р умножаем на него if ( a[i]>0 ) p = p*a[i];

//Если текущий элемент массива больше //максимального, то запоминаем его индекс if ( a[imax] < a[i] ) imax = i;

}

printf ( «\nМаксимальный элемент массива=%d», a[imax] ); a[imax] = p; // Замена максимального элемента

printf ( «\n p = %d», p );

printf ( «\n Обpаботанный массив:» ); for ( i = 0; i<n; i++ )

printf ( «%5d», a[i] ); getch ();

}

В приведенном примере массив вводится с клавиатуры. Для ввода массива используется оператор цикла со счетчиком. За начальное значение для индекса максимального элемента берем 0, т.е. предполагаем, что первый элемент максимальный. Далее в цикле перебираются все элементы массива и сравниваются с нулем для того, чтобы умножать или не умножать на элемент. В этом же цикле каждый элемент сравнивается с a[imax] для выяснения, не встретился ли элемент, больший прежнего максимального, и если встретился, то запоминается его индекс, чтобы в следующий раз сравнивать текущий элемент с большим из перебранных. В условном операторе if a[i]>a[imax] ветвь else отсутствует; это означает, что в случае невыполнения условия imax остается без изменения, что и обеспечивает наличие в области памяти с идентификатором imax значения индекса максимального из перебранных элементов.

На рис. 24 приведена графическая схема алгоритма сортировки элементов одномерного массива «методом пузырька» в порядке неубывания. Суть этой сортировки состоит в том, что сравниваются два соседних элемента; если они расположены в порядке убывания, то меняются местами, что фиксируется в переменной fl. После сравнения всех элементов массива принимается решение об очередном прохождении по массиву по состоянию fl. Решение этой задачи реализуется в программе pr19.

87

 

 

 

Рис. 31

//Пример 19

 

 

#include <stdio.h>

 

 

#include <conio.h>

 

#include <stdlib.h>

 

void main()

 

 

{ const int n1 = 100;

//Максимальный размер массива

int i,

//Индекс элемента массива

n,

//Количество элементов в массиве

fl;

//Флаг перестановок

float a[n1], d;

//Дополнительная переменная для

// перестановки местами двух элементов массива printf("\n Введите число элементов массива: «); scanf("%d»,&n);

printf("\n Введите элементы массива: \n"); for (i = 0; i<n; i++)

88

Соседние файлы в папке книги