Информатика

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

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

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

Содержание заданий и решения
Example
Метод решения

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

Иванов Петр 4 5 4

Требуется написать программу, которая будет выводить на экран фамилии и имена трех лучших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех лучших, то следует вывести и их фамилии и имена. Требуемые имена и фамилии можно выводить в произвольном порядке.
РЕШЕНИЕ:

str(100) массив учащихся, каждое содержит фамилия имя оценки (Иванов Петр 4 5 4)
a(100) сумма оценок каждого учащегося

Алгоритм:
1. Вводим данные по ученику str(i), считаем сумму его оценок и записываем в массив а(i)
Оценки находятся в конце записи str(i). Если длина всей строки k, то оценки находятся на k-4, k-2 и k местах. С помощью функции MID находим символы на k-4, k-2 и k местах и переводим их в числа с помощью команды VAL) 2. Находим максимум в массиве a(i) и выводим тех, кто занял 1 место. Обнуляем сумму всех 1 мест
Вывести нужно только фамилию и имя.  Если длина всей строки k, то имя заканчивается на k-5 символе) 3. Находим максимум в массиве a(i) и выводим тех, кто занял 2 место. Обнуляем сумму всех 2 мест
4. Находим максимум в массиве a(i) и выводим тех, кто занял 3 место. Обнуляем сумму всех 3 мест

CLS
DIM str(100) AS STRING
DIM s AS STRING
DIM a(100) AS LONG
INPUT "Введите количество учащихся", n
FOR i = 1 TO n
INPUT str(i)
k = LEN(str(i))
a(i) = VAL(MID$(str(i), k - 4, 1)) + VAL(MID$(str(i), k - 2, 1)) + VAL(MID$(str(i), k, 1))
NEXT i
max = 0
FOR i = 1 TO n
IF a(i) > max THEN max = a(i)
NEXT i
PRINT "1 mesto"
FOR i = 1 TO n
IF a(i) = max THEN
PRINT MID$(str(i), 1, LEN(str(i)) - 5); " "
a(i) = 0
END IF
NEXT i
max = 0
FOR i = 1 TO n
IF a(i) > max THEN max = a(i)
NEXT i
PRINT "2 mesto"
FOR i = 1 TO n
IF a(i) = max THEN
PRINT MID$(str(i), 1, LEN(str(i)) - 5); " "
a(i) = 0
END IF
NEXT i
max = 0
FOR i = 1 TO n
IF a(i) > max THEN max = a(i)
NEXT i
PRINT "3 mesto"
FOR i = 1 TO n
IF a(i) = max THEN
PRINT MID$(str(i), 1, LEN(str(i)) - 5); " "
a(i) = 0
END IF

NEXT i

Example
Заключительный этап олимпиады по астрономии проводился для учеников 9-11-х классов, участвующих в общем конкурсе. Каждый участник олимпиады мог набрать от 0 до 50 баллов. Для определения победителей и призеров сначала отбираются 45% участников, показавших лучшие результаты.

По положению, в случае, когда у последнего участника, входящего в 45%, оказывается количество баллов такое же, как и у следующих за ним в итоговой таблице, решение по данному участнику и всем участникам, имеющим с ним равное количество баллов, определяется следующим образом: все участники признаются призерами, если набранные ими баллы больше половины максимально возможных;

все участники не признаются призерами, если набранные ими баллы не превышают половины максимально возможных.

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

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

<Фамилия> <Имя> <класс> <баллы>

где <Фамилия> – строка, состоящая не более, чем из 20 символов,
<Имя> – строка, состоящая не более, чем из 15 символов, <класс> – число от 9 до 11, <баллы> – целое число от 0 до 50 набранных участником баллов. <Фамилия> и <Имя>, <Имя> и <класс>, а также <класс> и <баллы> разделены одним пробелом. Пример входной строки:

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

Программа должна выводить минимальный балл призера. Гарантируется, что хотя бы одного призера по указанным правилам определить можно.
РЕШЕНИЕ:

Алгоритм:
1. Вводим участника и записываем в отдельный массив a(i) количество его баллов
(k - длина строки, количество баллов записано после 3 пробела. находим позицию третьего пробела (команда INSTR), переводим символьные баллы в число (команда  VAL) 2. Сортируем массив с очками в порядке убывания и находим в нем максимальное значение max
3. Если призеров более 45%, то выводим минимальный балл призера max/2
Если призеров не более 45%, выводим значение a(i) 45%

CLS
DIM str(100) AS STRING
DIM s AS STRING
DIM a(100) AS LONG
INPUT "Введите количество учащихся", n
FOR i = 1 TO n
INPUT str(i)
k = LEN(str(i))
k1= INSTR(1,str(i), " ")
k2= INSTR(k1+1,str(i), " ")
k3= INSTR(k2+1,str(i), " ")
a(i) = VAL(MID$(str(i), k3 + 1, 2))
NEXT i

FOR s = 1 TO n
FOR d = s TO n
IF a(d) > a(s) THEN c = a(d): a(d) = a(s): a(s) = c
NEXT d
NEXT s

max = 0
FOR i = 1 TO n
IF a(i) > max THEN max = a(i)
NEXT i

pr=CINT(N*0.45)
IF a(pr)=a(pr+1) then print max/2 else print a(pr)


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

Алгоритм:
1. а(k) массив сумм температур каждого месяца, b(k) количество дней в каждом месяце
2. Далее а(к) массив средних температур каждого месяца
3. Сортируем массив средних температур в порядке убывания и параллельно массив b месяца средних температур
4. Выводим номер месяца и среднюю температуру

CLS
DIM str(365) AS STRING
DIM a(12) AS SINGLE
DIM b(12) AS LONG
INPUT "dd.mm t", n
FOR i = 1 TO n
INPUT str(i)
k = VAL(MID$(str(i), 4, 2))
m = VAL(MID$(str(i), 7, 6))
a(k) = a(k) + m
b(k) = b(k) + 1
NEXT i

FOR i = 1 TO 12
a(i) = a(i) / b(i)
b(i) = i
NEXT i

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

FOR i = 1 TO 12
PRINT b(i),
PRINT USING "###.##"; a(i)
NEXT i

Example
На вход программе подается текст заклинания, состоящего не более чем из 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

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

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