Форум программистов, компьютерный форум, киберфорум
antonboom
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Полезно выпускнику

Запись от antonboom размещена 23.05.2013 в 22:56
Показов 4650 Комментарии 0

Задание C4 по информатике: знания / сюжеты / методы решения

Не по теме:

Используемый язык - Pascal


Для большинства учеников самой сложной и нерешаемой задачей в ЕГЭ по информатике является задача C4.

Проанализировав несколько десятков задач С4 ЕГЭ по информатике из демонстрационных вариантов, реальных вариантов, а также многочисленных сборников для подготовки к экзамену. Из всего многообразия можно выделить несколько «типовых сюжетов» и методов их решения, знаний, которыми должен обладать ученик.

Знания:
Для успешного решения задачи необходимым минимумом является:
  • понимание структуры программы
  • работа с различными типами данных
  • ввод-вывод данных
  • работа с условными операторами
  • написание циклов с условиями и с параметрами
  • написание вложенных циклов

Работа со строками

Определение длины строки
Pascal
1
n:= length(str);
Получение отдельного символа по его номеру в строке
Pascal
1
ch := str[10]; {выделяем десятый символ в строке}
Получение кода символа по его коду
Pascal
1
code:=ord(ch);
Получение символа по коду
Pascal
1
ch:=ctr(code);
Поиск подстроки в строку
Pascal
1
pos(‘ ‘,str); {поиск первого пробела в строке}
Выделение подстроки в строке
Pascal
1
name:=copy(str,1,10); {выделяем первые пять символов в строке и сохраняем их в строковой переменной phone}
Удаление части строки
Pascal
1
delete(str,1,10) ; {удаляем первые десять символов в строке. Это – оператор.}
Перевод строки в число val()
Pascal
1
val(str,i,err); {значение строки str преобразовывается в числовое и записывается в переменную i, err- номер ошибочного символа, в случае успеха равен нулю}
Работа с массивами

Описание и формирование массива
Pascal
1
var m: array[1..99] of integer;
Поиск значения по заданному критерию
Pascal
1
2
3
4
5
6
7
for i:=1 to n do
if (m[i]=k) then
begin
num := I;
break;
end;
{запомнили индекс элемента массива с заданным значением k}
Поиск минимального элемента в массиве
Pascal
1
2
3
4
5
6
min := m[1];
num_min:=1;
for i:=2 to n do
if(m[i] < min) then begin
min := m[i]; num_min:=i;
end;
Обмен элементами массива
Pascal
1
2
z:=m[1]; m[1]:=m[10]; m[10]:=z;
{элементы массива с индексами 1 и 10 поменялись местами}
Сортировка массива (методом Пузырька)
Pascal
1
2
3
4
5
for i:=2 to n_qwest do
for j:=1 to i do
if m[i] > m[j] then begin
z := m[j]; m[j] := m[i]; m[i] := z;
end;
Работа с записями

Описание записей
Pascal
1
2
3
4
5
6
7
type student = record
name: string[20];
class: integer;
end;
var
r: student; 
mas:array[1..1000] of student;
Формирование новой записи
Pascal
1
2
r.name := ‘abc’;
r.class := 11;
Формирование массива записей
все тоже самое, но в цикле
Pascal
1
2
3
4
. . .
mas[i].name := ‘abc’;
mas[i].class := 11;
. . .
Большинство задач так или иначе использует все из перечисленных знаний.

Сюжеты и методы:
Ниже представлены одиннадцать различных вариантов задач С4, которые встречались демонстрационных, пробных и реальных экзаменах за последние три года. Для простоты обращения к каждой из задач им даны краткие названия, для каждой задачи приведен краткий метод ее решения.

1. «Результаты экзаменов»
Из полученных строк формируется массив записей, с их последующей статистической обработкой.
Текст задачи:
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:
<Фамилия> <Имя> <оценки>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Имя> – строка, состоящая не более чем из 15 символов, <оценки> – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом.
Пример входной строки:
Иванов Петр 4 5 3

Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.

Метод решения:
  1. получение N строк и их обработка:
  2. выделение имени
  3. выделение трех оценок
  4. получение суммарного балла (аналог среднего балла, но целое число)
  5. добавление в массив [0..15] имен учеников, набравших бал, равный индексу массива
  6. вывод трех наименьших не пустых значения массива

2. Участие в олимпиаде
Из полученных строк формируется массив записей, с последующей статистической обработкой.

Текст задачи:
На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: <Фамилия> <Инициалы> <номер школы>, где <Фамилия> – строка, состоящая не более чем из 20 символов, <Инициалы> – строка, состоящая из 4-х символов (буква, точка, буква, точка), <номер школы> – не более чем двузначный номер. <Фамилия> и <Инициалы>, а также <Инициалы> и <номер школы> разделены одним пробелом.
Пример входной строки:
Иванов П.С. 57

Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию, из каких школ было меньше всего участников олимпиады (но из этих школ был хотя бы один участник).

Метод решения:
  1. получение N строк и их обработка:
  2. выделение имени
  3. выделение номера школы
  4. добавление в массив записей [1..99] имен учеников, участвовавших в олимпиаде , в индекс, равный номеру школы. Так как после этот массив нужно будет сортировать, то помимо строки имен запись должна содержать номер школы и количество учеников (последнее значение должно увеличиваться на единицу при обработке новой строки).
  5. сортировка массива по полю количество учеников
  6. вывод трех наименьших не пустых значения массива
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
var N : integer;
 sym : char;
 nschool : 1..99; {или nschool : integer;}
 count : array[1..99] of integer;
 i, min : integer;
begin
 for i := 1 to 99 do
 count[i] = 0;
 readln(N);
 for i : =1 to N do begin
 sym := ‘!’;  {этот символ не может быть в начале фамилии}
 while sym <> ‘ ‘ do  {чтение фамилии}
 read(sym);
 sym := ‘!’;
 while sym <> ‘ ‘ do  {чтение инициалов}
 read(sym);       {следующий ввод – с новой строки}
 readln(nschool);
 count[nschool] := count[nschool] + 1;
 end;
 min := N;  {нельзя взять count[1], т.к. там может быть 0}
 for i := 1 to 99 do
 if count[i] > 0
 then begin if count[i] < min
 then min := count[i];
 end;
 for i := 1 to 99 do
 if count[i] = min
 then writeln (i);
end.


3. «Ученики школы»
Из списка учеников формируется массив записей, который подвергается статистической обработке.

Текст задачи:
На вход программе подаются сведения об учениках некоторой средней школы. В первой строке сообщается количество учеников N, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <класс>, где <Фамилия> – строка, состоящая не более, чем из 20 символов, <Имя> – строка, состоящая не более, чем из 15 символов, <класс> – год обучения (от 1 до 11) и заглавная буква (от “А” до “Я”) без пробела. <Фамилия> и <Имя>, а также <Имя> <класс> разделены одним пробелом.
Пример входной строки:
Иванов Петр 10Б

Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию о параллелях (годе обучения) с наименьшим числом учеников. Программа должна выводить на экран в первой строке количество учеников в искомых параллелях, а во второй строке – в порядке возрастания номера этих параллелей через пробел.
Например:
100
1 7 11


Метод решения:
вариация предыдущих задач
  1. получение N строк и их обработка:
  2. выделение имени
  3. выделение номера класса
  4. добавление в массив записей [1..11] имен учеников, в индекс, равный номеру класса. Так как после этот массив нужно будет сортировать, то помимо строки имен запись должна содержать номер параллели и количество учеников в ней (последнее значение должно увеличиваться на единицу при обработке каждой новой строки).
  5. сортировка массива по полю количество учеников
  6. вывод трех наибольших не пустых значения массива

4. «Среднесуточная температура»
Из полученных строк с среднесуточной температурой формируется массив записей, произволится статистическая полученных данных.

Текст задачи:
На вход программе подаются 365 строк, которые содержат информацию о среднесуточной температуре всех дней 2007 года. Формат каждой из строк следующий: сначала записана дата в виде dd.mm (на запись номера дня и номера месяца в числовом формате отводится строго два символа, день от месяца отделен точкой), затем через пробел (для Бейсика – через запятую) записано значение температуры — число со знаком плюс или минус, с точностью до 1 цифры после десятичной точки. Данная информация отсортирована по значению температуры, то есть хронологический порядок нарушен. Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию о месяцах с минимальной среднемесячной температурой. Найденные минимальные значения следует выводить в отдельной строке для каждого месяца в виде: номер месяца, значение среднемесячной температуры, округленное до одной цифры после десятичной точки.

Метод решения:
  1. начальные значения
  2. ввод и размещение необходимой информации в памяти для каждого месяца
  3. определение максимального отклонения в сравнении с предыдущими месяцами
Кликните здесь для просмотра всего текста
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
const N = 365;
var sym : char;
 month : 1..12;  {или month : integer;}
 temperature : real;
 max_otkl : real;
 days : array[1..12] of integer;
 tablica : array[1..32, 1..12] of real;
 I, j : integer;
begin
 for i:=1 to 12 do begin
 days [i]:= 0;
 tablica[32, i]:= 0;
 end;
 max_otkl:=0;
 for i :=1 to N do begin
 for j := 1 to 3 do     {чтение номера дня и точки}
 read(sym);
 read(month);   {чтение номера месяца}
 readln(temperature);     {следующий ввод – с новой строки}
 days [month]:= days [month]+1;  {место для температуры}
 tablica[days [month], month]:= temperature;
 tablica[32, month]:= tablica[32, month]+ temperature;
 end;
 for i:=1 to 12 do begin
 tablica[32, i]:= tablica[32, i] / days [i];
 for j:=1 to days [i] do begin  {по дням месяца}
 if abs(tablica[j,i] – tablica[32, i]) > max_otkl
 then max_otkl := abs(tablica[j, i] – tablica[32, i]);
 end;
 writeln(max_otkl);
end.


5. «Заклинание»
Получить строку, выполнить преобразования с символами по заданным правилам, вывести полученную строку.

Текст задачи:
На вход программе подается текст заклинания, состоящего не более чем из 200 символов, за*канчивающийся точкой (символ «точка» во входных данных единственный). Оно было за*шифровано юным волшебником следующим об*разом. Сначала волшебник определил количест*во букв в самом коротком слове, обозначив по*лученное число К (словом называется непрерыв*ная последовательность латинских букв, слова друг от друга отделяются любыми другими сим*волами, длина слова не превышает 20 симво*лов). Затем он заменил каждую латинскую бук*ву в заклинании на букву, стоящую в алфавите на К букв ранее (алфавит считается цикличе*ским, то есть перед буквой А стоит буква Z), ос*тавив другие символы неизменными. Строчные буквы при этом остались строчными, а пропис*ные — прописными. Требуется написать про*грамму на языке Паскаль или Бейсик, которая будет выводить на экран текст расшифрованного заклинания.

Например, если зашифрованный текст был таким:
Zb Ra Са Dab Ra,
то результат расшифровки должен быть сле*дующим:
Вd Тс Ее Fed Тс.


Метод решения:
  1. Выделение исходной строки
  2. Определение длины самого короткого слова – K.
  3. Замена в исходной строке каждого символа с кодом C на новый: CA + (C+K) mod CA для заглавных и Ca + (C+K) mod Ca для прописных. (мы добавляем, т.к. идет расшифровка кода).
  4. Вывод нового кода на экран.

6. «Контрольное значение»
На основе полученной последовательности чисел вычислить контрольного значение, которое строится по заданным правилам, сравнить вычисленное значение с полученным на входе.

Текст задачи:
По каналу связи передается последовательность положительных целых чисел, все числа не превышают 1000, их количество заранее неизвестно. Каждое число передается отдельно. Признаком конца передаваемой последовательности является число 0. После числа 0 передается контрольное значение – наибольшее число R, удовлетворяющее следующим условиям:
1) R – произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел, произведения различных, но равных по величине элементов допускаются);
2) R делится на 6
Напишите эффективную программу, которая получает последовательность чисел и следующие за ней признак конца и контрольное значение, а также проверяет правильность контрольного значения. Программа должна напечатать отчет по следующей форме:
Получено .. чисел
Полученное контрольное значение: ….
Вычисленное контрольное значение:…
Контроль пройден (или – контроль не пройден).

Размер памяти, которую использует Ваша программа, не должен зависеть от длины переданной последовательности чисел. Перед текстом программы кратко опишите используемый вами алгоритм решения задачи.
Пример входных данных:
60
17
3
7
9
60
0
3600

Пример выходных данных для приведенного выше примера входных данных:
Получено 6 чисел
Полученное контрольное значение: 3600
Вычисленное контрольное значение: 3600
Контроль пройден.


Метод решения:
В N полученных числах ищем:
  • максимальное значение,
  • максимальные значение кратное шести (если есть)
  • максимальные значение кратное трем (если есть)
  • максимальные значение кратное двум (если есть)
  • из этих полученных чисел формируем максимальное контрольное значение, сравниваем с полученным.

7. «Последовательность чисел»
Анализ последовательности чисел, выделение в ней участка с наибольшим «подъемом».

Текст задачи:
По каналу связи передается последовательность положительных целых чисел X1, X2 …, все числа не превышают 1000, их количество заранее неизвестно. Каждое число передается в виде отдельной текстовой строки, содержащей десятичную запись числа. Признаком конца передаваемой последовательности является число 0. Участок последовательности от элемента XT до элемента XT-N называется подъемом, если на этом участке каждое следующее число больше предыдущего. Высотой подъема называется разность XT-N - XT. Напишите эффективную программу, которая вычисляет наибольшую высоту среди всех подъемов последовательности. Если в последовательности нет ни одного подъема, программа выдает 0.
Программа должна напечатать отчет по следующей форме:
Получено ... чисел
Наибольшая высота подъема: …
Размер памяти, которую использует Ваша программа, не должен зависеть от длины переданной последовательности чисел.


Метод решения:
  1. задаем максимальную высоту подъема равную нулю
  2. в цикле While() получаем числа пока не получим 0. Всякий раз сохраняем предыдущее значение.
  3. получив новое число, которое больше предыдущего считаем, что это - новый подъем, вычисляем его текущую высоту.
  4. по окончании подъема сравниваем его с текущим максимальным, в случае если текущий подъем больше - перееопределяем значение.

Не по теме:

Слизано и подредактировано с сайта http://www.titorov.ru/
В дальнейшем, может быть, добавлю коды Паскаль и остальные задачи.

Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru