Программирование на языке Си/§6

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

## Программа 5.1

Напишем программу которая будит искать в массиве нужное нам значение

```
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int mas[N],zn,i,l=0;
/* введём массив*/
printf("введите массив\n");
for(i=0;i<5;i++)
scanf("%i",&mas[i]);
/*введём число которое нужно найти*/
printf("введите искомое значение\n");
scanf("%i",&zn);
/* начнём процедуру поиска нужного значения в массиве*/
i=0;
do //до тех пор пока
{
if(mas[i] == zn) // если искомое значение zn равно текущему элементу массива, то:
l=1; //l = 0
else //иначе
i++; // увеличиваем i на единицу, т.е. переходим к следующему элементу массива
}
while (l==0 && i<5); // выполняется условие l == 0 или i<5. т.е. пока мы не нашли нужный нам элемент или не закончился массив.
if(l==1) // если l=1, то
printf("число %i найдено в массиве под номером %i \n",zn, i+1);
else // иначе
printf("число не найдено в массиве\n");
getch();
}
```

В данном примере мы использовали идентификатор нахождения нужного нам значения "l", который мы задали сами. Если l имеет значение 1, поиск удачен. Иначе такого числа в массиве нет.

## Программа 5.2

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

```
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int mas[N],zn,i,l=0;
printf("Введите массив\n");
for(i=0;i<5;i++)
scanf("%i",&mas[i]);
printf("введите искомое число\n");
scanf("%i",&zn);
/* поиск в массиве*/
for(i=0;i<5;i++)
if(mas[i] == zn) // если искомое число есть в массиве, то
l++;
if(l)//l истинно, т.е. не равно нулю, то
printf("Число %i встречается в массиве %i раз \n",zn, l);
else // иначе
printf("net\n");
getch();
}
```

## Сортировка массива

Очень важно уметь сортировать элементы массива по заданным условиям. Одни из самых распространённых методов сортировки это метод прямого перебора и метод "пузырька" рассмотрим их:

- Метод прямого перебора

```
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int mas[N],zn,i,j,k, min;
/*ввод массива*/
printf("Введите массив\n");
for(i=0;i<5;i++)
scanf("%i",&mas[i]);
/*сортировка*/
for(i=0;i<4;i++)
{
/* поиск минимального элемента*/
min=i;
for(j=i+1;j<5;j++)
if(mas[j]<mas[min])
min=j;
/* меняем местами минимальное значение массива и текущее*/
zn=mas[i];
mas[i]=mas[min];
mas[min]=zn;
}
/*печать результата*/
for(k=0;k<5;k++)
printf("%i \n",mas[k]);
getch();
}
```

Мы уже рассматривали с вами и заполнение массива и поиск минимального значения в предыдущих лекциях. В этом же конкретном примере нас интересует непосредственно сортировка элементов массива. Она происходит очень просто:

- шаг. присваиваем min номер ячейки в массиве
- шаг. пробегаем по массиву, чтобы найти наименьший элемент
- шаг. Двигаем минимальное значение в начало массива
- шаг. присваиваем min номер следующей ячейки
- шаг. пробегаем по сокращённому массиву, т.е. без найденного во 2 шаге элемента. Находим минимальное значение
- шаг. ставим найденный минимум во вторую ячейку массива

и т.д.

- Метод "пузырька"

```
#include <stdio.h>
#include <stdlib.h>
#define N 10
int main()
{
int mas[N],zn,i,k; //где i счётчик циклов, k текущий номер ячейки массива
/*Ввод массива*/
printf("введите массив\n");
for(i=0;i<5;i++)
scanf("%i",&mas[i]);
/*сортировка*/
for(i=0;i<4;i++) //До те пор пока количество циклов не больше размерности массива, выполняем цикл:
{
for(k=0;k<4;k++) //До тех пор пока не переберём все элементы массива, выполняем цикл:
{
if(mas[k]<mas[k+1]) // если текущий элемент массива меньше следующего, то
{
/*меняем их местами*/
zn=mas[k];
mas[k]=mas[k+1];
mas[k+1]=zn;
}
}
}
/*печать результата*/
for(k=0;k<5;k++)
printf("%i \n",mas[k]);
getch();
}
```

Метод пузырька проанализируйте самостоятельно.

## Практикум

Напишите все приведённые выше программы. Проанализируйте их работу. Замените в программе 5.1 функцию do while функцией for.

## Домашнее задание

Повторите все предыдущие лекции. 7 лекция будит чисто практической по изученному материалу.