Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] Выравнивание текста, по правому краю 
V
    Опции темы
Dov
Дата 3.12.2006, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Результат работы программы:

Код
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;                        // возвращаем максимальную длину строки
}



--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
anad
Дата 5.12.2006, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 62
Регистрация: 30.3.2006

Репутация: нет
Всего: нет



Огромное СПАСИБО ВСЕМ кто мне помог!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0617 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.