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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Chieff
0 / 0 / 0
Регистрация: 05.03.2014
Сообщений: 17
#1

Вычислить, сколько в строке слов, заканчивающихся гласной буквой - C++

22.08.2014, 12:29. Просмотров 1184. Ответов 29
Метки нет (Все метки)

Помогите с решением этой задачи:
Дана строка до точки, группа символов в которой между пробелами считается словом,
знаки препинания от слова пробелом не отделяются. Необходимо вычислить, сколько в строке слов, заканчивающихся гласной буквой.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.08.2014, 12:29     Вычислить, сколько в строке слов, заканчивающихся гласной буквой
Посмотрите здесь:
C++ В тексте найти количество слов, начинающихся и заканчивающихся гласной русской буквой
Определить, сколько в наборе слов, заканчивающихся буквой а C++
C++ Определить сколько в заданном тексте слов, заканчивающихся буквой, введённой с клавиатуры
C++ Вычислить количество слов в заданной строке, начинающихся и заканчивающихся 'W'
Определить количество слов, заканчивающихся буквой а C++
C++ Количество слов, начинающихся и заканчивающихся одной буквой
Посчитать количество слов, начинающихся согласной и заканчивающихся буквой а C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
Эксперт CЭксперт С++
4106 / 1751 / 197
Регистрация: 20.02.2013
Сообщений: 4,856
Записей в блоге: 21
22.08.2014, 23:14     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #16
Считает, но почему-то на одно слово меньше, чем должна:

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
#include <iostream>
#include <string>
#include <windows.h>
#include <cctype>
 
bool isVowel(char);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    std::string str = "Дана строка до точки, группа символов "
                 "в которой между пробелами считается словом,"
                 "знаки препинания от слова пробелом не "
                 "отделяются; необходимо вычислить, сколько "
                 "в строке слов, заканчивающихся гласной буквой.";
 
    int strSize = str.size();
    char ch;
    int counter = 0;
 
    for (int i=0; i<strSize; ++i)
    {
        ch = str[i];
        if (isspace(ch))
        {
            ch = str[i-1];
 
            if (ispunct(ch))
            {
                ch = str[i-1];
                if(isVowel(ch))
                    ++counter;
            }
 
            if(isalpha(ch))
                if(isVowel(ch))
                    ++counter;
        }
    }
 
    std::cout << "В заданной строке " << counter
              << " слов, заканчивающихся на гласную.\n\n";
 
    return 0;
}
 
bool isVowel(char ch)
{
    if (ch=='а' || ch=='е' || ch=='ё' || ch=='и' || ch=='о' ||
        ch=='ы' || ch=='у' || ch=='э' || ch=='ю' || ch=='я')
        return true;
    else
        return false;
}
John Prick
22.08.2014, 23:26
  #17

Не по теме:

Цитата Сообщение от -NEURON- Посмотреть сообщение
задача уровня средней школы
-NEURON-, возьмёшься за взрослую задачу?

gru74ik
23.08.2014, 00:04
  #18

Не по теме:

Вставил проверки, там внутри, оказывается, вообще адЪ и израилЬ бред какой-то творится. Не могу понять, в чём загвоздка
Почему-то входит в ифы там, где, вроде бы, и вовсе не должна:

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
#include <iostream>
#include <string>
#include <windows.h>
#include <cctype>
 
bool isVowel(char);
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    std::string str = "Дана строка до точки, группа символов "
                 "в которой между пробелами считается словом,"
                 "знаки препинания от слова пробелом не "
                 "отделяются; необходимо вычислить, сколько "
                 "в строке слов, заканчивающихся гласной буквой.";
 
    int strSize = str.size();
    char ch;
    int counter = 0;
 
    for (int i=0; i<strSize; ++i)
    {
        std::cout << i+1 << " iteration.\n";
        ch = str[i];
        std::cout << i+1 << " char is: " << ch << "\n";
        if (!(isspace(ch)))
        {
            ch = str[i-1];
            std::cout << "If char is space then it's " << i-1 << " char.\n";
            if (!(ispunct(ch)))
            {
                ch = str[i-1];
                std::cout << "If char is punct then it's " << i-1 << " char.\n";
                if(isVowel(ch))
                    ++counter;
            }
 
            if(!(isalpha(ch)))
                if(isVowel(ch))
                    ++counter;
        }
        //--------- Специальный блок для задержки ---------
        //================================================
        // С небольшой задержкой будут выведены 10 точек
        // одна за другой, как будто программа думает:
        std::cout << std::endl;
        for (int i=0; i<10; i++)
        {
        Sleep(600);
        std::cout << "*";
        }
        std::cout << std::endl;
        //------------------------------------------------
    }
 
    std::cout << "В заданной строке " << counter
              << " слов, заканчивающихся на гласную.\n\n";
 
    return 0;
}
 
bool isVowel(char ch)
{
    if (ch=='а' || ch=='е' || ch=='ё' || ch=='и' || ch=='о' ||
        ch=='ы' || ch=='у' || ch=='э' || ch=='ю' || ch=='я')
        return true;
    else
        return false;
}

GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.08.2014, 00:30     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #19
Как вариант, может пригодится
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
#include <iostream>
#include <string>
 
int main()
{
    setlocale(0, "rus");
    int counter = 0;
    std::string str, vowels = "aeiouаеёиоуэюя";
    char ABC[] = {"abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщэюя"};
 
    std::cout << "Type some text: ";
    getline(std::cin, str);
    
    std::size_t found = str.find_first_not_of(ABC);
    while(found != std::string::npos)
    {
        for(std::string::iterator it = vowels.begin(); it != vowels.end(); ++it)
        {
            if(str[found - 1] == (*it))
            {
                counter++;
                break;
            }
        }
        found = str.find_first_not_of(ABC, found + 1);
    }
 
    if(vowels.find(str[str.size() - 1]) != std::string::npos) counter++;
 
    std::cout << counter << std::endl;
 
    return 0;
}
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
23.08.2014, 02:07     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #20
Цитата Сообщение от gru74ik Посмотреть сообщение
ch = str[i-1];
Как Вы думаете, что произойдет, если первый символ и не буква и не пробел?

Цитата Сообщение от GuGo1991 Посмотреть сообщение
if(str[found - 1] == (*it))
А как Вы думаете, что будет, если первый символ не будет буквой?
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.08.2014, 03:20     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #21
Цитата Сообщение от Toshkarik Посмотреть сообщение
А как Вы думаете, что будет, если первый символ не будет буквой?
В смысле? Первый символ строки?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
23.08.2014, 03:30     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #22
Да, строки. std::string::find_first_not_of вернет 0 в этом случае.
std::size_t беззнаковый тип. Следовательно, при "found - 1" будет переполнение, если found == 0.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.08.2014, 03:48     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #23
Toshkarik, да, есть такой момент, но crash-а как такового быть не должно, вложенный цикл его
проигнорит во время сравнения, если я не ошибаюсь. Хотя согласен, не был внимателен, виноват!
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
23.08.2014, 03:53     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #24
Падение программы может быть, а может и не быть. Попытка прочитать за пределами строки - UB, может быть все что угодно. Попробуйте использовать функцию std::string::at() вместо доступа по индексу и Вы получите исключение.
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
23.08.2014, 03:57     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #25
Цитата Сообщение от John Prick Посмотреть сообщение
А, кстати, что такого сложного в моём варианте?
Много букв, не выразительно.

Я бы предложил что-то типа:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main() {
  std::wstring str = L"Hello world";
  std::wistringstream ss( str );
  std::vector<std::wstring> strs{ std::istream_iterator<std::wstring, wchar_t>( ss ), std::istream_iterator<std::wstring, wchar_t>() };
 
  static const auto ends_with_vowel = []( const std::wstring& a_str ) {
    static const std::wstring vowels = L"aeiou";
    return std::binary_search( vowels.cbegin(), vowels.cend(), tolower( a_str.back() ) );
  };
 
  auto result = std::count_if( strs.cbegin(), strs.cend(), ends_with_vowel );
 
  return 0;
}
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
23.08.2014, 04:06     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #26
Ну а я бы что то вроде этого:

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 <algorithm>
#include <vector>
 
 
typedef std::vector< std::wstring > T_Tokens;
 
T_Tokens strtok( const std::wstring &str, const std::wstring &delim ) {
   T_Tokens tokens;
   
   std::wstring::size_type beginToken = str.find_first_not_of( delim );
   std::wstring::size_type endToken;
   
   while ( beginToken != std::wstring::npos ) {
      endToken = str.find_first_of( delim, beginToken );
      
      tokens.push_back( str.substr( beginToken, endToken - beginToken ) );
      
      beginToken = str.find_first_not_of( delim, endToken );
   }
   
   return tokens;
}
 
bool isVowel( const wchar_t ch ) {
   static const std::wstring vowels = L"aeiouy"; //не знаю, есть ли слова в английском, где 'y' в конце - согласная
   
   return vowels.find( ch ) != std::wstring::npos;
}
 
int main() {
   std::locale::global( std::locale( "" ) );
   
   std::wstring str;
   
   std::getline( std::wcin, str );
   
   T_Tokens tokens = strtok( str, std::wstring( L" ,.!?-:;\'\"" ));
   
   std::wcout << std::count_if( tokens.begin(), tokens.end(), [] ( const std::wstring &token ) -> bool {
      return !token.empty() && isVowel( token.back() );
   }) << std::endl;
}
Voivoid
674 / 277 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
23.08.2014, 04:22     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #27
А, еще ж знаки надо учитывать. Ну тогда добавить вот такой вот фасет:

C++
1
2
3
4
5
6
7
8
9
10
namespace {
  struct custom_separators : std::ctype < wchar_t > {
    typedef ctype<wchar_t> base;
 
    virtual bool do_is( mask m, char_type c ) const override {
      if( m != space ) return base::do_is( m, c );
      return c == L' ' || c == L',' || c == L'.';
    }
  };
}
Итого: http://ideone.com/Tgmbya
-NEURON-
23.08.2014, 07:08
  #28

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
-NEURON-, возьмёшься за взрослую задачу?
возьмусь, что за задача?

Mr.X
Эксперт С++
3048 / 1693 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
23.08.2014, 07:33     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #29
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
/////////////////////////////////////////////////////////////////////////////////////////
//Дана строка до точки, группа символов в которой между пробелами считается словом,
//знаки препинания от слова пробелом не отделяются. Необходимо вычислить, сколько в строке 
//слов, заканчивающихся гласной буквой.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <cctype>
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
bool    is_vowel( char  c )
{
    c   =   tolower(c);
    return  T_str("aeiou").find(c)  !=  T_str::npos;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     count_words_ending_in_vowel( T_str  const   &   s )
{
    int     res     =   0;
 
    for( auto  it_cur = s.begin();; ++res, ++it_cur )
    {
        it_cur  =   std::adjacent_find
                        (
                            it_cur,
                            s.end   (),
                            []      ( char L, char R )
                            {
                                return      is_vowel(L)
                                        &&  (
                                                    isspace(R)
                                                ||  ispunct(R)
                                            );
                            }
                        );
 
        if  (
                it_cur == s.end()
            )
        {
            break;
        }//if
    }//for
 
    return  res;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        std::cout   <<  "Введите предложение на латинице со знаками препинания:"
                    <<  std::endl;
 
        T_str   s;
 
        getline( std::cin, s );
        std::cout   <<  "Число слов в предложении, оканчивающихся на гласную, равно: "
                    <<  count_words_ending_in_vowel(s)
                    <<  std::endl
                    <<  std::endl
                    <<  std::endl;
    }//for
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.08.2014, 09:55     Вычислить, сколько в строке слов, заканчивающихся гласной буквой
Еще ссылки по теме:
C++ Найти количество слов начинающихся и заканчивающихся одной и той же буквой
Подсчитать количество слов в тексте, начинающихся и заканчивающихся одной и той же буквой C++
Определить количество слов, заканчивающихся буквой "а" C++
В строке с найти количество слов заканчивающихся подстрокой с2 C++
Определить количество слов в каждой строке , начинающихся на ‘А’ и заканчивающихся на “ и” C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
Эксперт CЭксперт С++
4106 / 1751 / 197
Регистрация: 20.02.2013
Сообщений: 4,856
Записей в блоге: 21
23.08.2014, 09:55     Вычислить, сколько в строке слов, заканчивающихся гласной буквой #30
Цитата Сообщение от Toshkarik Посмотреть сообщение
Как Вы думаете, что произойдет, если первый символ и не буква и не пробел?
Будет плохо, конечно, но мне было лень вставлять ещё и эту проверку (тем более, что предложение в нашем случае заранее задаётся строковым литералом, а не вводится пользователем, и заведомо известно, что с первым словом никаких сюрпризов нет), хотелось общий принцип набросать и заставить этого монстрика (мой код) делать то, что мне хочется. Но он не делает
Yandex
Объявления
23.08.2014, 09:55     Вычислить, сколько в строке слов, заканчивающихся гласной буквой
Ответ Создать тему
Опции темы

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