Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
visual с++.doc
Скачиваний:
28
Добавлен:
18.08.2019
Размер:
10.99 Mб
Скачать

4.4. Результаты работы программы:

Лабораторная работа №4. Одномерные массивы в языке C++

Цель работы и содержание: закрепление знаний об одномерных массивах, составление программ с одномерными массивами.

Ход работы

Основные сведения о массивах в языке C++. В случае использования простых переменных каждой области памяти для хранения одной вели­чины соответствует свое имя. Если требуется работать с группой величин одного типа, их располагают в памяти последовательно и дают им общее имя, а различают по порядковому номеру. Такая последовательность однотипных величин называ­ется массивом. Массивы, как и любые другие объекты, можно размещать либо с помощью опера­торов описания в сегментах данных или стека, либо в динамической области памя­ти с помощью операций выделения памяти.

При описании массива после имени в квадратных скобках задается количество его элементов (размерность), например int a[10]. Массив располагается в зависимо­сти от места его описания либо в сегменте данных, либо в сегменте стека, и все инструкции по выделению памяти формирует компилятор до выполнения про­граммы. Вследствие этого размерность массива может быть задана только констан­той или константным выражением. Если при описании массива не указана раз­мерность, должен присутствовать инициализатор, в этом случае компилятор вы­делит намять по количеству инициализирующих значений. В дальнейшем мы увидим, что размерность может быть опущена также в списке формальных пара­метров.

Элементы массива нумеруются с нуля. При описании массива используются те же модификаторы (класс памяти, const и инициализатор), что и для простых пе­ременных. При описании массив можно инициализировать, то есть присвоить его элементам начальные значения, например:

int а[10] = {1, 1, 2, 2, 5, 100};

Для данного массива элементы имеют номера от 0 до 9. Номер элемента указыва­ется после его имени в квадратных скобках, например, а[0], а[3]. Инициализирующие значения для массивов записываются в фигур­ных скобках. Значения элементам присваиваются по порядку. Если элементов в массиве больше, чем инициализаторов, элементы, для которых значения не ука­заны, обнуляются:

int b[5] = {3. 2, 1}; //b[0]=3,b[l]=2,b[2]=l,b[3]=0,b[4]=0

Для доступа к элементу массива после его имени указывается номер элемента (индекс) в квадратных скобках. В следующем примере подсчитывается сумма элементов массива.

#include <iostream.h>

int main()

{

const int n = 10; int i, sum;

int marks[n] = {3. 4, 5, 4, 4};

setlocale( LC_ALL, "Russian" );

for (i =0. sum = 0; i<n; i++) sum += marks[i];

cout << "Сумма элементов: " << sum;

return 0;

}

Размерность массивов предпочтительнее задавать с помощью именованных кон­стант, как это сделано в примере, поскольку при таком подходе для ее измене­ния достаточно скорректировать значение константы всего лишь в одном месте программы. Обратите внимание, что последний элемент массива имеет номер, на единицу меньший заданной при его описании размерности.

При обращении к элементам массива автоматический контроль выхода индекса за грани­цу массива не производится, что может привести к ошибкам.

Идентификатор массива является константным указателем на его нулевой эле­мент. Например, для массива из предыдущего листинга имя mark - это то же самое, что & mark[0], а к i-му элементу массива можно обратиться, используя выражение *(mark+i). Можно описать указатель, присвоить ему адрес начала массива и работать с массивом через указатель. Следующий фрагмент программы копирует все эле­менты массива а в массив b:

int а[100], b[100];

int *ра = а; // или int *p = &а[0];

int *pb = b;

for(int i = 0; i<100; 1++)

*pb++ = *pa++; // или pb[i] = pa[i];

Пример 4.1. Написать программу, которая для целочисленного массива из 100 элементов опре­деляет, сколько положительных элементов располагается между его максималь­ным и минимальным элементами.

Запишем алгоритм в самом общем виде.

  1. Определить, где в массиве расположены его максимальный и минимальный эле­менты, то есть найти их индексы.

  2. Просмотреть все элементы, расположенные между ними. Если элемент масси­ва больше нуля, увеличить счетчик элементов на единицу.

Ясно, что порядок расположения элементов в массиве заранее не известен, и сна­чала может следовать как максимальный, так и минимальный элемент, кроме того, они могут и совпадать. Поэтому прежде чем просматривать массив в поисках ко­личества положительных элементов, требуется определить, какой из этих индек­сов больше. Запишем уточненный алгоритм:

1. Определить, где в массиве расположены его максимальный и минимальный элементы:

  • задать начальные значения для индексов максимального и минимального элементов (например, равные нулю, но можно использовать любые другие значения индекса, не выходящие за границу массива).

  • просмотреть массив, поочередно сравнивая каждый его элемент с ранее най­ денными максимумом и минимумом. Если очередной элемент больше ранее найденного максимума, принять этот элемент за новый максимум (т.е. за­помнить его индекс). Если очередной элемент меньше ранее найденного минимума, принять этот элемент за новый минимум.

2. Определить границы просмотра массива для поиска положительных элемен­тов, находящихся между его максимальным и минимальным элементами:

  • если максимум расположен в массиве раньше, чем минимум, принять левую границу просмотра равной индексу максимума, иначе - индексу минимума.

  • если максимум расположен в массиве раньше, чем минимум, принять правую границу просмотра равной индексу минимума, иначе - индексу максимума.

  1. Обнулить счетчик положительных элементов. Просмотреть массив в указан­ном диапазоне. Если очередной элемент больше нуля, увеличить счетчик на единицу.

Для экономии времени при отладке значения элементов массива задаются путем инициализации.

Листинг 4.1

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

const int n = 10;

int a[n] = {1, 3, -5, 1, -2, 1, -1, 3, 8, 4};

int i, imax, imin, count;

setlocale( LC_ALL, "Russian" );

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

{

if(a[i] > a[imax]) imax = i;

if(a[i] < a[imin]) imin = i;

}

cout << “\n\t max = “ << a[imax] << “\t min = “

<< a[imin] << endl;

int ibeg = (imax < imin) ? imax : imin;

int iend = (imax < imin) ? imin : imax;

cout << “\n\t ibeg = “ << ibeg << “\t iend = “

<< iend << endl;

for(count = 0, i = ibeg + 1; i < iend; i++)

if(a[i] > 0) count++;

cout <<“Количество положительных “<< count <<endl;

getch();

return 0;

}

В программе использована управляющая последовательность \t, которая задает отступ при выводе на следующую позицию табуляции. Массив просматривается, начиная с элемента, следующего за максимальным (мини­мальным), до элемента, предшествующего минимальному (максимальному). Ин­дексы границ просмотра хранятся в переменных ibeg и iend. В приведенной выше программе для определения их значений используется тернарная условная опера­ция. Можно поступить и по-другому: просматривать массив всегда от максимума к минимуму, а индекс при просмотре увеличивать или уменьшать в зависимости от их взаимного расположения.

В приведенной ниже программе направление просмотра, то есть приращение ин­декса, хранится в переменной d. Если массив просматривается «слева направо», она равна 1, иначе - -1. Обратите внимание и на изменившееся условие продолже­ния этого цикла.

Листинг 4.2

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

const int n = 10;

int a[n] = {1, 3, -5, 1, -2, 1, -1, 3, 8, 4};

int i, imax, imin, count;

setlocale( LC_ALL, "Russian" );

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

{

if(a[i] > a[imax]) imax = i;

if(a[i] < a[imin]) imin = i;

}

cout << “\n\t max = “ << a[imax] << “\t min = “

<< a[imin] << endl;

int d = 0;

if(imax < imin) d = 1;

else if(imax > imin) d = -1;

for(count = 0, i = imax + d; i != imin; i += d)

if(a[i] > 0) count++;

cout << “Количество положительных “ << count

<< endl;

getch();

return 0;

}

Ввод массива в этом варианте программы осуществляется с клавиатуры. Напоми­наем, что в этом случае желательно для проверки вывести введенные значения на печать.

Тестовых примеров для этой задачи должно быть по крайней мере три для случа­ев, когда:

  1. a[imin] расположен левее a[imax];

  2. a[imin] расположен правее a[imax];

  3. a[imin] и a[imax] совпадают.

Последняя ситуация имеет место, когда в массиве все элементы имеют одно и то же значение. Кстати, во втором варианте программы третий случай корректно об­рабатывается благодаря значению d = 0 для этой ситуации. Желательно также проверить, как работает программа, если a[imin] и a[imax] расположены рядом, а также в начале и в конце массива (граничные случаи). Элементы массива нужно задавать как положительные, так и отрицательные.

Разница между приведенными способами решения несущественна, но первый ва­риант более «прозрачен», поэтому он, на наш взгляд, предпочтительнее.

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

Часто бывает, что точное количество элементов в исходном массиве не задано, но известно, что оно не может превышать некое конкретное значение. В этом случае память под массив выделяется «по максимуму», а затем заполняется только часть этой памяти. Память можно выделить либо с помощью оператора описания в сте­ке или сегменте данных, либо в динамической области. Фактическое количество введенных элементов запоминается в переменной, которая затем участвует в орга­низации циклов по массиву, задавая его верхнюю границу. Этот подход является весьма распространенным, поэтому мы приводим ниже небольшую, но полезную программу, в которой выполняется только считывание элементов массива с кла­виатуры и их вывод на экран:

const int n = 1000;

int a[n];

int i, kol_a;

setlocale( LC_ALL, "Russian" );

cout << “Введите количество элементов: “;

cin >> kol_a;

if(kol_a > n)

{

cout << “Превышение размера массива“ << endl;

return 1;

}

for(int i = 0; i < kol_a; i++) cin >> a[i];

for(int i = 0; i < kol_a; i++) cout << a[i] << “ “;

cout << endl;

Несмотря на то, что значение константы n определяется «с запасом», надо обяза­тельно проверять, не запрашивается ли большее количество элементов, чем воз­можно. Привычка к проверке подобных, казалось бы, маловероятных случаев по­зволит вам создавать более надежные программы, а нет ничего более важного для программы, чем надежность.

Пример 4.2. Выполнить сортировку массива по возрастанию, состоящего из n элементов методом «пузырька».

На языке C++ пузырьковая сортировка массива может быть запрограммирована следующим образом:

Листинг 4.3

#include “stdafx.h”

#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

const int N = 1000;

int a[N];

int n, i, j, temp;

setlocale( LC_ALL, "Russian" );

cout << “Введите количество элементов: “;

cin >> n;

if(n <= 0 || n > N)

{

cout << “Неверный размер массива“ << endl;

return 1;

}

for(i = 0; i < n; i++) cin >> a[i];

for(i = 0; i < n; i++) cout << a[i];

cout << endl;

// Сортировка

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

for(j = i + 1; j < n; j++)

if(a[i] > a[j])

{

temp = a[i]; a[i] = a[j];

a[j] = temp;

}

cout << “После сортировки: “;

for(i = 0; i < n; i++) cout << a[i] << “ “;

cout << endl;

getch();

return 0;

}

Аппаратура и материалы. Для выполнения лабораторной работы необходим персональный компьютер со следующими характеристиками: процессор Intel Pentium-совместимый с тактовой частотой 800 МГц и выше, оперативная память - не менее 64 Мбайт, свободное дисковое пространство - не менее 500 Мбайт, устройство для чтения компакт-дисков, монитор типа Super VGA (число цветов от 256) с диагональю не менее 15. Программное обеспечение - операционная система Windows2000/XP и выше, среда разработки приложений Microsoft Visual Studio.

Указания по технике безопасности. Техника безопасности при выполнении лабораторной работы совпадает с общепринятой для пользователей персональных компьютеров, самостоятельно не производить ремонт персонального компьютера, установку и удаление программного обеспечения; в случае неисправности персонального компьютера сообщить об этом обслуживающему персоналу лаборатории (оператору, администратору); соблюдать правила техники безопасности при работе с электрооборудованием; не касаться электрических розеток металлическими предметами; рабочее место пользователя персонального компьютера должно содержаться в чистоте; не разрешается возле персонального компьютера принимать пищу, напитки.

Методика и порядок выполнения работы. Перед выполнением лабораторной работы каждый студент получает индивидуальное задание. Защита лабораторной работы происходит только после его выполнения (индивидуального задания). При защите лабораторной работы студент отвечает на контрольные вопросы, приведенные в конце, и поясняет выполненное индивидуальное задание. Ход защиты лабораторной работы контролируется преподавателем. Порядок выполнения работы:

  1. Проработать примеры, приведенные в лабораторной работе.

  2. Составить программу с использованием одномерных массивов для решения задачи. Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №1. Вариант:

  1. Ввести массив А из 10 элементов, найти наибольший элемент и переставить его с первым элементом. Преобразованный массив вывести.

  2. Ввести массив А из 10 элементов, найти произведение положительных элементов и вывести его на экран.

  3. Ввести массив А из 10 элементов, найти наименьший элемент и переставить его с последним элементом. Преобразованный массив вывести.

  4. Ввести массив А из 10 элементов, найти сумму отрицательных элементов и вывести ее на экран.

  5. Ввести массив А из 10 элементов, найти сумму элементов, больших 3 и меньших 8 и вывести ее на экран.

  6. Ввести массив А из 10 элементов, найти разность положительных элементов, и вывести ее на экран.

  7. Ввести массив А из 10 элементов, найти произведение отрицательных элементов и вывести его на экран.

  8. В заданном массиве подсчитать число нулевых элементов и вывести на экран их индексы.

  9. Составить программу, выдающую индексы заданного элемента или сообщающую, что такого элемента в массиве нет.

  10. Ввести массив А из 10 элементов, найти произведение положительных элементов кратных 3, их количество и вывести результаты на экран.

  11. Ввести массив А из 10 элементов, найти сумму отрицательных элементов кратных 7, их количество и вывести результаты на экран.

  12. Ввести массив А из 10 элементов, найти сумму элементов, больших 2 и меньших 20 и кратных 8, их количество и вывести результаты на экран.

  13. Ввести массив А из 10 элементов, найти сумму элементов, меньших по модулю 3 и кратных 9, их количество и вывести результаты на экран.

  14. Ввести массив А из 10 элементов, найти разность положительных элементов кратных 11, их количество и вывести результаты на экран.

  15. Ввести массив А из 10 элементов, найти произведение элементов, больших 8 и меньших 18 и кратных 10, их количество и вывести результаты на экран.

  16. Ввести массив А из 10 элементов, найти сумму элементов кратных 2, их количество и вывести результаты на экран.

  17. Ввести массив А из 10 элементов, найти квадраты элементов кратных 4 и их количество. Преобразованный массив вывести.

  18. Ввести массив А из 10 элементов, найти сумму положительных элементов кратных 5, их количество и вывести результаты на экран.

  19. Ввести массив А из 10 элементов. Определить количество элементов, кратных 3 и индексы последнего такого элемента.

  20. В массивах U[7], D[7], V[7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Подсчитать среднее значение дневной температуры за каждый день.

  21. В массивах А[n], G[n], F[n] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить, по какому предмету лучше успеваемость.

  22. В массивах U[7], D[7], V[7] содержатся значения утренней, дневной и вечерней температуры соответственно за каждый день недели. Сформировать массив S[7], в котором будут содержаться значения среднедневной температуры. Определить среднее значение температуры а неделю.

  23. В массивах А[n], G[n], F[n] содержатся оценки учащихся по алгебре, геометрии и физике соответственно. Определить среднюю оценку по алгебре и количество учащихся, не имеющих ни одной «двойки».

  24. Определить средний рост девочек и мальчиков одного класса. В классе учится n учеников. (n > 15).

  25. В ЭВМ по очереди поступают результаты соревнований по плаванию на дистанции 200 м, в которых участвует n спортсменов (n > 10). Выдать на экран дисплея лучший результат.

  26. Из массива целых чисел составить три других, в первый из которых записать числа, кратные 5, во второй - числа, кратные 7, а в третий - остальные числа.

  27. Для заданного массива определить, каких элементов больше: положительных или отрицательных. Вывести на экран их количество.

  28. В заданном одномерном массиве все отрицательные элементы заменить нулями и подсчитать их количество.

3. Составить программу с использованием одномерных массивов для решения задачи на переупорядочивание элементов массива. В качестве алгоритма сортировки использовать сортировку методом «пузырька». Номер варианта определяется по формуле , где - номер студента по списку преподавателя.

Индивидуальное задание №2. Вариант:

1. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. сумму отрицательных элементов массива;

  2. произведение элементов массива, расположенных между максимальным и ми­нимальным элементами.

Упорядочить элементы массива по возрастанию.

2. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. сумму положительных элементов массива;

  2. произведение элементов массива, расположенных между максимальным по мо­дулю и минимальным по модулю элементами.

Упорядочить элементы массива по убыванию.

3. В одномерном массиве, состоящем из n целых элементов, вычислить:

  1. произведение элементов массива с четными номерами;

  1. сумму элементов массива, расположенных между первым и последним нуле­выми элементами.

Преобразовать массив таким образом, чтобы сначала располагались все положи­тельные элементы, а потом - все отрицательные (элементы, равные 0, считать по­ложительными).

4. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. сумму элементов массива с нечетными номерами;

  2. сумму элементов массива, расположенных между первым и последним отрица­тельными элементами.

Сжать массив, удалив из него все элементы, модуль которых не превышает 1. Освободившиеся в конце массива элементы заполнить нулями.

5. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

1) максимальный элемент массива;

2) сумму элементов массива, расположенных до последнего положительного эле­мента.

Сжать массив, удалив из него все элементы, модуль которых находится в интерва­ле [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

6. В одномерном массиве, состоящем из n целых элементов, вычислить:

  1. номер максимального элемента массива;

  2. произведение элементов массива, расположенных между первым и вторым ну­левыми элементами.

Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в нечетных позициях, а во второй половине - элементы, сто­явшие в четных позициях.

7. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. номер минимального элемента массива;

  2. сумму элементов массива, расположенных между первым и вторым отрицатель­ными элементами.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, модуль которых не превышает 1, а потом - все остальные.

8. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. максимальный по модулю элемент массива;

  2. сумму элементов массива, расположенных между первым и вторым положи­тельными элементами.

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

9. В одномерном массиве, состоящем из n целых элементов, вычислить:

1) минимальный по модулю элемент массива;

2) сумму модулей элементов массива, расположенных после первого элемента, рав­ного нулю.

Преобразовать массив таким образом, чтобы в первой его половине располагались элементы, стоявшие в четных позициях, а во второй половине - элементы, стояв­шие в нечетных позициях.

10. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. номер минимального по модулю элемента массива;

  1. сумму модулей элементов массива, расположенных после первого отрицатель­ного элемента.

Сжать массив, удалив из него все элементы, величина которых находится в интер­вале [а, b]. Освободившиеся в конце массива элементы заполнить нулями.

11. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. номер максимального по модулю элемента массива;

  2. сумму элементов массива, расположенных после первого положительного эле­мента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых лежит в интервале [а, b], а потом - все остальные.

12. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. количество элементов массива, лежащих в диапазоне от А до В;

  2. сумму элементов массива, расположенных после максимального элемента.

Упорядочить элементы массива по убыванию модулей элементов.

13. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. количество элементов массива, равных 0;

  2. сумму элементов массива, расположенных после минимального элемента.

Упорядочить элементы массива по возрастанию модулей элементов.

14. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. количество элементов массива, больших С;

  2. произведение элементов массива, расположенных после максимального по мо­дулю элемента.

Преобразовать массив таким образом, чтобы сначала располагались все отрица­тельные элементы, а потом - все положительные (элементы, равные 0, считать положительными).

15. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. количество отрицательных элементов массива;

  1. сумму модулей элементов массива, расположенных после минимального по мо­дулю элемента.

Заменить все отрицательные элементы массива их квадратами и упорядочить эле­менты массива по возрастанию.

16. В одномерном массиве, состоящем из n целых элементов, вычислить:

  1. количество положительных элементов массива;

  2. сумму элементов массива, расположенных после последнего элемента, равного нулю.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, целая часть которых не превышает 1, а потом - все остальные.

17. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. количество элементов массива, меньших С;

  1. сумму целых частей элементов массива, расположенных после последнего от­рицательного элемента.

Преобразовать массив таким образом, чтобы сначала располагались все элементы, отличающиеся от максимального не более чем на 20%, а потом - все остальные.

18. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. произведение отрицательных элементов массива;

  2. сумму положительных элементов массива, расположенных до максимального элемента.

Изменить порядок следования элементов в массиве на обратный.

19. В одномерном массиве, состоящем из n вещественных элементов, вычислить:

  1. произведение положительных элементов массива;

  2. сумму элементов массива, расположенных до минимального элемента.

Упорядочить по возрастанию отдельно элементы, стоящие на четных местах, и эле­менты, стоящие на нечетных местах.

Содержание отчета и его форма. Отчет по лабораторной работе должен состоять из:

1. Названия лабораторной работы.

2. Цели и содержания лабораторной работы.

3. Ответов на контрольные вопросы лабораторной работы.

4. Формулировки индивидуальных заданий и порядка их выполнения.

Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

        1. Как объявляются одномерные массивы в языке C++?

        2. Какими должны быть размерности при описании статического массива в языке C++?

        3. Каков диапазон изменения индекса массива в языке C++?

        4. Каким образом производится инициализация массива в языке C++?

        5. Чем является идентификатор массива?

        6. Для чего используется управляющая последовательность \t?

Пример выполнения лабораторной работы №4:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]