Результат работы программы: Код | Source text: -------------- I still hold your hand in mine In mine when I'm asleep And I will bear my When I'm kneeling at your feet Goodbye Goodbyemyfriendgoodbyemylover You have been the one You have been the one for I'm so hollow, I'm so hollow I'm so, I'm so hollow
Enter required width(30...80) of the text: 45
1 2 3 4 123456789012345678901234567890123456789012345
I still hold your hand in mine In mine when I'm asleep And I will bear my When I'm kneeling at your feet G o o d b y e // одно слово тянем! Go od by em yf ri en dg oo db ye my l o v e r // и здесь!!! You have been the one You have been the one for I'm so hollow, I'm so hollow I'm so, I'm so hollow
|
Код | #include <stdio.h> // для printf(), scanf(), putchar(), puts()... #include <conio.h> // для getch() #include <ctype.h> // для isspace() #include <string.h> // для strlen()
#define WIDTH 80 // максимальная ширина текста #define SIZE 10 // количество строк в массиве
int MaxLen (char** strarr); // функция возвращает максимальную длину строки в массиве строк int Words (char* str, int* alpha); // функция возвращает количество слов в строке void Feathering(char* str, int len); // функция растяжки строки
int main() { char* text[WIDTH] = { // наш текст "I still hold your hand in mine", "In mine when I'm asleep", "And I will bear my", "When I'm kneeling at your feet", "Goodbye", "Goodbyemyfriendgoodbyemylover", "You have been the one", "You have been the one for", "I'm so hollow, I'm so hollow", "I'm so, I'm so hollow" };
int i; // переменная управления циклом int width; // требуемая ширина текста(запрашиваем у пользователя) int lenstr = MaxLen(text); // длина максимальной строки в тексте
// выводим наш текст на экран printf(" Source text:\n--------------\n"); for(i = 0; i < SIZE; i++) printf("%s\n", text[i]);
// запрашиваем у пользователя ширину текста printf("\nEnter required width(%d...%d) of the text: ", lenstr, WIDTH); scanf("%d", &width); // корректируем её, если она выходит из диапазона допустимых значений if(width > WIDTH) width = WIDTH; else if(width < lenstr) width = lenstr;
// выводим вспомогательную линейку для визуального контроля значений putchar('\n'); for(i = 1; i <= width / 10; i++) printf("%10d", i); putchar('\n'); for(i = 1; i <= width; i++) printf("%d", i % 10); putchar('\n'); putchar('\n');
// растягиваем строки текста до указанной пользователем ширины for(i = 0; i < SIZE; i++) Feathering(text[i], width);
putchar('\n');
// выходим puts("\nPress any key to quit...\n"); getch();
return 0; }
// подсчёт слов и 'букв' в строке int Words(char* str, // строка int* alpha // счётчик 'букв' в строке ) { int count = 0; // обнуляем счётчик слов *alpha = 0; // обнуляем счётчик 'букв'
// пока не конец строки while(*str) { // пропускаем пробелы while(*str && isspace(*str)) str++;
// если не пробел, значит это начало слова, считаем его if(*str && !isspace(*str)) count++;
// пропускаем остальные буквы и подсчитываем их while(*str && !isspace(*str++)) (*alpha)++; }
// возвращаем количество слов в строке return count; }
// растягиваем строку void Feathering(char* str, // строка int len // длина, на которую растягиваем ) { int spaces; // количество необходимых пробелов int i; // переменная управления циклом int interval; // количество пробелов между словами int letcnt; // цепочка букв, которые нужно разделить пробелами в том // случае, если строка состоит из одного слова int spcrem; // остаток пробелов, равномерно добавляемых к интервалам int letrem; // остаток букв, равномерно добавляемых к цепочкам букв int gaps; // количество промежутков между словами в строке int letters; // количество букв в строке
gaps = Words(str, &letters) - 1; // вычисляем количество промежутков между словами spaces = len - letters; // общее количество необходимых пробелов interval = gaps ? spaces / gaps : 0; // если есть промежуток, значит есть у него размер spcrem = gaps ? spaces % gaps : 0; // пробелы для коррекции интервала while(*str) { // пробелы пропускаем while(*str && isspace(*str)) str++; // если нет промежутков, значит в строке // только одно слово и нужно его растянуть if(!gaps) { interval = letters > 1 ? spaces / (letters - 1) : 0;// определяем расстояние между символами spcrem = letters > 1 ? spaces % (letters - 1) : 0;// и оставшиеся пробелы letcnt = letters / (spaces + 1); // цепочка букв letrem = letters % (spaces + 1); // и их остаток для добавления к цепочкам while(*str) { for(i = letcnt + (letrem > 0); *str && i; i--) putchar(*str++); // печатаем цепочку букв printf("%*c", interval + (spcrem-- > 0), ' '); // и интервал if((letcnt + letrem) == 0) str++; // переходим к следующей цепочке if(letrem) letrem--; // уменьшаем остаток } }
// если мы здесь, значит в строке больше одного слова else { while(*str && !isspace(*str)) putchar(*str++); // печатаем слово printf("%*c", interval + (spcrem-- > 0), ' '); // и интервал } } putchar('\n'); }
// определяем максимальную длину строки в массиве строк int MaxLen(char** strarr // массив строк ) { int len; // длина текущей строки int maxlen; // максимальная длина строки int i; // переменная управления циклом
maxlen = strlen(strarr[0]); // назначаем первую строку массива максимальной
for(i = 1; i < SIZE; i++) // в цикле { len = strlen(strarr[i]); // просматриваем строки if(len > maxlen) // если находим большую, maxlen = len; // то назначаем её максимальной }
return maxlen; // возвращаем максимальную длину строки } |
--------------------
Тут вечности запах томительный, И свежие фрукты дешевые, А климат у нас – изумительный, И только соседи – #уевые. Игорь Губерман.
|