- •Основные сведения
- •Ввод и вывод данных через потоки
- •Описание функций математического модуля math
- •Модуль random
- •Лабораторная работа №1 Выполнение программы простой структуры. Вычисление выражений с использованием стандартных функций
- •Варианты
- •Лабораторная работа №2
- •Варианты
- •Лабораторная работа №3
- •Лабораторная работа №4 Работа с одномерными массивами
- •Сортировка массивов
- •Сортировка методом пузырьков (метод простого обмена)
- •Сортировка методом вставок
- •Сортировка методом простого выбора
- •Постановка задачи
- •Варианты
- •Лабораторная работа №5
- •Постановка задачи
- •Варианты
- •Методические указания
- •Лабораторная работа №6 Динамические массивы
- •Постановка задачи
- •Варианты
- •Лабораторная работа №7
- •Постановка задачи
- •Варианты
- •Лабораторная работа №8 Хранение данных на внешних носителях
- •Определение конца файла
- •Закрытие файла, если он больше не нужен
- •Ввод/вывод данных с помощью функций унаследованных от с
- •Постановка задачи
Сортировка методом простого выбора
Чтобы упорядочить массив в возрастающем порядке, нужно выбрать наибольший элемент. Поскольку наибольший элемент нужно поставить в самый конец массива, его нужно поменять местами с последним элементом, даже если эти элементы идентичны. Теперь, игнорируя последний (наибольший) элемент массива, выполним поиск наибольшего элемента в оставшейся части массива и поменяем его местами с предпоследним элементом исходного массива. Этот процесс продолжается до тех пор, пока не будут найдены и переставлены n-l элемент из п элементов массива. Оставшийся элемент, стоящий первым, не нарушает порядок и поэтому не рассматривается.
На рис. показан пример сортировки методом выбора. Среди пяти целых чисел выбирается наибольшее - число 37, которое меняется местами с последним элементом массива - числом 13. (Числа, стоящие на правильных местах, выделены полужирным шрифтом. Затем среди оставшихся четырех чисел снова выбирается наибольшее - число 29, - которое меняется местами с предпоследним элементом - числом 13. Обратите внимание, что следующий выбор - число 14- уже стоит на правильном месте, однако алгоритм игнорирует этот факт и выполняет фиктивную перестановку числа 14 на одном и том же месте. В принципе намного эффективнее выполнять фиктивные перестановки, чем каждый раз проверять, нужна перестановка или нет. В заключение выбирается число 13, которое меняется местами со вторым элементом массива - числом 1о. Теперь массив упорядочен по возрастанию.
int i,max, n_max,j;
for(i=0;i<n-1;i++)
{
max=a[i]; n_max=i; //поиск максимального
for(j=i+1; j<n; j++)
if(a[j]>max)
{
max=a[j];
n_max=j;
}
a[n_max]=a[i]; //обмен
a[i]=max;
}
Постановка задачи
Сформировать массив из n элементов с помощью датчика случайных чисел (n задается пользователем с клавиатуры).
Распечатать полученный массив.
Выполнить удаление указанных элементов из массива.
Вывести полученный результат.
Выполнить добавление указанных элементов в массив.
Вывести полученный результат.
Выполнить перестановку элементов в массиве.
Вывести полученный результат.
Выполнить поиск указанных в массиве элементов и подсчитать количество сравнений, необходимых для поиска нужного элемента.
Вывести полученный результат.
Выполнить сортировку массива указанным методом.
Вывести полученный результат.
Выполнить поиск указанных элементов в отсортированном массиве и подсчитать количество сравнений, необходимых для поиска нужного элемента.
Вывести полученный результат.
При решении задач использовать псевдодинамические массивы.
Варианты
Вариант |
Удаление |
Добавление |
Перестановка |
Поиск |
Сортировка |
1 |
Максимальный элемент |
К элементов в начало массива |
Перевернуть массив |
Первый четный |
Простой обмен |
2 |
Минимальный элемент |
К элементов в конец массива |
Сдвинуть циклически на M элементов вправо |
Первый отрицательный |
Простой выбор |
3 |
Элемент с заданным номером |
N элементов, начиная с номера К |
Сдвинуть циклически на M элементов влево |
Элемент с заданным ключом (значением) |
Простое включение |
4 |
N элементов, начиная с номера K |
Элемент с номером К |
Поменять местами элементы с четными и нечетными номерами |
Элемент равный среднему арифметическому элементов массива |
Простой обмен |
5 |
Все четные элементы |
К элементов в начало массива |
Четные элементы переставить в начало массива, нечетные - в конец |
Первый четный |
Простой выбор |
6 |
Все элементы с четными индексами |
К элементов в конец массива |
Поменять местами минимальный и максимальный элементы |
Первый отрицательный |
Простое включение |
7 |
Все нечетные элементы |
N элементов, начиная с номера К |
Положительные элементы переставить в начало массива, отрицательные - в конец |
Элемент с заданным ключом (значением) |
Простой обмен |
8 |
Все элементы с нечетными индексами |
Элемент с номером К |
Перевернуть массив |
Элемент равный среднему арифметическому элементов массива |
Простой выбор |
9 |
Все элементы больше среднего арифметического элементов массива |
К элементов в начало массива |
Сдвинуть циклически на M элементов вправо |
Первый четный |
Простое включение |
10 |
Максимальный элемент |
К элементов в конец массива |
Сдвинуть циклически на M элементов влево |
Первый отрицательный |
Простой обмен |
11 |
Минимальный элемент |
N элементов, начиная с номера К |
Поменять местами элементы с четными и нечетными номерами |
Элемент с заданным ключом (значением) |
Простой выбор |
12 |
Элемент с заданным номером |
Элемент с номером К |
Четные элементы переставить в начало массива, нечетные - в конец |
Элемент равный среднему арифметическому элементов массива |
Простое включение |
13 |
N элементов, начиная с номера K |
К элементов в начало массива |
Поменять местами минимальный и максимальный элементы |
Первый четный |
Простой обмен |
14 |
Все четные элементы |
К элементов в конец массива |
Положительные элементы переставить в начало массива, отрицательные - в конец |
Первый отрицательный |
Простой выбор |
15 |
Все элементы с четными индексами |
N элементов, начиная с номера К |
Перевернуть массив |
Элемент с заданным ключом (значением) |
Простое включение |
16 |
Все нечетные элементы |
Элемент с номером К |
Сдвинуть циклически на M элементов вправо |
Элемент равный среднему арифметическому элементов массива |
Простой обмен |
17 |
Все элементы с нечетными индексами |
К элементов в начало массива |
Сдвинуть циклически на M элементов влево |
Первый четный |
Простой выбор |
18 |
Все элементы больше среднего арифметического элементов массива |
К элементов в конец массива |
Поменять местами элементы с четными и нечетными номерами |
Первый отрицательный |
Простое включение |
19 |
Максимальный элемент |
N элементов, начиная с номера К |
Четные элементы переставить в начало массива, нечетные - в конец |
Элемент с заданным ключом (значением) |
Простой обмен |
20 |
Минимальный элемент |
Элемент с номером К |
Поменять местами минимальный и максимальный элементы |
Элемент равный среднему арифметическому элементов массива |
Простой выбор |
Пример заполнения массива случайными числами
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
float a[100], b[100],buf;
int i,n, k, num, num_per;
cout << "Введите размерность массива n: " ;
cin >> n;
cout <<time(NULL)<<"\n";
srand(time(NULL));
for (i=1; i<=n; i++)
{a[i]=rand()%50;
cout << a[i] << "\n";
}
getch();
}
Пример выполнения задания
Удаление |
Добавление |
Перестановка |
Все элементы, индекс которых кратен 3 |
После каждого 3 элемента вставить 1 |
Все элементы с индексами кратными 3 переставить в начало сохраняя порядок элементов в массиве |
Программа на удаление элементов
В программе проверяется кратность трем индекса i элементов массива. Если i не делится на 3 без остатка (if ((i%3)!=0)), то мы записываем соответствующий элемент в массив В, в противном случае игнорируем элемент. Одновременно увеличиваем переменную k на единицу. k – индекс элементов для массива В. Когда цикл закончит свою работу в переменной k будет хранится количество перезаписанных элементов из массива А. Таким образом мы получим новый массив В, в котором будут отсутствовать элементы, чей индекс был кратен 3.
#include <iostream.h>
#include <conio.h>
#include <stdlib.h> //заголовочный файл для генерации случ. чисел
int main()
{
int a[100], b[100]; //описываем два массива из 100 элементов
int i,n, k;
cout << "Введите размерность массива n: " ;
cin >> n;
srand(time(NULL)); //задаем начальную точку отсчета для генерации случайных чисел
for (i=0; i<n; i++)
{a[i]=rand()%50; //генерация случайных чисел в диапазоне от 0 до 50
cout << a[i] << "\t"; //вывод полученных элементов на экран (\t – позволяет разделять элементы пробелами
}
cout<<"\n"; // переход на новую строку (\n)
k=0;
for (i=0;i<n;i++)
if ((i%3)!=0) //проверка индекса на кратность 3
{b[k]=a[i]; //перезаписываем нужные элементы в новый массив
k++;}
cout<<"\Новый массив\n"; //вывод нового массива
for (i=0; i<k; i++) cout << b[i] << "\t";
getch();
}
Схема алгоритма
Добавление элементов
В программе созданы два счетчика – k индекс элементов массива В, m – отсчитывает каждый третий элемент массива А. Как только m=3, в массив B записывается 1 и индекс k увеличивается на единицу. После этого m сбрасывается до нуля, чтобы отсчитывать следующую тройку элементов а[i]
int main()
{
int a[100], b[100]; //описываем два массива из 100 элементов
int i,n, k;
cout << "Введите размерность массива n: " ;
cin >> n;
srand(time(NULL)); //задаем начальную точку отсчета для генерации случайных чисел
for (i=0; i<n; i++)
{a[i]=rand()%50; //генерация случайных чисел в диапазоне от 0 до 50
cout << a[i] << "\t"; //вывод полученных элементов на экран
}
cout<<"\n";
k=0; m=0;
for (i=0;i<n;i++)
{
b[k]=a[i];
k++;m++;
if (m==3)
{ b[k]=1;
m=0;
k++;
}
}
cout<<"\Новый массив\n"; for (i=0; i<k; i++) cout << b[i] << "\t";
getch();
}
Перестановка
Сначала в новый массив В записываются элементы массива А с индексами кратными 3, затем уже все остальные
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
int main()
{
float a[100], b[100],buf;
int i,n, k, num, num_per;
cout << "введите размерность массива n: " ;
cin >> n;
srand(time(NULL));
for (i=0; i<n; i++)
{a[i]=rand()%50;
cout << a[i] << "\t";
}
k=0;
for (i=0; i<n; i++)
if (i%3==0) //если индекс кратен 3
{
b[k]=a[i]; //записать в массив В элемент с индексом кратным 3
k++; //увеличивается индекс массива В
}
for (i=0; i<n; i++)
if (i%3!=0) //если индекс не кратен 3
{
b[k]=a[i];
k++;
}
cout<<"\nНовый массив\n"; //Вывод нового массива
for (i=0; i<n; i++) cout << b[i] << "\t";
getch();
}