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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C] выравнивание текста по ширине 
V
    Опции темы
DeathKnight
Дата 26.2.2009, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

прошу помочь, я уже запутался в багах и переделках...поэтому свой код не буду выкладывать, хочу глянуть на новый.
если можно. зарание спасибо.
PM   Вверх
mrbrooks
Дата 26.2.2009, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

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



Цитата(DeathKnight @  26.2.2009,  15:28 Найти цитируемый пост)
я уже запутался в багах и переделках...поэтому свой код не буду выкладывать, 

хитер  smile 
выкладывай. заценим.
PM MAIL   Вверх
DeathKnight
Дата 26.2.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale>
#include <windows.h>
#include <ctype.h>

char* ToRus(char* str
            )
{
    char * buf;
    buf=(char*)malloc(strlen(str));
    CharToOem(str, buf);
    return buf;
}

int MaxLen(char** strarr,                 // массив строк
           int Size)                      // количество строк
{
    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;                        // возвращаем максимальную длину строки
}


char* TabPr(char* str)
{
    int i,j, k=0, len=strlen(str);
    char* buf;

    buf=(char*)calloc(len,sizeof(char));
    for(i=0,j=0; str[i];j++,i++)
    {
        if(str[i]=='\t')
        {
            len+=7;
            buf=(char*)realloc(buf, len);
            for(k=0;k<8;k++)
                buf[j+k]=' ';
            i++;
            j+=8;
        }
        buf[j]=str[i];
    }
    return buf;
}


int Words(char* str,                      // строка
           int* alpha,                    // счётчик 'букв' в строке
           int* flag                      // счётчик "красной строки"
          )
{
    int count = 0;                        // обнуляем счётчик слов
    *alpha    = 0;                        // обнуляем счётчик 'букв'
    *flag     = 0;                        // обнуляем счётчик "красной строки"

    //пропускаем и считаем пробелы в начале строки
    while(*str && isspace(*str++))
        flag++;

    // пока не конец строки
    while(*str)
    {
        // пропускаем пробелы
        while(*str && isspace(*str))
            str++;
        // если не пробел, значит это начало слова, считаем его
        if(*str && !isspace(*str))
            count++;
        // пропускаем остальные буквы и подсчитываем их
        while(*str && !isspace(*str++))
            (*alpha)++;
    }
    // возвращаем количество слов в строке
    return count;
}


char* RestructT(char* str,                          // строка
                int   len                           // длина, на которую растягиваем
                )
{
    int    spaces;                                  // количество необходимых пробелов
    int    i;                                       // переменная управления циклом
    int    flag;                                    // кол-во пробелов в начале строки
    int    interval;                                // количество пробелов между словами
    int    spcrem;                                  // остаток пробелов, равномерно добавляемых к интервалам
    int    gaps;                                    // количество промежутков между словами в строке
    int    letters;                                 // количество букв в строке
    char*  buf;                                     // буферная строка
    gaps     = Words(str, &letters, &flag) - 1;     // вычисляем количество промежутков между словами
    spaces   = len - letters-flag;                  // общее количество необходимых пробелов
    interval = gaps ? spaces / gaps : 0;            // если есть промежуток, значит есть у него размер
    spcrem   = gaps ? spaces % gaps : 0;            // пробелы для коррекции интервала
    buf=(char*)calloc(len, sizeof(char));           //выделение памяти для буфера,


    while(*str)
    {
        // пробелы пропускаем
        while(*str && isspace(*str))
        {
            *str=*buf;
            str++;
            buf++;
        }

        // если нет промежутков, значит в строке только одно слово
        if(!gaps)
        {
            break;
        }
        // если мы здесь, значит в строке больше одного слова

        while(*str && !isspace(*str))
        {
            *str++=*buf++;                                   //копируем слово
        }
        for(i=0;i<interval + (spcrem-- > 0);i++)
            *buf++ =' ';
        //sprintf(buf,f"%*c", interval + (spcrem-- > 0), ' ');      // и интервал
    }
   return buf-len;
}


int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, ".866");
    char** text;
    int i;
    int j;
    int maxStr;
    int Size;

    puts(ToRus("Кол-во строк?:"));
    scanf("%d", &Size);

    text=(char**)malloc(Size * sizeof(char*));
    for(i=0; i < Size ;i++)
        text[i]=(char*)calloc(80, sizeof(char));

    for(i=0;i<Size;i++)
    {
        fflush(stdin);
        gets(text[i]);
    }

    for(i=0;i < Size;i++)
        text[i] = TabPr(text[i]);

    maxStr = MaxLen(text, Size);

    for(i=0; i < Size; i++)
        puts(text[i]);

    for(i=0; i<Size-1;i++)
        text[i]=RestructT(text[i], maxStr);

    for(i=0; i < Size; i++)
        puts(text[i]);


    system("PAUSE");
    return 0;
}



вот прога...не знаю уже как её заставить работать...
PM   Вверх
ИванМ
Дата 26.2.2009, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

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



Есть код на паскале, который растягивает текст. Если надо могу скинуть.
PM MAIL   Вверх
Dmi3ev
Дата 27.2.2009, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Код

#include "stdafx.h"
#include <iostream>

using namespace std;

char* mystrcat(char *s, char *s2)
{
    char* res=new char[strlen(s)+2];
    char* b=res;
    
    while (*s)
    {
        *res=*s;
        res++; s++;
    }

    while (*s2)
    {
        *res=*s2;
        res++; s2++;
    }
    *res='\0';
    res=b;
    return res;
}

char* stringtext(char* text, int length, char* my_del)
{
    char **mywords;
    int w_size=256;
    
    mywords=new char*[w_size];
    for (int j=0; j<w_size; j++)
        mywords[j]=new char[w_size]; 
    int cw=0;

    int counter=0;

    char *p;
    char *delimeters=" ";
    
    p=strtok(text, delimeters);
    mywords[cw]=p;
    counter+=strlen(mywords[cw]);
    while(p=strtok(NULL,delimeters))
    {
        cw++;
        mywords[cw]=p;
        counter+=strlen(mywords[cw]);
    }
    int n=length-counter;

    int myi=0;

    while (n)
    {
        if (myi<cw)
        {
            mywords[myi]=mystrcat(mywords[myi], my_del);
            n--;
            myi++;
        }
        else
        {
            myi=0;
        }
    }

    char* resstr;
     resstr=new char[length+1];
     *resstr='\0';
    for (int i=0; i<=cw; i++)
        resstr=mystrcat(resstr, mywords[i]);
    return resstr;
}

int _tmain()
{
    char my_text[256]="This is my text! I'll string it!";
    int newlength=50;

    cout<<"Before: "<<endl<<my_text<<endl<<"Length="<<strlen(my_text)<<endl;
    char *stext=stringtext(my_text, newlength, " ");
    cout<<"After: "<<stext<<endl<<"Length="<<strlen(stext)<<endl;
    
    system("pause");
    return 0;
}

пользоваться так:
stringtext(сам текст (char*), новая длина (int), символ(char*), который будет использоваться в качистве вставляемого);
напимер:
Код

    char my_text[256]="This is my text! I'll string it!";
    int newlength=50;

    cout<<"Before: "<<endl<<my_text<<endl<<"Length="<<strlen(my_text)<<endl;
    char *stext=stringtext(my_text, newlength, " ");
    cout<<"After: "<<stext<<endl<<"Length="<<strlen(stext)<<endl;

как в проге, или можно вставлять даже текст разделитель...
Код

char *stext=stringtext(my_text, newlength, "MY TEXT");

конкатенацию свою сделал для прикола...

Добавлено через 14 минут и 9 секунд
для абзаца добавляешь еще один параметр bool  в функцию...

Это сообщение отредактировал(а) Dmi3ev - 27.2.2009, 13:54


--------------------

PM MAIL   Вверх
DeathKnight
Дата 27.2.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



благодарю...
но не мог бы ты раставить немного комментариев? хочу разобраться в алгоритме лучше
PM   Вверх
Dmi3ev
Дата 27.2.2009, 19:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1698
Регистрация: 28.11.2007

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



Код

char* stringtext(char* text, int length, char* my_del)
{
    char **mywords;
//сюда будем записывать слова
//под словами понимается:
//1. набор символов от пробела до пробела
//2. если это начало строки, то от начала до пробела
//3. если это конец, то от последнего пробела до конца
    int w_size=256;//для понимания назову это размером массива в котором будут хранится слова
    
    //создаем 256 строк для строк, максимальная длина слова 255 (+символ конца строки)
    mywords=new char*[w_size];
    for (int j=0; j<w_size; j++)
        mywords[j]=new char[w_size]; 
    int cw=0;//номер текущей строки в массиве
    int counter=0;//общее количество символов во всех словах
    char *p;//указатель, который нужен для разбиения текста на слова
    char *delimeters=" ";//здесь хранится разделитель, который использует между словами. он нужен нам для разбиения нашего текста на слова
    
    p=strtok(text, delimeters);//получаем первое слова
    mywords[cw]=p;//записываем в наш массив
    counter+=strlen(mywords[cw]);//увеличиваем наш счетчик на длину первого слова
    //продолжаем разбивать текст на слова, пока он  не кончится
    while(p=strtok(NULL,delimeters))
    {
        cw++;//переходим на следующую строку
        mywords[cw]=p;//записываем туда следующее слово
        counter+=strlen(mywords[cw]);//увеличиваем на длину текущего слова
    }
    int n=length-counter;//считаем, сколько нужно поставить пробелов, чтобы длина строки была равной length
    int myi=0;//индекс строки
    //пока n>0, те пока не мы не поставим нужное количество пробелов делаем вот это
    while (n)
    {
        if (myi<cw)//это условие нужно для того, чтобы после последнего слова не ставить пробелы...
        {
            mywords[myi]=mystrcat(mywords[myi], my_del);//ставим пробел после слова
            n--;//пробелов надо ставить на 1 меньше, поэтому уменьшаем n
            myi++;//
        }
        else
        {
            myi=0;//снова перейти к первой строке, где хранится первое слово
        }
    }
    //теперь у нас есть массив вот такого вида
    //"слово 1                         "
    //"слово 2                         "
    //...
    //"слово cw"
    char* resstr;//это наша результирующая строка, которая имеет длину length
     resstr=new char[length+1];//добавляем 1 для символа конца строки
     *resstr='\0';//собаственно теперь его и добавляем
    for (int i=0; i<=cw; i++)
        resstr=mystrcat(resstr, mywords[i]);//поочередно записываем наши слова из массива вместе с пробелами в одну строку
    //"слово 1                         слово 2                         ...                      слово cw" те уже строка отформатирована
    return resstr;//возвращаем строку
}


Это сообщение отредактировал(а) Dmi3ev - 27.2.2009, 21:09


--------------------

PM MAIL   Вверх
DeathKnight
Дата 2.3.2009, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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


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

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

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

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


 




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


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

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