Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие С(часть1-3).doc
Скачиваний:
23
Добавлен:
12.02.2015
Размер:
854.02 Кб
Скачать

Void main ()

{

const int N=100;

int a[N],n;

printf("Enter n< %d",N);

scanf("%d",&n);

printf("\nArray:\n");

for (int i=0;i<n;i++) //Генерируем массив случайных чисел в

//диапазоне [0..50] и выводим на экран

{

a[i]=rand()%51;

printf("%d%s",a[i]," ");

}

printf("\nSotr:\n");

bool f; int b;

do

{

f=false;

for(int i=0;i<n-1;i++)// Просматриваем весь массив

if (a[i]>a[i+1])

{

b=a[i];

a[i]=a[i+1];

a[i+1]=b;

f=true; //Был обмен

}

}

while (f); // Проверяем, был ли хоть один обмен

for (int i=0;i<n;i++) // Выводим на экран отсортированный

//массив

printf("%d%s",a[i]," ");

getch();

}

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

  1. Усовершенствованная пузырьковая сортировка. Используется принцип пузырьковой сортировки, но массив просматривается не от начала до конца, а от начала до последнего перемещенного элемента (после которого все элементы уже упорядочены). Вначале этим «последним» элементом выбирается последний элемент массива.

  2. Простой выбор. Выбрать наибольший элемент массива и поменять его местами с последним (n–ным) элементом массива. Затем из n–1 первых элементов опять выбрать наибольший и опять поменять его местами с (n–1)–м. И так далее, пока весь массив не будет упорядочен.

  3. Простые вставки. Так обычно сортируют карты: из веера карт берут одну, стоящую не по старшинству и помещают между двумя уже упорядоченными картами. Массив просматривают с начала до конца. Рассматривается i–тый элемент массива и вставляется на нужную позицию в ряду первых (i–1) уже упорядоченных элементов. (Первоначально “упорядочен” только первый элемент массива). Если i–тый элемент перемещается в j–тую позицию, то все элементы с j–того по (i–1)–ый элемент должны быть сдвинуты на одну позицию вправо.

  4. Метод подсчета. Если для какого–то элемента массива известно, что если он больше, чем i других элементов этого массива, то он должен стоять на (i+1)–ом месте после упорядочивания. Для каждого i–го элемента массива считают, сколько чисел меньше его, и результат заносят в массив индексов с[i]. Это делается следующим образом. Сравнивают попарно все элементы массива: i–тый и j–тый. (Одна пара чисел может сравниваться только один раз.) Если i–тый больше, то с[i] увеличивают на единицу, иначе c[j] увеличивают на единицу. После формирования массива индексов с, формируют результирующий массив.

  5. Метод распределяющего подсчета. Используется, если в массиве много одинаковых элементов. Создается массив индексов d[i]. Размерность массива – число различных между собой элементов исходного массива. Затем в элемент массива d[i] заносят количество элементов массива, равных i, и в результирующий массив записывают по d[i] элементов i–того типа. Например, исходный массив 0010101031; d[0]=5, d[1]=4, d[2]=0, d[3]=1. Результирующий массив 0000011113.

7.Функции

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

тип_функции имя_функции (спецификация_формальных_параметров) {тело_функции}

Здесь тип_функции – тип возвращаемого функцией значения, в том числе void, если функция не возвращает никакого значения. Тип функции может быть любым кроме массива и функции. Имя_функции – идентификатор. Спецификация_формальных_параметров может отсутствовать (но скобки обязательны) или представлять собой список спецификаций для каждого параметра, имеющий вид:

тип имя_параметра

или

тип имя_параметра= умалчиваемое значение.

Тело_функции – это блок или составной оператор, заключенный в скобки {}. Очень важным оператором тела функции является оператор возврата в точку вызова

return выражение;

или

return;.

Выражение в операторе return определяет возвращаемое функцией значение, именно то значение, которое будет результатом обращения к функции. Если функция имеет тип void, то этот оператор можно опустить.

Обращение к функции (вызов функции) – это выражение вида

имя_функции (список_фактических_параметров)

При обращении к функции формальные параметры заменяются фактическими, причем соблюдается строгое соответствие параметров по типам. Именно поэтому необходимо определить или хотя бы объявить функцию ее вызова. Объявление функции (прототип) совпадает с заголовком определения функции (описание функции без тела) после которого ставится ;. В списке формальных параметров в этом случае могут отсутствовать имена параметров.

Приведем несколько примеров.

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

# include <stdio.h>

# include <conio.h>