Линейный поиск в массиве. Часть 1

Самым простым вариантом поиска можно считать поиск элемента в простом, неупорядоченном массиве. Рассмотрим данный вопрос на примере решения нескольких задач, начиная с легких и заканчивая задачами потруднее. Теоретический материал будет даваться в контексте, буду привязывать его к конкретным примерам в комментариях.

Задача 1.

В первой строке задается одно натуральное число N, не превосходящее 1000 – размер массива. Во второй строке вводятся N чисел – элементы массива (целые числа, не превосходящие по модулю 1000). В третьей строке содержится одно целое число x , не превосходящее по модулю 1000. Вывести одно число – сколько раз встречается x в данном массиве.

Решение.

Инициализируем переменные и массив

var a, x, i, n:integer;  //объявляем переменные
mas: array[0..1000] of integer; // объявляем массив элементов целого типа
begin
readln(n);              //ввод количества элементов в массиве
for i:=1 to n do        // ввод значений элементов массива в количестве n штук
read(mas[i]);
readln(x);               //ввод эталонного значения
for i:=1 to n do        
      if mas[i]=x then a:=a+1;   // в цикле сравниваем каждый элемент массива с эталоном, если условие выполняется, к переменной a прибавляется 1
 writeln(a);               //выводим количество совпадений
end.

Задача 2

В первой строке задается одно натуральное число N, не превосходящее 1000 – размер массива. Во второй строке вводятся N чисел – элементы массива (целые числа, не превосходящие по модулю 1000). В третьей строке содержится одно целое число x , не превосходящее по модулю 1000.  Вывести YES , если число x встречается в данном массиве, и NO в противном случае.

Решение.
Решение аналогично первой задаче, но есть кое что интересное. Посмотрим на код программы:

var a, x, i, n:integer;  //объявляем переменные
mas: array[0..1000] of integer; // объявляем массив элементов целого типа
begin
readln(n);              //ввод количества элементов в массиве
for i:=1 to n do        // ввод значений элементов массива в количестве n штук
read(mas[i]);
readln(x);               //ввод эталонного значения
for i:=1 to n do
if mas[i]=x then a:=a+1
else a:=a+0;
if a=0 then writeln('NO') else writeln('YES');
end.

Зачем, скажете вы, переменная а. Почему бы не написать так:

if mas[i]=x then writeln('YES')
else writeln('NO')

Вот что мы получим при этом:

5
35578
5
NO
YES
YES
NO
YES

Команда Write будет выполняться столько раз, сколько будет выполняться цикл.

Мне кажется, что используя переменную а, решение получилось достаточно красивым. Если переменная равна нулю, значит совпадений не было, если больше нуля, значит были. Логика проста. Если есть другие варианты — пишите в комментариях.

Задача 3.

В первой строке задается одно натуральное число N, не превосходящее 1000 – размер массива. Во второй строке вводятся N чисел – элементы массива (целые числа, не превосходящие по модулю 1000). В третьей строке содержится одно целое число x , не превосходящее по модулю 1000. Вывести номера элементов, равных данному, в порядке возрастания. Если таких элементов нет, ничего выводить не нужно.

Решение

var a, x, i, n:integer; //объявляем переменные
mas: array[0..1000] of integer; // объявляем массив элементов целого типа
begin
readln(n); //ввод количества элементов в массиве
for i:=1 to n do // ввод значений элементов массива в количестве n штук
read(mas[i]);
readln(x); //ввод эталонного значения
for i:=1 to n do
if mas[i]=x then write(i, ' '); // в цикле сравниваем каждый элемент массива с эталоном, если условие выполняется, выводим индекс элемента массива с пробелом
end.

Я думаю, без комментариев.

Задача 4 (Максимальный элемент массива)

В первой строке задается одно натуральное число N, не превосходящее 1000 – размер массива. Во второй строке вводятся N чисел – элементы массива (целые числа, не превосходящие по модулю 1000). Вывести одно число – значение максимального элемента в массиве.

Решение.

var max, i, n:integer; //объявляем переменные
mas: array[0..1000] of integer; // объявляем массив элементов целого типа
begin
readln(n); //ввод количества элементов в массиве
for i:=1 to n do // ввод значений элементов массива в количестве n штук
read(mas[i]);
max:=mas[1];  //присваиваем переменной max значение первого элемента массива
for i:=2 to n do
 if mas[i]>max then max:=mas[i]; // если найдется такой элемент массива, который больше чем max, значение max изменится на новое
writeln(max);
end.

Выделенный фрагмент — классический алгоритм поиска наибольшего значения. Алгоритм поиска наименьшего значения попробуйте составить сами.

Другие задачи, более сложные, на тему линейного поиска и сортировки смотрите в следующих выпусках

Andrey K

Share
Published by
Andrey K

Recent Posts

Решение задачи №6 и задачи №22 ЕГЭ по информатике 2021

Настала пора написать серию мини-обучалок по решению задач ЕГЭ по информатике версии 2021 года. В…

4 года ago

Внеурочное занятие по информатике. Пишем игру «Поле чудес» на Python.

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

5 лет ago

Основные алгоритмы в помощь школьнику. Часть 1

Рассмотрим набор наиболее часто встречающихся задач на программирование в школьном курсе информатики. Добавляйте свои задачи…

6 лет ago

Школьный тур Всероссийской олимпиады школьников по информатике 9-11 класс (2018-2019). Разбор задач. Часть 2

В прошлый раз мы разобрали первые две задачи школьного тура Всероссийской олимпиады школьников, проводимой в…

6 лет ago

Школьный тур Всероссийской олимпиады школьников по информатике 9-11 класс (2018-2019). Разбор задач. Часть 1

Закончился школьный тур Всероссийской олимпиады школьников. Разберем первую и вторую задачи тура, проводимого в московских…

6 лет ago

Школьный этап Всероссийской олимпиады школьников по информатике 2017 (9-11 классы). Задача №4. «Плацкартный вагон»

Задача. В плацкартном вагоне 54 места, пронумерованных числами от 1 до 54. Вагон разбит на 9…

7 лет ago