WWW.WIKI.PDFM.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Собрание ресурсов
 

«Во многих практических ситуациях приходится работать с большим объемом данных. Для этого удобно использовать массивы, которые являются достаточно простой в плане программирования ...»

Лабораторная работа № 2 .

Одномерные массивы

Во многих практических ситуациях приходится работать с большим объемом данных. Для этого

удобно использовать массивы, которые являются достаточно простой в плане программирования

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

определенным именем. Формально определение массива таково: совокупность однотипных данных,

хранящихся в последовательных ячейках памяти и имеющих общее имя. Эти ячейки называются элементами массива. Все элементы массива пронумерованы по порядку, а номер называется индексом элемента массива .

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

Массивы могут быть одномерными и многомерными. Здесь мы рассмотрим технологию работы с одномерными массивами .

Для объявления одномерного массива используется следующая форма записи .

ТИП имя_массива[размер];

Здесь с помощью элемента записи объявляется базовый тип массива. Базовый тип определяет ТИП тип данных каждого элемента, составляющего массив. Количество элементов, которые будут храниться в массиве, определяется параметром размер. Например, при выполнении приведенной ниже инструкции объявляется int-массив (состоящий из 10 элементов) с именем sample .

int sample[10];

Доступ к отдельному элементу массива осуществляется с помощью индекса. Индекс описывает позицию элемента внутри массива. В C++ первый элемент массива имеет нулевой индекс. Поскольку массив содержит 10 элементов, его индексы изменяются от 0 до 9. Чтобы получить доступ к sample элементу массива по индексу, достаточно указать нужный номер элемента в квадратных скобках. Так, первым элементом массива sample является sample[0], а последним — sample[9] .



Заполнение элементов массива случайными значениями Листинг 1 содержит программу заполнения массива значениями генерируемыми датчиком случайных чисел – функцией rand(). Изображение 1 показывает результат работы данной программы .

Листинг 1. Внесение значений в элементы массива #include iostream #include conio .

h using namespace std;

#define N 10 int main() { int a[N];

int i;

for (i=0;iN;i++) a[i]=rand()%5;

for (i=0;iN;i++) cout "a[" i "]=" a[i]"\n";

getch();

return 0;

} Изображение 1 Функция rand() генерирует случайные числа, а именно возвращает псевдослучайное целое число в диапазоне от до Это псевдослучайное число генерируется алгоритмом. Этот алгоритм 0 RAND_MAX .

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

–  –  –

показано на листинге 2 .

Листинг 2. Внесение различных значений в элементы массива при каждом запуске программы #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int a[N];

int i;

srand(time(NULL));

for (i=0;iN;i++) a[i]=rand()%5;

–  –  –

Функция srand() выполняет инициализацию генератора псевдослучайных чисел rand(). Генератор псевдослучайных чисел инициализируется с помощью аргумента seed функции srand(), который играет роль зерна .





–  –  –

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

Если использовать одно и то же значение seed, то с каждым вызовом функции rand(), алгоритм генерации псевдослучайных чисел будет генерировать ту же самую последовательность чисел .

Для того, чтобы генерировать случайные числа, функция srand() обычно инициализируется с помощью функции time(). Значение, возвращенное функцией time() (объявлена в заголовке ctime) отличается каждую секунду, что дает возможность получать совершенно случайные последовательности чисел, при каждом новом запуске программы .

–  –  –

элементы массива являются целыми числами (имеют тип int) .

Алгоритм вычисления суммы в переменной s простой и заключается в последовательном добавлении к s значений элементов массива. Программа, реализующая данный алгоритм, не требует пояснения с использованием блок-схемы. В листинге 3 приведена разработка, реализующая решение данной задачи. В программе с помощью конструкции rand()%20 мы обеспечиваем случайное заполнение элементов массива целыми числами от 0 до 19 (включая левую и правую границы интервала). В результате работы мы увидим на экране подсчитанную сумму. На изображении 2 показан вывод данной программы на экран .

Листинг 3. Вычисление суммы значений элементов массива #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int a[N];

int i,s;

srand(time(NULL));

for (i=0;iN;i++) a[i]=rand()%20;

–  –  –

Суммирование элементов массива с учетом условия Рассмотрим задачу суммирования не всех элементов массива, а только тех, которые удовлетворяют определенному условию. В качестве условия будем считать, что суммироваться должны только те элементы, значения которых кратны 3. В листинге 4 приведена необходимая программная разработка.

Действия, которые в ней производятся, выглядят так:

заполнение элементов массива случайными значениями;

организация цикла по количеству элементов массива;

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

Аналогичным образом можно использовать и другие условия при суммировании элементов массива. На изображении 3 показан вывод данной программы на экран .

Листинг 4. Суммирование элементов массива при условии кратности 3 #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int a[N];

int i,s;

–  –  –

Поиск максимального элемента в массиве В листинге 5 приведена программа поиска максимального элемента в числовом массиве. Как обычно, сам массив предварительно заполняется случайными целыми числами. На изображении 4 показан вывод данной программы на экран .

Листинг 5. Поиск максимального элемента в массиве #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int a[N];

int i,max;

–  –  –

Поиск индексов в массиве Рассмотрим еще один пример. Пусть наша задача заключается в том, чтобы найти индексы максимального и минимального элементов в массиве. В листинге 6 приведена программа поиска указанных индексов для массива элементов, предварительно заполненного случайными числами. Блоксхема алгоритма показана на изображении 5 .

–  –  –

Если максимальных или минимальных элементов несколько, то данная программа отображает только индексы первых найденных элементов .

Листинг 6. Поиск индексов минимального и максимального элементов массива #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int A[N+1];

int J, Jmax, Jmin, Max, Min;

–  –  –

упорядоченности в массиве (если текущий элемент больше последующего) заносится значение 1 (первоначально значение этой переменной инициализируется нулем). Это и является индикатором при формировании сообщения о неупорядоченности массива чисел. В противном случае, если переменная остается равной нулю, то можно сказать, что массив упорядочен. Блок-схема алгоритма Flag представлена на изображении 7 .

–  –  –

Листинг 7. Анализ упорядоченности элементов массива #include iostream #include ctime #include conio .

h using namespace std;

#define N 3 int main() { int A[N+1];

int J, Flag;

–  –  –

Обмен значений массива Обмен значений элементов массива достаточно часто встречается при работе с массивами. В программе, приведенной в листинге 8, сначала массив заполняется случайными числами, а затем производится следующий вариант обмена значений: первый элемент меняется значением с последним, второй с предпоследним и т. д. На изображении 9 показана данная схема обмена .

–  –  –

Сам алгоритм несложен, а его идея заключается в том, что сначала вычисляется количество обменов. Для этого следует число элементов массива поделить на 2 (выполнить целочисленное деление). После этого в цикле по числу обменов выполняется обмен значений элементов массива. Блоксхема алгоритма представлена на изображении 10 .

Вывод информации программы листинга 8 показан на изображении 11 .

–  –  –

Листинг 8. Обмен значений элементов массива #include iostream #include ctime #include conio .

h using namespace std;

#define N 7 int main() { int A[N+1];

int J, B, L;

–  –  –

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

–  –  –

следующих пар элементов. В случае когда сумма элементов очередной пары оказывается больше SumMax, это приводит к обновлению SumMax и фиксированию индекса первого элемента пары в переменной Jmax .

В конце программы значение выводится на печать. Блок-схема алгоритма представлена на Jmax изображении 12 .

Листинг 9. Поиск пары соседних элементов с максимальной суммой #include iostream #include ctime #include conio .

h using namespace std;

#define N 10 int main() { int A[N+1];

int J, Jmax, SumMax;

–  –  –

Подсчет соседних элементов по условию Необходимо разработать алгоритм подсчета максимального количества идущих подряд совпадающих элементов в целочисленном массиве, который имеет длину 10. Программа, решающая данную задачу, представлена в листинге 10. Учитывая некоторую неочевидность алгоритма, на рис. 13 приведена блок-схема, которая предоставляет необходимую информативность. Здесь мы для фиксирования максимального количества подряд идущих элементов определили переменную а MaxNums,

–  –  –

элемента массива .

Листинг10. Подсчет максимального количества подряд идущих одинаковых элементов массива #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, Nums, MaxNums;

Nums=1;

MaxNums=1;

–  –  –

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

Наиболее простой и очевидный вариант решения (изображение 14) заключается в организации двух этапов:

первоначальный просмотр массива с целью поиска максимального элемента;

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

В листинге 11 приведено программное решение поставленной задачи данным способом .

Листинг 11. Подсчет количества максимальных элементов (вариант 1) #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, Nums, Max;

–  –  –

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

Начало

–  –  –

Листинг 12. Подсчет количества максимальных элементов (вариант 2) #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, Nums, Max;

srand(time(NULL));

for (J=1;J=N;J++) A[J]=rand()%7;

–  –  –

определенным индексом (вводимым с клавиатуры). Один из вариантов программы показан в листинге 13, а на изображении 16 приведена блок-схема данного алгоритма .

Листинг 13. Удаление элемента из массива #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, K;

cout "input K (from 1 to 10)""\n";

cin K;

srand(time(NULL));

for (J=1;J=N;J++) A[J]=rand()%7;

for (J=1;J=N;J++) cout "A[" J "]=" A[J]"\n";

cout "\n";

for (J=K; J=(N-1);J++) A[J]=A[J+1];

–  –  –

Циклическое перемещение элементов массива Допустим, необходимо произвести циклическое перемещение элементов по такой схеме: второй элемент перемещается на место первого, третий на место второго и т. д. Исходный первый элемент переходит в последний элемент массива. Один из вариантов программы показан в листинге 14, а на изображении 18 представлена блок-схема алгоритма .

Начало

–  –  –

Листинг 14. Циклическое перемещение #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, B;

–  –  –

Заполнение массива случайными числами без повторений Требуется организовать заполнение массива случайными числами без повторений (все числа должны отличаться). Так, в массиве не должно оказаться одинаковых элементов. Один из вариантов программы показан в листинге 15, а на изображении 19 приведена блок-схема алгоритма заполнения массива .

Листинг 15. Заполнение массива случайными числами без повторений #include iostream #include ctime #include conio.h using namespace std;

#define N 10 int main() { int A[N+1];

int J, I, Flag;

–  –  –

Работа с файлами Часто приходится вводить информацию не вручную с клавиатуры, а брать ее из файла. Файл представляет собой набор данных, хранящихся во внешней памяти компьютера (на жестком диске, компакт-диске и т. д.) .

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

Конец самого файла обозначается символом конец файла. При записи информации в текстовый файл все данные преобразуются к символьному типу. Просмотреть текстовый файл можно с помощью любого текстового редактора .

Посмотрим на практическом примере каким бразом можно получать информацию в программу из текстового файла. Для этого создадим с помощью Блокнота (простого тектового редактора) файл в виде совокупности целых чисел (изображение 21). Друг от друга числа отделяются либо пробелом либо переводом на новую строку. В качестве имени файла выберем file.txt. После этого перейдем в среду Visual C++ и напишем текст программы, показанный на листинге 16 .

–  –  –

Данная программа открывает созданный текстовый, считывает целые числа из файла в массив, а затем выводит содержимое массива на экран. Здесь мы указали с помощью переменной file_name местонахождение нашего текстового файла - "C:/CPP/file.txt". Если у вас другой путь к файлу, то следует внести необходимую коррекцию .

–  –  –

в элементе массива mass[N]:

fscanf(file,"%d",&mass[N]) В данной записи спецификатор %d обозначает извлечение из файла переенной целого типа. Запись обознаяет указатель (адрес) N-го элемента массива mass .

&mass[N] Это считывание из файла будет производиться до тех пор пока мы не встретим символ завершения файла – После занесения числа в элемент массива производится вывод заполненного элемента EOF .

массива на экран. На изображении 22 показано окно вывода данной программы .

Листинг 16. Считывание данных из файла (использование функций С) #include stdio.h #include iostream #include conio.h using namespace std;

int main( void ) { FILE *file;

char* file_name = "C:/CPP/file.txt";

int mass[100];

int i,N;

file = fopen( file_name, "r" );

N=0;

while ( fscanf(file,"%d",&mass[N]) != EOF) { cout mass[N] "\n";

N++;

} fclose(file);

getch();

return 0;

}

–  –  –

Мы использовали в данном случае возможности работы с файлами, которые унаследованы от языка C. В листинге 17 показана версия этого же задания, но с использованием более современных средств работы с файлами .

Листинг 17. Считывание данных из файла (использование объектов С++) include iostream #include conio.h #include cstdlib #include fstream using namespace std;

int main( void ) { int mass[100];

int i,N;

fstream file;

–  –  –

getch();

return 0;

} Это задание касалось только считывание данных в определенном формате из файла. Следующее задание более сложное. Создадим текстовый файл из совокупности пар целых чисел: номер договора и зачисленная сумма по данному договору. При этом таких пар с определенным договором можт быть несколько (по договору было несколько перечислений денежных сумм .

Также воспользуемся Блокнотом и в качестве имени файла выберем file2.txt. На изображении 23 показан один из вариантов такого файла. На листинге 18 приведена программа, которая считывает информацию из файла и по каждому договору подсчитывает сумму по всем начислениям .

–  –  –

Листинг 18. Обработка данных из файла (использование функций С) #include stdio.h #include iostream #include conio.h #include iomanip using namespace std;

int main( void ) { FILE *file;

char* file_name = "C:/CPP/file2.txt";

int mass1[100]; //для номеров договоров static int mass2[100]; // для сумм по договорам int i,N,a1,a2,flag;

–  –  –

Листинг 19. Обработка данных из файла (использование объектов С++) #include iostream #include conio.h #include cstdlib #include fstream #include iomanip using namespace std;

int main( void ) { int mass1[100]; //для номеров договоров static int mass2[100]; // для сумм по договорам int i,N,a1,a2,flag;

fstream file;

–  –  –

Создадим новый текстовый файл file3.txt из совокупности пар Изменим данное задание на следующее .

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

Листинг 20. Обработка данных из файла разных типов (использование объектов С++) #include iostream #include conio.h #include cstdlib #include fstream #include iomanip using namespace std;

int main( void ) { int mass1[100]; //для номеров договоров static float mass2[100]; // для сумм по договорам int i,N,a1,flag;

float a2;

fstream file;

Похожие работы:

«ДОКАЗЫВАНИЕ ПРИТВОРНОСТИ И МНИМОСТИ СДЕЛОК Двойникова Д.А. Двойникова Дарья Андреевна – студент магистратуры, Институт права Волгоградский государственный университет, г. Волгоград Аннотация: в данной статье анализируется проблема доказывания таких видов ничтожных сделок, как мнимые и притворные. Проблема рассматривается в рам...»

«АККУМУЛЯЦИЯ УГЛЕВОДОРОДОВ В ТРЕХСЛОЙНЫХ ПРИРОДНЫХ РЕЗЕРВУАРАХ Е.Б. Риле (ИПНГ РАН) Теория трехслойного строения природных резервуаров (ПР) была разработана В.Д. Ильиным и другими исследователями [1, 69] в 7080-х гг. XX столетия. Согласно это...»

«+7 930 401 41 89 +7 920 414 14 41 +7 920 229-04-14 www.vsepitomniki.ru e-mail: vsepitomniki@mail.ru АССОРТИМЕНТ ДЕКОРАТИВНЫХ ДЕРЕВЬЕВ И КУСТАРНИКОВ НА ОСЕНЬ 2017 ГОДА Упаков Латинское название / Русское название Высота, см Цена, руб ка Лиственные деревья и кустарники Berberis thunbergii Aurea 20-30 со 2 800 Барба...»

«Сценарий открытия специализированного зала Фанфары Торжественная музыка Ведущий: Ты увлечение – акробатика И ритм, и музыка, и пластика, Ты рождена из вдохновения, Из танца, цвета и движения. Нам мир чудесный открывает двери Спортивной акробатики пробил час. И звездопад спортивных достижений Пусть прославля...»

«Ольга Неклюдова (Москва) Роль самиздатского журнала "Часы" в изучении и сохранении наследия поэзии первой половины ХХ века Журнал "Часы"1 (1976—1990) — одно из самых известных литературных изданий ленинградского самиздата. Н...»

«Е.А. БЕЛЯЕВ (МГУ), Н.О. ОСМАНОВ (КУБАНСКИЙ ГОСУНИВЕРСИТЕТ) Ж. М. Абдильдин, А. Н. Нысанбаев. Диалектико-логические принципы построения теории.– Алма-Ата: изд-во "Наука" Казахской ССР, 1973. – 420 с. Научная теория представляет собой довольно сложную систему знания. В настоящее время диалектикоматериал...»

«Техника Помидора (Pomodoro Technique) Франческо Цирилло (by Francesco Cirillo) Техника Помидора II Author: Francesco Cirillo Date of publication v1.0: 19 October 2006 Date of publication v1.3: 15 June 2007 Date of Russian translation: 07 June 2014, Alexey Yastrebov The information contained in this text has been verified and documented as c...»

«Кодекс правил поведения ученика ПРАВА и ОБЯЗАННОСТИ УЧЕНИКА 2007-2008 -Обращение к родителям/опекунам. Пожалуйста, прочтите этот кодекс и обсудите с Вашим ребенком важность прав и обязанностей ученика. Пожалуйста, подпишитесь ниже, отрежьте по пунктиру...»










 
2018 www.wiki.pdfm.ru - «Бесплатная электронная библиотека - собрание ресурсов»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.