Подготовка к ЕГЭ сына - школьника (по информатике)

Публикация № 981994

Программирование - Практика программирования

подготовка ЕГЭ программирование Паскаль Pascal

9
Примеры на Паскале. Если сам отец - поддержи ! Если сам водила - посигналь !

Вступление

 

Надеюсь, не один только я готовлюсь к ЕГЭ со своим сыном-школьником! Пора рядом с разделами "Администрирование", "Сообщество" создать раздел "Подготовка к ЕГЭ". (Шутка)

Задания - из кодификатора ЕГЭ-2019 по Информатике, программы составил сын на Pascal. Что он скажет через год-другой, когда опять их увидит ? (Мы знаем).  

Задание 1 переделали по комментариям. Мне лично нравится  задание 3. Оказывается, из двоичной системы счисления очень удобно переводить в восьмеричную. Каждая триада переходит в одну цифру.

 
 Задание 1. Нахождение минимума и максимума двух, трех, четырёх данных чисел без использования массивов и циклов. (Здесь предполагается, что все числа различны)
 
 Задание 2. Нахождение всех корней заданного квадратного уравнения ax2+bx+c = 0 (Здесь рассматриваются все возможные случаи):
 
 Задание 3. Запись натурального числа в позиционной системе с основанием, меньшим или равным 10. Обработка и преобразование такой записи числа.
 
 Задание 4. Нахождение сумм, произведений элементов данной конечной числовой последовательности (или массива). Очевидно, что произведение будет достигнуто лишь изменением счетчика с присвоением ему значения «1» и изменении знаков «+» на «*»:
 
 Задание 5. Использование цикла для решения простых переборных задач (поиск наименьшего простого делителя данного натурального числа, проверка числа на простоту и т.д.).
 
 Задание 6. Заполнение элементов одномерного и двумерного массивов по заданным правилам. Предлагаю рассмотреть лишь двумерный массив, потому что в примерах ранее заполнение одномерного было показано неоднократно:
 
 Задание 7. Операции с элементами массива. Линейный поиск элемента. Вставка и удаление элементов в массиве. Перестановка элементов данного массива в обратном порядке. Суммирование элементов массива. Проверка соответствия элементов массива некоторому условию
 
 Задание 8. Нахождение второго по величине (второго максимального или второго минимального) значения в данном массиве за однократный просмотр массива.
9

См. также

Специальные предложения

Вознаграждение за ответ
Показать полностью
Комментарии
Избранное Подписка Сортировка: Древо
1. insurgut 196 17.01.19 12:19 Сейчас в теме
Первое точно не так делается. Логика примерно такая:
МаксЧисло = -999999999;
Если ПервоеЧисло > МаксЧисло Тогда
МаксЧисло = ПервоеЧисло;
КонецЕсли;
Если ВтороеЧисло > МаксЧисло Тогда
МаксЧисло = ВтороеЧисло;
КонецЕсли;
Если ТретьеЧисло > МаксЧисло Тогда
МаксЧисло = ТретьеЧисло;
КонецЕсли;
Если ЧетвертоеЧисло > МаксЧисло Тогда
МаксЧисло = ЧетвертоеЧисло;
КонецЕсли;
Сообщить("Максимум: " + МаксЧисло);
Показать


Но ЕГЭ штука такая, им не всегда подходит более простое решение.
2. vasilev2015 913 17.01.19 12:25 Сейчас в теме
Да, я написал: не читайте, будем переделывать. За идею спасибо, хотел переделать как ниже, но Ваш вариант лучше.

Если ПервоеЧисло > ВтороеЧисло Тогда
Если ПервоеЧисло > ТретьеЧисло Тогда
Иначе
КонецЕсли
Иначе
Если ВтороеЧисло > ТретьеЧисло Тогда
Иначе
КонецЕсли
КонецЕсли
3. insurgut 196 17.01.19 12:34 Сейчас в теме +0.2 $m
(2) поторопился, там даже от одного условия можно избавится:
МаксЧисло = ПервоеЧисло;
Если ВтороеЧисло > МаксЧисло Тогда
   МаксЧисло = ВтороеЧисло;
КонецЕсли;
Если ТретьеЧисло > МаксЧисло Тогда
   МаксЧисло = ТретьеЧисло;
КонецЕсли;
Если ЧетвертоеЧисло > МаксЧисло Тогда
   МаксЧисло = ЧетвертоеЧисло;
КонецЕсли;
Сообщить("Максимум: " + МаксЧисло);
Показать


Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. :)
4. spacecraft 17.01.19 13:05 Сейчас в теме +0.2 $m
(3)
Но меня не отпускает ощущение, что скрыт какой-то подвох в задании. :)

правильные ощущения. Условия: "Нахождение минимума и максимума ..."
(2)
program min_max_of_four_numbers_without_arrays_or_cycles;
var
first_number, second_number, third_number, forth_number, min_number, max_number:real;
begin
    writeln('Последовательно введите четыре числа, которые необходимо сравнить');
    readln(first_number, second_number, third_number, forth_number);
    
    if (first_number > second_number) then
    begin
        min_number := second_number;
        max_number := first_number;
    end
    else
    begin
        min_number := first_number;
        max_number := second_number;
    end;
    if (min_number > third_number) then
        min_number := third_number;
    if (min_number > forth_number) then
        min_number := forth_number;
    if (max_number < third_number) then
        max_number := third_number;
    if (max_number < forth_number) then
        max_number := forth_number;
    writeln('Max = ', max_number);
    writeln('Mix = ', min_number);
    
end.
Показать
6. insurgut 196 17.01.19 13:13 Сейчас в теме
(4) да как бы понятно, что на минимум нужно операций по аналогии добавить, я не об этом.
10. starik-2005 1842 17.01.19 13:35 Сейчас в теме +0.2 $m
(4) а зачем так много кода?
var min_num, max_num, ent_num : double;
begin
  writeln('Последовательно введите четыре числа, которые необходимо сравнить');

  readLn(ent_num);
  min_num := ent_num;
  max_num := ent_num;

  readLn(ent_num);
  min_num := min(ent_num, min_num) ;
  max_num := max(ent_num, max_num) ;

  readLn(ent_num);
  min_num := min(ent_num, min_num) ;
  max_num := max(ent_num, max_num) ;

  readLn(ent_num);
  min_num := min(ent_num, min_num) ;
  max_num := max(ent_num, max_num) ;

  writeln('Max = ', max_num);
  writeln('Mix = ', min_num);
end.

Показать
11. vasilev2015 913 17.01.19 13:39 Сейчас в теме
(10) я между прочим, на публикацию вдохновился после вашей заметки о пузырке. : -)))
13. spacecraft 17.01.19 13:42 Сейчас в теме
(10) Ваш код вообще не скомпилится. min() и max() находятся в отдельной библиотеке, которую не факт, что можно использовать на ЕГЭ.
14. starik-2005 1842 17.01.19 13:48 Сейчас в теме
(13) можно заменить на "if ent_num > max_num then max_num := ent_num;"
var min_num, max_num, ent_num : double;
begin
  writeln('Последовательно введите четыре числа, которые необходимо сравнить');

  readLn(ent_num);
  min_num := ent_num;
  max_num := ent_num;

  readLn(ent_num);
  if ent_num < min_num then min_num := ent_num;
  if ent_num > max_num then max_num := ent_num;

  readLn(ent_num);
  if ent_num < min_num then min_num := ent_num;
  if ent_num > max_num then max_num := ent_num;

  readLn(ent_num);
  if ent_num < min_num then min_num := ent_num;
  if ent_num > max_num then max_num := ent_num;

  writeln('Max = ', max_num);
  writeln('Mix = ', min_num);
end.
Показать
15. spacecraft 17.01.19 13:50 Сейчас в теме
(14) и? Чем этот код лучше моего? Лишним if?
16. starik-2005 1842 17.01.19 13:51 Сейчас в теме
(15) отсутствием лишних переменных и читаемостью как минимум.
17. spacecraft 17.01.19 13:53 Сейчас в теме
(16) спорное утверждение. Куча readLn внутри когда не способствуют лучшей читаемости этого кода.
18. starik-2005 1842 17.01.19 13:57 Сейчас в теме
(17) каждому свое. Веток ветвления у Вас тоже 6, если считать блок "else". Блоки зачем-то, которые совершенно не нужны. Лишние переменные - это всегда минус баллы на олимпиадах. Но ведь главное, чтобы работало, да? А вот проверяющим ЕГЭ читаемость будет важнее.
45. vadim1011985 63 17.01.19 17:57 Сейчас в теме
(2)
По моему это самый простой и короткий способ искать мин и макс а вообще если есть встроенная функция max и min то тогда код получается еще короче т.е. сама функция не нужна

Function Max (a,b)
begin
If a>b then
return a
else
return b;
end;

Procedure FindMaxValue ()
var maxValue,a,b,c,d:int;
begin

writeln('Последовательно введите четыре числа, которые необходимо сравнить');
readln(a, b, c, d);

maxValue = Max (Мax(a,b),Мax(с,d));

end;
starik-2005; PowerBoy; +2 Ответить
46. starik-2005 1842 18.01.19 10:26 Сейчас в теме
(45) в идеале что-то такое получается:
var a,b,c,d : double;
begin
  writeln('Последовательно введите четыре числа, которые необходимо сравнить');
  readLn(a,b,c,d);
  writeLn('Max: ', max(max(a,b),max(c,d)));
  writeLn('Min: ', min(min(a,b),min(c,d)));
end.
48. roman77 85 18.01.19 16:38 Сейчас в теме
(1) В контрольных заданиях всё подробно расписано. В последней задаче за простое решение (перебором) дают 2 балла, за сложное 4 балла. Все методисты и здравомыслящие люди советуют решать на 2 балла, ибо при сложном решении есть высокая вероятность накосячить и не получить ни одного бала.
50. addinaq 20.01.19 16:06 Сейчас в теме
(1)
Попарное сравнение может
Перем Первая,Вторая,Третья,Четвертая

?(Первая>Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
?(Третья>Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
Максимум = ?(ИскомоеПервойПары>ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);

?(Первая<Вторая,ИскомоеПервойПары=Первая,ИскомоеПервойПары=Вторая);
?(Третья<Четвертая,ИскомоеВторойПары=Третья,ИскомоеВторойПары=Четвертая);
Минимум = ?(ИскомоеПервойПары<ИскомоеВторойПары,ИскомоеПервойПары,ИскомоеВторойПары);
Показать
5. insurgut 196 17.01.19 13:10 Сейчас в теме
Задание 8 (на паскаль думаю сами интерпретируете):
	НачальноеЧисло = Формат(ТекущаяДата(), "ДФ=HHmmss");
	ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
	
	//генерация массива
	МассивЧисел = Новый Массив;
	РазмерМассива = 9;
	Сообщить("Массив:");
	Для Сч = 0 По РазмерМассива - 1 Цикл
		СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
		МассивЧисел.Добавить(СлучайноеЧисло);
		Сообщить(СлучайноеЧисло);
	КонецЦикла;
	
	//поиск максимальных
	ПервоеМакс = 0;
	ВтороеМакс = 0;
	Для Сч = 0 По РазмерМассива - 1 Цикл
		Если МассивЧисел[Сч] > ПервоеМакс Тогда
			ВтороеМакс = ПервоеМакс;
			ПервоеМакс = МассивЧисел[Сч];
		КонецЕсли;
	КонецЦикла;
	Сообщить("Первое: " + ПервоеМакс);
	Сообщить("Второе: " + ВтороеМакс);
Показать
7. Man4kin 17.01.19 13:18 Сейчас в теме
(5) Без использования массивов и циклов же ?
8. insurgut 196 17.01.19 13:18 Сейчас в теме
(7) за однократный проход массива же?
9. vasilev2015 913 17.01.19 13:33 Сейчас в теме
(5) Когда элемент МассивЧисел[Сч] сравниваем с ПервоеМакс и ВтороеМакс, то элемент может изменить ВтороеМакс или обе переменные, а здесь только одно условие.
12. insurgut 196 17.01.19 13:39 Сейчас в теме
(9) если честно, то ничего не понял :) элемент массива не сравнивается со вторым максимальным, только с первым. Второе максимальное сравнивать ни с чем не нужно.
21. vasilev2015 913 17.01.19 14:13 Сейчас в теме
(12) из массива {2,1,5,4,3} нужно выбрать второй по-минимуму 2 или второй по-максимуму 4. Код из статьи мы проверяли.
22. insurgut 196 17.01.19 14:19 Сейчас в теме
(21) и все равно не пойму сути вашего замечания - что не так то? Алгоритм находит второе максимальное число в массиве (доработать под второе минимальное сложности не составит). Или вас смущает вывод сообщения о первом максимальном? Закомментируем его, так и быть. Если не нравится генерация массива - так это для проверки работоспособности. Можно задать фиксированным массив, суть не поменяется.
   
    //генерация массива
    РазмерМассива = 5;
    МассивЧисел = Новый Массив;
    МассивЧисел.Добавить(2);
    МассивЧисел.Добавить(1);
    МассивЧисел.Добавить(5);
    МассивЧисел.Добавить(4);
    МассивЧисел.Добавить(3);
    
    //поиск второго максимального числа
    ПервоеМакс = 0;
    ВтороеМакс = 0;
    Для Сч = 0 По РазмерМассива - 1 Цикл
        Если МассивЧисел[Сч] > ПервоеМакс Тогда
            ВтороеМакс = ПервоеМакс;
            ПервоеМакс = МассивЧисел[Сч];
        КонецЕсли;
    КонецЦикла;
    Сообщить("Второе: " + ВтороеМакс);
Показать
26. vasilev2015 913 17.01.19 14:50 Сейчас в теме
(22) Мы разошлись в понимании "второй максимальный" я себе представлял, что среди всего массива выбрать максимум, убрать его из рассмотрения, выбрать еще раз максимум - это будет ответ. А Вы представляете, что максимум должен быть локальным.Проверю еще раз условия задачи. В любом случае, спасибо.
35. insurgut 196 17.01.19 16:24 Сейчас в теме
(26) все я понял, где собака зарыта :)
Исправленный код:
	НачальноеЧисло = Формат(ТекущаяДата(), "ДФ=HHmmss");
	ГСЧ = Новый ГенераторСлучайныхЧисел(НачальноеЧисло);
	
	//генерация массива
	МассивЧисел = Новый Массив;
	РазмерМассива = 9;
	Сообщить("Массив:");
	Для Сч = 0 По РазмерМассива - 1 Цикл
		СлучайноеЧисло = ГСЧ.СлучайноеЧисло(0, 235959);
		МассивЧисел.Добавить(СлучайноеЧисло);
		Сообщить(СлучайноеЧисло);
	КонецЦикла;
	
	//поиск максимальных
	ПервоеМакс = 0;
	ВтороеМакс = 0;
	Для Сч = 0 По РазмерМассива - 1 Цикл
		Если МассивЧисел[Сч] > ПервоеМакс Тогда
			ВтороеМакс = ПервоеМакс;
			ПервоеМакс = МассивЧисел[Сч];
		ИначеЕсли МассивЧисел[Сч] > ВтороеМакс Тогда
			ВтороеМакс = МассивЧисел[Сч];
		КонецЕсли;
	КонецЦикла;
	Сообщить("Первое: " + ПервоеМакс);
	Сообщить("Второе: " + ВтороеМакс);
Показать


Пример №1



Пример №2
39. vasilev2015 913 17.01.19 16:36 Сейчас в теме
(35) да, у нас также получилось. Только мы не использовали, что числа неотрицательные, поэтому присваиваем не нули, а первые элементы.
41. insurgut 196 17.01.19 16:54 Сейчас в теме
(39) ну вместо 0 можно присвоит обоим переменным значение первого элемента массива, а сам цикл начать со второго элемента - результат будет тем же, а условий меньше. Ну и в самом цикле поиска в вашем примере на одно условие больше, можно обойтись всего двумя.
19. sergathome 17.01.19 14:01 Сейчас в теме
Оказывается, из двоичной системы счисления очень удобно переводить в восьмеричную. Каждая триада переходит в одну цифру.

Да, немногие помнют ужо линейку ДВК и славного её дитёныша БК-0010. Там оно изо всех щелей ;)
20. starik-2005 1842 17.01.19 14:01 Сейчас в теме
А вот по заветам Никлауса Вирта - процедурное программирование!
procedure minmax(min, max, ent : double)
begin
  readLn(ent);
  if ent > max them max := ent;
  if ent < min them min := ent;
end;

var min_num, max_num, ent_num : double;
begin
  writeln('Последовательно введите четыре числа, которые необходимо сравнить');

  readLn(ent_num);
  min_num := ent_num;
  max_num := ent_num;

  minmax(min_num, max_num, ent_num);
  minmax(min_num, max_num, ent_num);
  minmax(min_num, max_num, ent_num);

  writeln('Max = ', max_num);
  writeln('Mix = ', min_num);
end.
Показать
44. starik-2005 1842 17.01.19 17:51 Сейчас в теме
(20) кстати, рекурсия - это не цикл!

procedure minmax(i: integer; min, max, ent : double)
begin
  if i < 4 then begin
    readLn(ent);
    if (ent > max) or not i then max := ent;
    if (ent < min) or not i then min := ent;
    minmax(i + 1, min_num, max_num, ent_num);
  end 
  else begin
    writeln('Max = ', max);
    writeln('Mix = ', min);
  end;
end;

var min_num, max_num, ent_num : double;
begin
  writeln('Последовательно введите четыре числа, которые необходимо сравнить');
  minmax(0, min_num, max_num, ent_num);
end.
Показать
23. starik-2005 1842 17.01.19 14:19 Сейчас в теме
Кстати, по поводу квадратного уравнения, то эту задачу вроде бы все должны были в школе еще решать:
введите а, б, ц
д = б * б - 4 * а * ц
если д < 0 тогда Нет корней!
корень1 = (-б + корень(д)) / (2 * а)
если д > 0 тогда корень2 = (-б - корень(д)) / (2 * а)
24. starik-2005 1842 17.01.19 14:24 Сейчас в теме
Кстати, есть такой ресурс - codewars.com - там много интересных задачек.
27. vasilev2015 913 17.01.19 14:51 Сейчас в теме
(24) у меня узкие интересы: нужно подготовить к ЕГЭ, но ресурс посмотрю.
25. vadim1011985 63 17.01.19 14:42 Сейчас в теме
Тут на инфостарте есть статья по сортировке массивов там есть "Гномья сортировка" которая за один цикл (без вложенных) сортирует массив , поэтому поиск 2-го максимума или минимума можно построить на ней , тогда 1, 2-ой элемент будут 2-мя минимумами , а последний и предпоследний 2-мя максимумами


4. Алгоритм "Гномья сортировка".

Алгоритм так странно назван благодаря голландскому ученому Дику Груну.

Гномья сортировка основана на технике, используемой обычным голландским садовым гномом (нидерл. tuinkabouter). Это метод, которым садовый гном сортирует линию цветочных горшков. По существу он смотрит на следующий и предыдущий садовые горшки: если они в правильном порядке, он шагает на один горшок вперёд, иначе он меняет их местами и шагает на один горшок назад. Граничные условия: если нет предыдущего горшка, он шагает вперёд; если нет следующего горшка, он закончил.
Дик Грун

Вот собственно и все описание алгоритма "Гномья сортировка". Что интересно, алгоритм не содержит вложенных циклов, а сортирует весь массив за один проход.



Функция ГномьяСортировка(Знач Массив)
    
    i = 1;
    j = 2;
    
    Пока i < Массив.Количество() Цикл // Сравнение < - Сортировка по возрастанию, > - по убыванию   
        
        Если Массив[i-1]  
            i = j;
            j = j + 1;
        Иначе
            Замена = Массив[i];
            Массив[i] = Массив[i - 1];
            Массив[i - 1] = Замена;            
            i = i - 1;
            Если i = 0 Тогда
                i = j;
                j = j + 1;
            КонецЕсли;            
        КонецЕсли;        
    КонецЦикла;    
    
    Возврат Массив;    
КонецФункции
Показать



Ссылка на статью
32. herfis 278 17.01.19 15:53 Сейчас в теме
(25)
сортирует весь массив за один проход

Очень лукавая формулировка. Цикл-то один, но "одним проходом" это назвать никак нельзя.
36. insurgut 196 17.01.19 16:30 Сейчас в теме
(25) мы алгоритмы сортировок в институте изучали :)
38. herfis 278 17.01.19 16:35 Сейчас в теме
(25) Слыхал что когда нужно быстро на коленке сообразить хоть какую-то сортировку, то сортировка Шелла хороший кандидат. Типа золотой середины между более эффективными но более сложными алгоритмами и более медленными "учебными" алгоритмами.
28. capitan 1172 17.01.19 14:57 Сейчас в теме
29. starik-2005 1842 17.01.19 15:27 Сейчас в теме
(28) 30 секунд, однако... Странные задачи.
30. capitan 1172 17.01.19 15:47 Сейчас в теме
(29)Это из серии загадок, на которые дети отвечают за пару секунд, а взрослые — за пару часов
давайте сложнее
31. Octopus 337 17.01.19 15:50 Сейчас в теме
34. capitan 1172 17.01.19 16:12 Сейчас в теме
(31)
(33)
Гугл в помощь ) Я тоже не решил
33. vasilev2015 913 17.01.19 16:04 Сейчас в теме
37. insurgut 196 17.01.19 16:32 Сейчас в теме
40. SlavaKron 17.01.19 16:40 Сейчас в теме
(30) В массиве дат, отсортированном по убыванию.
42. herfis 278 17.01.19 17:14 Сейчас в теме
43. starik-2005 1842 17.01.19 17:18 Сейчас в теме
(30) сначала думал, что в календаре, оказалось, что в словаре. Ну тоже неплохо...
47. roman77 85 18.01.19 16:33 Сейчас в теме
А почему такая дискриминация - только сыновья? У меня дочка в прошлом году готовилась к информатике и ИкТ, успешно сдала. Не буду поддерживать :)
49. vasilev2015 913 20.01.19 12:12 Сейчас в теме
(47) Исправил в статье https://infostart.ru/public/983886/. Вместо "Отец, Сын" вставил "Родитель, Ребенок".
Оставьте свое сообщение