Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.70
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
#1

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

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

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

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

Добавлено через 13 минут
И какой список лучше использовать: односвязный или двусвязный
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2011, 09:29
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Линейный список, выравнивание текста по центру (C++):

Вставить в линейный список перед элементом с заданным значением другой линейный список - C++
Как можно вставить в линейный список перед элементом с заданным значением другой линейный список? Как один элемент вставлять, я знаю, а вот...

Применить выравнивание по центру окна - C++
Есть два вопроса: 1. необходимо вывести следующие данные "1 | x | x | 2" ....... "15| x | x | 16" проблема заключается в том,...

Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке - C++
Задали односвязный линейный список с целыми числами. Создать новый список, который содержит элементы заданного списка в обратном порядке.

Линейный список - C++
Текст помощи организовано как линейный список. каждая компонента текста помощи содержит пояснение к этому термину. Составить программу...

Линейный список - C++
Есть такая детская считалка: n детей стали в круг. Начиная отсчет от первого, убирают каждого k-го ребёнка, замыкая круг после каждого...

Линейный список - C++
Нужно написать курсовую по с++, не используя стандартных методов. Подскажите пожалуйста, с чего начать? Текст допомоги для деякої...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 09:31 #2
Эээ... А это два разных вопроса или один? Потому как связные списки и выравнивание текста у вас ну никак между собой не вяжутся, даже в вопросе, не то что в логике...
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:34  [ТС] #3
Цитата Сообщение от silent_1991 Посмотреть сообщение
Эээ... А это два разных вопроса или один? Потому как связные списки и выравнивание текста у вас ну никак между собой не вяжутся, даже в вопросе, не то что в логике...
мой косяк. в задание ещё нужно добавить. "Перемещение слов производится целиком. Для хранения в памяти строк файла использовать линейный список." Вотъ
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 09:35 #4
Я бы юзал двусвязный, хотя может вполне хватить и односвязного.
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:37  [ТС] #5
Цитата Сообщение от silent_1991 Посмотреть сообщение
Я бы юзал двусвязный, хотя может вполне хватить и односвязного.
а что нибудь по алгоритму сказать можете? я пытался что-то писать, но у меня ничего не получилось=(
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 09:41 #6
Ну а что, в принципе ничего сложного. Первым делом, считаем длину одной строки (не всего введённого текста, а одной его строки, до знака переноса строки). Если она короче ширины строки - просто добавляем перед первым и после последнего слова одинаковое число пробелов, пока длина получаемой строки не станет равна ширине строки. Если же длина этой строки больше ширины строки, идём назад по словам, пока не встретим слово, на котором длина от начала строки до конца этого слова не станет меньше ширины, разбиваем строку на две, одна из которых оканчивается найденным словом, а вторая начинается следующим после него, и к этим двум строкам применяем уже описанный алгоритм выравнивания по центру.
1
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 09:47  [ТС] #7
допустим длина строки больше ширины. строка разделена на две. одна записана, вторая записана. куда мне писать строку, которую я считываю из файла следующей? на новую строку? + мне нужно делать частичный перенос слов=(
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 10:07 #8
Гамбит, а вы считывайте весь файл целиком. У вас будет список, скажем так, лексем, где лексема - это слово или конец строки. Тогда текст
Код
Пример выравнивания текста по центру.
будет в виде списка оформлен так
Код
[Пример]->[выравнивания]->[текста]->[по]->[центру.]->[\0]
Вот у вас и будет, например, куча строк, а в списке они будут выглядеть просто как набор элементов, каждый из которых представляет либо слово, либо конец строки. И служебные элементы, например, "абзац", легко в такой список вставлять.

Добавлено через 2 минуты
Ну или если очень хочется, можно и построчно читать. Тогда да, следующую строку, разумеется, писать в файл на новую строку.
Про частичный перенос слов (если имеется ввиду по слогам) в задании не увидел, только про полный перенос.
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:09  [ТС] #9
Цитата Сообщение от silent_1991 Посмотреть сообщение
Гамбит, а вы считывайте весь файл целиком. У вас будет список, скажем так, лексем, где лексема - это слово или конец строки. Тогда текст
Код
Пример выравнивания текста по центру.
будет в виде списка оформлен так
Код
[Пример]->[выравнивания]->[текста]->[по]->[центру.]->[\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
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 14:14 #10
В 28 строку после if уберите точку с запятой.
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:20  [ТС] #11
Цитата Сообщение от silent_1991 Посмотреть сообщение
В 28 строку после if уберите точку с запятой.
который раз попадаюсь....но все равно не правильно. он не видит следующие строки. выдает кол-во строк 1 и общее кол-во символов.
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 14:23 #12
В 26 строку уберите & - имя массива является указателем на его начало.
К тому же, перевод строки будет склеен с последним слово в этой строке, т.е. так
Код
[последнее_слово.\n]
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:46  [ТС] #13
Цитата Сообщение от silent_1991 Посмотреть сообщение
В 26 строку уберите & - имя массива является указателем на его начало.
К тому же, перевод строки будет склеен с последним слово в этой строке, т.е. так
Код
[последнее_слово.\n]
Про & я знаю, это не критично.

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

Добавлено через 16 минут
и ещё не правильно считается длина строки=( текст из 2 строк с кол-вом символов 149. он показывает 1 строку в которой 131 символ=( (хотя он же наверно пробелы игнорирует)
0
silent_1991
Эксперт С++
4964 / 3040 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
08.01.2011, 14:46 #14
Гамбит, вы символ со строкой сравниваете. Пишите '\n', а не "\n"
0
Гамбит
14 / 14 / 1
Регистрация: 19.10.2009
Сообщений: 93
08.01.2011, 14:55  [ТС] #15
Цитата Сообщение от silent_1991 Посмотреть сообщение
Гамбит, вы символ со строкой сравниваете. Пишите '\n', а не "\n"
это я понял уже=)
if(p->word[k-1]=='\n') при условии, что к длина слова. все равно 1 строку находит=(
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2011, 14:55
Привет! Вот еще темы с ответами:

Выравнивание текста - C++
Как мне выравнить текст в этом коде, как показано на рисунке ? cout&lt;&lt;&quot;Едем...

Двусвязный линейный список - C++
Здравствуйте. Помогите пожалуйста в написании программы: Реализовать класс на основе двусвязного линейного списока Реализовать в нем...

Программа на линейный список - C++
Есть программа... Помогите сделать её же, но ввиде линейного списка. Вот условие задачи: (Автоматизированная информационная...

Линейный однонаправленный список - C++
всем доброго времени не получается создать функцию слияния двух списков методом расчесок( допустим первый список 1 3 5 второй 2 4 6 а после...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
08.01.2011, 14:55
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru