В данном текстовом файле удалить все слова которые содержат хотя бы одну цифру

Обновлено: 08.07.2024

Замечание. При решении задач следует руководствоваться правилом: если в строке должны производится изменения, то лучше пользоваться классом StringBuilder; если необходимо разбивать строки на слова, то классом String. При решении некоторых задач, потребуется использовать оба класса.

I. Разработать программу, которая для заданной строки s:

вставляет символ xпосле каждого вхождения символаy;

Пример

static void Main()

StringBuilder a = new StringBuilder(Console.ReadLine());

Console.WriteLine("Исходная строка: "+a);

Console.WriteLine("Введите символ x: ");

Console.WriteLine("Введите символ y: ");

for (int i=0; i<a.Length; ++i)

Console.WriteLine("Измененная строка: "+a);

меняет местами первую букву со второй, третью с четвертой и т.д.

определяет, какой из двух заданных символов встречается чаще в строке;

подсчитывает общее число вхождений символов х и y;

подсчитывает количество букв в строке;

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

удаляет среднюю букву, если длина строки нечетная, и две средних, если длина строки четная;

удваивает каждое вхождение заданного символа x;

удаляет все символы х;

удаляет все подстроки substr;

заменяет все вхождения подстроки substr1 на подстрокуsubstr2;

подсчитывает сумму всех содержащихся в ней цифр;

подсчитывает количество содержащихся в ней цифр;

находит порядковые номера первого и последнего вхождения символа x;

заменяет все группы стоящих рядом точек на многоточие;

выводит на экран последовательность символов, расположенных до первого двоеточия;

выводит на экран последовательность символов, расположенных после последнего двоеточия;

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

удаляет из нее последовательность символов, расположенных между двумя запятыми (считается, что в строке ровно две запятые);

определяет, сколько различных символов встречается в строке.

Пример

static void Main()

StringBuilder a = new StringBuilder(Console.ReadLine());

Console.WriteLine("Исходная строка: "+a);

Console.WriteLine("Введите заданныe подстроку: ");

for (int i=0; i<a.Length;)

for (int i=0; i<s.Length; ++i)

if (s[i].IndexOf(x)!=-1) Console.WriteLine(s[i]);

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

Вывести только те слова, которые встречаются в тексте ровно один раз.

Вывести только те слова, которые встречаются более n раз.

Самостоятельная работа

I. В одномерном массиве, элементы которого – целые числа, произвести следующие действия:

Удалить из массива все четные числа.

Вставить новый элемент после всех элементов, которые заканчиваются на данную цифру.

Удалить из массива повторяющиеся элементы, оставив только их первые вхождения.

Вставить новый элемент между всеми парами элементов, имеющими разные знаки.

Уплотнить массив, удалив из него все нулевые значения.

II. В двумерном массиве, элементы которого – целые числа, произвести следующие действия:

Вставить новую строку после строки, в которой находится первый встреченный минимальный элемент.

Вставить новый столбец перед всеми столбцами, в которых встречается заданное число.

Удалить все строки, в которых нет ни одного четного элемента.

Удалить все столбцы, в которых все элементы положительны.

Удалить из массива k-тую строку иj-тый столбец, если их значения совпадают.

Работа с дисками
Для представления диска в пространстве имен System.IO имеется класс DriveInfo.
Класс DriveInfo
имеет статический метод GetDrives, который возвращает имена всех
логических дисков компьютера. Также он предоставляет ряд полезных свойств:
• AvailableFreeSpace - указывает на объем доступного свободного места на диске в байтах.
• DriveFormat - получает имя файловой системы.
• DriveType - представляет тип диска.
• IsReady - готов ли диск (например, DVD-диск может быть не вставлен в дисковод).
• Name - получает имя диска.
• TotalFreeSpace - получает общий объем свободного места на диске в байтах.
• TotalSize - общий размер диска в байтах.
• VolumeLabel - получает или устанавливает метку тома.

Получение имен и свойства всех дисков на компьютере:
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
Console.WriteLine("Название: ", drive.Name);
Console.WriteLine("Тип: ", drive.DriveType);
if (drive.IsReady)
Console.WriteLine("Объем диска: ", drive.TotalSize);
Console.WriteLine("Свободное пространство: ", drive.TotalFreeSpace);
Console.WriteLine("Метка: ", drive.VolumeLabel);
>

Работа с каталогами
Класс Directory предоставляет ряд статических методов для управления
каталогами. Некоторые из этих методов:
CreateDirectory(path): создает каталог по указанному пути path.
Delete(path): удаляет каталог по указанному пути path.
Exists(path): определяет, существует ли каталог по указанному пути path.
Если существует, возвращается true, если не существует, то false.
GetDirectories(path): получает список каталогов в каталоге path.
GetFiles(path): получает список файлов в каталоге path.
Move(sourceDirName, destDirName): перемещает каталог.
GetParent(path): получение родительского каталога.

Класс DirectoryInfo предоставляет функциональность для создания,
удаления, перемещения и других операций с каталогами. Некоторые из его
свойств и методов:
Create(): создает каталог
CreateSubdirectory(path): создает подкаталог по указанному пути path
Delete(): удаляет каталог
Свойство Exists: определяет, существует ли каталог
GetDirectories(): получает список каталогов
GetFiles(): получает список файлов
MoveTo(destDirName): перемещает каталог
Свойство Parent: получение родительского каталога
Свойство Root: получение корневого каталога

Получение списка файлов и подкаталогов
string dirName = "C:\\";
if (Directory.Exists(dirName))
Console.WriteLine("Подкаталоги:");
string[] dirs =
Directory.GetDirectories(dirName);
foreach (string s in dirs)
Console.WriteLine(s); >
Console.WriteLine();
Console.WriteLine("Файлы:");
string[] files = Directory.GetFiles(dirName);
foreach (string s in files)
Console.WriteLine(s); >
>

Создание каталога
string path = @"C:\SomeDir";
string subpath = @"program\avalon";
DirectoryInfo dirInfo = new DirectoryInfo(path);
if (!dirInfo.Exists)
dirInfo.Create();
>
dirInfo.CreateSubdirectory(subpath);

Получение информации о каталоге
string dirName = "C:\\Program Files";
DirectoryInfo dirInfo = new DirectoryInfo(dirName);
Console.WriteLine("Название каталога: ", dirInfo.Name);
Console.WriteLine("Полное название каталога: ",
dirInfo.FullName);
Console.WriteLine("Время создания каталога: ",
dirInfo.CreationTime);
Console.WriteLine("Корневой каталог: ", dirInfo.Root);

Удаление каталога
string dirName = @"C:\SomeFolder";
try
DirectoryInfo dirInfo = new DirectoryInfo(dirName);
dirInfo.Delete(true);
>
catch (Exception ex)
Console.WriteLine(ex.Message);
>

Перемещение каталога
string oldPath = @"C:\SomeFolder";
string newPath = @"C:\SomeDir";
DirectoryInfo dirInfo = new DirectoryInfo(oldPath);
if (dirInfo.Exists && Directory.Exists(newPath) == false)
dirInfo.MoveTo(newPath);
>

Работа с файлами. Классы File и FileInfo
Некоторые полезные методы и свойства класса FileInfo:
CopyTo(path): копирует файл в новое место по указанному пути path
Create(): создает файл
Delete(): удаляет файл
MoveTo(destFileName): перемещает файл в новое место
Свойство Directory: получает родительский каталог в виде объекта DirectoryInfo
Свойство DirectoryName: получает полный путь к родительскому каталогу
Свойство Exists: указывает, существует ли файл
Свойство Length: получает размер файла
Свойство Extension: получает расширение файла
Свойство Name: получает имя файла
Свойство FullName: получает полное имя файла

Класс File реализует функциональность с помощью статических методов:
Copy(): копирует файл в новое место
Create(): создает файл
Delete(): удаляет файл
Move: перемещает файл в новое место
Exists(file): определяет, существует ли файл

Получение информации о файле
string path = @"C:\apache\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
Console.WriteLine("Имя файла: ", fileInf.Name);
Console.WriteLine("Время создания: ",
fileInf.CreationTime);
Console.WriteLine("Размер: ", fileInf.Length);
>

Удаление файла
string path = @"C:\apache\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
fileInf.Delete();
// альтернатива с помощью класса File
// File.Delete(path);
>

Перемещение файла
string path = @"C:\apache\hta.txt";
string newPath = @"C:\SomeDir\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
fileInf.MoveTo(newPath);
// альтернатива с помощью класса File
// File.Move(path, newPath);
>

Копирование файла
string path = @"C:\apache\hta.txt";
string newPath = @"C:\SomeDir\hta.txt";
FileInfo fileInf = new FileInfo(path);
if (fileInf.Exists)
fileInf.CopyTo(newPath, true);
// альтернатива с помощью класса File
// File.Copy(path, newPath, true);
>

Чтение из файла и StreamReader
Класс StreamReader позволяет нам легко считывать весь текст или отдельные строки из
текстового файла. Среди его методов можно выделить следующие:
Close: закрывает считываемый файл и освобождает все ресурсы
Peek: возвращает следующий доступный символ, если символов больше нет, то возвращает -1
Read: считывает и возвращает следующий символ в численном представлении. Имеет
перегруженную версию: Read(char[] array, int index, int count), где array - массив, куда
считываются символы, index - индекс в массиве array, начиная с которого записываются
считываемые символы, и count - максимальное количество считываемых символов
ReadLine: считывает одну строку в файле
ReadToEnd: считывает весь текст из файла

Console.WriteLine("******считываем весь файл********");
using (StreamReader sr = new StreamReader(path))
Console.WriteLine(sr.ReadToEnd());
>
Console.WriteLine("******считываем построчно********");
using (StreamReader sr = new StreamReader(path,
System.Text.Encoding.Default))
string line;
while ((line = sr.ReadLine()) != null)
Console.WriteLine(line);
>
>

Console.WriteLine("******считываем блоками********");
using (StreamReader sr = new StreamReader(path,
System.Text.Encoding.Default))
char[] array = new char[4];
// считываем 4 символа
sr.Read(array, 0, 4);
Console.WriteLine(array);
>

Запись в файл и StreamWriter
Для записи в текстовый файл используется класс StreamWriter. Свою функциональность он реализует через
следующие методы:
Close: закрывает записываемый файл и освобождает все ресурсы
Flush: записывает в файл оставшиеся в буфере данные и очищает буфер.
Write: записывает в файл данные простейших типов, как int, double, char, string и т.д.
WriteLine: также записывает данные, только после записи добавляет в файл символ окончания строки

using (StreamReader sr = new StreamReader(readPath, System.Text.Encoding.Default))
text=sr.ReadToEnd();
>
using (StreamWriter sw = new StreamWriter(writePath, false,
System.Text.Encoding.Default))
sw.WriteLine(text);
>
using (StreamWriter sw = new StreamWriter(writePath, true,
System.Text.Encoding.Default))
sw.WriteLine("Дозапись");
sw.Write(4.5);
>

•Дан текстовый файл, содержащий целые числа. Удалить из него все четные числа.
•В данном текстовом файле удалить все слова, которые содержат хотя бы одну цифру.
•Дан текстовый файл. Создать новый файл, каждая строка которого получается из
соответствующей строки исходного файла перестановкой слов в обратном порядке.
•Дан текстовый файл. Создать новый файл, состоящий из тех строк исходного файла, из чисел
которых можно составить арифметическую прогрессию.
•Даны два текстовых файла, содержащие целые числа. Создать файл из различных чисел,
которые содержатся: а) в каждом исходном файле; б) только в одном из двух исходных файлов;
в) только в первом исходном файле; г) хотя бы в одном из двух исходных файлов.
•Создать и заполнить файл случайными целыми значениями. Выполнить сортировку
содержимого файла по возрастанию.
•Cоздать типизированный файл записей со сведениями о телефонах абонентов; каждая запись
имеет поля: фамилия абонента, год установки телефона, номер телефона. По заданной
фамилии абонента выдать номера его телефонов. Определить количество установленных
телефонов с N-го года.
•В текстовый файл занесены пары чисел, разделенных пробелом (каждая пара чисел – в новой
строке). Рассматривая каждую пару как координаты точек на плоскости, найти наибольшее и
наименьшее расстояния между этими точками.

•Имеется файл с текстом. Осуществить шифрование данного текста в новый файл путем
записи текста в матрицу символов по строкам, а затем чтение символов из этой матрицы по
столбцам. Осуществить расшифровку полученного текста.
•Создать программу, переписывающую в текстовый файл g содержимое файла f, исключая
пустые строки, а остальные дополнить справа пробелами или ограничить до n символов.
•В файле, содержащем фамилии студентов и их оценки, изменить на прописные буквы
фамилии тех студентов, которые имеют средний балл за национальной шкалой более «4».
•Из текстового файла удалить все слова, содержащие от трех до пяти символов, но при этом
из каждой строки должно быть удалено только четное количество таких слов.
•Получить файл g, состоящий из строк файла f, содержащих заданную строку S.
Предусмотреть случай, когда строка размещается в двух строках файла «с переносом».
•Получить файл g, в котором текст выровнен по правому краю путем равномерного
добавления пробелов.
•Из текста программы выбрать все числа (целые и вещественные) и записать их в файл g в
виде: число 1 – номер строки, число 2 – номер строки и так далее.
•Определить, симметричен ли заданный во входном файле текст.

Выполните рекурсивный обход домашнего каталога и сохраните информацию в файл. Сожмите файл. Попросите пользователя вставить дискету и нажать клавишу ENTER. Запишите сжатый файл на дискету.

Замена цикла for циклами while и until

Замените циклы for в Пример 10-1 на while . Подсказка: запишите данные в массив и пройдите в цикле по элементам массива.

Выполнив эту "тяжелую работу" , замените циклы, в этом примере, на циклы until .

Изменение межстрочного интервала в текстовом файле

Напишите сценарий, который будет читать текст из заданного файла, и выводить, построчно, на stdout, добавляя при этом дополнительные пустые строки так, чтобы в результате получился вывод с двойным межстрочным интервалом .

Добавьте код, который будет выполнять проверку наличия файла, передаваемого как аргумент.

Когда сценарий будет отлажен, измените его так, чтобы он выводил текстовый файл с тройным межстрочным интервалом .

И наконец, напишите сценарий, который будет удалять пустые строки из заданного файла.

Вывод "задом-на-перед"

Напишите сценарий, который будет выводить себя на stdout, но в обратном порядке .

Автоматическое разархивирование

Для каждого файла, из заданного списка, сценарий должен определить тип архиватора, которым был создан тот или иной файл (с помощью утилиты file). Затем сценарий должен выполнить соответствующую команду разархивации (gunzip, bunzip2, unzip, uncompress или что-то иное). Если файл не является архивом, то сценарий должен оповестить пользователя об этом и ничего не делать с этим файлом.

Уникальный идентификатор системы

Сценарий должен сгенерировать "уникальный" 6-ти разрядный шестнадцатиричный идентификатор системы. Не пользуйтесь дефектной утилитой hostid. Подсказка: md5sum /etc/passwd, затем отберите первые 6 цифр.

Резервное копирование

Сценарий должен создать архив (*.tar.gz) всех файлов в домашнем каталоге пользователя (/home/user-name), которые изменялись в течение последних 24 часов. Подсказка: воспользуйтесь утилитой find.

Простые числа

Сценарий должен вывести (на stdout) все простые числа, в диапазоне от 60000 до 63000. Вывод должен быть отформатирован по столбцам (подсказка: воспользуйтесь командой printf).

Лототрон

Сценарий должен имитировать работу лототрона -- извлекать 5 случайных неповторяющихся чисел в диапазоне 1 - 50. Сценарий должен предусматривать как вывод на stdout, так и запись чисел в файл, кроме того, вместе с числами должны выводиться дата и время генерации данного набора.

Задания повышенной сложности

Управление дисковым пространством

Сценарий должен отыскать в домашнем каталоге пользователя /home/username файлы, имеющие размер больше 100K. Каждый раз предоставляя пользователю возможность удалить или сжать этот файл, затем переходить к поиску следующего файла.

Безопасное удаление

Напишите сценарий "безопасного" удаления файлов -- srm.sh. Файлы, с именами, передаваемыми этому сценарию, не должны удаляться, вместо этого, файлы следует сжать утилитой gzip, если они еще не сжаты (не забывайте про утилиту file), и переместить в каталог /home/username/trash. При старте, сценарий должен удалять из каталога "trash" файлы, которые были созданы более 48 часов тому назад.

Размен монет

Как более рационально собрать сумму в $1.68, используя только монеты, с номиналом не выше 25c? Это будет шесть 25-ти центовых монет, одна десятицентовая, одна пятицентовая и три монеты достоинством в 1 цент.

Учитывая возможность произвольного ввода суммы в долларах и центах ($*. ), найдите такую комбинацию, которая требовала бы наименьшее число монет. Если вы проживаете не в США, то можете использовать свою денежную единицу и номиналы монет. Подсказка: взгляните на Пример 22-7.

Корни квадратного уравнения

Напишите сценарий, который находил бы корни "квадратного " уравнения, вида: Ax^2 + Bx + C = 0 . Сценарий должен получать коэффициенты уравнения A, B и C, как аргументы командной строки, и находить корни, с точностью до четвертого знака после запятой.

Подсказка: воспользуйтесь bc, для нахождения решения по хорошо известной формуле: x = ( -B +/- sqrt( B^2 - 4AC ) ) / 2A .

Сумма чисел

Найдите сумму всех пятизначных чисел (в диапазоне 10000 - 99999), которые содержат точно две цифры из следующего набора: < 4, 5, 6 >.

Примеры чисел, удовлетворяющих данному условию: 42057, 74638 и 89515.

Счастливый билет

"Счастливым" считается такой билет, в котором последовательное сложение цифр номера дает число 7. Например, 62431 -- номер "счастливого" билета (6 + 2 + 4 + 3 + 1 = 16, 1 + 6 = 7). Найдите все "счастливые" номера, располагающиеся в диапазоне 1000 - 10000.

Синтаксический анализ

Проанализируйте файл /etc/passwd и выведите его содержимое в табличном виде.

Контроль входов в систему

Проанализируйте файл /var/log/messages и выведите в отформатированном виде сведения по каждому пользователю -- когда он входил в систему. Возможно, что для работы сценарию потребуются права root. (Подсказка: Ищите строки, содержащие текст "LOGIN" )

Просмотр файла с данными

Некоторые базы данных и электронные таблицы используют формат CSV ( comma-separated values -- значения, разделенные запятыми ), для хранения данных в файлах. Зачастую, эти файлы должны анализироваться другими приложениями.

Пусть файл содержит следующие данные:

Прочитайте данные и выведите их на stdout в виде колонок с заголовками.

Выравнивание

Текст вводится с устройства stdin или из файла. Его необходимо вывести на stdout, с выравниванием по ширине, используя задаваемую пользователем ширину строк.

Список рассылки

Напишите сценарий, который использовал бы команду mail, для управления простым списком рассылки. Сценарий должен брать текст ежемесячного информационного бюллетеня из заданного файла, список адресатов из другого файла и выполнять рассылку новостей по электронной почте.

Генерация паролей

Сложные задания

Проверка паролей

Напишите сценарий проверки простоты раскрытия заданного пароля.

Исследуемый пароль должен передаваться сценарию как аргумент командной строки. Пароль должен отвечать следующим минимальным требованиям:

Минимальная длина -- 8 символов

Должен содержать хотя бы одну цифру

Проверка возможности подбора по словарю каждой последовательной четверки алфавитных символов. Это исключит вхождение "словарных словwords" в пароль.

Проверьте с помощью этого сценария все пароли в вашей системе, которые могут располагаться в /etc/passwd (или в другом месте).

Для создания такого сценария вам потребуется умение работать с регулярными выражениями.

Попробуйте отследить все попытки обращения к файлам в каталоге /etc, в течение дня. Сведения, которые включают в себя время обращения, имя файла, имя пользователя (если имели место какие либо изменения в файлах, то они тоже должны быть отмечены), запишите в виде аккуратно отформатированных записей в логфайл.

Мониторинг процессов

Напишите сценарий, который производит непрерывный мониторинг запускаемых процессов и отслеживает количество дочерних процессов для каждого "родителя". Как только процесс порождает более 5 дочерних процессов, сценарий должен послать уведомление системному администратору (или root-у) с соответствующей информацией. В письме необходимо указать время, PID "родителя", PID каждого "потомка" и пр.. Сценарий должен писать отчет в системный журнал один раз в 10 минут.

Удаление комментариев

Преобразование в HTML

Преобразуйте заданный текстовый файл в HTML формат. Этот сценарий должен автоматически вставлять необходимые теги HTML в тело файла.

Удаление тегов HTML

Удалите все теги HTML из заданного HTML файла, затем переформатируйте его так, чтобы строки не были короче 60 и длиннее 75 символов. Предусмотрите оформление параграфов. Преобразуйте таблицы HTML в их приблизительный текстовый эквивалент.

Преобразование XML файлов

Преобразуйте файл из формата XML в формат HTML и в простой текстовый файл.

Борьба со спамом

По мере необходимости, используйте соответствующие команды для работы с сетью.

Азбука Морзе

Преобразуйте текстовый файл в код Морзе. Символы из файла должны быть представлены в виде, соответствующих им, кодов Морзе, состоящих из точек и тире, и разделенных пробелами. Например, "script" ===> ". _._. ._. .. .__. _" .

Шестнадцатиричный дамп

Эмуляция сдвигового регистра

Детерминант (определитель)

Найдите детерминант (определитель) матрицы 4 x 4.

Анаграммы

Сценарий должен запросить у пользователя 4-х символьное слово, и найти анаграммы для этого слова. Например, анаграммы к слову word : do or rod row word . Для поиска анаграмм можете использовать файл /usr/share/dict/linux.words.

Индекс сложности текста

Вычисление индекса ведется по следующему алгоритму.

Выберите кусок текста, длиной не менее 100 слов.

Сосчитайте количество предложений.

Найдите среднее число слов в предложении.

СРЕДНЕЕ_ЧИСЛО_СЛОВ = ОБЩЕЕ_ЧИСЛО_СЛОВ / ЧИСЛО_ПРЕДЛОЖЕНИЙ

Сосчитайте количество "трудных" слов -- которые содержат не менее 3-х слогов. Разделите это число на общее количество слов, в результате вы получите пропорцию сложных слов.

ПРОПОРЦИЯ_СЛОЖНЫХ_СЛОВ = ЧИСЛО_ДЛИННЫХ_СЛОВ / ОБЩЕЕ_ЧИСЛО_СЛОВ

Индекс сложности текста рассчитывается как сумма двух этих чисел, умноженная на 0.4 и округленная до ближайшего целого.

ИНДЕКС_СЛОЖНОСТИ = int ( 0.4 * ( СРЕДНЕЕ_ЧИСЛО_СЛОВ + ПРОПОРЦИЯ_СЛОЖНЫХ_СЛОВ ) )

4-й пункт -- самый сложный. Существуют различные алгоритмы подсчета слогов в словах. В данном же случае, вы можете ограничиться подсчетом сочетаний "гласный-согласный".

Строго говоря, при расчете индекса сложности не следует считать составные слова и имена собственные как "сложные" слова, но это слишком усложнит сценарий.

Вычисление числа пи по алгоритму "Игла Баффона"

В 18 веке, французский математик де Баффон (de Buffon) проделывал эксперимент, который заключался в бросании иглы, длиной "n" , на деревянный пол, собраный из длинных и узких досок. Ширина всех досок пола одинакова и равна "d" . Оказалось, что отношение общего числа бросков, к числу бросков, когда игла ложилась на щель, кратно числу пи.

Пользуясь Пример 12-38, напишите сценарий, который использовал бы метод Монте Карло для эмуляции "Иглы Баффона". Для простоты примите длину иглы раной ширине досок, n = d .

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

Шифрование по алгоритму Playfair (Wheatstone)

Напишите сценарий, реализующий алгоритм шифрования Playfair (Wheatstone).

В соответствии с этим алгоритмом, текст шифруется путем замены каждой 2-х символьной последовательности -- "диграммы" . Традиционно, в качестве ключа , используется матрица символов алфавита 5 x 5.

Матрица содержит все символы алфавита, за исключением символа "J", который представляет символ "I". Первая строка матрицы -- произвольно выбранное слово, в данном случае -- "CODES", далее следуют символы алфавита, в порядке слева-направо, исключая те, которые входят в состав первой строки.

Каждая диграмма может подпадать под одно из следующих определений:.

1) Оба символа находятся в одной строке ключа. Тогда, каждый из них заменяется символом, стоящим справа в той же строке. Если это последний символ строки ключа, то он заменяется первым символом в той же строке ключа.

2) Оба символа находятся в одном столбце ключа. Тогда каждый из них заменяется на символ, стоящий ниже, в этом же столбце. Если это последний символ в столбце ключа, то он заменяется первым символом в том же столбце ключа.

3) Символы диграммы стоят в вершинах прямоугольника. Тогда каждый из них заменяется символом из соседнего, по горизонтали, угла.

Диграмма "TH" соответствует 3-му определению.

Диграмма "SE" соответствует 1-му определению.

Дешифрация выполняется обратной процедурой, для случаев 1 и 2 -- замена символом стоящим левее/выше. Для случая 3 -- аналогично шифрации, т.е. заменяется символом из соседнего, по горизонтали, угла. Helen Fouche Gaines, в своей классической работе "Elementary Cryptoanalysis" (1939), приводит подробное описание алгоритма Playfair и методы его реализации.

Этот сценарий должен иметь три основных раздела

Генерация "ключевой матрицы" , основывающейся на слове, которое вводит пользователь.

Дешифрование зашифрованного текста.

Широкое применение, в этом сценарии, найдут массивы и функции.

Пожалуйста, не присылайте автору свои варианты решения упражнений. Если вы хотите впечатлить его своим умом и сообразительностью -- присылайте обнаруженные вами ошибки и предложения по улучшению этой книги.

Условие «дан текстовый файл» означает, что в наборе исходных данных указано имя данного файла (текстовая строка). Все исходные файлы в заданиях данной группы считаются существующими. Если в задании требуется создать новый файл, то имя создаваемого файла также входит в набор исходных данных (и, как правило, является последним элементом этого набора). Максимальный размер исходных файлов не устанавливается, поэтому при решении заданий не следует использовать вспомогательные массивы, содержащие все элементы исходных файлов, однако допускается использование вспомогательных файлов. Используемые в заданиях двоичные файлы удовлетворяют условиям, которые перечислены в начале раздела «Двоичные (типизированные) файлы».

Основные операции с текстовыми файлами

Text1. Дано имя файла и целые положительные числа $$N$$ и $$K$$. Создать текстовый файл с указанным именем и записать в него $$N$$ строк, каждая из которых состоит из $$K$$ символов «*» (звездочка).

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text4. Дан текстовый файл. Вывести количество содержащихся в нем символов и строк (маркеры концов строк EOLN и конца файла EOF при подсчете количества символов не учитывать).

Решение задачи, на языке: Паскаль

Text5. Дана строка $$S$$ и текстовый файл. Добавить строку $$S$$ в конец файла.

Решение задачи, на языке: Паскаль

Text6. Даны два текстовых файла. Добавить в конец первого файла содержимое второго файла.

Решение задачи, на языке: Паскаль

Text7. Дана строка $$S$$ и текстовый файл. Добавить строку $$S$$ в начало файла.

Решение задачи, на языке: Паскаль

Text8. Даны два текстовых файла. Добавить в начало первого файла содержимое второго файла.

Решение задачи, на языке: Паскаль

Text9. Дано целое число $$K$$ и текстовый файл. Вставить пустую строку перед строкой файла с номером $$K$$. Если строки с таким номером нет, то оставить файл без изменений.

Решение задачи, на языке: Паскаль

Text10. Дано целое число $$K$$ и текстовый файл. Вставить пустую строку после строки файла с номером $$K$$. Если строки с таким номером нет, то оставить файл без изменений.

Решение задачи, на языке: Паскаль

Text11. Дан текстовый файл. Продублировать в нем все пустые строки.

Решение задачи, на языке: Паскаль

Text12. Дана строка $$S$$ и текстовый файл. Заменить в файле все пустые строки на строку $$S$$.

Решение задачи, на языке: Паскаль

Text13. Дан непустой текстовый файл. Удалить из него первую строку.

Решение задачи, на языке: Паскаль

Text14. Дан непустой текстовый файл. Удалить из него последнюю строку.

Решение задачи, на языке: Паскаль

Text15. Дано целое число $$K$$ и текстовый файл. Удалить из файла строку с номером $$K$$. Если строки с таким номером нет, то оставить файл без изменений.

Решение задачи, на языке: Паскаль

Text16. Дан текстовый файл. Удалить из него все пустые строки.

Решение задачи, на языке: Паскаль

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

Решение задачи, на языке: Паскаль

Text18. Дано целое число $$K$$ и текстовый файл. Удалить из каждой строки файла первые $$K$$ символов (если длина строки меньше $$K$$, то удалить из нее все символы).

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text20. Дан текстовый файл. Заменить в нем все подряд идущие пробелы на один пробел.

Решение задачи, на языке: Паскаль

Text21. Дан текстовый файл, содержащий более трех строк. Удалить из него последние три строки.

Решение задачи, на языке: Паскаль

Text22. Дано целое число $$K$$ $$(0<K<10)$$ и текстовый файл, содержащий более $$K$$ строк. Удалить из файла последние $$K$$ строк.

Решение задачи, на языке: Паскаль

Text23. Дано целое число $$K$$ $$(0<K<10)$$ и текстовый файл, содержащий более $$K$$ строк. Создать новый текстовый файл, содержащий $$K$$ последних строк исходного файла.

Решение задачи, на языке: Паскаль

Анализ и форматирование текста

Text24. Дан текстовый файл. Найти количество абзацев в тексте, если абзацы отделяются друг от друга одной или несколькими пустыми строками.

Решение задачи, на языке: Паскаль

Text25. Дано целое число $$K$$ и текстовый файл. Удалить из файла абзац с номером $$K$$ (абзацы отделяются друг от друга одной или несколькими пустыми строками). Пустые строки, предшествующие и следующие за удаляемым абзацем, не удалять. Если абзац с данным номером отсутствует, то оставить файл без изменений.

Решение задачи, на языке: Паскаль

Text26. Дан текстовый файл. Найти количество абзацев в тексте, если первая строка каждого абзаца начинается с $$5$$ пробелов («красная строка»). Пустые строки между абзацами не учитывать.

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text28. Дан текстовый файл. Абзацы выделяются в нем с помощью красной строки (см. задание Text26), а пустых строк нет. Вставить между соседними абзацами по одной пустой строке (в начало и конец файла пустые строки не добавлять).

Решение задачи, на языке: Паскаль

Text29. Дан текстовый файл. Вывести первое слово текста наибольшей длины. Словом считать набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки.

Решение задачи, на языке: Паскаль

Text30. Дан текстовый файл. Вывести последнее слово текста наименьшей длины. Словом считать набор символов, не содержащий пробелов и ограниченный пробелами или началом/концом строки.

Решение задачи, на языке: Паскаль

Text31. Дано целое число $$K$$ и текстовый файл. Создать строковый файл и записать в него все слова длины $$K$$ из исходного файла. Словом считать набор символов, не содержащий пробелов, знаков препинания и ограниченный пробелами, знаками препинания или началом/концом строки. Если исходный файл не содержит слов длины K, то оставить результирующий файл пустым.

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text34. Дан текстовый файл, содержащий текст, выровненный по левому краю. Выровнять текст по правому краю, добавив в начало каждой непустой строки нужное количество пробелов (ширину текста считать равной $$50$$).

Решение задачи, на языке: Паскаль

Text35. Дан текстовый файл, содержащий текст, выровненный по левому краю. Выровнять текст по центру, добавив в начало каждой непустой строки нужное количество пробелов (ширину текста считать равной $$50$$). Строки нечетной длины перед центрированием дополнять слева пробелом.

Решение задачи, на языке: Паскаль

Text36. Дан текстовый файл, содержащий текст, выровненный по правому краю. Выровнять текст по центру, удалив из каждой непустой строки половину начальных пробелов. В строках с нечетным количеством начальных пробелов перед центрированием удалять первый начальный пробел.

Решение задачи, на языке: Паскаль

Text37. Дан текстовый файл, содержащий текст, выровненный по левому краю. Абзацы текста разделяются одной пустой строкой. Выровнять текст по ширине (то есть и по левому, и по правому краю), увеличив в каждой непустой строке (кроме последних строк абзацев) количество пробелов между словами, начиная с последнего пробела в строке (ширину текста считать равной $$50$$).

Решение задачи, на языке: Паскаль

Text38. Дано целое число $$K$$ $$(> 25)$$ и текстовый файл, содержащий текст, выровненный по левому краю. Абзацы текста отделяются друг от друга одной пустой строкой. Отформатировать текст так, чтобы его ширина не превосходила $$K$$ позиций, и выровнять текст по левому краю, сохранив деление на абзацы. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле.

Решение задачи, на языке: Паскаль

Text39. Дано целое число $$K$$ $$(> 25)$$ и текстовый файл, содержащий текст, выровненный по левому краю. Абзацы выделяются в нем с помощью красной строки ($$5$$ начальных пробелов), а пустых строк нет. Отформатировать текст так, чтобы его ширина не превосходила $$K$$ позиций, и выровнять текст по левому краю, сохранив деление на абзацы. Пробелы в конце строк удалить. Сохранить отформатированный текст в новом текстовом файле.

Решение задачи, на языке: Паскаль

Текстовые файлы с числовой информацией

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

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text42. Даны вещественные числа $$A$$, $$B$$ и целое число $$N$$. Создать текстовый файл, содержащий таблицу значений функции $$\sqrt$$ на промежутке $$[A, B]$$ с шагом $$(B-A)/N$$. Таблица состоит из двух столбцов: с аргументами $$x$$ ($$10$$ позиций, из них $$4$$ под дробную часть) и со значениями $$x$$ ($$15$$ позиций, из них $$8$$ под дробную часть). Столбцы выравниваются по правому краю.

Решение задачи, на языке: Паскаль

Text43. Даны вещественные числа $$A$$, $$B$$ и целое число $$N$$. Создать текстовый файл, содержащий таблицу значений функций $$\sin(x)$$ и $$\cos(x)$$ на промежутке $$[A, B]$$ с шагом $$(B-A)/N$$. Таблица состоит из трех столбцов: с аргументами $$x$$ ($$8$$ позиций, из них $$4$$ под дробную часть) и со значениями $$\sin(x)$$ и $$\cos(x)$$ (по $$12$$ позиций, из них $$8$$ под дробную часть). Столбцы выравниваются по правому краю.

Решение задачи, на языке: Паскаль

Text44. Дан текстовый файл, каждая строка которого изображает целое число, дополненное слева и справа несколькими пробелами. Вывести количество этих чисел и их сумму.

Решение задачи, на языке: Паскаль

Text45. Дан текстовый файл, каждая строка которого изображает целое или вещественное число, дополненное слева и справа несколькими пробелами (вещественные числа имеют ненулевую дробную часть). Вывести количество чисел с ненулевой дробной частью и их сумму.

Решение задачи, на языке: Паскаль

Text46. Дан текстовый файл, каждая строка которого содержит изображения нескольких чисел, разделенные пробелами (вещественные числа имеют ненулевую дробную часть). Создать файл вещественных чисел, содержащий (в том же порядке) все числа из исходного файла, имеющие ненулевую дробную часть.

Решение задачи, на языке: Паскаль

Text47. Дан текстовый файл, каждая строка которого изображает целое или вещественное число, дополненное слева и справа несколькими пробелами (вещественные числа имеют ненулевую дробную часть). Вывести количество целых чисел и их сумму.

Решение задачи, на языке: Паскаль

Text48. Дан текстовый файл, каждая строка которого содержит изображения нескольких чисел, разделенные пробелами (вещественные числа имеют ненулевую дробную часть). Создать файл целых чисел, содержащий все целые числа из исходного файла (в том же порядке).

Решение задачи, на языке: Паскаль

Text49. Дан текстовый файл и файл целых чисел. Добавить в конец каждой строки текстового файла изображение соответствующего числа из файла целых чисел. Если файл целых чисел короче текстового файла, то оставшиеся строки текстового файла не изменять.

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text51. Дан текстовый файл, содержащий таблицу из трех столбцов вещественных чисел. Ширина столбцов таблицы и способ их выравнивания являются произвольными, специальных символов-разделителей таблица не содержит. Создать три файла вещественных чисел, каждый из которых содержит числа из соответствующего столбца таблицы (в том же порядке).

Решение задачи, на языке: Паскаль

Text52. Дан текстовый файл, содержащий таблицу из трех столбцов целых чисел. В начале и в конце каждой строки таблицы, а также между ее столбцами располагается символ-разделитель. Ширина столбцов таблицы, способ их выравнивания и вид символа-разделителя являются произвольными. Создать файл целых чисел, содержащий сумму чисел из каждой строки исходной таблицы.
Решение задачи, на языке: Паскаль

Дополнительные задания на обработку текстовых файлов

Text53. Дан текстовый файл. Создать символьный файл, содержащий все знаки препинания, встретившиеся в текстовом файле (в том же порядке).

Решение задачи, на языке: Паскаль

Text54. Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке их первого появления в тексте.

Решение задачи, на языке: Паскаль

Text55. Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке возрастания их кодов.

Решение задачи, на языке: Паскаль

Text56. Дан текстовый файл. Создать символьный файл, содержащий все символы, встретившиеся в тексте, включая пробел и знаки препинания (без повторений). Символы располагать в порядке убывания их кодов.

Решение задачи, на языке: Паскаль

Text57. Дан текстовый файл. Подсчитать число появлений в нем каждой строчной (то есть маленькой) русской буквы и создать строковый файл, элементы которого имеют вид «<буква>-<число ее появлений>» (например, «а-25»). Буквы, отсутствующие в тексте, в файл не включать. Строки упорядочить по возрастанию кодов букв.

Решение задачи, на языке: Паскаль

Решение задачи, на языке: Паскаль

Text59. Дана строка $$S$$, состоящая из $$10$$ цифр, и файл с русским текстом. Зашифровать файл, выполнив циклическую замену каждой русской буквы, стоящей на $$K$$-й позиции строки, на букву того же регистра, расположенную в алфавите на $$S_K$$-м месте после шифруемой буквы (для $$K=11$$ снова используется смещение $$S_1$$ и т. д.). Букву «ё» в алфавите не учитывать, знаки препинания и пробелы не изменять.

Решение задачи, на языке: Паскаль

Text60. Дана строка и файл с русским текстом, зашифрованным по правилу, описанному в задании Text59. Данная строка представляет собой первую расшифрованную строку текста. Расшифровать остальные строки и заменить в файле зашифрованный текст на расшифрованный. Если информации для расшифровки недостаточно, то исходный файл не изменять.

Решение задачи, на языке: Паскаль

Если вы хотите выложить решение для задач, но нет решения на нужном языке, или вообще к задаче нет решений. Можете разместить его в виде комментария к данной статье.

Читайте также: