УМК ШКОЛА



** На вход программе подаются сведения
ОГЭ ЕГЭ - РЕШЕНИЯ ЗАДАНИЙ > ** Программирование и алгоритмизация > ** На вход программе подаются сведения
 

Страницы:

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

Zb Ra Ca Dab Ra.

то результат расшифровки должен быть следующим:

Bl Tc Ec Fcd Tc.
РЕШЕНИЕ:

Алгоритм:
1. Задаем массив заглавных и прописных букв
2. Находим в зашифрованном тексте минимально слово K
3. Чтобы сделать замену, преобразуем зашифрованный текст в массив.
4. Каждый элемент массива заменяем на новую букву, отстоящую на K+1 место правее
5. Выводим на монитор получившийся массив а(i)

CLS
DIM str AS STRING
DIM str1 AS STRING
DIM str2 AS STRING
DIM a(200) AS STRING
INPUT "kod", str
str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"
str2 = "abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz"

K = 200
L = LEN(str)

FOR i = 1 TO L
FOR j = 1 TO 26
IF MID$(str, i, 1) = MID$(str1, j, 1) OR MID$(str, i, 1) = MID$(str2, j, 1) THEN
m = m + 1
j = 26
ELSE
IF m > 0 AND m < K THEN
K = m
m = 0
END IF
END IF
NEXT j
NEXT i

FOR i = 1 TO L
a(i) = MID$(str, i, 1)
FOR j = 1 TO 52
IF MID$(str, i, 1) = MID$(str1, j, 1) THEN a(i) = MID$(str1, j + 1 + K, 1): j = 52
IF MID$(str, i, 1) = MID$(str2, j, 1) THEN a(i) = MID$(str2, j + K + 1, 1): j = 52
NEXT j
NEXT i

FOR i = 1 TO L
PRINT a(i);
NEXT i

№ 6 На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от “.” и букв “a”..“z”, во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать эффективную программу, которая будет печатать буквы, встречающиеся во входной последовательности, в порядке уменьшения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается.

Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке. Например, пусть на вход подаются следующие символы:

batat.

В данном случае программа должна вывести

atb
РЕШЕНИЕ:

Алгоритм:
1. Пока не введена точка, программа запрашивает ввод символа
2. При вводе символа создаем два массива. str1(i) - массив количества каждой буквы и str2(i) массив символов по алфавиту
3. Сортируем массив с количеством букв в порядке убывания и параллельно исправляем массив символов
4. Если количество символов не равно нулю, выписываем отсортированный массив символов

CLS
DIM str AS STRING
DIM str1(26) AS INTEGER
DIM str2(26) AS STRING
DIM a(200) AS STRING
DIM c1 AS STRING
str = "abcdefghijklmnopqrstuvwxyz."

WHILE a(K) <> MID$(str, 27, 1)
K = K + 1
INPUT a(K)
FOR i = 1 TO 26
str2(i) = MID$(str, i, 1)
IF a(K) = MID$(str, i, 1) THEN
str1(i) = str1(i) + 1
i = 26
END IF
NEXT i
WEND

FOR s = 1 TO 26
FOR d = s TO 26
IF str1(d) > str1(s) THEN c = str1(d): str1(d) = str1(s): str1(s) = c: c1 = str2(d): str2(d) = str2(s): str2(s) = c1:
NEXT d
NEXT s

FOR i = 1 TO 26
IF str1(i) <> 0 THEN PRINT str2(i);
NEXT i

№ 7 На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от “.” и букв “a”..“z”, во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, BorlandPascal 7.0), которая будет печатать буквы, встречающиеся во входной последовательности, в порядке увеличения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается.

Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке.

Например, пусть на вход подаются следующие символы:

baobaba.

В данном случае программа должна вывести

oab.
РЕШЕНИЕ:

Алгоритм:
1. Пока не введена точка, программа запрашивает ввод символа
2. При вводе символа создаем два массива. str1(i) - массив количества каждой буквы и str2(i) массив символов по алфавиту
3. Сортируем массив с количеством букв в порядке возрастания и параллельно исправляем массив символов
4. Если количество символов не равно нулю, выписываем отсортированный массив символов

CLS
DIM str AS STRING
DIM str1(26) AS INTEGER
DIM str2(26) AS STRING
DIM a(200) AS STRING
DIM c1 AS STRING
str = "abcdefghijklmnopqrstuvwxyz."

WHILE a(K) <> MID$(str, 27, 1)
K = K + 1
INPUT a(K)
FOR i = 1 TO 26
str2(i) = MID$(str, i, 1)
IF a(K) = MID$(str, i, 1) THEN
str1(i) = str1(i) + 1
i = 26
END IF
NEXT i
WEND

FOR s = 1 TO 26
FOR d = s TO 26
IF str1(d) < str1(s) THEN c = str1(d): str1(d) = str1(s): str1(s) = c: c1 = str2(d): str2(d) = str2(s): str2(s) = c1:
NEXT d
NEXT s

FOR i = 1 TO 26
IF str1(i) <> 0 THEN PRINT str2(i);
NEXT i

№ 8 На вход программе подаются сведения о пассажирах, сдавших свой багаж в камеру хранения. В первой строке задано текущее время: через двоеточие два целых числа, соответствующие часам (от 00 до 23 – ровно 2 символа) и минутам (от 00 до 59 – ровно 2 символа). Во второй строке сообщается количество пассажиров N, которое не меньше 10, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат:

<Фамилия> <время освобождения ячейки>,

где <Фамилия> – строка, состоящая не более, чем из 20 символов, <время освобождения ячейки> – через двоеточие два целых числа, соответствующие часам (от 00 до 23 – ровно 2 символа) и минутам (от 00 до 59 – ровно 2 символа). <Фамилия> и <время освобождения ячейки> разделены одним пробелом. Сведения отсортированы в порядке времени сдачи багажа.

Требуется написать программу, выводящую фамилии пассажиров, которые в ближайшие 2 часа должны освободить ячейки, в хронологическом порядке освобождения ячеек.

Пример входных данных:

10:00

3

Иванов 12:00

Петров 10:00

Сидоров 12:12

Результат работы программы для этого примера:

Петров

Иванов
РЕШЕНИЕ:

Алгоритм:
1. Считаем количество минут текущего времени
2. При вводе одного пассажира формируем два массива. Массив fio(i) содержит фамилии пассажиров и массив tt(i) содержит время освобождения ячеек в минутах
3. Сортируем массив fio(i) в порядке возрастания и параллельно массив tt(i)
4. Если значение элемента массива fio(i)<2часов(120минут) выводим на печать tt(i)

CLS
DIM str AS STRING
DIM str1(200) AS STRING
DIM fio(200) AS STRING
DIM tt(200) AS INTEGER
DIM c1 AS STRING

INPUT str
T = VAL(MID$(str, 1, 2)) * 60 + VAL(MID$(str, 4, 2))
PRINT T
INPUT N

FOR i = 1 TO N
INPUT str1(i)
l = LEN(str1(i))
tt(i) = VAL(MID$(str1(i), l - 4, 2)) * 60 + VAL(MID$(str1(i), l - 1, 2))
fio(i) = MID$(str1(i), 1, l - 5)
PRINT tt(i)
NEXT i

FOR s = 1 TO N
FOR d = s TO N
IF tt(d) < tt(s) THEN c = tt(d): tt(d) = tt(s): tt(s) = c: c1 = fio(d): fio(d) = fio(s): fio(s) = c1:
NEXT d
NEXT s

FOR i = 1 TO N
IF tt(i) - T <= 120 THEN PRINT fio(i):
NEXT i

Ответ:


Страницы:
 
Перейти на другой форум:



Логин: Пароль: Забыли пароль?Регистрация
Сайт сделан на SiNG cms © 2010-2020