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

Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово - C++

Восстановить пароль Регистрация
 
FMihail
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 33
02.05.2013, 12:46     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово #1
Дано предложение, слова в нем разделены пробелами. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово. Если таких слов больше половины, то их необходимо перенести в конец предложения. Если я ввожу строку : okno opera stryna argentina akter программа выводит: okno stryna opera argentina akter. Но если пробую: okno teatr rabota africa akter то программа выводит исходную строку не изменяя ее. В чем проблема?
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
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
 
// Schitaet chislo slov v stroke i skladivaet slova v massiv
size_t WordsNumber(char* const pstring, char const** const parrayp)
{
    char const* pdelimeters = " ";
    size_t wn = 0;
    for(char* p = strtok(pstring, pdelimeters); p; p = strtok(0, pdelimeters))
    {
        parrayp[wn] = p;
        ++wn;
    }
    return wn;
}
 
// Schitaet chislo slov nachinaushihsya s poslednei bukvi predidushego slova
size_t SpecWordsNumber(char const* const* parrayp)
{
    size_t swn = 0;
    while(*++parrayp)
        if(isalpha(**parrayp) && (**parrayp == *(parrayp[-1] + strlen(parrayp[-1]) - 1)))
            ++swn;
    return swn;
}
 
int main()
{
    char str[300], strresult[sizeof(str)] = {0}, strtemp[sizeof(str)] = {0};
    char const* arrayp[100] = {0};
    puts("Vvedite stroku:");
    gets(str);
    strcpy(strresult, str);
    size_t wn = WordsNumber(str, arrayp);
    printf("\nChislo slov v stroke: %u\n", wn);
    size_t swn = SpecWordsNumber(arrayp);
    printf("\nChislo slov nachinaushihsya s poslednei bukvi predidushego slova: %u\n", swn);
 
    // Esli takih slov bol'she polovini, to perenosim ih v konec stroki
    if(double(swn) > double(wn) / 2)
    {
        char const* const* parrayp = arrayp;
        char const* const delimeter = " ";
        strcat(strcpy(strresult, *parrayp), delimeter);
        while(*++parrayp)
        {
            if(!(isalpha(**parrayp) && (**parrayp == *(parrayp[-1] + strlen(parrayp[-1]) - 1))))
                strcat(strcpy(strresult + strlen(strresult), *parrayp), delimeter);
            else
                strcat(strcpy(strtemp + strlen(strtemp), *parrayp), delimeter);
        }
        strcat(strresult, strtemp);
    }
    printf("\nRezul'tat:\n%s\n\n", strresult);
    system("pause");
    return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.05.2013, 12:46     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово
Посмотрите здесь:

Поиск слова которое начинается и заканчивается на одну букву C++
Вывести слова, которые начинаются на ту же букву, на которую заканчивается предыдущее слово C++
Подсчитать колличество слов очереди, которое начинается и заканчивается одной и той же литерой. C++
Даны два слова.Верно ли,что первое слово начинается на ту же букву,на которую заканчивается второе слово (работа с символами строки) C++
Подсчитать количество слов в тексте, начинающихся и заканчивающихся одной и той же буквой C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cyberbrain1000
 Аватар для cyberbrain1000
23 / 23 / 3
Регистрация: 15.04.2013
Сообщений: 62
02.05.2013, 13:19     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово #2
а что должна вывести во втором случае? Ведь слова rabota africa akter и так стоят в конце
FMihail
0 / 0 / 0
Регистрация: 22.04.2013
Сообщений: 33
02.05.2013, 13:45  [ТС]     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово #3
все понял,просто задание немного не так понял
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
02.05.2013, 15:10     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово #4
Интересная задачка, вот мой вариант решения:
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
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <boost/algorithm/string.hpp>
 
int main()
{
    std::string s = "world okno opera adc conan stryna argentina akter";
    //std::getline(std::cin, s); //или ручной ввод
    
    std::vector<std::string> words;
    boost::split(words, s, boost::is_any_of(" ,:;!?"), boost::token_compress_on);
    
    std::cout<<"All words:\n";
    for (const auto& i : words) std::cout<<i<<" ";
    
    char letter = words[0].back();      //последняя буква первого слова
    std::vector<std::string> matches;   //совпавшие слова
    
    std::for_each(words.begin()+1, words.end(), [&letter, &matches](const std::string& s)
    {
        if (letter == s.front()) matches.push_back(s);  //ищем совпадения
        letter = s.back();
    });
    std::cout<<"\n\nMatches = "<<matches.size()<<" times\n";
    std::cout<<"\nMatches words:\n";
    for (const auto& i : matches) std::cout<<i<<" ";
    
    if (matches.size() > words.size()/2)
    {
        words.erase(std::remove_if(words.begin(), words.end(), [&matches](const std::string& s)
        {
            return std::any_of(matches.begin(), matches.end(), [&s](const std::string& str){return str == s;});
        }), words.end());
        matches.insert(matches.begin(), words.begin(), words.end());
        
        std::cout<<"\n\nResult:\n";
        for (const auto& i : matches) std::cout<<i<<" ";
    }
    
    std::cout<<"\n\n\n";
    return 0;
}
Yandex
Объявления
02.05.2013, 15:10     Операции над строкой. Подсчитать количество слов, которое начинается с той буквы, которой заканчивается предыдущее слово
Ответ Создать тему
Опции темы

Текущее время: 22:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru