Вопросы к экзамену. Паскаль 2023

Ответы

Ответы можно найти здесь

Вопросы

  • 1) Что такое операторные скобки? Какими они бывают? Что такое тело программы? Зачем нужны комментарии? Какие типы комментариев в коде вы знаете? Как их оформлять?
  • 2) Литералы какого типа вы знаете? Чем строковые литералы отличаются от символьных? Что такое процедура? Что такое аргументы процедуры?
  • 3) Что такое переменная? Чем она отличается от литерала?
  • 4) Что такое оператор? Что такое операнд? Приведите примеры операторов и операндов.
  • 5) Что такое инициализация переменной? Приведите примеры инициализаций.
  • 6) Что такое выражение? Что такое арифметическое выражение? Что такое подвыражение? Приведите примеры
  • 7) Какие выражения можно присваивать переменным целого типа? Какие операнды могут входить в эти выражения?
  • 8) Что такое неявное приведение типа и когда оно работает? Приведите пример
  • 9) Что такое и для чего нужен Readln()? Сколько аргументов может принимать Readln()?
  • 10) Чтобы такое логический тип данных? Для чего он нужен? Какие литералы логического типа вы знаете? Сколько их?
  • 11) Какие выражения могут возвращать логический тип данных?
  • 12) Как работает операция AND? Сколько операндов она использует для получения результата? Какая у нее таблица истинности?
  • 13) Как работает операция Not? Сколько операндов она использует для получения результата? Какая у нее таблица истинности?
  • 14) Как работает операция OR? Сколько операндов она использует для получения результата? Какая у нее таблица истинности?
  • 15) Зачем нужно форматирование кода? Что такое базовый отступ, приведите примеры правильного и неправильного форматирование кода для вложенных условных операторов if()
  • 16) Для чего нужен оператор ветвления (условный оператор)?
    Какие ветви условного оператора вы знаете?
    Чем полная форма условного оператора отличается от неполной?
    Когда нужны операторные скобки в ветвях оператора IF, а когда нет? Приведите примеры
  • 17) Операции div и mod - зачем они нужны и как работают? Зачем нужен цикл for?
    Что такое заголовок цикла?
  • 18) Зачем нужен цикл for?Что такое счетчик цикла? Что такое тело цикла?
    Переменной i в цикле for левую границу установили в 5, а правую в 12 -- сколько раз выполнится цикл?
  • 19) Как работает цикл while? Приведите пример. Чем он отличается от других циклов?
  • 20) Как работает цикл repeat until? Приведите пример. Чем он отличается от других циклов?
  • 21) Можно ли использовать while() как условный оператор if() в неполной форме? Если да, приведите пример кода
  • 22) Чем процедура в Паскале отличается от функции, приведите примеры кода
  • 23) Что такое вложенные циклы? Приведите пример кода
  • 24) Зачем в принципе нужны цикла? Приведите пример кода. Какие циклические конструкции вы знаете
  • 25) В консольных программах на паскале можно делать анимации и игры - каким способом там удается "обновлять кадры"? Какой вызов для этого используются?
  • 26) Как возникают бесконечные циклы? Приведите пример кода для бесконечного цикла
  • 27) Что такое отладка программы? Какие способы отладки программы вы знаете?
  • 28) Что такое ООП? Приведите пример кода класса, приведите пример кода интерфейса и его реализации классом
  • 29) Что такое ООП? Приведите пример кода наследования классов с переопределением метода.
  • 30) Что такое ООП? Чем переопределение методов отличается от перегрузки. Приведите примеры кода.

Задачи

  • 1) Пользователь вводит три числа, найдите из них максимальное.
    Решите тремя способами: 1) С использованием логической операции and. 2) С вложенными блоками (без and, все операторы if должны быть в полной форме). 3) Без вложенных блоков (без and) -- запомнив максимум из первых двух чисел в специальной переменной.
  • 2) Пользователь вводит четыре числа, найдите из них максимальное.
    Решите тремя способами: 1) С использованием логической операции and. 2) С вложенными блоками (без and, все операторы if должны быть в полной форме). 3) Без вложенных блоков (без and) -- запомнив максимум из первых двух чисел в специальной переменной.
  • 3) Есть программа:
    var m,s:integer;
    begin
      writeln('Vvedite chislo M');
      readln(m);
      s:=1;
      if (s = 1) then
        writeln('soobchenie 1');
      if (s = m) then
        writeln('soobchenie 2');
    end;
    

    -- при этом известно, что если s равно 1, то на экран должно вывестись только первое сообщение (а второе выводиться не должно), а если s не равно 1, но равно m, то второе (а первое выводиться не должно).
    Но сейчас программа работает не так, исправьте это.

  • 4) Есть программа:
    var z,s:integer;
      f:boolean;
    begin
      readln(z);
      f := z > 5;
      s:=1;
      if (z=s) and (f=false) then
      begin
        writeln();// делаем перенос строки
        z:=0;
        s:=s+1;//но увеличиваем кол-во строк
      end;
    
      if (z=s) and (f=true) then
      begin
        writeln(); // делаем перенос строки
        z:=0;
        s:=s-1;//но уменьшаем кол-во строк
      end;
    end.  
    

    -- в двух условных операторах действия частично совпадают, а значит наблюдается дублирование кода. Перепишите код так, чтобы дублирования не было.

  • 5) Изучите код:
    var s, t:integer;
        f, b:boolean;
    begin
      f := true;
      b := false;
    
      if (f=true) then
        t:=1
      else
        t:=2;
    
      if (b=false) then
        s:=3
      else
        s:=4;
    end. 
    

    -- блоки условий можно переписать более кратко, без использования сравнения = true или = false, с сохранением той же логики работы программы.

  • 6) У вас есть код:
    var f : integer;
    begin
      write('Введите число : ');
      readln(f);
      if f = 0 then
      else
        writeln('Не равно 0!');
    
      readln();
    end.

    -- который сообщает пользователю, что число не равно нулю, если это действительно так, или в обратной ситуации не делает вообще ничего.

    Задача: Перепишите это код в неполной форме (без использования else).

  • 7) Дан код:
    var a: integer;
    begin
      readln(a);
      if (a > 2) then
      begin
        writeln('2');
        writeln('3');
      end else
        writeln('0');
    end.

    -- есть ли здесь лишние операторные скобки? Объясните почему есть или нет и если есть, перепишите более кратким образом.

  • 8) Была программа
    // Вариант 1:
    var a: integer;
    begin
      writeln('Введите а:');
      readln(a);
      if (a > 5) then
         writeln('a')
      else
         writeln(5);
    
      readln();
    end.
    

    Ее переписали так:

    // Вариант 2:
    var a: integer;
    begin
      writeln('Введите а:');
      readln(a);
      if (a > 5) then
         writeln('a')
      else if (a < 5) then
         writeln(5);
    
      readln();
    end. 
    

    Вопрос: изменилось ли что-то в поведении программы, если да, то почему? Объясните письменно, можно прокомментировать код, если изменения в логике есть

  • 9) Пользователь вводит 4 целых числа, выведите на экран не более трех из этих чисел, которые делятся нацело на 4 (т.е. нужно вывести те числа, которые делятся на 4, но не более трех штук).
  • 10) Пользователь вводит 5 целых числа, выведите на экран не более трех из этих чисел, которые делятся нацело на 4 (т.е. нужно вывести те числа, которые делятся на 4, но не более трех штук).
  • 11) Выведите на экран, все четные числа от 35 до 117 и нечетные числа, лежащие в диапазоне от 45 до 99.
    Указание: сначала можно решить задачу двумя циклами, но потом перепишите с использованием одного цикла, в теле которого составьте логическое выражение, описывающее подходящие числа (используйте логические операции).
  • 12) Есть код:
    var
       i, a: integer;
    begin
      readln(a);
    
      for i:=1 to 10 do
        if (a>2) then
          write('*')
        else
          write('#');
    
      readln();
    end. 
    

    -- перепишите его так, чтобы логика программы не изменилась, но количество проверок в теле цикла стало меньше.

  • 13) Модицифируйте код:
    var i:integer;
    begin
      for i:=1 to 10 do
      begin
         writeln(777);
         break;
      end;
    
      readln();
    end.     
    

    -- таким образом, чтобы на 4-ом витке на экран было выведено число 777, а на 5-ом произошел выход из цикла (при этом строчку for i:=1 to 10 оставьте без изменений).

  • 14) Есть код:
    var a, b, i:integer;
    begin
      a := 5;
      writeln('Угадайте число от 1 до 10 с трех попыток');
      for i:=1 to 3 do
      begin
        writeln('Попытка №', i, ' выше число:' );
        readln(b);
        if (b = a) then
        begin
           writeln('Победа!');
           break
        end else
           writeln('Не угадали!');
      end;
    
      writeln('Игра окончена!');
      readln();
    end. 
    

    Перепишите этот код так, чтобы:

    1. Можно было бы задать угадываемое число (пусть его вводит пользователь)
    2. Если пользователь все же угадал число - напишите в сообщении о победе с какой именно попытки ему это удалось.
  • 15) Есть код:
    var a, b, i:integer;
    begin
      a := 5;
      writeln('Угадайте число от 1 до 10 с трех попыток');
      for i:=1 to 3 do
      begin
        writeln('Попытка №', i, ' выше число:' );
        readln(b);
        if (b = a) then
        begin
           writeln('Победа!');
           break
        end else
           writeln('Не угадали!');
      end;
    
      writeln('Игра окончена!');
      readln();
    end. 
    

    -- перепишите его таким образом, чтобы сообщение "Игра окончена" выводилась, только если пользователь не угадал загаданное число.

  • 16) У вас есть число z=5. Пользователь вводит числа в цикле, если хотя бы одно введенное число число было равно 77, то увеличивайте число z на 1 в ответ на каждое введенное число, до тех пор пока пользователь не введет число 55, если такое произойдет то в ответ на это и любое последующее число, уменьшайте z на 1.

    Цикл и программа должны завершиться, когда число z станет отрицательным.
    (в начале цикла, если первое введенное число не равно ни 55, ни 77, считаем, что мы должны увеличивать z на 1 пока не встретим 55 или 77, которые укажут на конкретные действия).

    Пример работы в консоли:

    --Polzovatel: 
    12
    Otvet: 6
    --Polzovatel: 
    12
    Otvet: 7
    --Polzovatel: 
    90
    Otvet: 8 
    --Polzovatel: 
    55
    Otvet: 7
    --Polzovatel: 
    100
    Otvet: 6
    --Polzovatel: 
    123644
    Otvet: 5
    --Polzovatel: 
    77
    Otvet: 6
    --Polzovatel: 
    1
    Otvet: 7
  • 17) У вас есть число z=5. Пользователь вводит числа в цикле, если за последние 4 попытки ввода было хотя бы одно число больше или равно 15, то увеличивайте число z на 1 в ответ на каждое введенное число, а если такого числа не было, то уменьшайте на 1 в ответ на каждый ввод.

    Цикл и программа должны завершиться, когда число z станет отрицательным.

    Пример работы в консоли:

    --Polzovatel: 
    12
    Otvet: 4
    --Polzovatel: 
    16
    Otvet: 5
    --Polzovatel: 
    5
    Otvet: 6
    --Polzovatel: 
    10
    Otvet: 7
    --Polzovatel: 
    8
    Otvet: 8
    --Polzovatel: 
    9
    Otvet: 7
    --Polzovatel: 
    9
    Otvet: 6
    --Polzovatel: 
    20
    Otvet: 7
  • 18) У вас есть число z=5. Пользователь вводит числа в цикле, если за последние 4 попытки ввода было хотя бы одно число больше или равно 15, то увеличивайте число z на 1 в ответ на каждое введенное число, а если такого числа не было, то уменьшайте на 1 в ответ на каждый ввод.

    Цикл и программа должны завершиться, когда число z станет отрицательным либо когда значение z увеличивалось 7 раз подряд.

  • 19) Имеется программа:
    var i: integer;
    begin
      for i:=5 to 34 do
        write(i, ' ');
    
      readln();
    end. 
    

    Ответьте на вопросы/выполните задания

    • Что в ней происходит?
    • Что будет на экране после её выполнения?
    • Перепишите её, используя цикл while.
    • Перепишите её, используя цикл repeat/until.
  • 20) Напишите программу, которая выводит на экран ряд чисел с помощью цикла for:
    1 5 9 13 17 21 25 29 33 37 41 45
  • 21) У вас есть программа, использующая цикл while:
    var
       i: integer;
    begin
      i:=1;
      while i<=100 do
      begin
        write(i, ' ');
        i:=i+5;
      end;
    
      readln();
    end.
    
    • Объясните что делает эта программа (что будет выведно на экран и почему)
    • Перепишите её с помощью цикла repeat/until
    • Перепишите её с помощью цикла for
  • 22) Пользователь вводит целое положительное число $N$ большее или равное 8, если оно не соответствует этим критериям (то есть не является положительным и большим или равным 8), также пользователь вводил второе число $M$, которое отвечало бы за длину возрастающего фрагмента, например для $M=4$, выведите все числа до $N$ таким образом:
    $ \underbrace{8 \;10 \;12 \;14}_{\text{четыре числа}} \;3 \underbrace{\;16 \;18 \;20 \;22}_{\text{четыре числа}} \;3 \; .... \;3 \;.... \;\text{и т.д.} $

    Если же число $M$ было зафиксировано как $=2$ то получем:
    $ \underbrace{8 \;10}_{\text{два числа}} \;3 \underbrace{\;14 \;16}_{\text{два числа}} \;3 \; .... \;3 \;.... \;\text{и т.д.} $

  • 23) Модифицируйте решение предыдущей задачи, так, чтобы длина возрастающего фрагмента каждый раз увеличивалась на единицу (начиная с двух):
    $\underbrace{\; 8 \;10}_{\text{два числа}} \;3\; \underbrace{10 \;12 \;14 }_{\text{три числа}} \;3\; \underbrace{\;16 \;18 \;20 \;22}_{\text{четыре числа}} \;3 \; .... \;3 \;.... \;\text{и т.д.} $

    ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно), при этом решение одним циклом можно сделать, как используя делимость нацело (для определения момента вывода тройки), так и не используя.
    Решите всеми тремя способами.

  • 24) Пользователь передает целое положительное число $N$, выведете на экран последовательность от $1$ до $N$ "ёлочкой", например для $N = 18$:
    1
    2 3
    4 5 6
    7 8 9 10
    11 12 13 14 15
    16 17 18

    ПРИМЕЧАНИЕ: эту задачу можно решить, как вложенными циклами, так и вообще одним циклом (что более изящно).
    Решите указанными двумя способами.

  • 25) Пользователь передает целые положительные число $N$ и $M$, выведете на экран последовательность от $1$ до $N$, так чтобы ширина "ёлочки" увеличивалась до $M$ чисел, то уменьшалась до $1$. Например, для $M = 3$ и $N = 19$ получим:
    $
    1\; \\
    2\; 3\; \\
    4\; 5\; 6\;\;\;\;\;\;\;\;\; \text{--максимум три числа} \\
    7\; 8\; \\
    9\; \\
    10\; 11\; \\
    12\; 13\; 14\;\;\;\;\;\;\; \text{--снова три числа} \\
    15\; 16\; \\
    17\; \\
    18\; 19\;.....
    $
  • 26) Пользователь передает целое положительное число $N$, выведете на экран последовательность от $1$ до $N$, так чтобы ширина "ёлочки" росла волнами. Например, для $N = 49$ получим:
    $
    1\; \\
    2\; 3\; \;\;\;\;\;\;\;\; \text{--сначала до двух} \\
    4\; \\
    5\; 6\; \\
    7\; 8\; 9\; \;\;\;\;\;\;\;\; \text{--потом до трёх} \\
    10\; 11\; \\
    12\; \;\;\;\;\;\;\;\; \text{--возвращаемся к одному} \\
    13\; 14\; \\
    15\; 16\; 17\; \\
    18\; 19\; 20\; 21\; \;\;\;\;\;\;\;\; \text{--тут уже четыре} \\
    22\; 23\; 24\; \\
    25\; 26\; \;\;\;\;\;\;\;\; \text{--снова убывает } \\
    27\; \\
    28\; 29\; \\
    30\; 31\; 32\; \\
    33\; 34\; 35\; 36\; \\
    37\; 38\; 39\; 40\; 41\; \\
    42\; 43\; 44\; 45\; \\
    46\; 47\; 48\; \\
    49\;
    $
  • 27) Составьте программу, которая выводит на экран прямоугольный флаг $N \times M$ вида (с рамкой по краям):
    + + + + + +
    + - - - - +
    + - - - - +
    + + + + + +
    
  • 28) Пользователь задает целое положительное число N, выведите матрицу из чисел, размером N, на N, так чтобы элементы ее главной диагонали были заменены, звездочками, напр.
    для N = 3, мы должны получить:
    * 2 3
    1 * 3
    1 2 *
    
  • 29) Пользователь задает целое положительное N, выведите матрицу из чисел, размером N, на N, так чтобы элементы ее побочной диагонали были заменены, звездочками, напр.:
    • для N = 3, мы должны получить:
      1 2 *
      1 * 3
      * 2 3
      
    • для N = 4, мы должны получить:
      1 2 3 *
      1 2 * 4
      1 * 3 4
      * 2 3 4
      
      
  • 30) Пользователь задает целое положительное число N, выведите матрицу из чисел, размером N на N, так чтобы элементы ее и главной и побочной диагонали были заменены, звездочками, напр.
    • для N = 3, мы должны получить:
      * 2 *
      1 * 3
      * 2 *
      
    • для N = 4, мы должны получить:
      * 2 3 *
      1 * * 4
      1 * * 4
      * 2 3 *