Pascal. Примеры и решения задач




Содержание:
  • Линейные алгоритмы
  • Циклические алгоритмы;
  • Одномерные массивы.


  • Решения задач написаны на Delphi - консольные приложения. При написании кода решений в среде Turbo Pascal или ABC Pascal следует строки:
    {$APPTYPE CONSOLE}
    uses
       SysUtils;
    заменить на: uses CRT;
    Так как консольные приложения "не дружат" с русским языком, все сообщения в программах транслитерированы.


    Линейные алгоритмы


    Задача 1.
    Напишите программу ввода трёх произвольных чисел X, Y и Z с клавиатуры. Если X больше Z, то вывести на экран сумму X и Y, иначе вывести на экран значение Z.
    Решение:
    program Project1;
    {$APPTYPE CONSOLE}
    uses
    SysUtils;
    var
    x, y, z, rez: real;
    begin
    {Вод значений с клавиатуры}
    write('Wwedi X:'); readln(x);
    write('Wwedi Y:'); readln(y);
    write('Wwedi Z:'); readln(z);
    {Сравниваем значения по условию задачи}
    if x > z then rez:= x + y else rez:= z;
    {Выводим результат на экран}
    writeln(rez:0:2);
    readln; {Задержка закрытия программы}
    end.

    Задача 2.
    Напишите программу ввода с клавиатуры трёх произвольных чисел X,Y,Z. Программа должна найти наименьшее число из введённых, и вывести его на экран.
    Решение:

    program Project1;
    {$APPTYPE CONSOLE}
    uses
    SysUtils;
    var
    x, y, z, min: real;
    begin
    {Вод значений с клавиатуры}
    write('Wwedi X:'); readln(x);
    write('Wwedi Y:'); readln(y);
    write('Wwedi Z:'); readln(z);
    {Присваиваем начальное значение минимуму}
    min:= x;
    {Делаем проверку}
    if min > y then min:= y;
    if min > z then min:= z;
    {Выводим результат на экран}
    writeln('Minimum = ', min);
    readln; {Задержка закрытия программы}
    end.

    Задача 3.
    Длина прямоугольного участка земли равна X метров, а ширина равна Y метров. Напишите программу вычисления количества досок для забора на заданном участке, если ширина доски равна 10 сантиметров.
    Решение:

    program Project1;
    {$APPTYPE CONSOLE}
    uses
    SysUtils;
    var
    x, y, rez: real;
    begin
    {Вод значений с клавиатуры}
    write('Wwedi dlinu X:'); readln(x);
    write('Wwedi shirinu Y:'); readln(y);
    {Вычисляем периметр участка}
    rez:= 2*x + 2*y;
    {Вычисляем нужное количество досок}
    rez:= rez/0.1;
    {Выводим результат на экран}
    writeln('Chislo dosok = ', rez:0:2);
    readln; {Задержка закрытия программы}
    end.

    Задачи с циклами

    Задача 1.
    Чиновник, ежемесячно берёт взятки в размере Х рублей. Величина Х непостоянная и колеблется от 0 до 150000 рублей. Автомобиль BMW 3, который хочет купить на взятки чиновник, стоит 1700000 рублей. Напишите программу, которая вычислит, сколько месяцев потребуется чиновнику на сбор нужной суммы.
    Решение:

    program Project1;
    {$APPTYPE CONSOLE}
    uses
    SysUtils;
    var
    x: longint; {Размер взятки}
    mes: integer; {Число месяцев}
    begin
    mes:= 0;
    x:= 0;
    {Организуем цикл, который завершится при сумме взяток
    равной или больше 1700000}
    Repeat
    {Организуем случайные числа для величины Х}
    randomize;
    x:= x + random(150000);
    writeln(x);
    {Организуем счётчик месяцев}
    mes:= mes + 1; {inc(mes)}
    until x >= 1700000;
    {Выводим результат на экран}
    writeln('Mesjac = ', mes);
    readln; {Задержка закрытия программы}
    end.

    Задача 2. (Пример ГИА для 9 класса).
    Напишите программу, которая вычисляет произведение членов последовательности, кратных 5. Программа получает на вход целые числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 - признак окончания ввода, не входит в последовательность).
    Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30000.
    Программа должна вывести одно число: произведение членов последовательности, кратных 5.

    Решение: program Ls1;
    {$APPTYPE CONSOLE}
    uses
       SysUtils;
    var
       x, z: integer; { Переменные для ввода значений x и вычисления произведения z}
       n : integer; {Счётчик цикла}
    label L1; {Метка безусловного перехода}
    begin
       {clrscr} {Очистить экран - убрать кавычки в Turbo Pascal}
       z:= 1; {Начальное значение результата}
    {Создаём цикл с максимальным числом вводимых значений}
       for n := 1 to 1000 do
       begin {начало тела цикла}
    {Получаем данные с клавиатуры}
        L1: write('Vvedi X: '); readln(x);
    {Проверяем условие на вводимый диапазон значений}
        if (x < -30000) or (x > 30000) then {Если за пределами диапазона, то перейти к вводу другого зачения - к метке L1}
        begin
        writeln('Input error!');
        goto L1;
        end;
    {Если признак окончания ввода, то прервать цикл}
       if x = 0 then break else
    {Если введённое число кратно 5, то наращиваем произведение членов z Функция frac возвращает остаток от деления x / 5}
       if frac(x/5) = 0 then z:= z * x;
      end; {конец тела цикла}
    {Проверяем, были ли во вводимых значениях числа кратные 5, если нет выводим 0 иначе выводим произведение}
      if z = 1 then z:= 0;
      writeln('Result = ', z);
      readln;
    end.
    Пример выполнения программы.


    Задача 3. (Пример ГИА для 9 класса).
    Напишите программу, которая в последовательности целых чисел определяет разность максимального и минимального чисел. Программа получает на входе целее числа, количество введённых чисел неизвестно, последовательность чисел заканчивается число 0 (0 - признак окончания ввода, не входит в последовательность).
    Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30000.
    Программа должна вывести одно число: разность максимального и минимального чисел.

    Решение.

    Так же, как и в предыдущей задаче вычисления будем производить в цикле, но для разнообразия используем цикл Repeat :Until. Цикл будет прерываться при вводе числа 0 (признаке окончания ввода последовательности).

    program Lesson2;
    {$APPTYPE CONSOLE}
    uses
      SysUtils;
    var
      x_min, x_max: integer; {Переменные для хранения максимума и минимума}
      x, rez : integer; {Переменные - вводимое значение и результат}
    label L1; {Метка для перехода при ошибке ввода}
    begin
    {clrscr - для Turbo Pascal}
    {Задаём начальное значение для минимума и максимума при вводе первого значения из потока данных}
      write('Vvedi X: '); readln(x);
      x_min:= x;
      x_max:= x;
      repeat {Запускаем цикл который прервётся при вводе 0}
      begin {Тело цикла}
       L1: write('Vvedi X: '); readln(x);
    {Проверяем введённое число на допустимость значения по условию. В этом примере ипользуем функцию abs - модуль числа}
      if abs(x) > 30000 then
       begin
        writeln('Osibka vvoda');
       goto L1; {Если ошибка переход назад (метка L1) к вводу данных}
       end;
       if x <> 0 then
       begin
       if x < x_min then x_min:= x; {Роверяем на минимум}
       if x > x_max then x_max:= x; {Проверяем на максимум}
       end;
      end; {Конец тела цикла}
      until x = 0;
      rez:= x_max - x_min; {Вычисляем разность между минимумом и максимумом}
      writeln('Rezultat = ', rez); {Выводим результат на экран}
      readln;
    end.
    Пример выполнения программы.


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

    program Project1;
    {$APPTYPE CONSOLE}
    uses
      SysUtils;
    var
      x, xmin, xmax: integer;
      n, rez: integer;
    label L1;
    begin
      Write('Wedi X: '); ReadLN(x);
      xmin:= x; xmax:= x;
      for n := 1 to 1000 do
      begin
        L1: Write('Wedi X: '); ReadLN(x);
        if abs(x) > 3000 then
        begin
        Writeln('Input ERROR!');
        goto L1;
      end;
      if x = 0 then break;
      if x < xmin then xmin:= x;
      if x > xmax then xmax:= x;
      end;
    rez:= xmax - xmin;
    Writeln('Rezultat = ',rez);
    readln;
    end.


    Задача 4.
    Напишите программу перевода чисел из двоичной системы счисления в десятичную.
    Решение. В этой программе мы будем вводить двоичное число как строку символов, затем разворачивать строку с зада наперёд (чтобы обрабатывать запись с младших разрядов) и далее при наличии "1" в строке произведём соответствующие вычисления.

    uses crt;
    var
    s, se: string; {s - строка ввода se - перевёрнутая строка}
    n: integer; {счётчик цикла}
    c: char;
    d: real;
    begin
    writeln('Input Bin:');
    readln(s); {Считываем бинарную строку с клавиатуры}
    se:= '';
    for n:= length(s) downto 1 do {Переворачиваем введённую строку}
    begin
    c:= s[n];
    se:= se + c;
    end;
    { writeln('New string: ', se); отладочная информация}
    d:= 0;
    for n:= 1 to length(se) do
    begin
    c:= se[n];
    if c = '1' then d:= d + exp((n-1) * ln(2)); {Если в строке появляется 1, то возводим 2 в степень n-1 и наращиваем результат d}
    end;
    writeln(' Decimal = ',d);
    end.

    Линейные (одномерные) массивы.


    Задача 1.
    Задан массив случайных целых чисел, величина которых, по модулю, не превышает 300 (-300 ... 300). Число элементов массива равно 10. Найти максимальное и минимальное числа в массиве и вывести на экран.
    Решение.

    program lesson3;
    {$APPTYPE CONSOLE}
    uses
       SysUtils;
    var
      ar: array [1..10] of integer; {Объявляем массив из 10 элементов}
      min, max: integer; {переменные для хранения минимума и максимума}
      z: integer; {счётчик цикла}
      x: integer; {для промежуточного хранения чисел элементов массива}
    begin
     randomize; {включаем генератор случайных чисел}
      for z := 1 to 10 do {создаём цикл из 10 итераций}
      begin
     {Получаем случайные числа.}
        x:= random(600);
    {Создаём отрицательные значения элементов массива, если значения превышают 300}
        if x > 300 then x:= (x * -1) + 300;
        ar[z]:= x; {Перегружаем значения в массив}
        writeln(z, '= ', ar[z]); {Выводим значения массива на экран (отладочная информация)}
      end;
    {Присваиваем начальные значения минимуму и максимуму}
      min:= ar[1]; max:= ar[1];
    {Находим в цикле минимум и максимум}
      for z:= 2 to 10 do
      begin
        if min > ar[z] then min:= ar[z];
        if max < ar[z] then max:= ar[z];
      end;
    {Выводим результат на экран}
      Writeln('Minimum = ', min);
       Writeln('Maximum = ', max);
      readln;
    end.
    Пример выполнения программы.



       ©Гуков Константин Михайлович 2006 - 2011     Почта: [email protected]