Если в строке первые два пробелы, а третий – не пробел, или последние два символа пробелы, а стоящий перед ними – не пробел, то значит, разорвался абзац. В этом случае функция возвращает единицу, которая прибавляется к общему количеству абзацев.
Функция int prov_mid_word(char*,int, FILE);
Предназначена для проверки, нарушена ли целостность термина. В функцию передаются три параметра – строка, в которой встречен разорванный термин, длина этой строки и указатель на файл, из которого произведено считывание.
Локальная переменная int y – счетчик цикла.
Функция анализирует, был ли разорван термин. Если последние символы строки – прописные, то значит, был разорван. В этом случае старая строка затирается, указатель в файле позиционируется туда, откуда строка была считана, предварительно уменьшив размерность буфера для чтения, и вновь читает строку. После этого функция рекурсивно вызывает саму себя. И все указанные действия повторяются до тех пор, пока термин не уйдет за пределы строки. В этом случае разрыв исключается, а следующее чтение из файла начинается с этого термина (так как указатель в файле стоит после считанной строки). В конце функция возвращает получившуюся длину строки.
Функция bool term_here(int, char*);
Функция проверяет, впервые указанный термин встречается или он уже сохранен.
Передаваемые параметры: int – количество сохраненных терминов, char* - строка, содержащая еще непроверенный термин.
В ходе вызова функции анализируется, сколько терминов уже сохранено. Если нет ни одного, то функция возвращает false – совпадений нет. Если какие-либо термины уже сохранены, то идет проход по массиву терминов снизу вверх, и если данный совпал с каким-то из сохраненных, то функция возвращает true – совпадение обнаружено. Если после прохода ни одного совпадения обнаружено не было, функция возвращает false – совпадений нет.
Функция void sort(int);
Функция сортирует термины в прямом или обратном (в зависимости от желания пользователя) порядке. Передаваемый в функцию параметр: int – количество сохраненных терминов.
Локальные параметры:
Int r – счетчик цикла (номер текущего термина)
Char q – анализатор нажатой клавиши.
Termin w – вспомогательная структура, предназначенная для обмена элементов по методу «трех стаканов».
Функция при вызове запрашивает способ сортировки: по возрастанию или по убыванию. Если нажата клавиша ‘1’ – по возрастанию, если ‘2’ – по убыванию. Если нажато что-то третье, сортировки не будет.
Внешний цикл выполняется от первого термина и пока они не закончатся. Внутренний цикл выполняется со следующей после текущей позиции и до окончания терминов. Во внутреннем цикле проверяется условие: если первый термин больше второго и при этом была нажата клавиша ‘1’ (два условия для сортировки по возрастанию) или если первый термин меньше второго и при этом была нажата клавиша ‘2’ (два условия для сортировки по убыванию), то происходит обмену по методу «трех стаканов» и циклы продолжаются.
Функция to_file(int)
Функция записывает полученную отсортированные структуры в файл. Формальный параметр: int – количество терминов.
Локальные переменные:
Int r – счетчик цикла (номер текущего термина)
FILE *fp – файловая переменная файла для записи
Сначала открывается (или создается, если не существует) файл для записи. Цикл – пока не закончатся термины. В цикле: в файл записывается очередной термин. Указатель в файле позиционируется на 20 символов от начала строки, в которую был записан данный термин (вне зависимости от длины строки). В файл записывается номер абзаца и символ перевода каретки. Таким образом, в файле все номера абзацев хранятся столбиком. После этого осуществляется запись следующего термина по аналогичному образцу.
Описание работы программы на контрольном примере
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.