
- •Основы программирования
- •Средства создания программ
- •Работа в интегрированной среде разработки программ turbo c (Borland c)
- •Основные функциональные клавиши и сочетания клавиш в Turbo c
- •Контрольные вопросы
- •Основы языка Си
- •Составляющие языка Си
- •Понятия алгоритмических языков (На примере языка Си)
- •Структура программы на языке Си
- •Директивы препроцессора
- •Главная функция
- •Переменные и массивы
- •Объявления переменных и массивов
- •Комментарии
- •Основные операции в Си
- •Арифметические операции
- •Логические операции и операции отношения
- •Операции присваивания
- •Функции ввода и вывода
- •Функция форматированного вывода printf( )
- •Функция форматированного ввода scanf( )
- •Функция неформатированного ввода getch( )
- •Функция неформатированного ввода gets( )
- •Функция неформатированного вывода puts( )
- •Программа – диалог
- •Контрольные к лабораторной работе «Программа-диалог»
- •Программа–тест
- •Контрольные вопросы к лабораторной работе «Программа-тест»
- •Конструкция switch/case/default
- •Операторы цикла
- •Цикл for
- •Стандартные математические функции
- •Пример выполнения лабораторной работы «Вычисление значения функции»
- •Контрольные вопросы к лабораторной работе «Вычисление значения функции»
- •Вложенные циклы.
- •Использование оператора break в циклах
- •Оператор continue
- •Оператор безусловного перехода goto
- •Действия с одномерными массивами
- •Инициализация массива
- •Ввод значений элементов массива с клавиатуры
- •Заполнение массива случайными числами
- •Вычисление суммы и произведения элементов массива
- •Поиск максимального элемента массива и его номера
- •Вычисление среднего арифметического
- •Перестановка элементов в массиве
- •Сортировка массива
- •Заполнение массива элементами из другого массива.
- •Контрольные вопросы к лабораторной работе «Одномерный массив»
- •Контрольные к лабораторной работе «Программа-диалог»
- •Контрольные вопросы к лабораторной работе «Программа-тест»
- •Контрольные вопросы к лабораторной работе «Вычисление значения функции»
- •Контрольные вопросы к лабораторной работе «Одномерный массив»
Перестановка элементов в массиве
ПРИМЕР 36:
Задание
Составить программу, которая заполняет целочисленный массив a[12] случайными числами из диапазона [–10, 10], находит наименьший элемент этого массива и меняет его местами с первым элементом. Преобразованный массив вывести на экран.
Пояснение
Для перестановки элементов вводим вспомогательную переменную s.
Если несколько элементов массива a[12] будут иметь одинаковое наименьшее значение, то для перестановки будет выбран первый из этих элементов.
Решение
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define N 12 #define P printf void main() { int a[N] , i, number, min, s; randomize(); P(“Исходный массив \n”); for (i = 0; i < N; i ++) { a[i] = -10 + random(21); P("%4d", a[i]); } min = a[0]; number = 0; for (i = 1; i < N; i ++) if(a[i] < min) {min = a[i]; number=i; } s = a[0]; a[0] = min; a[number] = s; P(“\n Преобразованный массив:\n”); for (i = 0; i < N; i ++) P(“%4d”, a[i]); P(“\n Нажмите любую клавишу”); getch(); } |
/*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ /*10*/ /*11*/ /*12*/ /*13*/ /*14*/ /*15*/ /*16*/ /*17*/ /*18*/ /*19*/ /*20*/ /*21*/ /*22*/ /*23*/ /*24*/ |
|
Сортировка массива
Под сортировкой понимается процесс перегруппировки одно-типных элементов с целью расположения их в некотором порядке, напри-мер, сортировка числового массива в порядке возрастания или убывания его элементов. Цель сортировки – облегчить поиск в массиве, его модифи-кацию. Сортировка ускоряет работу практически любого алгоритма, рабо-тающего с массивами данных. Одним из основных требований, предъяв-ляемых к алгоритмам сортировки, является экономичность использования памяти. Хорошую оценку эффективности алгоритмов сортировки дают число С – количество необходимых сравнений элементов и Р – количество перестановок элементов массива.
Разработано большое количество алгоритмов сортировки, однако не существует наилучшего алгоритма сортировки для всех случаев.
Пусть требуется отсортировать элементы числового массива в порядке возрастания его элементов.
Рассмотрим один из самых простых алгоритмов сортировки – сор-тировка методом пузырька (пузырьковая сортировка). Этот алгоритм ос-нован на сравнении двух соседних элементов и, возможно, их перестановке. После того, как будут просмотрены все элементы массива по направ-лению от его конца к началу (выполнен один проход) наименьший (самый “легкий”) элемент окажется первым (или наибольший элемент окажется последним при просмотре массива в обратном направлении). Этот процесс повторяется до тех пор пока все элементы массива не окажутся упоря-доченными. Нетрудно видеть, что максимальное число проходов равно n – 1, где n – количество элементов в массиве.
Оценим минимальное количество сравнений в пузырьковой сортировке. Если массив уже упорядочен, то для того, чтобы убедиться в этом, потребуется в течение одного прохода выполнить (n – 1) сравнений. Это и есть минимальное количество сравнений С.
Теперь оценим максимальное число сравнений в пузырьковой сортировке. На первом проходе число сравнений составляет (n – 1), на втором проходе (n – 2) и т.д. Таким образом, общее число сравнений не превосходит величины:
(n – 1) + (n – 2) + . . . +1 = nּ(n – 1)/2.
Аналогично можно оценить минимальное и максимальное число перестановок. В результате можно получить следующие оценки для числа сравнений С и числа перестановок Р:
Сmin
= n
– 1
Cmax
= (n
2
– n)/2
Pmin
= 0
Pсредн
= 3ּ(n
2
– n)/4
Pmax
= 3ּ(n
2
– n
)/2
Ниже приводится текст программы, реализующей этот метод. Массив а[N] заполняется случайными числами.
ПРИМЕР 37:
Задание
Составить программу, которая заполняет целочисленный массив a[10] случайными числами из диапазона [–15, 15] и сортирует его в порядке возрастания элементов. Преобразованный массив вывести на экран.
Решение
#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<time.h> #define N 10 #define P printf void main( ) { int a[N] , i,j, s; randomize(); P(“Исходный массив\n”); for (i = 0; i < N; i ++) { a[i]= -15 + random(31); P("%4d", a[i]); } for (i = 0; i < N-1; i ++) for (j = N-1; j >i; j--) if(a[j] < a[j-1]) {s = a[j-1]; a[j-1]=a[j]; a[j]=s; } P(“\n Преобразованный массив:\n”); for (i = 0; i < N; i ++) P(“%4d”, a[i]); P(“\n Нажмите любую клавишу”); getch(); } |
/*1*/ /*2*/ /*3*/ /*4*/ /*5*/ /*6*/ /*7*/ /*8*/ /*9*/ /*10*/ /*11*//*12*//*13*//*14*//*15*//*16*//*17*//*18*//*19*//*20*//*21*//*22*/ |
Пояснение
В предложенном варианте реализации алгоритма пузырьковой сортировки возможна ситуация, когда массив уже отсортирован, но программа продолжает работать. Предложите улучшенный вариант программы.