Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/34: Рейтинг темы: голосов - 34, средняя оценка - 4.82
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93

Линейный список, выравнивание текста по центру

08.01.2011, 09:29. Показов 6602. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Задача- написать программу реализующую выравнивание текста по центру. ширина строки, имя входного и выходного файлов задаются пользователем с командной строки. Слова, которые превышают по длине заданную ширину строки, должны переносится на следующую строку. абзацы отделяются пустрй строкой. вроде все.

Так вот вопрос, как мне это реализовать? я не могу придумать алгоритм, что за чем делать. Прошу помощи

Добавлено через 13 минут
И какой список лучше использовать: односвязный или двусвязный
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.01.2011, 09:29
Ответы с готовыми решениями:

HTML!? Выравнивание IMG после текста по центру этого текста
как выровнять изображение по центру текста? имеется в виду опустить изображение на пару пикселей, только если исп. margin-top в его css,...

Выравнивание текста по центру
подскажите как максимально просто отрисовать строку по середине JPanel? строки могут быть разных размеров в TextArea не нашел функций...

Выравнивание текста по центру
Доброго времени суток. Делаю "резиновую шапку". И столкнулся с такой проблемой. У меня не выравнивается текст по центру в среднем блоке.....

28
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 09:31
Эээ... А это два разных вопроса или один? Потому как связные списки и выравнивание текста у вас ну никак между собой не вяжутся, даже в вопросе, не то что в логике...
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:34  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Эээ... А это два разных вопроса или один? Потому как связные списки и выравнивание текста у вас ну никак между собой не вяжутся, даже в вопросе, не то что в логике...
мой косяк. в задание ещё нужно добавить. "Перемещение слов производится целиком. Для хранения в памяти строк файла использовать линейный список." Вотъ
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 09:35
Я бы юзал двусвязный, хотя может вполне хватить и односвязного.
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:37  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я бы юзал двусвязный, хотя может вполне хватить и односвязного.
а что нибудь по алгоритму сказать можете? я пытался что-то писать, но у меня ничего не получилось=(
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 09:41
Ну а что, в принципе ничего сложного. Первым делом, считаем длину одной строки (не всего введённого текста, а одной его строки, до знака переноса строки). Если она короче ширины строки - просто добавляем перед первым и после последнего слова одинаковое число пробелов, пока длина получаемой строки не станет равна ширине строки. Если же длина этой строки больше ширины строки, идём назад по словам, пока не встретим слово, на котором длина от начала строки до конца этого слова не станет меньше ширины, разбиваем строку на две, одна из которых оканчивается найденным словом, а вторая начинается следующим после него, и к этим двум строкам применяем уже описанный алгоритм выравнивания по центру.
1
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:47  [ТС]
допустим длина строки больше ширины. строка разделена на две. одна записана, вторая записана. куда мне писать строку, которую я считываю из файла следующей? на новую строку? + мне нужно делать частичный перенос слов=(
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 10:07
Гамбит, а вы считывайте весь файл целиком. У вас будет список, скажем так, лексем, где лексема - это слово или конец строки. Тогда текст
Code
1
Пример выравнивания текста по центру.
будет в виде списка оформлен так
Code
1
[Пример]->[выравнивания]->[текста]->[по]->[центру.]->[\0]
Вот у вас и будет, например, куча строк, а в списке они будут выглядеть просто как набор элементов, каждый из которых представляет либо слово, либо конец строки. И служебные элементы, например, "абзац", легко в такой список вставлять.

Добавлено через 2 минуты
Ну или если очень хочется, можно и построчно читать. Тогда да, следующую строку, разумеется, писать в файл на новую строку.
Про частичный перенос слов (если имеется ввиду по слогам) в задании не увидел, только про полный перенос.
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:09  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Гамбит, а вы считывайте весь файл целиком. У вас будет список, скажем так, лексем, где лексема - это слово или конец строки. Тогда текст
Code
1
Пример выравнивания текста по центру.
будет в виде списка оформлен так
Code
1
[Пример]->[выравнивания]->[текста]->[по]->[центру.]->[\0]
Вот у вас и будет, например, куча строк, а в списке они будут выглядеть просто как набор элементов, каждый из которых представляет либо слово, либо конец строки. И служебные элементы, например, "абзац", легко в такой список вставлять.

Добавлено через 2 минуты
Ну или если очень хочется, можно и построчно читать. Тогда да, следующую строку, разумеется, писать в файл на новую строку.
Про частичный перенос слов (если имеется ввиду по слогам) в задании не увидел, только про полный перенос.
спасибо=) попытаюсь=)

Добавлено через 2 часа 54 минуты
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <stdio.h>
#include <string.h>
#include <alloc.h>
#include<conio.h>
#define n 15
typedef struct list {
char word[80];
struct list *next;
} LIST;
int i,a[100];
 
LIST * read_list(LIST *lst)
{
    LIST *p;
    FILE *f;
    int k;
    f=fopen("f:\\1\\bc\\bin\\1.txt","r");
    if (!feof(f))
    {
        i=1;
        a[1]=0;
        lst=(LIST*)malloc(sizeof(LIST));
        p=lst;
        while(1)
        {
            fscanf(f,"%s",&p->word);
            if(p->word=="\n");{
            i++;a[i]=0;}
            a[i]=a[i]+strlen(p->word);
            if (!feof(f))
            {
                p->next=(LIST*)malloc(sizeof(LIST));
                p=p->next;
            }
            else break;
 
        }
        p->next=NULL;
    }
    else printf("File pustoi\n");
    fclose(f);
    return lst;
}
 
 
 
void main()
{
clrscr();
LIST *lst;
int k;
read_list(lst);
printf("%d\n",i);
for(k=1;k<=i;k++)
printf("%d\n",a[k]);
}
не хочет адекватно считывать кол-во строк. почему?
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 14:14
В 28 строку после if уберите точку с запятой.
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:20  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
В 28 строку после if уберите точку с запятой.
который раз попадаюсь....но все равно не правильно. он не видит следующие строки. выдает кол-во строк 1 и общее кол-во символов.
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 14:23
В 26 строку уберите & - имя массива является указателем на его начало.
К тому же, перевод строки будет склеен с последним слово в этой строке, т.е. так
Code
1
[последнее_слово.\n]
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:46  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
В 26 строку уберите & - имя массива является указателем на его начало.
К тому же, перевод строки будет склеен с последним слово в этой строке, т.е. так
Code
1
[последнее_слово.\n]
Про & я знаю, это не критично.

Code
1
2
3
fscanf(f,"%s",p->word);
k=strlen(p->word);
if(p->word[k-1]=="\n")
я пытался так сделать, но ругается на иф, пишет что не может превратить char в char *
ну и то что начение параметра k не используется=(

Добавлено через 16 минут
и ещё не правильно считается длина строки=( текст из 2 строк с кол-вом символов 149. он показывает 1 строку в которой 131 символ=( (хотя он же наверно пробелы игнорирует)
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 14:46
Гамбит, вы символ со строкой сравниваете. Пишите '\n', а не "\n"
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:55  [ТС]
Цитата Сообщение от silent_1991 Посмотреть сообщение
Гамбит, вы символ со строкой сравниваете. Пишите '\n', а не "\n"
это я понял уже=)
if(p->word[k-1]=='\n') при условии, что к длина слова. все равно 1 строку находит=(
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 16:19
Балин, что-то быдлокодерски вышло. Но работает. Это только чтение и распихивание по списку слов.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
typedef struct Node Node;
 
typedef struct Node
{
    char word[80];
    char type;
    int len;
    Node *next;
} Node;
 
typedef struct
{
    Node *first;
    Node *last;
} Words;
 
void scan_words(Words *words, char *filename)
{
    Node *new_elem;
    Node *paragraph;
    Node *end;
    char buffer[1024];
    char word[80];
    char c;
    int len;
    int i, j, k;
 
    FILE *fin;
 
    if ((fin = fopen(filename, "r")) == NULL)
    {
        printf("Error opening file!\n");
 
        exit(-1);
    }
 
    while (!feof(fin))
    {
        i = 0;
 
        while ((c = fgetc(fin)) != '\n' && !feof(fin))
            buffer[i++] = c;
 
        buffer[i] = '\0';
 
        i = 0;
 
        while (buffer[i] != '\0')
        {
            j = i;
 
            while (buffer[j] != ' ' && buffer[j] != '\0')
                ++j;
 
            for (k = i; k < j; ++k)
                word[k - i] = buffer[k];
 
            word[k - i] = '\0';
 
            len = strlen(word);
 
            new_elem = (Node *)malloc(sizeof(Node));
            new_elem->next = NULL;
 
            if (words->first == NULL)
            {
                words->first = new_elem;
                words->last = new_elem;
            }
            else
            {
                words->last->next = new_elem;
                words->last = new_elem;
            }
 
            strcpy(new_elem->word, word);
            new_elem->len = len;
            new_elem->type = 'w';
 
            i = j + 1;
 
            if (buffer[j] == '\0')
                break;
        }
 
        paragraph = (Node *)malloc(sizeof(Node));
        strcpy(paragraph->word, "\n\n");
        paragraph->type = 'p';
 
        words->last->next = paragraph;
        words->last = paragraph;
    }
 
    end = (Node *)malloc(sizeof(Node *));
    end->type = 'e';
 
    words->last->next = end;
    words->last = end;
 
    fclose(fin);
}
 
void print_words(Words *words)
{
    Node *first = words->first;
    Node *next_elem;
    Node *prev_element = words->first;
 
    while (first->type != 'e')
    {
        printf("%s", first->word);
 
        next_elem = first->next;
 
        if (next_elem->type != 'p' && prev_element->type != 'p')
            printf(" ");
 
        first = first->next;
        prev_element = first;
    }
}
 
void delete_words(Words *words)
{
    Node *first = words->first;
    Node *temp;
 
    while (first != NULL)
    {
        temp = first;
        first = first->next;
 
        free(temp);
    }
}
 
int main()
{
    Words words;
 
    words.first = NULL;
    words.last = NULL;
 
    scan_words(&words, "1.txt");
    print_words(&words);
    delete_words(&words);
 
    return 0;
}
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 16:53  [ТС]
о мой моцк....сама функция считывания и распихивания у меня работает. у меня не работает подсчет строк и длин строк
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 17:02
Гамбит, потому что у вас это самое "считывание и распихивание" неверно реализовано. У вас всё интерпретируется как одна строка, поскольку в файле нету разделения на строки. Поэтому приходится считывать посимвольно. Чем и занимается изрядная часть моей функции. Остальная часть - по сути то же, что и у вас. В мой код добавить подсчёт строк труда не составит.
0
17 / 17 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 17:54  [ТС]
слишком много кода=( мне это в жизн не объяснить преподу
тоесть нужно посимвольно считывать? просто в задании написано, что Перемещение строк производится целиком...
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
08.01.2011, 18:03
Гамбит, ну и что? Перемещение - целиком. А обрабатывать-то их как-то надо. Вот и обрабатываем, как можем, а чтобы удовлетворять заданию, т.е. вообще разбить набор входных символов на строки - приходится читать посимвольно.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.01.2011, 18:03
Помогаю со студенческими работами здесь

Выравнивание текста по центру
Всем привет , я вот тока седня начал изучать php и у меня такая проблема , как в php перечислять нужные параметры ? Пример: 1. &lt;div...

Выравнивание текста по центру экрана
нужно зделать программу чтобы выравнивала текст по центру екрана,вот написал чтото ??? Помогите доделать плиз!:rtfm: program sss; ...

Выравнивание текста по центру MessageBox
Всем привет.Как выровнять текст по центру MessageBox?

ListBox выравнивание текста по центру
Я что то пропустил, или в свойствах ListBox нет данной опции? нашёл как по правому краю выровнить и всё. Есть простой способ? или может...

Выравнивание текста по центру, Word
&quot;Microsoft.Office.Interop.Word.Range&quot; не содержит определение для &quot;Alignment&quot;. Не удалось найти метод расширения &quot;Alignment&quot; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru