В этой статье вашему вниманию будет представлен исходный текст и разбор программы, выравнивающей текст по ширине, за счет увеличения количества пробелов между словами.
Итак, имеется матрица символов размером [n, m], предполагается, что в каждой строке есть хотя бы один пробел, за которым следует любой другой символ. За счет изменения групп пробелов каждой строки нужно добиться того, что бы текст был выровнен по ширине, при этом внутри одной строки количество пробелов в каждой группе пробелов между словами должно отличаться не более чем на единицу.
Ввод и вывод будем осуществлять из файла.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
#include <stdio.h> int main () { FILE *fp; fopen_s (&fp, "input.txt", "r"); int m=0, k=0, i; //ищем m-длину максимальной строки do { while ((getc(fp)!='\n') && (!feof(fp))) k++; if (k>m) m=k; k=0; } while (!feof(fp)); rewind (fp); FILE *fp_out; fopen_s (&fp_out, "output.txt", "w"); int space, len, beginning_line; //кол-во пробелов, длина и указатель на начало текущей строки char c; do { space=len=0; beginning_line=ftell (fp); //считаем количество пробелов while (((c=getc(fp))!='\n') && (!feof(fp))) { if (c==' ') space++; len++; } fseek (fp, beginning_line, SEEK_SET); while (((c=getc(fp))!='\n') && (!feof(fp))) { if (c!=' ') fprintf (fp_out, "%c", c); else { //k - количество пробелов, которое нужно вывести if ((m-len)%space) //если разница в длине максимальной строки и текущей не делится нацело на количество пробелов в текущей строке { k = (m-len) / space + 2; //+1 исходный пробел и +1 пробел от остатка деления, поэтому +2 len++; //чтобы больше не входить в эту часть кода, при обработке данной строки } else k = (m-len) / space + 1; //+1 что бы сохранить исходный пробел, на который выводим for (i = 0; i < k; i++) fprintf (fp_out, " "); } } fprintf (fp_out, "\n"); } while (!feof(fp)); fclose (fp); fclose (fp_out); return 0; } |
Поясню, что происходит в коде программы построчно:
5-6: Открываем файл input.txt для чтения входных данных.
9-15: Ищем самую длинную строку и заносим ее длину в переменную m.
16: Возвращаемся к началу файла.
17-18: Открываем или создаем файл output.txt для вывода результата работы программы.
21-49: Цикл от начала, до конца входного файла. Запоминаем текущую позицию начала данной строки во входном файле, считаем количество пробелов в этой строке, возвращаемся к началу этой строки, посимвольно выводим в output.txt текущую строку с нужным количеством пробелов между словами, тем самым выравниваем текст по ширине, обрабатываем так же следующую строчку, и так до конца файла.
50-51: Закрываем входной и выходной файлы.
Демонстрация работы программы. Исходной текст:
Обработанный текст, выровненный по ширине:
Скачать исходник можно, нажав на кнопку ниже.
Скачать исходник
Поделиться в соц. сетях: