Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [c++]Выравнивание строки


Автор: desert_rose 4.5.2007, 21:52
Выравнивание строки заключается в том, что между ее отдельными словами дополнительно вносятся пробелы так, чтобы длина  строки стала равна заданной длине (предполагается, что требуемая длина не меньше исходной), а последнее слово строки сдвинулось к  ее правому краю. Составить процедуру  выравнивания  заданной  строки текста.


Эта задача уже неоднократно встречалась...но мне надо не совсем так...
в решении, которое уже было на форуме идет выравнивание не слов, а всех символов, т.е. пробелы вводятся не между словами, а и между символами.вот я пробовала переделать:

Код

#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <string.h>

#define WIDTH 90                                        // shirina ekrana

char str[1000];

int main()
{
           
    int  len=0;                            
    int  spaces=0; 
    int  sc=0;
    int  i=0;
    int  k = 0;

    cout << "Enter a string: \n";    
    cin >> str;
    len = strlen(str);    
    
// чтобы определить сколько слов для дальнейшей формулы:
    char *sep = " ";
    char *word = strtok(str, sep);
    while (word)
    {
        word = strtok(NULL, sep);
        k++;
    }
        cout << k;
    
        sc = 0;
        for (i = 0; i < len; i++)
        {
            if(str[i] == ' ')
                sc++;
            
        }

    cout << k;
        spaces = (WIDTH - (len - sc))/(k-1);

               . . . 


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

Автор: Dov 5.5.2007, 14:38
desert_rose, так попробуй. 

Код
#include <stdio.h>
#include <string.h>
#include <ctype.h>

#define WIDTH 80                          // максимальная ширина текста

int  Words     (char* str, int* alpha);   // функция возвращает количество слов в строке
void Feathering(char* str, int len);      // функция растяжки строки

int main() 
{
    char text[WIDTH];

    int i;                                // переменная управления циклом
    int width;                            // требуемая ширина текста(запрашиваем у пользователя)
    int lenstr;                           // длина строки 

    // ввод строки
    puts("Enter a string: ");
    fgets(text, WIDTH, stdin);

    // получаем длину введённой строки
    lenstr = strlen(text);

    // запрашиваем у пользователя ширину текста
    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;

    // выводим вспомогательную линейку для визуального контроля значений
    puts("");
    for(i = 1; i <= width / 10; i++)
        printf("%10d", i);
    putchar('\n');
    for(i = 1; i <= width; i++)
        printf("%d", i % 10);
    puts("\n");

    // растягиваем строку
    Feathering(text, width); 

    // выходим из программы
    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    letters;                         // количество букв в строке    
    int    gaps;                            // количество промежутков между словами в строке 
    int    spaces;                          // количество необходимых пробелов
    int    interval;                        // количество пробелов между словами 
    int    spacerem;                        // остаток пробелов, равномерно добавляемых к интервалам

    gaps     = Words(str, &letters) - 1;    // вычисляем количество промежутков между словами
    spaces   = len - letters;               // общее количество необходимых пробелов
    interval = gaps ? spaces / gaps : 0;    // если есть промежуток, значит есть у него размер
    spacerem = gaps ? spaces % gaps : 0;    // пробелы для коррекции интервала
    
    while(*str)
    {
        
        while(*str && isspace(*str))                         
            str++;                                          // пробелы пропускаем
        while(*str && !isspace(*str))                 
            putchar(*str++);                                // печатаем слово
            
        printf("%*c", interval + (spacerem-- > 0), ' ');    // и интервал            
    }
    putchar('\n');
}


Автор: desert_rose 5.5.2007, 18:53
спасибо большое!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)