Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 23.01.2017
Сообщений: 3
1

Переставить слова в строке в обратном порядке

23.01.2017, 17:27. Просмотров 3519. Ответов 6
Метки нет (Все метки)

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


не могу придумать, как переставить слова в строке в обратном порядке
то ли их сначала записать в отдельный массив, а потом переписывать в массив текста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2017, 17:27
Ответы с готовыми решениями:

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

В строке содержащей максимальное количество слов переставить слова в обратном порядке
Что будет в коде при нахождении максимального количества слов в строке? Мне нужен только этот кусок...

Строка символов (переставить слова в обратном порядке)
Вводится строка состоящая из каких-либо слов,например: My name is qwe. Как поменять слова...

Ввести строку символов, переставить все символы в строке в обратном порядке
Помогите дописать программу с условием: Ввести строку символов, переставить все символы в строке в...

6
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
24.01.2017, 18:22 2
Цитата Сообщение от Shiki Richter Посмотреть сообщение
не могу придумать, как переставить слова в строке в обратном порядке
Строка символов (переставить слова в обратном порядке)
В частности
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <string.h>
#define DELIM ",.!? "
 
void PrintReverse(char *str)
{
    if (str)
    {
        PrintReverse(strtok(NULL, DELIM));
        printf("%s ", str);
    }
}
 
int main(void)
{
    char str[] = "Eniki beniki eli vareniki";
    PrintReverse(strtok(str, DELIM));
    return 0;
}
0
0 / 0 / 0
Регистрация: 23.01.2017
Сообщений: 3
25.01.2017, 23:24  [ТС] 3
у меня strtok не работает вообще никак и нужно придумать другую реализацию
0
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
25.01.2017, 23:34 4
Вангую, используете VS и он выдаёт ошибку компиляции, ругаясь на strtok.
Добавьте #define _CRT_SECURE_NO_WARNINGS первой строкой
0
894 / 643 / 216
Регистрация: 30.06.2015
Сообщений: 3,522
Записей в блоге: 34
26.01.2017, 18:00 5
Цитата Сообщение от Shiki Richter Посмотреть сообщение
и нужно придумать другую реализацию
Можно конечно улучшить, но работает и оставляет знаки разделителей на своих местах, как требует задача
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
#include <stdio.h>
char del[]="\t\n,.!?;: ";
int isdelim(char s)
{
    int i;
    for(i=0; del[i]; ++i)
    {
        if(del[i]==s)return 1;
    }
    return 0;
}
#define N 255
int main(void)
{
char s;
int i, konPrSl, konPosSl, nachPrSl, nachPosSl, c1, c2, j, razn, d, b;
    char str[N]="Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do...";
    konPrSl=0;konPosSl=0;nachPrSl=0; nachPosSl=0;
    i=0;
for(; str[konPosSl]; ++konPosSl);
        konPosSl-=1;
while(1)
{
    while(isdelim(str[nachPrSl]) && str[nachPrSl])++nachPrSl;
        konPrSl=nachPrSl;
    while(!isdelim(str[konPrSl]) && str[konPrSl])++konPrSl;
    konPrSl-=1;
    
    while(isdelim(str[konPosSl]) && konPosSl!=0)--konPosSl;
        nachPosSl=konPosSl;
    while(!isdelim(str[nachPosSl]) && nachPosSl!=0)--nachPosSl;
    nachPosSl+=1;
        if(nachPrSl==nachPosSl || nachPrSl>nachPosSl)break;
    c1=konPrSl-nachPrSl+1;
    c2=konPosSl-nachPosSl+1;
    if(c1==c2)
        {
            for(i=nachPrSl, j=nachPosSl; i<konPrSl+1; ++i, ++j)
                {
                    s=str[i];
                    str[i]=str[j];
                    str[j]=s;
                    
                }
            nachPrSl=konPrSl+=1;
            konPosSl=nachPosSl-=1;
        }else
            if(c1<c2)
            {
                for(i=nachPrSl, j=nachPosSl; i<konPrSl+1; ++i, ++j)
                {
                    s=str[i];
                    str[i]=str[j];
                    str[j]=s;
                }
                razn=c2-c1;
                d=konPrSl+1;
                
                for(i=0;i<razn; ++i)
                {
                    b=konPosSl;
                    s=str[konPosSl];
                    
                    for(; b!=d; --b)
                    {
                        str[b]=str[b-1];
                    }
                    str[d]=s;
                }
                nachPrSl=konPrSl+1+razn;
                konPosSl=nachPosSl+razn-1;
            }else
                {
                    for(i=konPosSl, j=konPrSl; i>nachPosSl-1; --i, --j)
                    {
                        s=str[i];
                        str[i]=str[j];
                        str[j]=s;
                    }
                    razn=c1-c2;
                    d=nachPosSl-1;
                    
                    for(i=0;i<razn; ++i)
                    {
                        b=nachPrSl;
                        s=str[nachPrSl];
                    
                        for(; b!=d; ++b)
                        {
                            str[b]=str[b+1];
                        }
                        str[d]=s;
                    }
                    nachPrSl=konPrSl+1-razn;
                    konPosSl=nachPosSl-razn-1;
                }
}
    for(i=0; str[i]; ++i)printf("%c", str[i]);
return 0;
}
0
0 / 0 / 0
Регистрация: 23.01.2017
Сообщений: 3
26.01.2017, 23:14  [ТС] 6
все равно не могу добиться корректной работы

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
154
155
#include <stdio.h>
#include <string.h>
#include <locale.h>
#include <stdlib.h>
int getMenu();
char* inputString();
char* reverse();
char* deallocation(char* str);
 
 
 
void main()
 
{
    setlocale(LC_ALL, "Russian");
    char* myString = NULL;    // Указатель на 0-ой символ строки
    char* delimiter = NULL;   //Указатель на 0-ой символ строки разделителей
    char* newString = NULL;   //Указатель на 0-ой символ строки результата
        int menu,           // Переменная выбора меню
        f1 = 0,         // Проверка ввода строки
        f2 = 0,         //Проверка ввода разделителей
        f3 = 0;         // Проверка обработки строки
    do
    {
        menu = getMenu();
        switch (menu)
        {
        case 1:
            if (myString)
                myString = deallocation(myString);
            printf("Введите строку: \n");
            myString = inputString();
            printf("Ввод строки закончен. \n");
            if (myString != NULL)
                f1 = 1;
            else
                printf("Вы не вели строку. \n");
            break;
        case 2:
            if (f1)
                puts(myString);
            else
                printf("Вы не ввели строку. \n");
            break;
        case 3:
            if (delimiter)
                delimiter = deallocation(delimiter);
            printf("Введите разделители: \n");
            delimiter = inputString();
            printf("Ввод разделителей закончен. \n");
                if (delimiter != NULL)
                    f2 = 1;
                else
                    printf("Вы не ввели разделители. \n");
            
            break;
        case 4:
            if (f2)
                puts(delimiter);
            else
                printf("Вы не ввели разделители. \n");
            break;
        case 5:
            if (f1)
                if (f2)
                {
                    newString = reverse();//Функция престановки
                    f3 = 1;
                }
                else
                    printf("Вы не ввели разделители. \n");
            else
                printf("Вы не ввели строку. \n");
            break;
        case 6:
            if (f3)
                if (f2)
                    if (f1)
                        //ВЫВОД РЕЗУЛЬТАТА
                    else
                        printf("Вы не ввели строку.\n");
                else
                    printf("Вы не ввели разделители. \n");
            else
                printf("Строка не обработана. /n");
            break;
        case 7:
            printf("Завершение программы. \n");
            break;
        default:
            printf("Ошибка. \n");
        }
    } while (menu != 7);
    myString = deallocation(myString);
    delimiter = deallocation(delimiter);
}
 
// Функция для вывода меню и выбора пункта
int getMenu()
{
    int menu;
    printf("Выберите пункт меню: \n");
    printf("1. Ввод строки \n");
    printf("2. Контрольный вывод строки \n");
    printf("3. Ввод разделителей \n");
    printf("4. Контрольный вывод разделителей \n");
    printf("5. Перестановка слов в обратном порядке \n");
    printf("6. Вывод результата \n");
    printf("7. Завершение программы \n");
    scanf_s("%d", &menu);
    scanf_s("%*[^\n]");         // Эти две команды нужны для того, чтобы очистить поток ввода
    scanf_s("%*c");
    return menu;
}
 
//Функция для ввода строк
char* inputString()
{
    int flag = 0,
        length = 0,
        maxSize = 81;
    char* String = NULL;
    char charInString;
    printf("\nВведите исходную строку (Размер строки должен быть не больше %d):\n", maxSize);
    while (!flag)
    {
        scanf_s("%c", &charInString);
        if ((charInString != '\n') && (length < maxSize))
        {
            String = (char*)realloc(String, (length + 1) * sizeof(char));
            *(String + length) = charInString;
            ++length;
        }
        else
            flag = 1;
    }
    if (length == maxSize)
        printf("Ваша строка была больше, чем %d. \n", maxSize);
 
    if (NULL != String)
    {
        String = (char*)realloc(String, (length + 2) * sizeof(char));
        *(String + length) = '\n';
        *(String + length + 1) = '\0';
    }
    return String;
}
 
    // Функция для освобождения памяти
    char* deallocation(char* str)
    {
        if (str != NULL)
            free(str);
        return NULL;
    }
0
735 / 540 / 416
Регистрация: 17.09.2015
Сообщений: 1,601
27.01.2017, 10:09 7
Shiki Richter, когда публикуете код,пользуйтесь тегом С
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2017, 10:09

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

В символьной строке переставить слова в зеркальном порядке
Все изменения строки происходят &quot;на месте&quot;, т.е. в том же самом массиве. Дополнительное ограничение...

Переставить буквы слова в обратном порядке
составьте программу,которая во введенном с клавиатуры слово выводит в начале строки,а затем по...

Переставить слова из файла в обратном порядке
Задание звучит так : Дан файл с неизвестным количеством слов и строк.Создать новый файл каждая...

Переставить слова в предложении в обратном порядке
Задача заключается в следующем: &quot;Переставить слова в каждом предложении в обратном порядке&quot; Есть...

Переставить в строке символы в обратном порядке
Составить программу, которая из заданного текстового файла произвольной длины читает строку и...

Переставить символы в строке в обратном порядке
Добрый вечер. Помогите пожалуйста разобраться в программке. #include &lt;iostream&gt; #include...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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