Pascal abc как найти числа

На занятии объясняется, как работать с одномерными массивами в Паскале, как использовать генератор случайных чисел — функцию random в Паскале. Рассматривается пример того, как вывести числа Фибоначчи

Материалы сайта labs-org.ru направлены на практическое освоение языка программирования Pascal. Краткие теоретические сведения не претендуют на полное освещение материала по теме; необходимую информацию можно найти в сети Интернет в большом количестве. В наши же задачи входит предоставление возможности получения практических навыков программирования на Паскале. Решенные наглядные примеры и задания изложены по мере увеличения их сложности, что позволит с легкостью изучить материал с нуля.

Содержание:

  • Одномерные массивы в Паскале
    • Объявление массива
    • Инициализация массива
    • Вывод элементов массива
    • Динамические массивы (pascalAbc.Net)
    • Функция Random в Pascal
    • Числа Фибоначчи в Паскале
    • Максимальный (минимальный) элемент массива
    • Поиск в массиве
    • Циклический сдвиг
    • Перестановка элементов в массиве
    • Выбор элементов и сохранение в другой массив
    • Сортировка элементов массива

Одномерные массивы в Паскале

Объявление массива

Массивы в Паскале используются двух типов: одномерные и двумерные.
Определение одномерного массива в Паскале звучит так: одномерный массив — это определенное количество элементов, относящихся к одному и тому же типу данных, которые имеют одно имя, и каждый элемент имеет свой индекс — порядковый номер.
Описание массива в Паскале (объявление) и обращение к его элементам происходит следующим образом:

Описание массива в Паскале

Объявление массива

var dlina: array [1..3] of integer;
begin
dlina[1]:=500; 
dlina[2]:=400; 
dlina[3]:=150;
...
  • dlina — идентификатор (имя) массива;
  • для объявления используется служебное слово Array (в переводе с англ. «массив» или «набор»);
  • [1..3] — в квадратных скобках ставится номер (индекс) первого элемента, затем две точки и индекс последнего элемента массива, т.е. по сути, указывается количество элементов; количество элементов массива называется размерностью массива
  • of integer (с англ. «из целых чисел») — указывает, к какому типу относится массив, of здесь — служебное слово.
  • Объявить размер можно через константу:

    размер массива через константу

    Инициализация массива

    Кроме того, массив может быть сам константным, т.е. все его элементы в программе заранее определены. Описание такого массива выглядит следующим образом:

    const a:array[1..4] of integer = (1, 3, 2, 5);

    Заполнение последовательными числами:
    заполнение массива

    Результат:
    A[1] = 8, A[2] = 9, A[3] = 10, ..., A[N] = A[N-1] + 1
    

    Ввод с клавиатуры:

    Пример: Рассмотрим, как происходит ввод массива в Паскале:

    writeln ('введите кол-во элементов: ');
    readln(n); {если кол-во заранее не известно, - запрашиваем его}
    for i := 1 to n do begin
       write('a[', i, ']=');
       read(a[i]);
       ...
    end;
    ...

    ввод массива с клавиатуры
    ✍ Пример результата:

    введите кол-во элементов: 
    3
    a[1]=5
    a[2]=7
    a[3]=4
    

    Вывод элементов массива

    Пример: Рассмотрим, как вывести массив в Паскале:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    var
      a: array[1..5] of integer; {массив из пяти элементов}
      i: integer;
    begin
    a[1]:=2;
    a[2]:=4;
    a[3]:=8;
    a[4]:=6;
    a[5]:=3;
    writeln('Массив A:');
    for i := 1 to 5 do
        write(a[i]:2); {вывод элементов массива}
    end.

    ✍ Пример результата:

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

    Задача Array 0. Необходимо задать вещественный массив размерностью 6 (т.е. из шести элементов); заполнить массив вводимыми значениями и вывести элементы на экран. Использовать два цикла: первый — для ввода элементов, второй — для вывода.

    Пример результата:

    введите элемент массива: 3.0
    введите элемент массива: 0.8
    введите элемент массива: 0.56
    введите элемент массива: 4.3
    введите элемент массива: 23.8
    введите элемент массива: 0.7
    Массив =  3, 0.8, 0.56, 4.3, 23.8, 0.7

    [Название файла: taskArray0.pas]

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

    Обработка массивов в Паскале, так же как и заполнение массива, происходит обычно с использованием цикла for.

    Динамические массивы (pascalAbc.Net)

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

  • Основной особенностью динамических массивов является возможность выделения для них памяти на любом этапе выполнения программы.
  • Имеется возможность корректировки размера динамического массива как в сторону его уменьшения, так и в сторону увеличения.
  • Объявление:

    var a: array of integer;
    var n:=readInteger;
    a:=new integer[n]; // инициализация, выделение памяти для элементов массива

    или:

    var a: array of integer;
    var n:=readInteger;
    SetLength(a,n); // устанавливаем размер

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

    procedure p(a: array of integer);

    Созданные элементы сразу получают начальное значение, равное нулевому значению соответствующего типа: для чисел это целый или вещественный нуль, для символов — символ с кодом 0, для строк и других ссылочных типов данных — нулевая ссылка nil

    Объявление и инициализация массива:

    Пример:

    begin
      var a: array of integer;
      a := new integer[3];
      a[0] := 5;
      a[1] := 2;
      a[2] := 3;
    end.

    или в одну строку:

    begin
      var a: array of integer;
      a := new integer[3](5,2,3);
      print(a)
    end.

    или короткая запись:

    var a:=Arr(1,2,3);// по правой части - integer

    Элементы динамического массива всегда индексируются от 0.

    Ввод элементов:

    Пример:

    var a:=ReadArrInteger(5); // ввод пяти целых
    var a:=ReadArrReal(5); // ввод пяти вещественных

    Функции генерации массивов:

    1. ArrFill :

    var a := ArrFill(10, 1); // массив из 10 целых чисел, равных 1

    2. ArrGen :

    var a := ArrGen(ReadInteger, 1, e -> e + 2); // массив, состоящий из n первых положительных нечетных чисел
    a.Print;

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

    Пример:

    for var i:=0 to a.Length-1 do
      a[i] += 1;

    или:

    for var i := 0 to a.High do
      a[i] += 1;

    Проход по элементам (только для чтения):
    Пример:

    foreach var x in a do
      Print(x)
  • Размер динамического массива (т. е. количество его элементов) можно определить с помощью его свойства Length
  • Для динамического массива определены еще два свойства: Low и High, определяющие соответственно нижнюю и верхнюю границу диапазона изменения индекса. Свойство a.Low всегда возвращает 0, а свойство a.High определяется как a.High = a.Length – 1
  • Простой вывод элементов:

    Writeln(a); // пример вывода: [1,5,3,13,20]

    или метод массива Print:

    a.Print; // пример вывода: 1 5 3 13 20
    a.PrintLines; // каждый элемент с новой строки

    Функция Random в Pascal

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

    Для генерации чисел от 0 до n (не включая само значение n, целые числа в интервале [0,N)) используется запись random (n).
    Перед использованием функции необходимо инициализировать датчик случайных чисел с помощью процедуры randomize.

    Диапазон в Паскале тех самых случайных чисел от a до b задается формулой:

    Пример: Заполнение массива случайными числами в Pascal:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    var f: array[1..10] of integer;
        i:integer;
    begin
    randomize;
    for i:=1 to 10 do
      begin
       f[i]:=random(10); { интервал [0,9] }   
       write(f[i],' ');
      end;
    end.

    ✍ Пример результата: 

    Для вещественных чисел в интервале [0,1):

    var x: real;
    ...
    x := random(0.0,1.0);;         { интервал [0,1), т.е. единица не включена }

    PascalABC.NET:

  • Сгенерированный случайным образом кортеж из двух (Random2), либо из трех (Random3) элементов:
  • var (a, b, c) := Random3(10.0, 20.0); // диапазон [10, 20)
    write(a:0:2,' ',b:0:2,' ', c:0:2) // 14.73 18.63 19.72
  • Массив из 10 сгенерированных случайным образом целых чисел в диапазоне [0;99]:
  • Пример:

    var a:=arrRandomInteger(10);

    или с дополнительными параметрами (диапазон [5;15]):

    var a:=arrRandomInteger(10,5,15);

    Задача Array 1. Необходимо задать массив размерностью 5, заполнить массив случайными числами в интервале [-1,1] и вывести элементы на экран: определить три позиции для вывода каждого элемента, с двумя знаками после запятой.

    Пример результата:

    Массив =  0.22 0.00 -0.69 -0.35 -0.11 

    [Название файла: taskArray1.pas]

    Числа Фибоначчи в Паскале

    Наиболее распространенным примером работы с массивом является вывод ряда чисел Фибоначчи в Паскаль. Рассмотрим его.

    Пример: Ряд чисел Фибоначчи: 1 1 2 3 5 8 13…

    f[0]:=1;   
    f[1]:=1; 
    f[2]:=2;

    или

    f[2]:=f[0]+f[1];
    f[3]:=f[1]+f[2];

    или

    Получили формулу элементов ряда.

    Пример: Вычислить и распечатать первые 20 чисел Фибоначчи.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    var i:integer;
    f:array[0..19]of integer;
    begin
    f[0]:=1;
    f[1]:=1;
    for i:=2 to 19 do
    begin
      f[i]:=f[i-1]+f[i-2];
      writeln(f[i])
    end;
    end.

    На данном примере, становится понятен принцип работы с числовыми рядами. Обычно, для вывода числового ряда находится формула определения каждого элемента данного ряда. Так, в случае с числами Фибоначчи, эта формула-правило выглядит как f[i]:=f[i-1]+f[i-2]. Поэтому ее необходимо использовать в цикле for при формировании элементов массива.

    Задача Array 2. Дан ряд из 10 произвольных чисел: a[1], a[2], ... , a[10] (использовать функцию random()). Подсчитать и напечатать суммы троек стоящих рядом чисел: a[1]+a[2]+a[3], a[2]+a[3]+a[4], a[3]+a[4]+a[5], …… , a[8]+a[9]+a[10]

    Пример результата:

    Массив =  2 0 4 29 3 11 26 11 9 4 
    mas[1] + mas[2] + mas[3] = 6
    mas[2] + mas[3] + mas[4] = 33
    mas[3] + mas[4] + mas[5] = 36
    mas[4] + mas[5] + mas[6] = 43
    mas[5] + mas[6] + mas[7] = 40
    mas[6] + mas[7] + mas[8] = 48
    mas[7] + mas[8] + mas[9] = 46
    mas[8] + mas[9] + mas[10] = 24

    [Название файла: taskArray2.pas]

    Задача Array 3. Написать программу решения задачи о печати ряда чисел 2 4 8 16 32 ... 512; для заполнения массива использовать цикл Repeat
    [Название файла: taskArray3.pas]

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

    Псевдокод:
    Максимальный (минимальный) элемент массива

    Поиск максимального элемента по его индексу:
    максимальный элемент по номеру


    PascalABC.NET:

    Минимальный элемент и его индекс:

    Решение 1:

      // …
      var (min, minind) := (a[0], 0);  
      for var i:=1 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 2:

      // …
      var (min, minind) := (real.MaxValue, 0);  
      for var i:=0 to a.Length-1 do
        if a[i]<min then
          (min, minind) := (a[i], i);  Result := (min, minind);

    Решение 3:

    begin
      var a := new integer[5];
      a := arrRandomInteger(5); // [86,37,41,45,76] 
      print(a.Min,a.IndexMin); // 37  1
    end.

    Задача Array_min: Найдите минимальный элемент массива. Выведите элемент и его индекс.

    Пример результата:

    9 5 4 22 23 7 3 16 16 8 
    Минимальный элемент массива A[7]=3
    

    [Название файла: taskArray_min.pas]

    Задача Array 4. Дан массив из 10 целочисленных элементов. Найти количество отрицательных и вывести количество на экран.

    Пример результата:

    3 4 6 -1 6 -2 1 5 0 1 
    Количество отрицательных элементов: 2
    

    [Название файла: taskArray4.pas]

    Задача Array 5. Найти минимальное и максимальное из n введенных чисел (массива). Определить расстояние между этими элементами.

    3  2  6  1  3  4  7  2  >>>  min=1, max=7, distance=3
    

    [Название файла: taskArray5.pas]

    Задача Array 6. Дан целочисленный массив размера N. Вывести все содержащиеся в данном массиве четные числа в порядке убывания их индексов, а также их количество K.

    N=4
    mas: 8 9 2 5
    >>> 2 8 количество= 2
    

    [Название файла: taskArray6.pas]

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

    Пример:

    Исходный массив:
    4   -5   10  -10  5
    максимальные A[3]=10, A[5]=5
    

    [Название файла: taskArray7.pas]

    Поиск в массиве

    Рассмотрим сложный пример работы с одномерными массивами:

    Пример: Дан массив из 10 чисел. Определить, есть ли в массиве число, введенное пользователем. Если есть – выводить «найдено», если нет – «не найдено».
    Сложность задания заключается в том, что выводить слова «найдено» или «не найдено» необходимо один раз.

    Для решения поставленной задачи понадобится оператор break — выход из цикла.
    Решение Вариант 1. Цикл for:


    PascalABC.NET:

    Cтандартные методы a.IndexOf(x) и a.LastIndexOf(x):

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.IndexOf(3)) // 1
    end.

    или метод a.Contains(x) наравне с x in a:

    begin
      var a := new integer[10];
      a := arrRandomInteger(5,0,5); //[1,3,5,4,5] 
      print(a.Contains(3)); // True
      print(3 in a)// True
    end.

    Рассмотрим эффективное решение:

    Задача: найти в массиве элемент, равный X, или установить, что его нет.

    Алгоритм:

    • начать с 1-го элемента (i:=1);
    • если очередной элемент (A[i]) равен X, то закончить поиск иначе перейти к следующему элементу.

    решение на Паскале Вариант 2. Цикл While:

    Поиск элемента в массиве

    Поиск элемента в массиве

    Предлагаем посмотреть подробный видео разбор поиска элемента в массиве (эффективный алгоритм):

    Задача Array 8. Заполнить массив из 10 элементов случайными числами в интервале [0..4] и вывести номера всех элементов, равных X.

    Пример:

    	 Исходный массив:
    	 4  0  1  2  0  1  3  4  1  0
    	 Что ищем? 0
    	 A[2], A[5], A[10]
    

    [Название файла: taskArray8.pas]

    Циклический сдвиг

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

    Решение:

    Алгоритм:
    A[1]:=A[2]; A[2]:=A[3];… A[N-1]:=A[N];

    Программа:
    сдвиг элементов массива


    PascalABC.NET:

    Циклический сдвиг влево:

      // …
      var v := a[0];
      for var i:=0 to a.Length-2 do
        a[i] := a[i+1];
      a[a.Length-1] := v;

    Циклический сдвиг вправо:

      // …
      var v := a[a.Length-1];
      for var i:=a.Length-1 downto 1 do
        a[i] := a[i-1];
      a[0] := v;

    Задача Array 9. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и выполнить циклический сдвиг влево без первого элемента.
    Пример:

    Исходный массив:
      4  -5   3  10  -4  -6   8 -10  1  0
    Результат:
      4   3  10  -4  -6   8 -10   1  0 -5
    

    [Название файла: taskArray9.pas]

    Перестановка элементов в массиве

    Рассмотрим, как происходит перестановка или реверс массива.

    Пример: переставить элементы массива в обратном порядке
    реверс массива

    Решение:

    Алгоритм:
    алгоритм перестановки элементов массива

    Псевдокод:
    2

    Программа:
    перестановка элементов массива


    PascalABC.NET:

    Перестановка (ревёрс):

    Решение 1:

    begin
    var a: array of integer := (1,3,5,7); 
    var n := a.Length;
    for var i:=0 to n div 2 - 1 do
        Swap(a[i],a[n-i-1]);
    End.

    Решение 2 (стандартная процедура Reverse()):

    begin
    var a:=new integer[10];
    a:=arrRandomInteger(10);
    print(a);// [41,81,84,63,12,26,88,25,36,72] 
    Reverse(a);
    print(a) //[72,36,25,88,26,12,63,84,81,41] 
    end.

    Задача Array 10. Заполнить массив из 10 элементов случайными числами в интервале [-10..10] и сделать реверс всех элементов, кроме последнего.
    Пример:

     Исходный массив:
    -5  3   10  -4  -6   8 -10  1   0  4
     Результат:
    0  1  -10   8  -6  -4  10  3  -5  4
    

    [Название файла: taskArray10.pas]

    Выбор элементов и сохранение в другой массив

    Пример: найти в массиве элементы, удовлетворяющие некоторому условию (например, отрицательные), и скопировать их в другой массив
    выбор элементов массива

    Решение:

    Решение: подсчитывать количество найденных элементов с помощью счетчика count, очередной элемент устанавливать на место B[count]. Переменой count необходимо присвоить 1.

    сохранение элементов массива в другой
    Вывод массива B:

    writeln('Выбранные элементы');
    for i:=1 to count-1 do
       write(B[i], ' ')

    PascalABC.NET:

    Процедура SetLength():

    // ...
    for var i := 0 to a.length - 1 do 
        if a[i] < 0 then
        begin
          b[j] := a[i];
          j += 1;
        end;
      SetLength(b, j);

    Задача Array 11. Заполнить массив случайными числами в интервале [20,100] и записать в другой массив все числа, которые оканчиваются на 0.
    Пример:

    	 Исходный массив:
    	 40   57   30  71  84
    	 Заканчиваются на 0:
    	 40 30
    

    [Название файла: taskArray11.pas]

    Сортировка элементов массива

    Сортировка методом «Пузырька»

    • В таком типе сортировок массив представляется в виде воды, маленькие элементы — пузырьки в воде, которые всплывают наверх (самые легкие).
    • При первой итерации цикла элементы массива попарно сравниваются между собой:предпоследний с последним, пред предпоследний с предпоследним и т.д. Если предшествующий элемент оказывается больше последующего, то производится их обмен.
    • При второй итерации цикла нет надобности сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте, он самый большой. Значит, число сравнений будет на одно меньше. То же самое касается каждой последующей итерации.

    сортировка методом пузырька

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    
    for i:=1 to N-1 do begin
       for j:=N-1 downto i do
         if A[j] > A[j+1] then begin
           с := A[j];
           A[j] := A[j+1];
           A[j+1] := с;
         end;
     end;
    1
    2
    3
    4
    
    for var i := 0 to arr.High - 1 do
        for var j := arr.High - 1 downto i do
          if arr[j] > arr[j + 1] then 
            Swap(arr[j], arr[j + 1]);

    Задача Array 12. Заполнить массив из 10 элементов случайными числами в интервале [0..100] и отсортировать первую половину массива по возрастанию, а вторую – по убыванию (методом ‘Пузырька’).

    Пример:
    Исходный массив:
    14  25  13  30  76  58  32  11  41  97
    Результат:
    13  14  25  30  76  97  58  41  32  11

    [Название файла: taskArray12.pas]

    Сортировка методом выбора

    • в массиве ищется минимальный элемент и ставится на первое место (меняется местами с A[1]);
    • среди оставшихся элементов также производится поиск минимального, который ставится на второе место (меняется местами с A[2]) и т.д.

    сортировка методом вставки

    Pascal PascalABC.NET
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    for i := 1 to N-1 do begin
      min:= i ;
      for j:= i+1 to N do
        if A[j] < A[min] then min:=j; 
      if min <> i then begin
        c:=A[i]; 
        A[i]:=A[min]; 
        A[min]:=c;
      end;
    end;
    1
    2
    3
    4
    5
    6
    7
    8
    
    for var i := 0 to a.High-1 do
      begin
        var (min,imin) := (a[i],i);
        for var j := i + 1 to a.High do
          if a[j] < min then
            (min,imin) := (a[j],j);
        Swap(a[imin],a[i]);
      end;

    Задача Array 13: Заполнить массив из 10 элементов случайными числами в интервале [0..50] и отсортировать его по возрастанию суммы цифр

    Пример:
    Исходный массив:
    14  25  13  12  76  58  21  87  10  98
    Результат:
    10  21  12  13  14  25  76  58  87  98  
    

    [Название файла: taskArray13.pas]


    PascalABC.NET:

    Стандартная процедура sort():

    Sort(a);
    SortByDescending(a);

    Быстрая сортировка или quick sort

    Алгоритм:

    1. Выбирается и запоминается средний элемент массива (присвоим X):
    2. быстрая сортировка

    3. Инициализируем две переменные (будущие индексы массива): L:=1, R:=N (N — количество элементов).
    4. Увеличиваем L и ищем первый элемент A[L], который больше либо равен X (в итоге он должен находиться справа).
    5. Уменьшаем R и ищем элемент A[R], который меньше либо равен X (в итоге он должен находиться слева).
    6. Смотрим, если L<=R, то меняем местами A[L] и A[R], возвращаемся к пункту 3.

    быстрая сортировка паскаль

    Выполнение на Паскале:
    1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    procedure QSort ( first, last: integer);
    var L, R, c, X: integer;
    begin
      if first < last then begin
        X:= A[(first + last) div 2];
        L:= first; R:= last;
     while L <= R do begin
       while A[L] < X do L:= L + 1;
       while A[R] > X do R:= R - 1;
       if L <= R then begin
         c:= A[L]; A[L]:= A[R]; A[R]:= c;
         L:= L + 1; R:= R - 1;
       end;
     end;
      QSort(first, R);   QSort(L, last);
      end;
    end.

    Задача Array 14:
    Заполнить массив из 10 элементов случайными числами в интервале [-50..50] и отсортировать его с помощью алгоритма быстрой сортировки.

    [Название файла: taskArray14.pas]

    Простейшие алгоритмы

    №1. Сумма вводимых целых чисел

    begin
      var n := ReadInteger('Введите число слагаемых:'); 
    
      var s := 0.0; 
      for var i:=1 to n do
      begin 
        var x := ReadReal($'Введите слагаемое №{i}:'); 
        s += x;
      end;
    
      Println($'Сумма равна {s}');
    end.
    

    В алгоритме используются интерполированные строки вида $’Сумма равна {s}’.
    Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.

    №2. Произведение целых чисел

    begin
      var n := ReadInteger('Введите число множителей: ');
    
      var p := 1.0;
      for var i:=1 to n do
      begin
        var x := ReadReal('Введите множитель: ');
        p *= x;
      end;
    
      Println($'Произведение равно {p}');
    end.
    

    №3. Двойной факториал n!!=n*(n-2)*(n-4)*…*2 (или 1)

    begin
      var x := ReadInteger('Введите x: ');
    
      var p := 1;
      while x>=2 do
      begin
        p *= x;
        x -= 2;
      end;
    
      Println($'Двойной факториал равен {p}');
    end.
    

    №4. Сколько нечетных среди n введенных

    begin
      var n := ReadInteger('Введите n: ');
    
      var c := 0;
      for var i:=1 to n do
      begin
        var x := ReadInteger('Введите целое число: ');
        if x mod 2 <> 0 then
          c += 1;
      end;
    
      println($'Количество нечетных равно {c}');
    end.
    

    №5. Защита от неверного ввода

    begin
      var x: real;
      repeat
        x := ReadReal('Введите x>0: ');
        if x<=0 then
          Println('Неверный ввод');
      until x>0;
    end.
    

    №6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей

    Дан отрезок [a,b]

    function f(x: real) := sin(x)*x;
    
    begin
      var N := ReadInteger('Введите N: ');
      Assert(N>0);
      var (a,b) := ReadReal2('Введите a и b: ');
    
      var h := (b-a)/N;
      var x := a;
      loop N+1 do
      begin
        Writeln(x:5:2,f(x):10:4);
        x += h;
      end;
    end.
    

    №6a. Решение, использующее while. Погрешность округления и вычислительная погрешность

    function f(x: real): real:= sin(x)*x;
    
    begin
      var N:=ReadInteger('Введите N: ');
      Assert(N>0);
      var (a,b):=ReadReal2('Введите a и b: ');
     
      var h := (b-a)/N;
      var x := a;
      while x <= b+h/2 do
      begin
        writeln(x:5:2,f(x):10:4);
        x += h;
      end;
    end.
    

    Рекуррентные соотношения

    №7. Вывод 10 первых степеней двойки

    begin
      var x := 2;
      for var i := 1 to 10 do
      begin
        writeln(i:2,x:5);
        x *= 2;
      end;
    end.
    

    №8. Вывод всех двухзначных чисел, кратных 5

    begin
      var x := 10;
      while x < 100 do
      begin
        writeln(x:3);
        x += 5;
      end;
    end.
    

    №9. Вывод n первых чисел Фибоначчи

    begin
      var n := ReadInteger('Введите целое число n (n > 1): ');
      Assert(n>1);
      var (a,b) := (1,1);
      Print(a,b);
      loop n-2 do
      begin
        (a,b):=(b,a+b);
        Print(b);
      end;
    end.
    

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

    №10. Найти НОД(A,B), используя алгоритм Евклида:

    НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A

    begin
      var (a,b):=ReadInteger2('Введите целые числа A и B: ');
      while b<>0 do
        (A,B):=(B,A mod B);
      println($'НОД(A,B) = {A}');
    end.
    

    №11. Найти сумму цифр целого числа m

    begin
      var m := ReadInteger('Введите целое число m: ');
     
      var (s,m1) := (0,abs(m));
      while m1 > 0 do
      begin
        s += m1 mod 10;
        m1 := m1 div 10;
      end;
     
      println($'Сумма цифр числа {m} равна {s}');
    end.
    

    Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.

    Максимумы и минимумы

    №12. Найти max из введенных чисел

    begin
      var n := ReadInteger('Введите целое число n (n>0): ');
      assert(n>0);
     
      var x := ReadReal('Введите 1 число: ');
      var max := x;
      for var i := 2 to n do
      begin
        x := ReadReal($'Введите {i} число: ');
        if max < x then
          max := x;
      end;
     
      Println($'Максимальное из введенных чисел: {max}');
    end.
    

    №12a. Найти min, удовлетворяющее условию p(x)

    // Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false)
    function p(x: real): boolean:=x > 0;
     
    begin
      var n := ReadInteger('Введите целое число n (n>0): ');
      assert(n>0);
     
      var min := real.MaxValue;
      for var i := 1 to n do
      begin
        var x := ReadReal($'Введите {i} число: ');
        if (x < min) and p(x) then
          min := x;
      end;
     
      if min = real.MaxValue then
        println('Нет чисел, удовлетворяющих условию')
      else println($'Минимальное из введенных чисел, удовлетворяющее условию: {min}');
    end.
    

    Суммирование рядов (конечных и бесконечных)

    №13. Вычислить Σ(i=1..n) a^i/i!

    begin
      var a:=ReadReal('Введите a: ');
      var n:=ReadInteger('Введите n (n>0): ');
      assert(n>0);
      var x := a;
      var s := x;
      for var i := 2 to n do
      begin
        x *= a / i;
        s += x;
      end;
      Println($'Сумма = {s}');
    end.
    

    №13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i!

    begin
      var a:=ReadReal('Введите a (0 < a < 1): ');
      assert((a>0) and (a<1));
     
      var eps := 0.0001;
      var i := 1;
      var s := 0.0;
      var y := -a;
      repeat
        s += y / i;
        i += 1;
        y *= -a;
      until abs(y/i) < eps;
     
      Println($'Сумма = {s}');   
    end.
    

    Поиск значения

    №14. Есть ли среди введенных число k?

    var n,k: integer;
    begin
      write('Введите целые числа n (n>0) и k: ');
      readln(n,k);
      assert(n>0);
    
      var Exists := false;
      for var i := 1 to n do
      begin
        write('Введите ', i, ' целое число: ');
        var x := ReadInteger;
        if x = k then
        begin
          Exists := true;
          break;
        end;
      end;
    
      if Exists then
        writeln('Число ', k, ' было введено')
      else writeln('Число ', k, ' не было введено');
    end.
    

    №14b. Есть ли среди введенных число k? (то же с использованием while)

    var n,k: integer;
    begin
      write('Введите целые числа n (n>0) и k: ');
      readln(n,k);
      assert(n>0);
    
      var Exists := false;
      var i := 1;
      while (i <= n) and not Exists do
      begin
        write('Введите ', i, ' целое число: ');
        var x := ReadInteger;
        i += 1;
        if x = k then
          Exists := true;
      end;
    
      if Exists then
        writeln('Число ', k, ' было введено')
      else writeln('Число ', k, ' не было введено');
    end.
    

    №15. Является ли число N>1 простым?

    begin
      write('Введите целое число N (N>1): ');
      var N := ReadInteger;
      assert(N>1);
    
      var IsPrime := True;
      for var i := 2 to round(sqrt(N)) do
        if N mod i = 0 then
        begin
          IsPrime := False;
          break;
        end;
    
      if IsPrime then
        writeln('Число ', N, ' является простым')
      else writeln('Число ', N, ' является составным');
    end.
    

    Другие алгоритмы

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

    begin
      var x := ReadInteger('Введите целое число x (x>1): ');
      assert(x>1);
    
      var i := 2;
      write(x, ' = 1');
      repeat
        if x mod i = 0 then
        begin
          Print('*', i);
          x := x div i;
        end
        else i += 1;
      until x = 1;
    end.
    

    №17. Вычисление значения многочлена в точке x по схеме Горнера

    var 
      x,a: real;
      n: integer;
    begin
      write('Введите x: ');
      readln(x);
      write('Введите степень многочлена n (n>0): ');
      readln(n);
      assert(n>=0);
      write('Введите коэффициенты: ');
      readln(a);
    
      var s := a;
      for var i := 1 to n do
      begin
        write('Введите a_{', i+1,'}: ');
        readln(a);
        s := s*x + a;
      end;
    
      writeln('Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + ... + a_{n}*x + a_{n+1} в точке x = ', x, ' равно ', s);
    end.
    

    №18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления

    Дан отрезок [a,b] (f(a)*f(b)<=0)

    // В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x)
    const eps = 0.0001;
    const f = sin;
    
    var a,b: real;
    begin
      write('Введите числа a и b (a<b): ');
      readln(a,b);
      assert(a<b);
    
      var fa := f(a);
      var fb := f(b);
      assert(fb*fa<0);
    
      while (b-a) > eps do
      begin
        var x := (b+a)/2;
        var fx := f(x);
        if fa*fx <= 0 then
          b := x;
        else
        begin
          a := x;
          fa := fx;
        end;
      end;
    
      writeln('Корень функции на [a,b] равен ',(b+a)/2);
    end.
    

    © Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав

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

    Аналогичные функции можно написать для поиска минимального из чисел. Для этого достаточно сменить знак сравнения в функции с двумя аргументами(в первой из рассмотренных).

    Для реализации сначала нужно написать функцию, которая находит максимальное из двух чисел.

    Функция определения максимального из двух чисел

    function Max(x1, x2 : integer) : integer;
    begin
      if x1 > x2 then
        Max := x1
      else
        Max := x2;
    end; 
    

    Теперь у нас есть код, который возвращает наибольшее из двух чисел. Для того, чтобы расширить количество аргументов до трех, достаточно написать ещё одну функцию, которая будет дважды вызывать предыдущую.

    Функция поиска наибольшего из трех чисел

    function Max(x1, x2, x3 : integer) : integer;
    begin
      Max := Max(Max(x1, x2), x3);
    end;
    

    А что если нужно сравнить четыре, пять и больше чисел, и найти максимальное из них?

    Без проблем, мы можем писать столько перегруженных функций, сколько нам нужно.

    Максимум из четырех чисел

    function Max(x1, x2, x3, x4 : integer) : integer;
    begin
      Max := Max(Max(x1, x2, x3), x4);
    end; 
    

    Эта функция использует вызов двух предыдущих.

    Программа для поиска и вывода максимальных чисел

    все приведенные выше функции должны быть размещены в том же порядке над телом основной программы

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

    begin
      writeln(Max(1, 4));
      writeln(Max(9, 2, 7));
      writeln(Max(8, 3, 6, 5));
      readln;
    end. 
    

    Если предполагается сравнивать много чисел, то лучше всего представить их в виде массива, и искать минимальный или максимальный элемент в массиве.

    Смотрите также:

    Записывать данные в массива можно и без помощи readln, достаточно простой команды read. Приведём простой пример где считываем данные из массива и выводим:

    for i:=1 to n do
     write(a[i]);

    Это было простое повторение. А теперь давайте попробуем написать программу, которая ищет в массиве число k, и если оно есть, то выводит yes или no:

    for i:=1 to n do
     if a[i]=k then
      q:=1;
    if q=1 then
     write('Yes')
    else
     write('No');

    Эту программу все всегда пишут с первого раза именно в таком виде.

    Какие тут могут быть ошибки?

    Ошибки довольно таки простые:

    Например переменная q и так может быть равна 1, так как в разных средах Ваша программа будет воспринимать всё по разному. Тогда онулируем переменную в самом начале:

    q:=0;
    for i:=1 to n do
     if a[i]=k then
      q:=1;
    if q=1 then
     write('Yes')
    else
     write('No');

    И видно что программа будет работать очень долго, если у нас будет массив из миллиарда элементов, так как наш цикл сначала проверит весь массив и только потом выдаст результат, что нам не нужно. Тогда ускорить программу нам поможет замена цикла на цикл с условием — while:

    q:=0; i:=1;
    while (q<>1) and (i<=n) do
    begin
     if a[i]=k then
      q:=1;
     i:=i+1;
    end;
    if q=1 then 
     write('Yes')
    else
     write('No');

    Теперь программа стала работать быстрее, так как после нахождения нужного нам числа, цикл остановится, но эта программа ещё далека от совершенства. Теперь давайте попробуем вида-изменить цикл while, и убрать переменную q:

    i:=1;
    while (a[i]<>k) and (i<=n) do
     i:=i+1;
    if q=1 then 
     write('Yes')
    else
     write('No');

    Наш цикл стал немного лучше, но всё же в нём есть грубые ошибки, и эти ошибки именно в цикле, а не в условии, так как мы его пока затрагивать не собираемся. И так какую же ошибку мы можем сейчас изменить? Ошибка очень проста, достаточно посмотреть на условие цикла, и всё станет понятно — мы говорим о том, что сначала цикл проверяет совпадение, а потом кончился ли цикл или нет, что может выдать ошибку.

    То есть если у нас в программе строгие проверки с количеством элементов в массиве, то ошибка будет видна нам сразу, а так мы её и не заметим, то есть цикл может быть переполненным — значение i станет равно n+1, что нам не нужно, тогда достаточно просто поменять условия местами, и как известно в pascal — если одно условие не сработает, то и другое проверятся не будет:

    i:=1;
    while (i<=n) and (a[i]<>k) do
     i:=i+1;
    if q=1 then 
     write('Yes')
    else
     write('No');

    Мы можем ещё упростить верхнюю часть:

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

    Это самый последний элемент массива, добавленный вручную, который имеет искомое значение, то есть мы добавим искомое значение в конец массива, и при проверки условия будет проверять именно это — имеет ли переменная i значение n+1:

    i:=1;
    a[n+1]:=k;
    while a[i]<>k do
     i:=i+1;
    if i=n+1 then  write('No')
    else write('Yes');

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

    Теперь перейдём к следующему:

    Второй максимум.

    То есть мы будем искать в массиве второй максимум, второй максимум — это число, которое меньше максимума, но больше других чисел.

    Сначала напишем программу, которая просто находит максимальное число в массиве:

    max:=a[1];
    for i:=2 to n do
     if a[i]>max then
      max:=a[i];

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

    До этого мы представляли себе — если у нас много чисел, то всех их нужно загонять в массив, но это не так — представьте себе что в Вашей программе нельзя использовать массивы, то как сделаете Вы?

    Самое простое решение — это использование одной переменной для хранения всех значений:

    readln(k);
    max:=k
    for i:=2 to n do
    begin
     readln(k);
      if k>max then
       max:=k;
    end;

    Теперь перейдём к решению задачи со вторым максимумом.

    Представим что изначально переменные max и max2 равны минус бесконечности.

    Теперь изменим код предыдущей программы именно так, что бы он искал max2 и не было ни каких ошибок:

    readln(k);
    max:=k;
    for i:=2 to n do
    begin
     readln(k);
      if k>max then
      begin
       max2:=max;
       max:=k;
      end else
       if (k>max2) and (k<max) then
        max2:=k;
    end;

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

    Представьте себе задачу подсчитать сколько максимумов в массиве, то как бы Вы реализовали её?

    Мы предлагаем ввести в программу счётчик, который увеличивался на 1 при новом максимуме или числу равному максимуму. Увеличивать мы будем не по старинке — i:=i+1, а при помощи функции increment, сокращённо inc, и в скобках уже пишем имя переменной, эта функция увеличивает переменную на единицу. Также есть и функция, которая уменьшает значение на единицу — decrement, сокращённо dec.

    Теперь давайте напишем нашу программу:

    readln(k);
    max:=k;
    maxcount:=0;
    for i:=2 to n do
    begin
     readln(k);
      if k>max then
      begin
       inc(maxcount);
       max2:=max;
       max:=k;
      end else
       if (k>max2) and (k<max) then
        max2:=k
       else
        if max=k then
         inc(maxcount);
    end;

    Описание презентации по отдельным слайдам:

    • ПАСКАЛЬ Pascal  ABC

      1 слайд

      ПАСКАЛЬ
      Pascal ABC

    • ПАСКАЛЬ Pascal  ABCРабота с числовыми даннымиЦелые числа

      2 слайд

      ПАСКАЛЬ
      Pascal ABC
      Работа с числовыми данными
      Целые числа

    • Любые данные, с которыми вы работаете, надо где-то хранить. Данные, с которым...

      3 слайд

      Любые данные, с которыми вы работаете, надо где-то хранить. Данные, с которыми работает программа хранятся в основной памяти, которая состоит из ячеек (байтов), каждая из которых имеет адрес (порядковый номер).
      Имена
      переменных
      Адреса ячеек
      Ячейки памяти
      Значения переменных
      (значения ячейки)

    • Данные программы принято называть ВЕЛИЧИНАМИВеличины, которые меняются, назыв...

      4 слайд

      Данные программы принято называть ВЕЛИЧИНАМИ
      Величины, которые меняются, называют ПЕРЕМЕННЫМИ
      Величины, которые НЕ меняются, называют ПОСТОЯННЫМИ
      Величину (число), которое хранится в ячейке, называют ЗНАЧЕНИЕМ ЯЧЕЙКИ
      Имя ячейки – ИДЕНТИФИКАТОР – всегда должно начинаться с латинской буквы

    • Оператор присваиванияВ результате выполнения оператора присваивания в ячейку...

      5 слайд

      Оператор присваивания
      В результате выполнения оператора присваивания в ячейку помещается новое число. Старое содержимое ячейки при этом пропадает.
      Справа от оператора может стоять число или любое выражение. Слева – только имя переменной.
      А := А + B – 7 ;
      А := 6 ;

    • Тип данных  INTEGERСамые простые переменные – это целые числа. Для хранения ц...

      6 слайд

      Тип данных INTEGER
      Самые простые переменные – это целые числа. Для хранения целых чисел в Pascal используется специальный тип данных – INTEGER. Для их ввода в программу используется оператор VAR (variable – переменная)
      ПРИМЕР :

      program p1 ;

      VAR a, b, c : INTEGER ;

      Begin и прочее……….

    • Задание 4. 
Дано два целых числа (a = 5 и b = 7)
По условию, а увеличивается...

      7 слайд

      Задание 4.
      Дано два целых числа (a = 5 и b = 7)
      По условию, а увеличивается на 1, а потом умножается на значение b.
      program integer1;

      var a, b, c: integer;

      begin
      write (‘a = ‘);
      a:=5;
      writeln (a);
      a:=a+1;
      b:=7;
      c:=a*b;
      writeln (‘c = ‘, c);
      end. Результат:

    • 4) Набрать задание 4, которое было рассмотрено выше. По условию дано два целы...

      8 слайд

      4) Набрать задание 4, которое было рассмотрено выше. По условию дано два целых числа (a = 5 и b = 7). а увеличивается на 1, а потом умножается на значение b. Найти результат выполнения действий и вывести его на экран.
      5) По условию даны целые числа (m = 15 и n = 9, k = 3 ). Даны целые числа (m = 15 и n = 9, k = 3 ). Нужно вывести их на экран и получить их итоговую сумму (t) при условии, что n=m-n, а k=n*k;.
      6) Найти площадь прямоугольника со сторонами 5 см и 20 см
      7) Чему равно 3 в шестой степени?
      8) Найти с помощью программы чему равно выражение (15*2+8)-1, если есть всего 3 переменные x, y, z
      ЗАДАНИЕ:

    • Литература:М. Э. Абрамян. Programming Taskbook. Электронный задачник по прогр...

      9 слайд

      Литература:
      М. Э. Абрамян. Programming Taskbook. Электронный задачник по программированию. Версия 4.6./ Ростов-на-Дону — 2007 г.

      2. Ушаков Д.М., Юркова Т.А. Паскаль для школьников.  СПб.: Питер, 2010. — 256 с.

    Понравилась статья? Поделить с друзьями:
  • Как составить акт на строительно монтажные работы
  • Как найти парня за три дня
  • Как найти центр масс полусферы
  • Как исправить текст книги
  • Как составить сложное предложение со словом садовод