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

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

Войти
Регистрация
Восстановить пароль
 
ExtoZy
0 / 0 / 0
Регистрация: 15.11.2012
Сообщений: 19
#1

Строка: Напечатать те слова, которые отличаются только порядком следования букв. - C++

16.01.2013, 18:38. Просмотров 840. Ответов 6
Метки нет (Все метки)

Задание: Дана строка. Напечатать те слова, которые отличаются только порядком следования букв.
Помогите, пожалуйста...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 18:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Строка: Напечатать те слова, которые отличаются только порядком следования букв. (C++):

Строки: Вывести на экран только те слова, которые отличаются от последнего и в которых нет повторяющихся букв. - C++
вводи с клавиатуры строку. Вывести на экран только те слова, которые отлчаются от последнего и в которых нет повторяющихся букв.

Строка: напечатать слова, которые удовлетворяют следующему свойству: в слове нет повторяющихся букв - C++
Доброго времени суток. помогите написать программу в С++. Дан текст. Напечатать те слова, которые удовлетворяют следующему свойству: в...

Верно ли, что 2 массива отличаются не более, чем порядком следования членов - C++
Даны целые числа. В массиве а n-элементов и в массиве b n-элементов. Верно ли, что эти 2 массива отличаются не более, чем порядком...

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

Вывести те слова, которые отличаются от последнего слова и удовлетворяют условию, что в слове нет повторяющихся букв - C++
Короче я сделал так #include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> void main() { int const...

Напечатать те слова данной строки, которые отличны от последнего слова, и в слове нет повторяющихся букв - C++
Доброго времени суток! Помогите пожалуйста решить задачу. Дана строка s, содержащая от 2 до 25 слов, в каждом из которых от 1 до 8 ...

6
m1Rr0r
247 / 230 / 15
Регистрация: 05.02.2010
Сообщений: 3,262
Завершенные тесты: 2
19.01.2013, 14:34 #2
разбиваешь строку с помощью strtok(), каждое полученное слово заносишь в матрицу слов. затем сортируешь матрицу согласно условию и выводишь на печать, или не сортируешь а выводишь сразу с проверкой условия.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
19.01.2013, 18:49 #3
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
#include <iostream>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    std::map<std::string, std::size_t> m;
    std::vector<std::string> v;
    std::for_each(std::istream_iterator<std::string>(ist),
        std::istream_iterator<std::string>(), [&m, &v](const std::string &s)
        {
            std::string tmp = s;
            std::sort(tmp.begin(), tmp.end());
            ++m[tmp];
            v.push_back(s);
        } );
    for(auto &x : v)
    {
        std::string tmp = x;
        std::sort(tmp.begin(), tmp.end());
        if (m[tmp] > 1)
            std::cout << x << std::endl;
    }
}
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
19.01.2013, 19:50 #4
Цитата Сообщение от MrGluck Посмотреть сообщение
#include <iostream>
#include <sstream>
#include <map>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
* * std::string str;
* * std::getline(std::cin, str);
* * std::istringstream ist(str);
* * std::map<std::string, std::size_t> m;
* * std::vector<std::string> v;
* * std::for_each(std::istream_iterator<std::string>(ist),
* * * * std::istream_iterator<std::string>(), [&m, &v](const std::string &s)
* * * * {
* * * * * * std::string tmp = s;
* * * * * * std::sort(tmp.begin(), tmp.end());
* * * * * * ++m[tmp];
* * * * * * v.push_back(s);
* * * * } );
* * for(auto &x : v)
* * {
* * * * std::string tmp = x;
* * * * std::sort(tmp.begin(), tmp.end());
* * * * if (m[tmp] > 1)
* * * * * * std::cout << x << std::endl;
* * }
}

Не по теме:

Мне интересно, ты специально щёлкал ссылку на форуме, называющуюся "Со строками на C", чтобы запостить это?

0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
19.01.2013, 19:55 #5
Kuzia domovenok, я сидел в разделе С++, сидел бы на С, сделал бы на С.
0
Kuzia domovenok
1949 / 1802 / 138
Регистрация: 25.03.2012
Сообщений: 6,245
Записей в блоге: 1
19.01.2013, 19:57 #6
Строки Си - это тоже часть языка С++. Одна из лучших частей, доставшихся в наследство ему.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
20.01.2013, 00:01 #7
Kuzia domovenok, в С++ есть замечательный аналог - std::string, а char * это обременительная ноша для капабилити. Или так нравится геморой с памятью и отслеживанием выхода за границы?

Добавлено через 1 минуту
Я на первенство не претендую, написал код для интереса, ТС пусть сам решит брать его или не брать.

Добавлено через 5 минут
Вот, немного оптимизировал свой вариант:
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
#include <iostream>
#include <sstream>
#include <map>
#include <set>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::string str;
    std::getline(std::cin, str);
    std::istringstream ist(str);
    std::map<std::multiset<char>, std::size_t> m;
    std::vector<std::string> v;
    std::for_each(std::istream_iterator<std::string>(ist),
        std::istream_iterator<std::string>(), [&m, &v](const std::string &s)
        {
            ++m[ std::multiset<char>(s.begin(), s.end()) ];
            v.push_back(s);
        } );
    std::copy_if(v.begin(), v.end(), std::ostream_iterator<std::string>
        (std::cout, "\n"), [&m](const std::string &s)
        { return m[ std::multiset<char>(s.begin(), s.end()) ] > 1; } );
}
Добавлено через 3 часа 50 минут
На чистых Сях:
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
/*Напечатать те слова, которые отличаются только порядком следования букв. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int compare (const void *, const void *);
int equalChars(char **, const size_t, const char *);
    
int main(void)
{
    char str[256], **words = NULL, **sortWords = NULL, *p = NULL;
    size_t i, len, numWords = 1;
    if (fgets(str, sizeof(str), stdin) == NULL || strlen(str) == 1)
        return 1;
    len = strlen(str);
    str[len - 1] = '\0';
    for (i=0; i < len; i++)
        if (str[i] == ' ')
            numWords++;
    if ((words     = (char **)malloc (sizeof(char *) * numWords)) == NULL ||
        (sortWords = (char **)malloc (sizeof(char *) * numWords)) == NULL)
        return 2;
    i = 0;
    for (p = strtok(str, " "); p != NULL; p = strtok(NULL, " "))
    {
        if ((words[i]     = strdup(p)) == NULL || 
            (sortWords[i] = strdup(p)) == NULL)
            return 3;
        qsort(sortWords[i], strlen(sortWords[i]), sizeof(char), compare);
        i++;
    }
    
    for (i = 0; i < numWords; i++)
        if (equalChars(sortWords, numWords, words[i]))
            printf("%s\n", words[i]);
    
    for (i = 0; i < numWords; i++)
    {
        free(words[i]);
        free(sortWords[i]);
    }
    free(words);
    free(sortWords);
    free(p);
    return 0;
}
 
int compare (const void *a, const void *b)
{
    return *(char *)a - *(char *)b;
}
 
int equalChars(char **words, const size_t num, const char *word)
{
    size_t i, j;
    char *tmp = strdup(word);
    qsort(tmp, strlen(tmp), sizeof(char), compare);
    for (i=0; i < num-1; i++)
        if (strcmp(words[i], tmp) == 0)
            for (j=i+1; j < num; j++)
                if (strcmp(words[j], tmp) == 0)
                {
                    free(tmp);
                    return 1;
                }
    free(tmp);
    return 0;
}
1
20.01.2013, 00:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 00:01
Привет! Вот еще темы с ответами:

Даны два слова, напечатать только те символы, которые встречаются только в одном из слов - C++
помогите, пожалуйста, с программой:) Писать ее не нужно, просто нужно помочь объяснить как ее сделать) я не могу понять алгоритм действий....

Даны два слова. Напечатать только те буквы слов, которые есть только в одном из них - C++
2.Даны два слова. Напечатать только те буквы слов, которые есть только в одном из них (в том числе повторяющиеся). Например, если ...

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

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


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

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

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