1 / 1 / 0
Регистрация: 11.02.2016
Сообщений: 27
1

Строки

23.04.2016, 00:51. Показов 4241. Ответов 46

Дана строка (char str[81]), состоящая из слов и разделителей. Слово – это непрерывная последовательность букв. Разделителями слов могут быть следующие символы: ! '' (двойные кавычки) ; : ? - . , [пробел]. Последовательности символов, не являющиеся словами (т.е. содержащие недопустимые символы), игнорировать. В строке найдите группы слов, имеющие одинаковый состав букв (количество одинаковых букв не имеет значения). Прописные и строчные буквы считать одинаковыми. Исходную строку не модифицировать. Слова выводить в порядке их вхождения в строку.
Формат входных данных. [строка]
Формат выходных данных. [1-е слово из 1-й группы слов] [пробел] [2-е слово из 1-й группы слов] [пробел] и т.д. [перевод строки] [1-е слово из 2-й группы слов] [пробел] [2-е слово из 2-й группы слов] [пробел] и т.д.; если искомых слов нет, то напечатайте сообщение «no solution». Слова выводить в порядке их вхождения в строку.
================================================== =======================

Подскажите пожалуйста, как реализовать 2-ю функцию, правильно заюзать конкретные разделители, и сделать прописные и строчные буквы одинаковыми...
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <math.h>
#include "string.h"
#include "ctype.h"
 
using namespace std;
 
 
int strToWords ( const char str[81], int words[40][2])
{
    char str2[81]; // Для копии имеющейся строки(чтобы не изменить данную)
    char pazdel[50] = { "!';:?-., " }; // Разделители слов
        int words_count=0; // Число слов в строке
 
 
    for (int i=0; i<strlen(str); i++)
    {
        if (isalpha(str[i]) || isalnum(str[i]))
        {
 
            words[words_count][0]=i;
 
            while (isalpha(str[i]) || isalnum(str[i]))
            {
                i++;
            }
            words[words_count++][1]=i-1;
        }
    }
 
    return words_count;    
}
 
 
 
int compareByContents( const char str1[21], const char str2[21])
{
    
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
 
    char str[81]; 
    char str2[81]; // для преобразования слов в строчные
    int words[40][2];
    int Count_Words; // Число слов в строке
    
 
    cout << "Введите исходную строку:\n";
        gets_s(str);
 
    strlwr(str); // Преобразовали в строчные -???
    
 
    Count_Words=strToWords (str,words);// Число слов
    
    return 0;
    
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.04.2016, 00:51
Ответы с готовыми решениями:

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

Добавить строки, начиная со строки К1 и до строки К2, в динамический массив строк
Есть динамический массив строк. Заполняется, т.е. размер его уже известен будет. Но дальше нужно...

Удалить строки, начиная со строки К1 и до строки К2 (динамические массивы)
#include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;stdlib.h&gt; using namespace std; int main() {...

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2
Сформировать динамический двумерный массив, заполнить его случайными числами и удалить строки,...

46
1 / 1 / 0
Регистрация: 11.02.2016
Сообщений: 27
23.04.2016, 21:47  [ТС] 41
Просто необходимо этот весь перебор организовать лишь в одной
int compareByContents( const char str1[21], const char str2[21]);
А у вас столько адресов, указателей, что я даже не знаю как это перенести с работоспособностью в вышеприведенную функцию
Та и такие штучки пока не делаем: std::cin.ignore();
? true : false; и т.п
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
23.04.2016, 21:56 42
Mister X, ну смотрите
C++
1
std::cin.ignore();
используется для заержки окна консоли, как вариант можете написать
C++
1
getch()
который находится в библиотеке conio.h
или
C++
1
system("pause");
а что такое ?... : ...;
это тот же самый иф елс, в более краткой форме (тернарный оператор)
тот код эквивлентен такому
C++
1
2
3
4
if (/*вот тут вон то супер длинное условие*/)
        return true;
    else 
        return false;
1
1 / 1 / 0
Регистрация: 11.02.2016
Сообщений: 27
23.04.2016, 22:05  [ТС] 43
И все же не могли бы запихнуть в одну функцию все...
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
23.04.2016, 22:06 44
Mister X, ок ну тогда коменты тоже оставлю
0
1 / 1 / 0
Регистрация: 11.02.2016
Сообщений: 27
23.04.2016, 22:06  [ТС] 45
А вот в чем смысл кстати std::cin.ignore();
про замены if ясно-более кратко а это...
0
Падаван С++
447 / 261 / 89
Регистрация: 11.11.2014
Сообщений: 916
23.04.2016, 22:49 46
Mister X,
Цитата Сообщение от obivan Посмотреть сообщение
используется для заержки окна консоли
если вам смысл самого метода, то он извлекает из потока символ и выбрасывает его

Добавлено через 40 минут
Mister X,
Кликните здесь для просмотра всего текста
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include <iostream>
#include <string>
#include <cstring>
 
int compareByContents(const char* str1, const char* str2) {//функция поиска вхождений
    /*
        т.к вы попросили чтобы она была такой, т.е не передавая размеры строк, то для начала напишем код
    определения размера*/
 
    int sizeFirst(0), sizeSecond(0);
    for (int i(0); str1[i] != '\0'; i++, sizeFirst++); // вот тут мы посчитали кол-во символов в 1 строке
    for (int i(0); str2[i] != '\0'; i++, sizeSecond++); // вот тут мы посчитали кол-во символов во 2 строке
 
    /*
    Теперь нам необходимо выполнить такую задачу, а именно реализовать алгоритм
    составления алфавита (т.е все уникальные символы в каждой строке)
    вот как мы это сделаем
    */
 
    char alphabet[80];//собственно сам наш алфавит (сейчас пустой)
    int alphabetSize = 0;//вот эта переменная будет считать размер нашего алфавита
    bool uniq;//переменная типо бул которая будет отвечать за то чтобы у наш символ был уникален
 
    /*
        итак что делается дальше
        мы проверяем все символы в нашей строке, в данном случае строка str1 ----- for (int i(0); i < sizeFirst; i++)
        изначально будем считать что наш текущий элемент в строке уникален ----- uniq = true;
        мы проверяем все символы в нашем алфавите, стоит учест что при первой итерации, этой проверки не будет
        т.к alphabetSize равен 0 -------- for (int j(0); j < alphabetSize; j++)
        в цикле мы проверяем такое условие, если наш текущий элемент в строке
        уже есть в нашем алфавите то мы делаем его уникальность в false 
 
        if (str1[i] == alphabet[j]) {
                uniq = false;
                break;
            }
 
        После выхода из цикла, который по j, мы проверям осталась ли наша переменная uniq равной true
        если она осталось, значит в алфавите нет такой буквы и мы ее добавляем
 
        if (uniq)
            alphabet[alphabetSize++] = str1[i];
 
        Если что вот это if (uniq) эквивалентно if (uniq == true)
    */
    for (int i(0); i < sizeFirst; i++) {
        uniq = true;
        for (int j(0); j < alphabetSize; j++)
            if (str1[i] == alphabet[j]) {
                uniq = false;
                break;
            }
        if (uniq)
            alphabet[alphabetSize++] = str1[i];
    }
 
    /*
    Собственно далее тупо повторяется тот же код, только мы делаем это для строки str2
    */
 
    for (int i(0); i < sizeSecond; i++) {
        uniq = true;
        for (int j(0); j < alphabetSize; j++)
            if (str2[i] == alphabet[j]) {
                uniq = false;
                break;
            }
        if (uniq)
            alphabet[alphabetSize++] = str2[i];
    }
 
    //////////////////////////////////// закончили составлять алфавит
 
    /*
        теперь наша задача состоит в том чтобы найти нужные нам вхождения
        и вот как мы это будем делать
    */
 
    int countFirstStr = 0;//итак эта переменная отвечает за то сколько уникальных символов мы нашли
    
    /*
        чуть ниже мы создаем массив check, который будет отвечать за уникальность элемента
        по сути это наш массив с алфавитом только в формате true/false
        и мы его будем использовать так, если мы находили уже такой элемент
        то поставим значение true если нет то оно по умолчанию false
    */
    bool* check = new  bool[alphabetSize];
    for (int i(0); i < alphabetSize; i++)
        check[i] = false;
 
    /*
        вообщем создали мы массив чек
        теперь у нас как и раньше перебор по нужной нам строке
        далее перебор по алфавиту
        и стоит вот такое условие 
 
        if (str[i] == alphabet[j] && check[j] == false) {
            check[j] = true;
            count++;
            break;
        }
 
        если наш элемент в строке, соответствует какому либо элементу в алфавите И (вот тут важно
        мы видем что индекс j и в массиве check и алфавите, т.е мы определяем нужный элемент по позиции)
        И этот элемент пока что не был найден, то мы увеличиваем переменную уникальных символов,
        ставим в массиве уникальных элемент его как true т.е был найден
        и прерываем внутренний цикл т.к дальнейший поиск не имеет смысла
    */
 
    for (int i(0); i < sizeFirst; i++) {
        for (int j(0); j < alphabetSize; j++)
            if (str1[i] == alphabet[j] && check[j] == false) {
                check[j] = true;
                countFirstStr++;
                break;
            }
    }
 
    /*
    что мы теперь имеем у нас есть переменная countFirstStr которая хранит кол-во уникальных элементов в первой строке
    если оно равно кол-во уникальных элементов алфавита, то эта страка пока что нам подходит
    
    
    далее мы делаем все тоже самое со второй строкой
    */
    
    int countSecondStr = 0;
    for (int i(0); i < alphabetSize; i++)
        check[i] = false;
 
    for (int i(0); i < sizeSecond; i++) {
        for (int j(0); j < alphabetSize; j++)
            if (str2[i] == alphabet[j] && check[j] == false) {
                check[j] = true;
                countSecondStr++;
                break;
            }
    }
 
    delete[] check;
 
    ////////закончили поиск колва кникальных элементов
 
    /*
        и теперь последняя проверка, если кол-во уникальнох элементов в первой строке и во второй строке
        совпадает с кол-во уникальных элементов алфавита то значит задание выполенно и строки скажем так
        эквивалентны по набору символов
 
        если же какая то из строк или обе не равны кол-ву уникальных элементов в алфавите то эти строке
        не эквивалентны по набору символов, и в конце программы проверив это условие мы вернем 
        1 если все хорошо 0 если все плохо :)))
    */
 
    if (countFirstStr == alphabetSize && countSecondStr == alphabetSize)
        return 1;
    else
        return 0;
 
    /* 
        ну как вариант вот такая коротка запись ))))
 
        return countFirstStr == alphabetSize && countSecondStr == alphabetSize ? 1 : 0;
    */
}
int main(void) {
    std::cout << compareByContents("oleg", "ggelo") << std::endl;
    system("pause");
    return 0;
}


я старался коментить как мог, подробнее могу только рассказать как в первый раз целовался
1
1 / 1 / 0
Регистрация: 11.02.2016
Сообщений: 27
24.04.2016, 14:49  [ТС] 47
Здравствуйте, а не подскажете поподробнее ещё, как осуществить вот такое:
1-е слово из 1-й группы слов] [пробел] [2-е слово из 1-й группы слов] [пробел] и т.д. [перевод строки] [1-е слово из 2-й группы слов] [пробел] [2-е слово из 2-й группы слов] [пробел] и т.д.; если искомых слов нет, то напечатайте сообщение «no solution». Слова выводить в порядке их вхождения в строку.

в теле главной функции, используя предыдущие 2 функции, просто никак не получается передать нормально в int compareByContents( const char str1[21], const char str2[21]); данные, и все это скомпоновать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
 
    char str[81]; 
    char str2[81]; 
    int words[40][2]; 
    int Count_Words; // Кол-во слов 
 
    printf("Введите исходную строку:\n");
    gets_s(str);
 
    Count_Words=strToWords (str,words);// Кол-во слов 
 
 
 
    return 0;
    
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.04.2016, 14:49
Помогаю со студенческими работами здесь

Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой строки, с которой вторая строка содер-жится в ней
Ввести две символьных строки. Выполнить поиск второй строки в первой и вывести номер позиции первой...

Даны три строки. Определить можно ли из символов третьей строки получить первую и вторую строки
Помогите пожалуйста! 1)Даны три строки. Определить можно ли из символов третьей строки получить...

Ввести строки и через n символов первой строки вставить вторую строку, и так до конца строки
Помогите исправить баг задача состоит в следующем :ввести строку и простроку тоесть две строки и...

Слить две строки, вставив символы одной строки между символами другой строки
Строка a из n символов лексикографически меньше строки b из n символов, если существует такой...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru