При программировании школьной тестирующей системы по английскому языку
Условие
При программировании школьной тестирующей системы по английскому языку выяснилось, что файлы с вопросами к тестам легко доступны, и каждый может перед тестом открыть их и заранее узнать вопросы. Было решено закодировать файлы. Для этого придумали следующий алгоритм.Каждая строка файла кодируется отдельно.В каждой строке ищутся отдельные слова, и все символы слова сдвигаются по алфавиту циклически вправо на длину слова.Словом считается любая последовательность подряд идущих символов латинского алфавита, строчных и прописных.Циклический сдвиг символа по алфавиту вправо на X — замена символа на символ, стоящий в алфавите на X позиций дальше. Если при этом происходит выход за пределы алфавита, счёт начинается с начала алфавита.Пример циклического сдвига символов на 3 позиции: буква «Е» превращается в букву «Н», буква «t» — в букву «w» буква «Y» — в букву «В».Напишите эффективную, в том числе и по используемой памяти, программу (укажите используемую версию языка программирования, например Borland Pascal 7.0), которая должна закодировать строку по указанному алгоритму.На вход программе подается строка, состоящая из не более чем 250 символов латинского алфавита, пробелов, знаков препинания, разного рода скобок, кавычек и других символов. Строка заканчивается символом «#». Других символов «#» в строке нет.Программа должна вывести закодированную по указанному алгоритму строку. Пример входных данных: Day, mice. "Year" - a mistake# Пример выходных данных: Gdb, qmgi. "Ciev" - b tpzahrl# Критерии оценивания выполнения задания | Баллы | Программа работает для любых входных данных произвольного размера. Программа просматривает входные данные один раз. Допускается наличие в тексте программы одной синтаксической ошибки: пропущен или неверно указан знак пунктуации, неверно написано или пропущено зарезервированное слово языка программирования, не описана или неверно описана переменная, применяется операция, недопустимая для соответствующего типа данных (если одна и та же ошибка встречается несколько раз, то это считается за одну ошибку). | 4 | Программа работает верно. Допускается наличие от одной до трех синтаксических ошибок. Возможно, в принципиально верно организованном вводе данных есть одна ошибка (например, использование read вместо readln в Паскале или неверное считывание строки в C++). Три балла также выставляется, если в эффективной программе, удовлетворяющей критериям выставления 4 баллов, есть одна ошибка, в результате которой программа работает неверно на некоторых наборах нетипичных входных данных. | 3 | Программа работает в целом верно, эффективно или нет, но в реализации алгоритма содержится до двух ошибок (неверная инициализация счётчиков, допущена ошибка в принципиально верно организованной сортировке или алгоритме поиска минимальных элементов, используется знак “<” вместо “<=”, “or” вместо “and” и тому подобное). Возможно, некорректно организовано считывание входных данных. Допускается наличие от одной до пяти синтаксических ошибок, описанных выше | 2 | Программа, возможно, неверно работает при некоторых входных данных, но по приведённому тексту решения ясно, что экзаменуемый понимает, из каких этапов должно состоять решение задачи. При использовании сортировки она может быть реализована принципиально неверно (например, вместо двух циклов используется один), или допущена принципиальная ошибка в поиске нужных элементов. Всего допускается до 4 различных ошибок в реализации алгоритма, в том числе описанных в критериях присвоения двух баллов. Допускается наличие от одной до семи синтаксических ошибок, описанных выше. | 1 | Задание не выполнено или выполнено неверно. | 0 | Максимальный балл | 4 |
Формат задания
Решение по шагам
Как рассуждать
Решение. ПАСКАЛЬvar.s:string; flag:boolean; i, k,len:integer; beginreadln(s); {считали всю входную строку} flag:=false; {признак середины слова} for i : =1 to length (s) do begin{если текущий символ - буква} if (upcase(s[i])>='A' ) and (upcase(s[i])<= 'Z') thenif flag then {не первая буква слова} len:=len+1 {текущая длина слова увеличилась на 1} else {первая буква слова}beginflag:=true;len:=1 {текущая длина слова = 1}endelse {текущий символ — не буква}if flag then {слово только что закончилось} beginflag:=false; for k:=1 to len do {перебираем все символы слова}beginif ((s[i-k]>='a') and (s[i-k]<='z'))thens[i-k]:=chr((ord(s[i-k])+len-ord('a')) mod 26 + ord('a'))elses[i-k]:=chr((ord(s[i-k])+len-ord('A')) mod 26 + ord('A'));end endend;writeln(s) end.
Осталось ещё 1 шаг
Полный разбор с проверкой ответа
Бесплатно · займёт минуту