Показаны сообщения с ярлыком Массив. Показать все сообщения
Показаны сообщения с ярлыком Массив. Показать все сообщения

20.11.2023

Срезы в PascalABC.NET (примеры использования в задачах)

Срез - это набор элементов списка, массива или строки.

Приведем в пример программу, демонстрирующую срезы в PascalABC.NET, а также решения задач с использованием срезов.

begin

  var a:=Arr(10, 11, 12, 13, 14, 15, 16, 17, 18);

  a.Println(); // вывод массива // [10, 11, 12, 13, 14, 15, 16, 17, 18]

  a[1:3].Println(); // срез по индексам [1, 3) с шагом 1 // [11, 12]

  a[2:8:3].println(); // срез по индексам [2, 8) с шагом 3 // [12, 15]

  a[7:2:-1].Println(); // срез по индексам [7, 2) с шагом -1 // [17, 16, 15, 14, 13]

  a[::-1].Println(); // реверс массива

 end.

 Задача 1. В массиве удалить каждый второй элемент.

  Пусть имеется массив [12, 13, 14, 15, 16]

  Результат [12, 14, 16]

begin

   var a:=Arr(12, 13, 14, 15, 16);

   a:=a[::2];

   a.Println();

end.

Задача 2. В массиве найти минимальный элемент среди элементов, у которых индексы кратны 3.

 Пусть имеется массив [100, 12, 14, 23, 45, 200, 27, 21]

 То есть среди элементов 100, 23, 27 найти минимальный.

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var m:=a[0::3].Min;

  println(m);

end.

Задача 3. В массиве удалить элемент с индексом k (k меньше количества элементов массива).

begin

  var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//k зададим случайно

  if k < a.Length-1 then a:=a[:k]+a[k+1:]

                     else a:=a[:a.Length-1];

  a.Println;

  println('удалили элемент с индексом ',k);

end.

Задача 4. В массив вставить элемент на место с индексом k (k меньше количества элементов массива).

begin

var a:=Arr(100, 12, 14, 23, 45, 200, 27, 21);

  var k:=random(a.Length);//зададим случайно

  setlength(a, a.Length);

  var d:=Random(100); //число зададим случайно

  if k < a.Length then a:=a[:k] + Arr(d) + a[k:]

                  else a:=a[:a.Length-1] + Arr(d);

  a.Println;

  println('вставили число ',d,' на место с индексом ',k);

end.


Динамические массивы в Паскале

Читать

Найти число пар соседних элементов массива, оканчивающихся нулем. Язык Паскаль.

Читать

Найти максимум/минимум в массиве. Программа на языке Паскаль.

Читать

Массивы в языке Паскаль. Решение задач. 8 класс (сумма, произведение, среднее арифметическое, минимум/максимум с условием)

Читать

Язык Паскаль. Найти количество различных чисел в массиве из N элементов (2 способа решения)

Читать

14.03.2023

Найти число пар соседних элементов массива, оканчивающихся нулем. Язык Паскаль. PascalABC.NET

 В этой публикации разберем задачу о парах соседних элементов массива.

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

Пусть дан массив a из 5 элементов:

4, 10, 20, 80, 10

Все пары соседних элементов это:

4 и 10

10 и 20

20 и 80

80 и 10

Три пары соседних элементов, в которых оба числа оканчиваются на 0.

Если ввести нумерацию ячеек с 1, то обращение к парам будет таким:

a[1] и a[2]

a[2] и a[3]

a[3] и a[4]

a[4] и a[5]

Заметим, что всего пар соседних элементов четыре.

Если всего элементов в массиве будет 6, то пар будет 5.

В общем случае если число элементов массива N, то пар соседних элементов N-1.

Если ввести счетчик пар k, то обращение к парам будет таким:

a[k] и a[k+1]

Чтобы обратиться ко всем парам, нужно запустить цикл по всем парам, то есть от первой до последней:

for k:=1 to N-1 do

Как будем решать задачу

  • Сформируем массив целых чисел из N элементов случайным образом (возьмем диапазон от 10 до 30)
  • Выведем массив
  • Обратимся ко всем парам соседних элементов массива и будем узнавать, каждое ли число из пары оканчивается цифрой 0, если да, то будем копить счетчик искомых пар p.

if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

Публикация про последнюю цифру числа (читать).

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer;

    k,p,N:integer;

begin

  print('Введите количество элементов массива:');

  readln(N);

  for k:=1 to N do

  begin

    a[k]:=random(10,30);

    print(a[k]);

  end;

  println;

  p:=0;

  for k:=1 to N-1 do

  begin

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

  print('количество пар соседних элементов, оканчивающихся цифрой 0:',p);

end.

Результат запуска программы

Пары соседних элементов массива, оканчивающихся цифрой 0

В нашем примере получилось две пары, это числа 10 и 10, 20 и 30.

Для проверки можно выводить все пары соседних элементов:

for k:=1 to N-1 do

  begin

    println(a[k],a[k+1]);

    if (a[k] mod 10 = 0) and (a[k+1] mod 10=0) then p:=p+1;

  end;

Пары соседних элементов массива

28.02.2023

Найти максимум/минимум в массиве. Программа на языке Паскаль. PascalABC.NET

 Задача. Дан массив целых чисел из N элементов. Найти максимум.

Максимум - это самое большое число, сохраненное в массиве.

Алгоритм поиска заключается в следующем:

  • за начальное значение максимума взять самое маленькое число, которое может быть сохранено в массиве;
  • обращаясь к каждому элементу массива выполнять проверку: значение элемента больше, чем значение максимума, если да, что значение максимума заменить на значение элемента.

Предположим, что в массиве a из N элементов могут храниться числа из промежутка от 1 до 100. Заполним массив случайными числами (прочитать статью "Сформировать массив случайных чисел")

За начальное значение максимума возьмем число 1:

m:=1;

Осуществим обращение к каждому элементу массива оператором цикла:

for k:=1 to N do

begin

обращение к элементу a[k]

end;

Выполнять проверку и изменение максимума будем оператором:

if a[k]>m then m:=a[k];

Программа решения задачи на языке Паскаль

var a:array[1..30] of integer;

    N,k,m:integer;

begin

  print('Введите количество элементов массива N =');

  readln(N);

  println('Массив чисел');

  m:=1;

  for k:=1 to N do

  begin

    a[k]:=random(1,100);

    print(a[k]);

    if a[k]>m then m:=a[k];

  end;

  println;

  println('Максимум в массиве:',m);

end.

Результат запуска программы

Максимум в массиве. Паскаль

Для наглядности можно выводить текущее значение максимума в цикле.

Максимум в массиве. Паскаль

Для поиска минимума начальное значение следует взять за самое большое число в массиве (в нашем случае это число 100). А проверка условия и изменение минимума будет таким:

if a[k]<m then m:=a[k];

08.02.2023

Массивы в языке Паскаль. Решение задач. 8 класс (сумма, произведение, среднее арифметическое, минимум/максимум с условием)

Список задач для решения

Задача 1. Дан целочисленный массив из N элементов. Элементы массива могут принимать целые значения от 0 до 100. Найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0. 

Задача 2. Дан массив, содержащий N неотрицательных целых чисел, не превышающих 10 000. Найти и вывести сумму всех содержащихся в массиве трёхзначных чисел, которые оканчиваются на 9, но не на 99. 

Задача 3. Дан целочисленный массив из N элементов. Элементы массива могут принимать значения от –1000 до 1000. Найти среднее арифметическое всех элементов массива, оканчивающихся цифрой 5. Гарантируется, что хотя бы один такое элемент в массиве есть.
 
Задача 4. Дан целочисленный массив из N элементов, все элементы которого – целые числа в интервале от -1000 до 1000. Найти минимальное значение из всех нечетных элементов массива, которые делятся на 5. Гарантируется, что хотя бы один такой элемент существует. 

Задача 5. Дан целочисленный массив из N элементов, все элементы которого – неотрицательные числа, не превосходящие 10 000. Найти минимальное трехзначное число, записанное в этом массиве, если таких чисел нет, нужно вывести сообщение "Таких чисел нет".

Программы решений

Задача 1. Дан целочисленный массив из N элементов. Элементы массива могут принимать целые значения от 0 до 100. Найти и вывести произведение элементов массива, которые имеют чётное значение и не оканчиваются на 0. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не оканчиваются на 0.

Сформируем массив случайным образом так, чтобы значения элементов были равны числам от 0 до 100 и выведем массив на экран.

for k:=1 to N do

begin

 a[k]:=random(0,100);

print(a[k]);

end;

Произведение элементов примем за 1. Пройдем циклом по массиву и проверим: не оканчивается ли элемент на 0, и является ли он четным.

p:=1;

for k:=1 to N do

begin

if (a[k] mod 10 <> 0) and (a[k] mod 2=0) then p:=p*a[k];

end;

print(p);

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer; N,k,p:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,100):

     print(a[k]);

    end;

    p:=1;

   for k:=1 to N do

    begin

     if (a[k] mod 10 <> 0) and (a[k] mod 2=0) then p:=p*a[k];

    end;

  print('Произведение четных элементов, не оканчивающихся на 0',p);

end.

Задача 2. Дан массив, содержащий N неотрицательных целых чисел, не превышающих 10 000. Найти и вывести сумму всех содержащихся в массиве трёхзначных чисел, которые оканчиваются на 9, но не на 99. 

Сформируем массив случайным образом так, чтобы значения элементов были равны числам от 0 до 10000 и выведем массив на экран.

for k:=1 to N do

begin

 a[k]:=random(0,10000);

print(a[k]);

end;

Сумму элементов примем за 0. Пройдем циклом по массиву и проверим: является ли элемент трехзначным числом, оканчивающимся на 9, но не на 99.

s:=0;

for k:=1 to N do

  begin

   if (a[k]>=100) and (a[k]<=999) and (a[k] mod 10=9) and (a[k] mod 100<>99) then s:=s+a[k];

  end;

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer; N,k,s:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,10000):

     print(a[k]);

    end;

   s:=0;

   for k:=1 to N do

    begin

     if (a[k]>=100) and (a[k]<=999) and (a[k] mod 10=9) and (a[k] mod 100<>99) then s:=s+a[k];

    end;

  print('Сумма элементов',s);

end.

Задача 3. Дан целочисленный массив из N элементов. Элементы массива могут принимать значения от –1000 до 1000. Найти среднее арифметическое всех элементов массива, оканчивающихся цифрой 5. Гарантируется, что хотя бы один такое элемент в массиве есть.

 Для вычисления среднего арифметического значения элементов, оканчивающихся цифрой 5, необходимо найти сумму таких элементов и их количество. Поскольку числа могут быть отрицательными, следует взять модуль числа при проверке abs(a[k]).

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer; N,k,s,t:integer;

Sr:real;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(-1000,1000):

     print(a[k]);

    end;

   s:=0; t:=0;

   for k:=1 to N do

    begin

    if abs(a[k]) mod 10 = 5 then

        begin

         s:=s+a[k];

         t:=t+1;

        end;

    end;

  sr:=s/t;

  print('Среднее арифметическое элементов, оканчивающихся на 5',Sr);

end.

Задача 4. Дан целочисленный массив из N элементов, все элементы которого – целые числа в интервале от -1000 до 1000. Найти минимальное значение из всех нечетных элементов массива, которые делятся на 5. Гарантируется, что хотя бы один такой элемент существует. 

Поскольку есть гарантия, что такой элемент в массиве есть, то за искомый минимум возьмем самое большое возможное число 1000.

Программа решения задачи на языке Паскаль

var a:array[1..100] of integer; N,k,m:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(-1000,1000):

     print(a[k]);

    end;

   m:=1000;

   for k:=1 to N do

    begin

    if (a[k] mod 2<>0) and (a[k] mod 5 = 0) and (a[k]<m) then m:=a[k];     

    end;

  print('Минимальный нечетный элемент, кратный 5',m);

end.

Задача 5. Дан целочисленный массив из N элементов, все элементы которого – неотрицательные числа, не превосходящие 10 000. Найти минимальное трехзначное число, записанное в этом массиве, если таких чисел нет, нужно вывести сообщение "Таких чисел нет".

За начальное значение минимума возьмем число -1 (число, которое не может присутствовать в массиве). Поскольку гарантии того, что трехзначное число присутствует в массиве, нет, то для дальнейшего поиска такого минимума, за его значение возьмем любое трехзначное число в массиве. 

Если после поиска значение минимума осталось равно -1, значит трехзначных чисел в массиве нет.

var a:array[1..100] of integer; N,k,m:integer;

begin 

   readln(N);

   for k:=1 to N do

    begin

     a[k]:=random(0,10000):

     print(a[k]);

    end;

   m:=-1;//число -1 выступает признаком того, что трехзначных чисел в массиве нет

   for k:=1 to N do

    begin

    if (a[k]>99) and (a[k]<1000) then m:=a[k];     

    end;

   for k:=1 to N do

    begin

    if (a[k]>99) and (a[k]<1000) and (a[k]<m) then m:=a[k];     

    end;

   if m=-1 then print('Таких чисел нет') else print('Минимальное трехзначное число',m);

end.

В решении задач с использованием массивов можно выделить следующие этапы:

  • формирование массива (ввод с клавиатуры или случайно)
  • вывод массива на экран
  • обработка массива
Каждый этап требует своего цикла для обращения к каждому элементу массива.

18.10.2022

Язык Паскаль. PascalABC.NET. Массивы. Методы Where, Sum, Max

Задача. Дан массив целых чисел из N элементов. Верно ли, что сумма чисел, оканчивающихся на 7, меньше утроенного максимального нечетного значения?

Пример:

Массив mas = [29, -17, 7, 24, 27, 54]

Сумма чисел, оканчивающихся на 7: -17+7+27 = 17

Максимальное нечетное значение: 29

17 < 3*29, то есть 17 < 87, да, верно.

Как будем решать задачу

Опишем массив в блоке Var

var mas:array of integer;

Выделим N ячеек для хранения данных в массиве:

setLength(mas,N);

Введем данные с клавиатуры и сохраним в массиве:

for k:=0 to mas.Length-1 do

  begin

    readln(mas[k]);

  end;

Нумерация ячеек при таком объявлении ведется с 0 и, номер последней ячейки можно вычислить так: mas.length - 1, где mas.length это длина массива.

Найдем элементы, оканчивающиеся на 7: mas.Where(k->abs(k) mod 10 = 7)

Метод Where (где) находит элементы массива, удовлетворяющие условию.

В нашем случае условие такое: abs(k) mod 10 = 7  (модуль числа применяем для того, чтобы обработать в том числе и отрицательные числа).

Результатом работы метода Where является набор тех элементов, которые отвечают условию. Для решения нашей задачи нужно найденные элементы суммировать. Сделаем это методом Sum:

mas.Where(k->abs(k) mod 10 = 7).Sum

Найденное значение сохраним в переменной s.

s:=mas.Where(k->abs(k) mod 10 = 7).Sum;

Таким же образом будем находить нечетные значения в массиве, а затем применим метод Max:

mas.Where(k->k mod 2 <> 0).Max

Найденное значение сохраним в переменной m.

m:=mas.Where(k->k mod 2 <> 0).Max;

Выполним проверку: если s<m*3, то верно, иначе неверно.

Программа решения задачи на языке Паскаль

var mas:array of integer;

    s,m,N,k:integer;

begin

  readln(N);

  setLength(mas,N);

  for k:=0 to mas.Length-1 do

  begin

    readln(mas[k]);

  end;

  s:=mas.Where(k->abs(k) mod 10=7).Sum;

  m:=mas.Where(k->k mod 2<>0).Max;

  if s<m*3 then println('Верно') else println('Неверно');

end.

Результат запуска программы

Результат запуска программы

Объявление и методы динамических массивов (читать)


28.07.2022

Язык Паскаль. Наибольший общий делитель двух натуральных чисел НОД(m,n)

Приведем 3 программы поиска наибольшего общего делителя двух натуральных чисел, основанных на:

  • алгоритме Евклида
  • перебора возможных делителей числа
  • разложения чисел на простые множители

Что такое наибольший общий делитель двух натуральных чисел m и n, или НОД(m, n)

НОД двух натуральных чисел - это такое наибольшее натуральное число, которое одновременно делит без остатка оба этих числа.

Алгоритм Евклида

Евклид - древнегреческий математик, геометр, автор первого из дошедших до нас теоретических трактатов по математике.

Алгоритм Евклида - один из наиболее ранних численных алгоритмов в истории. Евклид впервые дал описание этого алгоритма в книгах «Начала». Изначально этот алгоритм назывался «взаимным вычитанием», так как его принцип заключался в последовательном вычитании из большего числа меньшего, пока в результате не получится ноль.

Сформулируем алгоритм

Пусть даны два натуральных числа m и n. Пока числа m и n не равны (или их разница не равна 0), большее число заменить их разницей. В качестве ответа взять любое из чисел.

Пример:

Пусть m = 12, n = 18

12<>18, n = 18 - 12 = 6

12<>6, m = 12 - 6 = 6

6<>6, НОД(12, 18) = 6

Программа на языке программирования Паскаль (алгоритм Евклида)

var m, n:integer;

begin

  writeln('Введите два натуральных числа m и n:');  

  readln(m,n);

  while m<>n do

  begin

    if m>n then m:=m-n

           else n:=n-m;

  end;

  writeln('НОД(m,n): ',m);

end.

Результат запуска программы

Результат запуска программы

Перебор возможных делителей числа

Будем использовать алгоритм, разобранный ранее в этом блоге.

Запустим цикл for с счетчиком k от 1 до n, будем проверять условие: если число n делится на значение счетчика k без остатка (n mod k = 0), то значение счетчика k - это делитель числа n, значение k можно вывести на экран или сохранить в отдельной переменной.

Поскольку нам нужен наибольший общий делитель чисел m и n, поэтому запустим цикл до минимального из чисел m и n (другое будет лишним), и будем проверять условие: если число m делится на значение счетчика цикла k без остатка и число n делится на значение счетчика цикла k без остатка одновременно (воспользуемся операцией and), это и будет их общий делитель.

Программа на языке программирования Паскаль (перебор возможных делителей числа)

var m, n, k, p:integer;

begin

  writeln('Введите два натуральных числа m и n:');

  readln(m,n);

  for k:=1 to min(m,n) do 

  begin

    if (m mod k = 0) and (n mod k=0) then p:=k;

  end;

  writeln('НОД(m,n): ',p);

end.

Функция min будет работать в PascalABC.NET, в случае использования другой среды, нужно до цикла определить наибольшее число из m и n.

Разложение чисел на простые множители

Ранее мы разбирали алгоритм разложения натурального числа на простые множители. 

Как связаны простые множители числа и НОД. Приведем пример.

Пусть m = 18,  n = 12

Выполним разложение на простые множители.

Множители числа m: 2 3 3

Множители числа n: 2 2 3

Выделим их общие простые множители - это числа 2 и 3. В качестве наибольшего общего делителя нужно взять из произведение: 2 * 3 = 6. НОД(12, 18) = 6.

Пусть m = 36,  n = 48

Множители числа m: 2 2 3 3

Множители числа n: 2 2 2 2 3

Общие простые множители - это числа 2 2 3. Произведение этих множителей равно 12. НОД(36, 48) = 12.

Для нахождения НОД двух чисел нужно выполнить их разложение на простые множители и в качестве ответа взять произведение их общих множителей.

Как будем решать задачу

Для хранения множителей числа воспользуемся списком (PascalABC.NET), в него легко добавлять значение командой add.

Описание списка с именем nod в блоке var

var nod:List<integer>;

Создание нового пустого списка в теле программы

nod:=new List<integer>;

Добавление значения в конец списка

nod.add(значение);

Создадим два списка (s1 и s2) для хранения множителей числа m и n соответственно. С помощью конструкции вложенных циклов переберем все элементы списков и сравним на равенство, если множители равны, сохраним их в списке nod, а значения элементов списков сделаем равными -1 и -2 соответственно (чтобы далее их повторное сравнение на равенство было ложным) . В качестве ответа возьмем произведение элементов списка nod командой nod.Product.

Программа на языке программирования Паскаль (разложение чисел на простые множители)

var

  m, n, k1, k2: integer;      

  s1, s2, nod: List<integer>;


begin

  writeln('Введите два натуральных числа m и n:');   

  readln(m, n);  

  s1 := new List<integer>; 

  s2 := new List<integer>; 

  nod := new List<integer>;

  k1 := 2; k2 := 2;  

  while (m > 1) or (n > 1) do   

  begin

    while m mod k1 = 0 do     

    begin

      m := m div k1;      

      s1.Add(k1); //добавить значение в список можно и так: s1+=k1;

    end;     

    k1 += 1;     

    while n mod k2 = 0 do    

    begin

      n := n div k2;       

      s2.Add(k2);     

    end;     

    k2 += 1;   

  end;   

  //writeln(s1, s2); 

  for k1:=0 to s1.Count-1 do //элементы списка нумеруются с 0, длина списка s1.count

    for k2:=0 to s2.Count-1 do

      if s1[k1]=s2[k2] then //s1[k1] - обращение к элементу списка по его номеру

        begin 

        nod.Add(s1[k1]);

        s1[k1]:=-1;

        s2[k2]:=-2;

        end;

  //println(s1,s2,nod);

  println('НОД(m,n): ',nod.Product);

end.

Это программа состоит из самого большого количества строк. Насколько она эффективна?

Задача на применение НОД

Даны числа: a = 23 • 310 • 5 • 72 , b = 25 • 3 • 11. Чему равен  НОД (a,b)?

27.06.2022

Язык Паскаль. Найти количество различных чисел в массиве из N элементов (2 способа решения)

Задача. Найти количество различных чисел в массиве из N элементов.

Как будем решать задачу (2 способа)

для хранения уникальных значений исходного массива будем использовать:
  1. новый массив 
  2. множество 

Способ 1

Сформируем массив a случайных чисел из диапазона от 0 до 20.

Заведем массив b и заполним все его ячейки числами -1.

Переменной j присвоим значение 0.

В цикле для k от 1 до n:

  1. Присвоим флагу f значение true, это будет означать, что ячейка a[k] хранит уникальное значение, и его нет в массиве b.
  2. В цикле для s от 1 до j сравним значение a[k] со значениями массива b (a[k]=b[s]), если условие верно, флагу присвоим значение false.
  3. Если флаг не поменял значение true на false и хранит значение true, счетчик j увеличим на 1 и сохраним в ячейке b[j] значение a[k].

В итоге переменная j будет хранить количество измененных ячеек массива b - количество различных элементов исходного массива.

Программа решения задачи на языке Паскаль (способ 1)

const n = 10;

var a,b:array[1..n] of integer;

    k,s,j:integer;

    f:boolean;

begin

  write('Исходный массив: ');

  for k:=1 to n do

  begin

    a[k]:=random(21); write(a[k],' ');

    b[k]:=-1;

  end;

  j:=0;

  for k:=1 to n do

  begin

    f:=true; //элемента a[k] нет в массиве b

    for s:=1 to j do if a[k]=b[s] then f:=false;

    if f then begin j+=1; b[j]:=a[k]; end;

  end;

  writeln;

  write('Неповторяющиеся числа: ');

  for k:=1 to j do write(b[k],' ');

  writeln;

  writeln('Количество различных чисел: ',j);

end.

Способ 2

Заведем пустое множество m.

Сформируем массив a случайных чисел из диапазона от 0 до 20. 

В цикле для k от 1 до n:

  1. если значение a[k] нет в множестве m, увеличим счетчик j на 1,
  2. добавим значение a[k] в множество m.

В итоге переменная j будет хранить длину сформированного множества, то есть количество различных значений исходного массива

В цикле  foreach k in m do (для каждого k, имеющегося в множестве m) выведем значения, сохраненные в множестве m.

Программа решения задачи на языке Паскаль (способ 2)

const n = 10;

var a:array[1..n] of integer;

    k,j:integer;

    m:set of integer;

begin

  m:=[];

  j:=0;

  write('Исходный массив: ');

  for k:=1 to n do

  begin

    a[k]:=random(21); write(a[k],' ');

    if not(a[k] in m) then j+=1; 

    m:=m+[a[k]];

  end;

  writeln;

  write('Неповторяющиеся числа: ');

 foreach k in m do write(k,' ');

  writeln;

  writeln('Количество различных чисел: ',j);

end.

Результат запуска программы

Результат запуска программы

Если значительно увеличить количество элементов массива a, какая программа будет искать различные числа более эффективно (быстро)?

25.05.2022

Динамические массивы в Паскале (объявление, методы)

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

  • println
  • count
  • countof
  • where
  • sum
  • max
  • min
  • fill
  • sort
  • sortDescending
  • length
  • setLength

Для наглядности после выполнения действий будем выводить на экран массив или информацию о массиве.

Программа на языке Паскаль

var a,b:array of integer; //a и b массивы целых чисел

k:integer;

begin

  a:=new integer[20]; //выделение памяти из 20 ячеек, нумерация ячеек с 0

  println(a); //вывод массива на экран в виде списка

  a.Println; //вывод значений массива

  for k:=0 to a.Length-1 do //a.length - возвращает длину массива

    a[k]:=1+k*10;

  println(a);

  a.Where(k->k>100).Println; //вывод значений массива более 100

  a.CountOf(81).Println; //подсчет и вывод количества значений массива, равных 81

  a.Count(k->k mod 11=0).Println; //подсчет и вывод количества значений массива, кратных 11

  a.Where(k->(k mod 3=0)or(k mod 11=0)).Println; //вывод значений массива, кратных 3

  a.Sum.Println; //подсчет и вывод суммы значений массива

  a.Where(k->k mod 3=0).Sum.Println; //подсчет и вывод суммы значений массива, кратных 3

  a[0:5].println; //вывод среза массива с 0 по 4 индексы

  b:=a[:4]; //срез от начала массива до индекса 3

  b.println;

  b:=a[5:]; //срез от 5 индекса до конца массива

  b.println;

  a.Max.println; //максимум 

  a.Min.Println; //минимум

  a.SortDescending; //сортировка массива по убыванию

  a.Println;

  a.Sort(); //сортировка массива по возрастанию

  a.Println;

  setlength(a,a.length-18);//уменьшение длины массива на 18 ячеек

  a.Println;

  a.Fill(2); //заполнение массива значениями 2

  a.Println;

end.

Результат запуска программы

Динамические массивы


27.03.2022

Язык Паскаль. Как найти номер минимального элемента массива

Минимум в некоторой последовательности чисел это наименьшее значение. Например, среди чисел последовательности 431, 85, 200, 125 минимумом является число 85. Если числа последовательности сохранить в массиве, то можно найти номер минимального элемента массива. 

Сохраним числа в массиве: a[1]=431, a[2]=85, a[3]=200, a[4]=125.

Минимум хранится в ячейке с номером 2, значит номер минимального элемента это число 2. 

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

Будем считать, что в массиве хранятся целые числа, диапазон значений не известен.

Исходные данные: a – массив целых чисел

Выходные данные: min – минимальный элемент, kmin – номер минимального элемента массива

За  начальное значение минимума min возьмем значение первого элемента, тогда за номер минимального элемента kmin возьмем номер 1.

Далее будем сравнивать каждый элемент массива со значением min, если a[k]<min, то перезапишем значение min на значение a[k], а значение kmin на значение k.

Программа решения на языке Паскаль

var a:array[1..10] of integer;

    k,min,kmin:integer;

begin

  for k:=1 to 10 do

  begin

    read(a[k]);

  end;

  min:=a[1];

  kmin:=1;

  for k:=2 to 10 do

  begin

    if a[k]<min then

    begin

      min:=a[k];

      kmin:=k;

    end;

  end;

  writeln('Минимальный элемент ',min);

  writeln('Номер минимального элемента массива ',kmin);

end.

Результат выполнения программы

Как найти номер минимального элемента массива

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

Еще одна программа

Теперь не будем сохранять само минимальное значение, а будем пользоваться номером минимального элемента.

За номер минимального элемента kmin возьмем 1. Далее будем сравнивать a[k]<a[kmin], в случае истины, будем перезаписывать kmin на k.

Программа решения на языке Паскаль

var a:array[1..10] of integer;

    k,min,kmin:integer;

begin

  for k:=1 to 10 do

  begin

    read(a[k]);

  end;

  kmin:=1;

  for k:=2 to 10 do

  begin

    if a[k]<a[kmin] then

    begin

      kmin:=k;

    end;

  end;

  writeln('Минимальный элемент ',a[kmin]);

  writeln('Номер минимального элемента массива ',kmin);

end.

Еще одна программа с применением методов последовательностей PascalABC.NET

a.min – определяет минимальное значение в массиве

a.indexof(a.min) – определяет номер элемента, равного минимальному

Массив описан как динамический (не указываются номера элементов, нумерация начинается с 0). Оператор setlength(a,10) выделяет память под массив (десять ячеек).

var a:array of integer;

    k:integer;

begin

  setlength(a,10);

  for k:=0 to 10-1 do

  begin

    read(a[k]);

  end;

  writeln('Минимальный элемент ',a.min);

  writeln('Номер минимального элемента массива ',a.indexof(a.min));

end.

Как еще можно найти номер минимального элемента массива? 

Предложите свои способы. 

Читайте также:

09.03.2022

Массивы в языке Паскаль (примеры, задачи, решения)

 В этой публикации приведем примеры задач с решениями на языке Паскаль по теме "Массив".

Задачи:

  1. Дан массив из 10 целых чисел. Найти сумму элементов, кратных данному числу k.
  2. Дан массив из N элементов. Найти количество элементов, равных максимальному.
  3. Дан массив из N элементов. Найти среднее значение положительных элементов.

Задача 1. Дан массив из 10 целых чисел. Найти сумму элементов, кратных данному числу k.

Исходные данные: a - массив 10 целых чисел (тип array); k - целое число (тип integer)

Выходные данные: sum - сумма элементов, кратных числу k

Как будем решать задачу:

  • Введем массив 10 целых чисел оператором цикла for  с счетчиком от 1 до 10.
  • Введем число k
  • Обнулим сумму sum
  • В цикле for будем проверять, делится ли число, хранящееся в ячейке (элемент массива) на число k, если да, то будем этот элемент добавлять в сумму sum.
  • Выведем значение sum на экран.

Программа решения задачи на языке Паскаль:

var a:array[1..10] of integer;

    k,sum,j:integer;

begin

  writeln('Введите массив 10 целых чисел');

  for j:=1 to 10 do

  begin

    readln(a[j]);

  end;

  write('Введите число k=');

  readln(k);

  sum:=0;

  for j:=1 to 10 do

  begin

    if a[j] mod k = 0 then sum:=sum+a[j];

  end;

  writeln('Сумма элементов, кратных числу ',k,': ',sum);

end.

Программа решения задачи на языке Паскаль

С использованием методов для последовательностей в PascalABC.NET (версия 3.8.2)

var a:array[1..10] of integer;

    k,s,j,x:integer;

begin

  writeln('Введите массив 10 целых чисел');

  for j:=1 to 10 do

  begin

    readln(a[j]);

  end;

  write('Введите число k=');

  readln(k);

  s:=a.Where(x -> x mod k = 0).sum;

  writeln('Сумма элементов, кратных числу ',k,': ',s);

end.

Задача 2. Дан массив из N элементов. Найти количество элементов, равных максимальному.

Исходные данные: N - количество элементов массива (тип integer); a - массив N целых чисел (тип array)

Промежуточные данные: m - максимальное значение (тип integer)

Выходные данные: k - количество элементов, равных максимальному (тип integer)

Как будем решать задачу

  • Введем число N
  • Введем массив из N элементов
  • Найдем максимальное значение
  • Найдем количество элементов, равных максимальному значению.

Программа решения задачи на языке Паскаль:

var a:array[1..10] of integer;

    k,m,j,N:integer;

begin

  writeln('Введите количество элементов массива');

  readln(N);

  writeln('Введите массив целых чисел');

  for j:=1 to N do

  begin

    readln(a[j]);

  end;

  m:=a[1];

  for j:=2 to N do

  begin

    if a[j]>m then m:=a[j];

  end;

  k:=0;

  for j:=1 to N do

  begin

    if a[j]=m then k:=k+1;

  end;

  writeln('Количество элементов, равных максимальному k=',k);

end.

Программа решения задачи на языке Паскаль

С использованием методов для последовательностей в PascalABC.NET (версия 3.8.2)

var a:array of integer;

    k,m,j,N:integer;

begin

  writeln('Введите количество элементов массива');

  readln(N);

  setlength(a,N);

  writeln('Введите массив целых чисел');

  for j:=0 to N-1 do

  begin

    readln(a[j]);

  end;

  k:=a.countof(a.max);

  writeln('Количество элементов, равных максимальному ',k);

end.

Задача 3. Дан массив из N элементов. Найти среднее значение положительных элементов.

Исходные данные: N - количество элементов массива (тип integer); a - массив N целых чисел (тип array)

Промежуточные данные: s - сумма положительных элементов (тип integer), k - количество положительных элементов (тип integer)

Выходные данные: r - среднее значение положительных элементов (тип real)

Как будем решать задачу

  • Введем число N
  • Введем массив из N элементов
  • Найдем сумму и количество положительных элементов
  • Вычислим среднее значение положительных элементов

Программа решения задачи на языке Паскаль

var a:array[1..10] of integer;

    k,s,j,N:integer;

    r:real;

begin

  writeln('Введите количество элементов массива');

  readln(N);

  writeln('Введите массив целых чисел');

  for j:=1 to N do

  begin

    readln(a[j]);

  end;

  s:=0; k:=0;

  for j:=1 to N do

  begin

    if a[j]>0 then 

    begin

      s:=s+a[j];

      k:=k+1;

    end;

  end;

  r:=s/k;

  writeln('Среднее значение положительных элементов ',r);

end.

Программа решения задачи на языке Паскаль

С использованием методов для последовательностей в PascalABC.NET (версия 3.8.2)

var a:array of integer;

    k,s,j,N:integer;

    r:real;

begin

  writeln('Введите количество элементов массива');

  readln(N);

  setlength(a,N);

  writeln('Введите массив целых чисел');

  for j:=0 to N-1 do

  begin

    readln(a[j]);

  end;

  s:=a.Where(x->x>0).sum;

  k:=a.Count(x->x>0);

  r:=s/k;

  //либо так: r:=a.Where(x->x>0).Average;

  writeln('Среднее значение положительных элементов ',r);

end.

Сформировать массив случайных чисел

18.02.2022

Зачем нужны массивы (язык Паскаль)

Зачем нужны массивы (язык Паскаль)

На уроках информатики при изучении темы «Массив», ученики нередко задают вопрос: «Зачем? Неужели нельзя вводить данные с клавиатуры и обрабатывать их по пути?»

Действительно, когда речь идет об определении понятия массив, мы даем, например, такое:

Массив – это упорядоченный и хранимый в памяти набор данных одного типа.

11.02.2022

Язык Паскаль. Сформировать массив случайных чисел

Сформировать массив случайных чисел (язык Паскаль)

Будем получать случайное целое число функцией random из промежутка [-30, 70].

В цикле for для счетчика k от 1 до N будем получать случайное число и присваивать его ячейке массива a[k], значение ячейки будем выводить на экран оператором write(a[k],' ')