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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [c++]Выравнивание строки 
V
    Опции темы
desert_rose
Дата 4.5.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

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



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


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

Код

#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);

               . . . 


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

Это сообщение отредактировал(а) Alexeis - 5.5.2007, 00:24
PM   Вверх
Dov
Дата 5.5.2007, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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');
}




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


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 18.12.2006
Где: Беллорусия, Минск

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



спасибо большое!
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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