Задание 12

Алгоритм ветвление

Блок-схема разветвляющегося алгоритма выглядит следующим образом:

Полная форма ветвления
Полная форма ветвления

Что в словесной форме будет звучать так:

  • ввод a и b;
  • если a больше b, то переменной max присваиваем значение a, иначе переменной max присваиваем значение b;
  • вывод max.

Реализуем это в Паскале:

Ветвление в Паскале
Ветвление в Паскале

Ветвление бывает неполное, в таком случае отсутствует блок «иначе»:

Неполная форма ветвления
Неполная форма ветвления

На Паскале:

Неполная форма условного оператора
Неполная форма условного оператора

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

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

Цикл со счетчиком (с переменной)

Рассмотрим блок-схему работы цикла со счетчиком (счетчик считает, сколько раз выполнилось тело цикла):

Блок-схема цикла со счетчиком
Блок-схема цикла со счетчиком

Что словесно будет означать следующее:

  • i равно 0;
  • если i равно 5, то заканчиваем программу, иначе выводим на экран слово Привет и увеличиваем i на единицу;
  • возвращаемся к проверке i (к предыдущему пункту).

На языке Паскаль цикл со счетчиком выглядит так:

Цикл со счетчиком
Цикл со счетчиком

Если в теле цикла более одного оператора:

В теле цикла больше одного оператора
В теле цикла больше одного оператора

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

Цикл с обратным счетчиком
Цикл с обратным счетчиком

Цикл с предусловием

Рассмотрим блок-схему цикла с предусловием:

Цикл с предусловием
Цикл с предусловием

Данный алгоритм подсчитывает количество цифр в числе:

  • вводится число n
  • присваивается 0 (т.е. обнуляем счетчик)
  • пока n не равно 0 выполняем:
    • увеличиваем c на единицу
    • делим целочисленно n на 10 и n присваиваем получившееся значение
  • выводим значение c
  • конец

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

Цикл с предусловием
Цикл с предусловием

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

Цикл с постусловием

Рассмотрим блок-схему:

Цикл с постусловием
Цикл с постусловием

Что дословно означает:

  • вводится n
  • если n больше 0 то продолжаем программу, иначе возвращаемся к предыдущему пункту (ввод n)

В Паскале:

Цикл с постусловием, Паскаль
Цикл с постусловием, Паскаль

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

Решение заданий 12 ЕГЭ по информатике

Плейлист видеоразборов задания на YouTube:
Задание демонстрационного варианта 2022 года ФИПИ


Исполнитель Редактор и цепочки символов

📹 Учимся по видео (решения разного типа программным способом):

📹 YouTube здесьКакая строка получится?

12_4:

Исполнитель Редактор получает на вход строку цифр и преобразовывает её. Редактор может выполнять две команды, в обеих командах v и w обозначают цепочки цифр.

А) заменить (vw)
Эта команда заменяет в строке первое слева вхождение цепочки v на цепочку w.

Б) нашлось (v)
Эта команда проверяет, встречается ли цепочка v в строке исполнителя Редактор. Если она встречается, то команда возвращает логическое значение «истина», в противном случае возвращает значение «ложь». Строка при этом не изменяется.

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

НАЧАЛО
ПОКА нашлось (12) ИЛИ нашлось (333)
  ЕСЛИ нашлось (12)
    ТО заменить (12, 3)
    ИНАЧЕ заменить (333, 3)
  КОНЕЦ ЕСЛИ
КОНЕЦ ПОКА
КОНЕЦ
✍ Решение:
✎ Решение 1. Теоретическое:

  • Рассмотрим алгоритм: редактор будет выполнять команды только тогда, когда в строке встречается цепочка «12» или цепочка «333»;
  • если в строке есть «12», то тогда эта цепочка заменяется на «3»;
  • если в строке нет цепочки «12», но есть «333», то цепочка «333» заменяется на «3».
  • Теперь вернемся к условию нашей задачи. Условие цикла истинно, соответственно выполняем блок ЕСЛИ, т.е. делаем замену: в каждом из 40 чисел ‘123‘, заменяем 12 на 3. Получим 40 + 40 = 80 троек (40 троек было изначально и 40 добавилось);
  • 123123123...123
    ↓  ↓  ↓     ↓
    3 33 33 3...3 3
    
  • Так как больше чисел 12 у нас не встречается, то работает блок ИНАЧЕ. Сколько раз можно заменить в 80 подряд идущих тройках три тройки на одну80 делим на получаем 26 раз + тройки в остатке. Итого осталось 28 троек;
  • 333 333 333 333... 333 33
       26 троек по три
    получили:
    3   3   3   3  ... 3 33
             26          + 2
    
  • Теперь из 28 троек сколько раз мы можем заменить три тройки на одну28 делим на и получаем 9 раз + 1 тройка в остатке. Итого 10 троек;
  • 333 333 333 333... 333 3
       9 троек по три   + 1
    получили:
    3   3   3   3  ... 3 3
             9          + 1
    
  • Делаем то же самое: 10 делим на 3 получаем 3 раза + 1 тройка в остатке = 4 тройки
  • 333 333 333 3
    3 тройки по три + 1
    получили:
    3   3   3   3
    
  • Последний раз делим 4 на 3, получаем 1 тройку + 1 = 2 тройки
  • 3 3 3 3
      ↓
      3   3 
    

Результат: 33
  
✎ Решение 2. Программное:
Pascalabc.net:

1
2
3
4
5
6
7
8
9
10
11
begin
  var s := '123' * 40;
  while ('12' in s) or ('333' in s) do
  begin
    if '12' in s then
      s := s.Replace('12', '3', 1)
      else
      s := s.Replace('333', '3', 1);
  end; 
  print(s);
end.
Pascal (традиционный):

begin
   var s := '123'*40;
   var p1 := Pos('12',s);
   var p2 := Pos('333',s);
   while (p1 > 0) or (p2 > 0) do begin
     if p1 > 0 then begin
       Delete( s, p1, 2 );
       Insert( '3', s, p1 );
     end
     else begin
       Delete( s, p2, 3 );
       Insert( '3', s, p2 );
     end;
     p1 := Pos('12',s);
     p2 := Pos('333',s);
   end; 
   write(s);
end.
Python:

s = 40*'123'
while "12" in s or "333" in s:
  if "12" in s:
    s = s.replace( "12", "3", 1 )
  else:
    s = s.replace( "333", "3", 1 )
print(s)
С++:

#include<iostream>
using namespace std;
int main()
{
    string s = "";
    for (int i = 0; i < 40; ++i) {
         s+= "123";
    }
    string s(40, '123');
    int p1 = s.find("12");
    int p2 = s.find("333");
    while (p1 != string::npos or p2 != string::npos) {
        if (p1 != string::npos)
            s.replace(p1, 2, "3"); // 12
        else
            s.replace(p2, 3, "3"); // 333
        p1 = s.find("12");
        p2 = s.find("333");
    }
    cout << s;
}

Результат: 33

Комментарии