С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/34: Рейтинг темы: голосов - 34, средняя оценка - 4.59
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21

Программа переноса слов

15.12.2018, 05:44. Показов 7189. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, нужна помощь с задачей для так называемого переноса слов. Используя данные правила переноса слов.

Правила:
1. В каждой из разделяемых частей должно быть более одно буквы, из которых хотя бы одна – гласная
2. Нельзя разделять согласную и следующую за ней гласную;
3. Буквы Й,Ь,Ъ считать согласными, но перенос после них допустим. В каждом из вводимых слов поставить все возможные знаки переноса, на - пример: СЕ-ЛЬ-С-КО-ХО-ЗЯЙ-С-Т-ВЕ-Н-НАЯ. Строчные и прописные буквы считать неразличимыми.

Думаю над задачей около двух недель, нашел несколько примеров но постоянно выдает ошибки. Задача в теории - понятна, но как реализовать на практике...
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.12.2018, 05:44
Ответы с готовыми решениями:

Программа для переноса слов
Вообщем условие вот: Перенос. Примем следующие правила переноса русских слов: – в каждой из разделяемых частей должно быть более одной ...

Составить программу автоматического переноса слов
Товарищи, помогите пожалуйста. Необходимо составить программу автоматического переноса слов. Исходная информация вводится с клавиатуры....

Формула для переноса слов в соседний столбец
Ребятки выручайте. Нужно в эксель написать формулу,по которой в предложении если больше 33 символов,то остальная часть символов...

15
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
17.12.2018, 05:39  [ТС]
Вроде бы попробовал написал код, но почему то выдает ошибки и программа не запускаеться..Подчеркивает только gets(s);

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
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<locale.h>
 
void main()
{
    char s[100],
        glas[] = { "уеыаоэяиюё" },
        sogl[] = { "цкнгшщзхфвпрлджчсмтб" },
        iskl[] = { "йьъ" };
    int i = 0, j;
    setlocale(LC_ALL, "Russian");
    printf("Введите слово:\n");
    gets(s);
    while (s[i] != '\0')
    {
        if (strchr(glas, s[i]) != NULL)
        {
            if (strchr(sogl, s[i + 1]) != NULL && strchr(glas, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(sogl, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(iskl, s[i + 2]) != NULL && s[i + 3] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 3; j--)
                    s[j] = s[j--];
                s[i + 3] = '-';
                i = i + 3;
                goto next;
            }
            if (strchr(glas, s[i + 1]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(iskl, s[i + 1]) != NULL && s[i + 2] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
        next:;
        }
        i++;
    }
    printf("Слово с знаками переноса:\n %s", s);
    getchar();
    getchar();
}
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
17.12.2018, 06:00
Цитата Сообщение от IIIeJlkyN4ik Посмотреть сообщение
Подчеркивает только gets(s);
Поменяйте на cin. В Вашем случае (только для одного слова) будет достаточно.
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
17.12.2018, 06:13  [ТС]
Поменял void main на int main
изменил gets



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
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<locale.h>
 
int main()
{
    char s[100],
        glas[] = { "уеыаоэяиюё" },
        sogl[] = { "цкнгшщзхфвпрлджчсмтб" },
        iskl[] = { "йьъ" };
    int i = 0, j;
    setlocale(LC_ALL, "Russian");
    printf("Введите слово:\n");
    cin(s);
    while (s[i] != '\0')
    {
        if (strchr(glas, s[i]) != NULL)
        {
            if (strchr(sogl, s[i + 1]) != NULL && strchr(glas, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(sogl, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(iskl, s[i + 2]) != NULL && s[i + 3] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 3; j--)
                    s[j] = s[j--];
                s[i + 3] = '-';
                i = i + 3;
                goto next;
            }
            if (strchr(glas, s[i + 1]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(iskl, s[i + 1]) != NULL && s[i + 2] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
        next:;
        }
        i++;
    }
    printf("Слово с знаками переноса:\n %s", s);
    getchar();
    getchar();
}
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
17.12.2018, 06:15
C++
1
2
3
#include <iostream>
 
using namespace std;
C++
1
cin >> s;
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
17.12.2018, 06:24  [ТС]
Программа запустилась но почему то после написания слова выводятся набор символов,
хотя setlocale(LC_ALL, "Russian"); я написал.

Название: Screenshot_3.png
Просмотров: 148

Размер: 1.5 Кб

Это может быть связано с тем что нужно ставить язык ввода и вывода русский, а не просто писать один раз setlocate?
0
 Аватар для alkl
119 / 94 / 35
Регистрация: 18.12.2012
Сообщений: 654
17.12.2018, 06:53
Русские шрифты в консоли
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
17.12.2018, 07:54  [ТС]
Тема про шрифты мне понятна. Дело в том что если я переставляю
C++
1
setlocale(LC_ALL, "Russian")
;
в другое место то просьба о вводе данных в консоли идет неверная, и ответ так же выводиться неправильно.

Название: 1.png
Просмотров: 147

Размер: 1.9 Кб

если же оставить
C++
1
setlocale(LC_ALL, "Russian")
; на 16 строке то вывод идет верный, но ответ все еще выводиться неправильно.



Попробовал и

C++
1
2
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Но в конечном итоге ничего не меняется. Во всех примерах показывают любой вывод и далее пишут
C++
1
cout << rus("текст");
В других программах это работает, но в данной программе я не выбираю что выводить, она сама считает и выводит...
Что я делаю не так?


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
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<locale.h>
#include<iostream>
 
using namespace std;
 
int main()
{
    char s[100],
        glas[] = { "уеыаоэяиюё" },
        sogl[] = { "цкнгшщзхфвпрлджчсмтб" },
        iskl[] = { "йьъ" };
    int i = 0, j;
    setlocale(LC_ALL, "RUS");
    printf("Введите слово:\n");
    cin >> s;
    while (s[i] != '\0')
    {
        if (strchr(glas, s[i]) != NULL)
        {
            if (strchr(sogl, s[i + 1]) != NULL && strchr(glas, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(sogl, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(iskl, s[i + 2]) != NULL && s[i + 3] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 3; j--)
                    s[j] = s[j--];
                s[i + 3] = '-';
                i = i + 3;
                goto next;
            }
            if (strchr(glas, s[i + 1]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j--];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(iskl, s[i + 1]) != NULL && s[i + 2] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j--];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
        next:;
        }
        i++;
    }
    printf("Слово с знаками переноса:\n %s", s);
    getchar();
    getchar();
}
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
18.12.2018, 07:19  [ТС]
Требуется помощь
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
18.12.2018, 08:26
IIIeJlkyN4ik, шрифт на Lucida Console поменяли? По скринам похоже что нет, у этого шрифта вроде другое начертание.
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
18.12.2018, 09:06  [ТС]
Поставил setconsolecp
Теперь почему то ставит " - " заместо буквы
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
18.12.2018, 09:11  [ТС]
Название: Screenshot_4.png
Просмотров: 131

Размер: 3.9 Кб
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
18.12.2018, 10:20
IIIeJlkyN4ik, вы не сдвигаете буквы.

C++
1
s[j] = s[j--];
Это равнозначно следующей паре действий:
C++
1
2
s[j] = s[j];
j--;
Полагаю, это будет правильнее:
C++
1
s[j] = s[j - 1];
Уменьшать j в цикле не нужно, т.к. это делается в конце итерации в строке с for.
0
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
18.12.2018, 10:38  [ТС]
Программа работает, Спасибо, все выводит, но что за символы идут за словом?


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
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<locale.h>
#include<iostream>
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    char s[100],
        glas[] = { "уеыаоэяиюё" },
        sogl[] = { "цкнгшщзхфвпрлджчсмтб" },
        iskl[] = { "йьъ" };
    int i = 0, j;
    printf("Введите слово:\n");
    cin >> s;
    while (s[i] != '\0')
    {
        if (strchr(glas, s[i]) != NULL)
        {
            if (strchr(sogl, s[i + 1]) != NULL && strchr(glas, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j - 1];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(sogl, s[i + 2]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j - 1];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
            if (strchr(sogl, s[i + 1]) != NULL && strchr(iskl, s[i + 2]) != NULL && s[i + 3] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 3; j--)
                    s[j] = s[j - 1];
                s[i + 3] = '-';
                i = i + 3;
                goto next;
            }
            if (strchr(glas, s[i + 1]) != NULL)
            {
                j = strlen(s);
                for (j; j >= i + 1; j--)
                    s[j] = s[j - 1];
                s[i + 1] = '-';
                i = i + 1;
                goto next;
            }
            if (strchr(iskl, s[i + 1]) != NULL && s[i + 2] != '\0')
            {
                j = strlen(s);
                for (j; j >= i + 2; j--)
                    s[j] = s[j - 1];
                s[i + 2] = '-';
                i = i + 2;
                goto next;
            }
        next:;
        }
        i++;
    }
    printf("Слово с знаками переноса:\n %s", s);
    getchar();
    getchar();
}
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
18.12.2018, 11:30
Лучший ответ Сообщение было отмечено IIIeJlkyN4ik как решение

Решение

IIIeJlkyN4ik, вы потеряли конец строки, символ с кодом 0.

C++
1
j = strlen(s);
После этой строки j имеет индекс именно конца строки, т.к. функция возвращает именно длину строки без учета нуля в конце. Прибавляйте 1 к длине строки, чтобы учитывать и переносить ноль.

C++
1
j = strlen(s) + 1;
Добавлено через 28 минут
Еще пара замечаний. С такой проверкой конца строки есть некоторый риск его проскочить. По логике вроде бы не должно этого произойти, но безопаснее было бы так:

C++
1
while (i < strlen(s))
Использование goto в данном случае неоправданно. Увеличивайте i сразу на 1 больше и используйте cintinue. Например:

C++
1
2
i = i + 3;
goto next;
Можно заменить на:

C++
1
2
i = i + 3 + 1;
continue;
1
0 / 0 / 0
Регистрация: 21.11.2018
Сообщений: 21
18.12.2018, 18:06  [ТС]
Спасибо большое, все работает. Тогда можно еще спросить на будущее чтобы знать?
Данная программа разделяет по слогам одно слово, а как сделать чтобы можно было несколько слов вводить и она их разделяла?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.12.2018, 18:06
Помогаю со студенческими работами здесь

Как составить программу автоматического переноса слов
Cоставить программу автоматического переноса слов. Исходная информация вводится с клавиатуры

В каждом из введенных слов поставить все возможные знаки переноса
Примем следующие правила переноса украинских слов: · В каждой из разделенных частей должно быть больше одной буквы, из которых хотя бы одна...

Печать текстового файла с размещением текста по 4 символа в сроку без переноса слов
Разработать программу печати текстового файла с размещением текста по 4 символа в сроку без переноса слов (заполняя недостающие до 64...

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

Не работает программа после переноса в CodeVision
Здравствуйте! Подскажите, пожалуйста, по программированию в CodeVision. Разбираюсь с программированием AVR по урокам на данном сайте -...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru