Лабораторная работа №7 Тип данных массив. Обработка одномерных массивов. 1. Цель работы: программирование простейших типовых алгоритмов обработки массивов 2. Основные сведения Простой поиск в массиве Во многих задачах требуется последовательно перебрать все элементы массива и найти нужные нам. Мы рассмотрим 3 таких задачи: • поиск одного заданного элемента; • вывод всех элементов, которые удовлетворяют заданному условию; • поиск минимального (максимального) элемента. Все эти задачи решаются с помощью цикла, в котором перебираются все элементы массива от начального (0-ого) до конечного (N-1-ого) элемента. Такой поиск называется линейным, поскольку все элементы просматриваются последовательно один за другим. Поиск одного элемента Задача. Определить, есть ли в массиве элемент с заданным значением x, и, если он есть, найти его номер. #include <stdio.h> #include <stdlib.h> const int N = 10; main() { int i, X, A[N]; int flag = 0; // Флаг сброшен printf("Введите 10 целых чисел "); for ( i = 0; i < N; i ++ ) scanf("%d",&A[i]); printf("Введите искомое число "); scanf("%d",&X); for ( i = 0; i < N; i ++ ) if ( A[i] == X ) { // если найдено flag = 1; // поднимаем флаг break; // заканчиваем поиск } if ( flag ) printf ( "A[%d] = %d", i, A[i] ); else printf ( "Число %d не найдено ", X ); system("PAUSE"); return 0; } Чтобы определить ситуацию, когда элемент не найден, нам надо ввести специальную переменную flag, которая устанавливается в 1, если элемент найден, и остается равной нулю, если в массиве нет нужного элемента. Такая переменная называется флагом, флаг может быть установлен (равен 1) или сброшен (равен нулю). Поиск всех элементов, соответствующих условию Задача. Определить, сколько в массиве положительных элементов и вывести их на экран. Для решения этой задачи вводим счетчик – специальную переменную, значение которой будет увеличиваться на единицу, когда мы нашли очередной положительный элемент. #include <stdio.h> #include <stdlib.h> const int N = 10; main() { int i, A[N], count = 0; // count – счетчик положительных элементов // здесь нужно ввести массив for ( i = 0; i < N; i ++ ) // цикл по всем элементам массива if ( A[i] > 0 ) { // если нашли положительный, ... count ++; // увеличиваем счетчик printf ("%d ", A[i]); // выводим элемент } printf ("\n В массиве %d положительных чисел", count); system(“PAUSE”); return 0; } Сортировка массивов Сортировка – это расстановка элементов некоторого списка в заданном порядке. Мы рассмотрим простейший вариант сортировки – расстановку элементов массива в порядке возрастания. Программисты придумали множество методов сортировки. Они делятся на две группы: - понятные, но не эффективные -эффективные, но непонятные (быстрая сортировка и т.п.). Пока мы изучим только метод из первой группы, которого хватает для простых задач (когда размер массива не более 1000). Метод пузырька Название этого метода произошло от известного физического явления – пузырек воздуха в воде поднимается вверх. В этом методе сначала поднимается «наверх» (к началу массива) самый «легкий» элемент (минимальный), затем следующий и т.д. Сначала сравниваем последний элемент с предпоследним. Если они стоят неправильно, то меняем их местами. Далее так же рассматриваем следующую пару элементов и т.д. Когда мы обработали пару (A[0], A[1]), минимальный элемент стоит на месте A[0]. Это значит, что на следующих этапах его можно не рассматривать. При следующем проходе наша задача – поставить на место элемент A[1]. Делаем это так же, но уже не рассматриваем A[0], который стоит на своем месте. Сделав N-1 проходов, мы установим на место элементы с A[0] по A[N-2]. Это значит, что последний элемент, A[N-1], тоже стоит на своем месте. #include <stdio.h> #include <stdlib.h> const int N = 10; main() { int i, j, A[N], c; // генерируем массив A printf("\n исходный массив:\n"); for ( i = 0; i < N; i ++ ) { A[i]=rand()%20; printf("%d ",A[i]); } for ( i = 0; i < N-1; i ++ ) // достаточно поставить N-1 элементов for ( j = N-2; j >= i; j -- ) // идем с конца массива в начало if ( A[j] > A[j+1] ) // если они стоят неправильно, ... { c = A[j]; A[j] = A[j+1]; // переставить A[j] и A[j+1] A[j+1] = c; } printf("\n Отсортированный массив:\n"); for ( i = 0; i < N; i ++ ) printf("%d ", A[i]); system("PAUSE"); return 0; } 3. Выполнение работы 1. Вычислить и записать в массив значения функции y=a*x**2+b*x+c при изменении x от хнач до хкон с шагом h. Массив значений отсортировать по убыванию методом пузырька и напечатать. a =2.14; b= -4.21; c= 3.25; хнач = -4.5, хкон= -33.5, h= 0.5; 2. Сформировать с помощью датчика случайных чисел в диапазоне [0,50] массив из 15 элементов целого типа. Вывести его на экран. Вывести элементы массива, исключая ранее встречавшиеся. 3. Сформировать с помощью датчика случайных чисел в диапазоне [-10,10] массив из 20 элементов вещественного типа. Вывести его на экран. Сформировать из положительных элементов массива А массив В. Вывести массив В 4. Сформировать с помощью датчика случайных чисел в диапазоне [0,20] два массива C и D, из 20 элементов целого типа каждый. Вывести их на экран. Отсортировать массивы C и D по возрастанию и сформировать из них массив E, таким образом, чтобы он также был отсортирован. 4. Контрольные вопросы 1. 2. 3. 4. 5. Как просматриваются элементы массива при линейном поиске? Зачем вводится переменная «флаг»? Какую переменную программисты называют «счётчиком»? Что такое сортировка массива? Принцип сортировки методом пузырька.