Информатика

Всё о сервере, форум!
Основы программирования
ИНФОРМАЦИОННО-РАЗВЛЕКАТЕЛЬНЫЙ ПОРТАЛ

ИНФОРМАТИКА: ЕГЭ, ТЕОРИЯ, ПРАКТИКА, ТЕСТЫ

Вам предлагается написать эффективную программу, которая будет будет определять, какой минимальный
ЕГЭ, ДОМАШНИЕ ЗАДАНИЯ > Алгоритмизация и программирование > Вам предлагается написать эффективную программу, которая будет будет определять, какой минимальный
 
Страницы:

Содержание заданий и решения
Example
На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от “.” и букв “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

Example
На вход программе подаются сведения о пассажирах, сдавших свой багаж в камеру хранения. В первой строке задано текущее время: через двоеточие два целых числа, соответствующие часам (от 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

Ответ:

Example
На вход программе подается последовательность символов, среди которых могут быть и цифры, отличные от нуля. Ввод символов заканчивается точкой (в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая составит из тех цифр, которые не встречаются во входных данных, минимальное число (ноль не используется). Каждая цифра при этом используется ровно один раз. Если во входных данных встречаются все цифры от 1 до 9, то следует вывести “0”.

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

1А734В39.

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

2568
РЕШЕНИЕ:

Алгоритм:
1. Задаем строковую переменную с цифрами от 1 до 9
2. Числа от 1 до 9 помещаем в массив a(i)
3. Сравниваем элементы массива a(i) c символами заданной строки. Если они совпадают, элемент a(i) заменяем 0 Подсчитываем количество полученных нулей
4. Если количество 0 равно 9, значит в первоначальной записи используются все числа. Иначе выводим на печать не нулевые ячейки a(i)

CLS
DIM str AS STRING
DIM str1 AS STRING
DIM a(200) AS integer
str = "123456789"

INPUT str1
l=len(str1)

FOR i = 1 TO 9
a(i)=i
FOR j = 1 TO l
IF a(i) = val(MID$(str1, j, 1)) THEN
a(i) = 0
j=10
k=k+1
END IF
next j
next i

if k=l then
PRINT 0
else
FOR i = 1 TO 9
IF a(i) <> 0 THEN PRINT a(i);
NEXT i
end if


Example
На вход программе подаются сведения об учениках некоторой средней школы. В первой строке сообщается количество учеников N, каждая из следующих N строк имеет следующий формат:

<Фамилия> <Имя> <класс>,

где <Фамилия> – строка, состоящая не более, чем из 20 символов, <Имя> – строка, состоящая не более, чем из 15 символов, <класс> – год обучения (от 1 до 12) и заглавная буква (от “А” до “Я”) без пробела. <Фамилия> и <Имя>, а также <Имя> <класс> разделены одним пробелом. Пример входной строки:

Иванов Петр 10Б

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

100

1 7 11
РЕШЕНИЕ:

Алгоритм:
1. В одной записи <Фамилия> <Имя> <класс> отбрасываем последний символ - букву класса.
2. По двум последним цифрам определяем класс и считаем количество учащихся по параллелям. Записывая количество в массив k(i)
3. Сортируем массив k(i) по убыванию
4. выводим на монитор первые три элемента массива количества учащихся по параллелям k(i)

DIM str1(200) AS STRING
DIM g(12) AS INTEGER
DIM k(12) AS INTEGER

INPUT "Общее количество всех учеников", N

FOR i = 1 TO 12
g(i)=i
k(i)=0
NEXT i

FOR i = 1 TO N
INPUT str1(i)
l = LEN(str1(i)) - 1
str1(i) = LEFT$(str1(i), l)
FOR j = 1 TO 12
IF j = VAL(MID$(str1(i), LEN(str1(i))-1, 2)) THEN
k(j) = k(j) + 1
END IF
NEXT j
NEXT i

FOR s = 1 TO 12
FOR d = s TO 12
IF k(d) > k(s) THEN c = k(d): k(d) = k(s): k(s) = c: c1 = g(d): g(d) = g(s): g(s) = c1:
NEXT d
NEXT s

FOR i = 1 TO 3
z = z + k(i)
NEXT i
PRINT z

FOR i = 1 TO 3
if k(i)<> then PRINT g(i);
NEXT i

Ответ:

Example
На вход программе подаются сведения о ячейках автоматической камеры хранения багажа. В первой строке задана текущая дата: через точку два целых числа, соответствующие дню (от 01 до 31 – ровно 2 символа) и месяцу (от 01 до 12 – ровно 2 символа). Во второй строке сообщается количество занятых ячеек N, которое не меньше 3, но не превосходит 1000. Каждая из следующих N строк имеет следующий формат: <номер ячейки> <дата сдачи багажа>, где <номер ячейки> – четырехзначное число, <дата сдачи багажа> – через точку два целых числа, соответствующие дню (от 01 до 31 – ровно 2 символа) и месяцу (от 01 до 12 – ровно 2 символа). Номер ячейки и дата сдачи багажа разделены одним пробелом. Сведения отсортированы в порядке номеров ячеек.

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

Багаж мог сдаваться только в текущем или предыдущем месяце текущего календарного года (если текущий месяц январь, то данные о сдаче багажа в декабре прошлого года отсутствуют). Количество дней в каждом из месяцев текущего года следующее: январь – 31, февраль – 28, март – 31, апрель – 30, май – 31, июнь – 30, июль – 31, август – 31, сентябрь – 30, октябрь – 31, ноябрь – 30, декабрь – 31. Все входные данные корректны.

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

04.06

3

1000 01.06

1001 31.05

2007 21.05

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

2007

1001

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

Bd Tc Ec Fcd Tc.

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

Zb Ra Ca Dab Ra.
РЕШЕНИЕ:

Алгоритм:
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 = 27 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

Страницы:
 
При копировании материала с сайта активная ссылка обязательна!
Сайт управляется SiNG cms © 2010-2015