Программирование на языке Си/§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();
    
}

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

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

и т.д.

  • Метод "пузырька"
#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 лекция будет чисто практической по изученному материалу.