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

Поиск:

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


Шустрый
*


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

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



Программа, выравнивающая текст по правому краю, т.е. равномерно размещающая по строке пробелы между словами так, чтобы длина каждой строки стала=n.
(Если можно с пояснениями)
PM MAIL   Вверх
Kuvaldis
Дата 29.11.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


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

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



anad
когда-то писал для своего варианта блокнота. Учитывается, строка является красной или нет. При анализе кода можно идею подсмотреть и переделать более простой вариант (мне лень)
left и right - это максимальное левое и правое значение 
Код

// insert extra gaps to get width-str
// count - words kol, is_red - if red_line

int get_width(char* str, int count, int is_red)

{
    int    gapkol = 0;  // gaps count
    int    i, j, k;     // cycle variables
    int    n;           // real str length
    int    step;        // gaps count to add to each gap_group
    int    tail = 0;    // step += tail
    int    ost;         // gapskol % count
    int    len = right - left + 1; // formatted str length
    char*  res = NULL;  // result str

    n = strlen(str);
    if((count == 1) && (str[0] != ' '))  // if only one word and no leading gaps
    {
      for(i = n; i < len; i++)           // fill following spaces with gaps
         str[i] = ' ';
      return 1;
    }

    if(!(res = (char*)calloc(len + 2, sizeof(char))))
    {
      puts("Error: not enough memory");
      return 0;
    }
    gapkol = len - n;   // following gaps count
    count--;            // count of gaps groups
    i = j = 0;

    if(is_red)
      for(i = 0, j = 0; i < red; i++, j++)      // leading gaps  - parafraph
       res[j] = str[i];

    if(gap == TRUE)                             // if +- 1 gap difference
    {
      for(k = i; k <= n; k++)                   // calculate all gaps in str
         if(str[k] == ' ')
           gapkol++;
    }
    else
    // else calculate following gaps in str 
      for(k = n - 1; (k >= 0) && (str[k] == ' '); k--)
         gapkol++;

    if(gapkol == 0)  // if no gaps
    {
      free(res);                          // exit function
      return 1;
    }
    if(count == 0)                        // if only one word
    {
       while((i < n) && (str[i] != ' '))  // copy word in res
          res[j++] = str[i++];
       for(i = 0; i < gapkol; i++)        //add gaps into str end
          res[j++] = ' ';
       strcpy(str, res);                  // restore str
       free(res);
       return 1;
    }
    
    step = gapkol / count;                // gaps count to add to each gap_group
    ost = gapkol % count;                 // divide ostatok
    if(ost)
      tail = 1;
    for(count; count > 0; count--)        // for each gap_group
    {
       while(str[i] != ' ')               // copy word
          res[j++] = str[i++];
       while(str[i] == ' ')               // following gaps
       {
          if(gap == FALSE)                // if not +- 1 gap difference
            res[j++] = str[i];            //    copy old gaps after word
          i++;
       }
       for(int i = 0; i < step + tail; i++) // add new gaps after word
          res[j++] = ' ';
       ost--;
       if(!ost)                           // if all ostatok is written
         tail = 0;
    }

    while(str[i] && (str[i] != ' '))      // copy last word
       res[j++] = str[i++];

    strcpy(str, res);                     // restore str
    free(res);

    return 1;
}




--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
anad
Дата 29.11.2006, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Программа не идет.
 А что нибудь полегче. Мне с такой в жизни не разобраться.
PM MAIL   Вверх
anad
Дата 30.11.2006, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Никто не знает как написать прогу?
PM MAIL   Вверх
Solomon
Дата 30.11.2006, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне кстати тож интересует эта тема, так что тож жду ответа с нетерпением
еще небольшое дополнение... А как насчет варианта если длинна cлова >n(т.е. длинны строки)


--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
Dov
Дата 30.11.2006, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(anad @  29.11.2006,  20:39 Найти цитируемый пост)
Программа, выравнивающая текст по правому краю, т.е. равномерно размещающая по строке пробелы между словами так, чтобы длина каждой строки стала=n.

Не понял задание,  smile  пример приведите.  smile 



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


Опытный
**


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

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



В ворде работал? знаеш там есть такая функция как выравнивание по ширине...? это что в этом роде, если я правильно понял )))


--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
Dov
Дата 30.11.2006, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Solomon @  30.11.2006,  19:13 Найти цитируемый пост)
если я правильно понял )))

А если неправильно. smile 


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


Опытный
**


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

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



Цитата

 т.е. равномерно размещающая по строке пробелы между словами так, чтобы длина каждой строки стала=n.


ну полюбому то...

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


--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
Dov
Дата 30.11.2006, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Ладно, Solomon, подождём anad, она нам всё объяснит.  smile 
Цитата(Solomon @  30.11.2006,  17:09 Найти цитируемый пост)
Мне кстати тож интересует эта тема, так что тож жду ответа с нетерпением

А тебя-то что интересует, только конкретно.



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


Кодю потиху
****


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

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



А меня интересует вы сами будете рисовать на листе, или расстояния между словами измеряются только количеством пробелов в них?
Если первое, то алгоритм таков: 
1) находим первое слово, которое не помещается в строку.
Для этого нам нужно знать ширину каждой буквы и минимальную ширину пробела.
Складываем последовательно ширину всех букв, включая пробелы и проверяем вышли ли мы за пределы строки.
2) слово на котором вышли отбрасываем и вычисляем длину всех букв в неоткинутых словах (пробелы не считаются).
3) вычисляем разность между длинной строки и числом из п. 2 и делим его поровну между всеми пробелами.
4) выводим строку с шириной пробела вычисленной в пред. пункте.
Все.
Цитата(Solomon @  30.11.2006,  17:09 Найти цитируемый пост)
А как насчет варианта если длинна cлова >n(т.е. длинны строки) 

Ничего страшного. Просто обрезаем слово по первой букве, которая не влезла в строку
А вот если воторое:
То ничего у вас не выйдет  smile 
Количество букв в слове в среднем 10. Поэтому в среднем у нас будет отсекаться 5 букв. именно их ширину и нужно будет распределять между пробелами !равномерно! 
Но как можно это сделать, если мы можем добавить не менее одного пробела к другому. 
Т.е.хоть у нас и будет выравнивание по ширине, но будет оно корявое. Где-то 1, где-то 2 пробела между словами, что будет бросаться в глаза

Это сообщение отредактировал(а) ivashkanet - 30.11.2006, 20:41
PM MAIL WWW ICQ   Вверх
Dov
Дата 30.11.2006, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ivashkanet, по-моему, ты только всё усложнил. Какой лист, какое рисование? Чёрный экран, белые буквы, всё.


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


Кодю потиху
****


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

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



Dov, тогда читай второй вариант
PM MAIL WWW ICQ   Вверх
Solomon
Дата 30.11.2006, 21:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Dov @  30.11.2006,  19:33 Найти цитируемый пост)
А тебя-то что интересует, только конкретно.


конкретно мне надо реализовать культкрное выранивание по ширине, как это еесть в ворде


Цитата

Т.е.хоть у нас и будет выравнивание по ширине, но будет оно корявое. Где-то 1, где-то 2 пробела между словами, что будет бросаться в глаза

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



--------------------
Если не идти до конца к поставленным целям и не пытатся их достигнуть, каким бы тяжелым не казался путь, то лучше и не ставь их перед собой, но тот кто не ставит перед собой труднодоступные цели, никогда не ощутит эйфорию настоящей победы... победы над миром...
Соломон 2008
PM MAIL ICQ GTalk YIM   Вверх
Dov
Дата 30.11.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Короче, без anad, не разберёмся.  smile 


Это сообщение отредактировал(а) Dov - 30.11.2006, 21:04


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

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


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

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

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

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


 




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


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

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