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

Посчитать количество слов содержащих букву "b/B" - C++

Восстановить пароль Регистрация
 
IseeYpuSuka
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 8
07.08.2014, 20:26     Посчитать количество слов содержащих букву "b/B" #1
Всем добрый день !
Начал учить С++ и наткнулся на такое задание, решил сделать его по своему, экземпляров кода не видел, но видимо смекалки у меня не хватает)
Код написал, но не работает правильно(
Буду рад если ткнете носом в ошибки...
Собственно код :
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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
 
void t(char str[80])
{
    bool word = true;
    int count = 0;
    if (str == "")
        cout << "String is empty\n";
    int size = strlen(str);
    for (int i = 0; i<size-1; i++)
    {
        if (str[i] == ' ')
        {
            word = true;
        }
        if ((str[i] == 'b' || str[i] == 'B') && word)
        {
            word = false;
            count++;
        }
 
    }
    cout << "\n" << count<<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    char d[80];
    cout << "Enter string" << endl;
    cin >> d;
    t(d);
    system("pause");
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.08.2014, 20:26     Посчитать количество слов содержащих букву "b/B"
Посмотрите здесь:

C++ Найти количество слов начинающихся на букву "а"
C++ найти количество слов которые содержат хотя бы одну букву "A"
C++ Посчитать в предложении количество слов, заканчивающихся на букву "о"
C++ найти количество слов которые содержат хтя бы одну букву "а".
C++ Определить количество слов в предложении, заканчивающихся на букву "я"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gru74ik
Модератор
 Аватар для gru74ik
3080 / 1325 / 164
Регистрация: 20.02.2013
Сообщений: 3,765
Записей в блоге: 17
07.08.2014, 20:41     Посчитать количество слов содержащих букву "b/B" #2
Навскидку, что бросилось в глаза:

1. Имена функций лучше делать "говорящими", например void letter_bCounter(char str[80]).
Имя функции, состоящее из одной буквы - не есть гут:
C++
1
void t(char str[80])

2. Должно быть i<size, а не i<size-1. В Вашем варианте последний символ циклом не будет пройдён:
C++
1
2
    int size = strlen(str);
    for (int i = 0; i<size-1; i++)

3. Лучше использовать пре-инкремент (вот так: ++count):
C++
1
count++

4. Главная функция должна называться только int main - это требования стандарта C++:
C++
1
int _tmain(int argc, _TCHAR* argv[])

5. Главная функция должна возвращать значение типа int:
C++
1
2
3
4
5
6
7
8
9
int main()
{
    char d[80];
    cout << "Enter string" << endl;
    cin >> d;
    t(d);
    system("pause");
    return 0;
}
IseeYpuSuka
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 8
07.08.2014, 20:43  [ТС]     Посчитать количество слов содержащих букву "b/B" #3
Навскидку, что бросилось в глаза:

Код C++
1
void t(char str[80])
Имена функций лучше делать "говорящими". Имя функции, состоящее из одной буквы - не есть гут.
даа, с фантазией пробемы...
Код C++
1
int _tmain(int argc, _TCHAR* argv[])
Главная функция должна называться только int main - это требования стандарта C++.
при создании приложения в MS VS 2013 такая вот хрень, а про стандарт я знаю, просто не менял)
поставил ++i и убрал -1 ... и и все же не работает такой код(

что-то мне подсказывает что читается строка до 1 пробела?
gru74ik
Модератор
 Аватар для gru74ik
3080 / 1325 / 164
Регистрация: 20.02.2013
Сообщений: 3,765
Записей в блоге: 17
07.08.2014, 20:51     Посчитать количество слов содержащих букву "b/B" #4
Если предполагается, что пользователь будет вводить много слов с пробелами, то лучше использовать вместо строк в стиле С библиотечный класс std::string. Не забудьте подключить заголовочный файл
C++
1
#include <string>
Для чтения строк std::string используйте функцию
C++
1
getline(cin, myString);
Для того, чтобы узнать размер строки типа string используйте метод size:
C++
1
myString.size()
IseeYpuSuka
0 / 0 / 0
Регистрация: 05.06.2014
Сообщений: 8
07.08.2014, 20:59  [ТС]     Посчитать количество слов содержащих букву "b/B" #5
Цитата Сообщение от gru74ik Посмотреть сообщение
3. Лучше использовать пре-инкремент (вот так: ++count):
Код C++
1
count++
это ведь не имеет значения без выражения
в любом случае если кому интересно - рабочий код :
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
#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
 
void t(string str)
{
    bool word = true;
    int count = 0;
    if (str == "")
    {
        cout << "String is empty\n";
    }
    int size = str.length();
    for (int i = 0; i<size; ++i)
    {
        if (str[i] == ' ')
        {
            word = true;
        }
        if ((str[i] == 'b' || str[i] == 'B') && word)
        {
            word = false;
            count++;
        }
 
    }
    cout << "\n" << count<<endl;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    char d[80];
    cout << "Enter string" << endl;
    cin.getline(d, 80);
    cout << d;
    t(d);
    system("pause");
}
gru74ik
Модератор
 Аватар для gru74ik
3080 / 1325 / 164
Регистрация: 20.02.2013
Сообщений: 3,765
Записей в блоге: 17
07.08.2014, 22:30     Посчитать количество слов содержащих букву "b/B" #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
// Задание: написать программу, которая предлагает пользователю
// ввести строку, состоящую из нескольких слов, разделённых
// пробелами, а затем считает количество слов, содержащих букву b или B.
 
#include <iostream>
#include <string>
 
using namespace std;
 
void letter_bCounter(string);  // прототип функции letter_bCounter()
 
int main()
{
    string myString;
 
    cout << "Enter string: ";
    getline(cin, myString);
    letter_bCounter(myString);   // вызов функции letter_bCounter()
 
    cin.get();
 
    return 0;
}
 
void letter_bCounter(string myString)   // реализация функции letter_bCounter()
{
    bool word = true;
    int count = 0;
    if (myString == "")
        cout << "String is empty\n";
 
    for (int i = 0; i<=myString.size(); ++i)
    {
        if (myString[i] == ' ')
        {
            word = true;
        }
        if ((myString[i] == 'b' || myString[i] == 'B') && word)
        {
            word = false;
            ++count;
        }
 
    }
    cout << "\nYou have entered " << count
         << " words containing the characters b or B.\n";
}


Цитата Сообщение от IseeYpuSuka Посмотреть сообщение
это ведь не имеет значения без выражения
Скотт Мейерс "Наиболее эффективное использование C++. 35 новых рекомендаций" (2000, ДМК),
глава 2, правило 6 (стр. 45-48):
Цитата Сообщение от Скотт Мейерс
Если вы относитесь к программистам, которые заботятся об эффективности кода, то вас, вероятно, обеспокоила реализация постфиксного инкрементного оператора. Эта функция создает временный объект для возвращаемого значения (см. правило 19), а ее реализация, приведенная выше, создает также временный объект (oldValue), для которого вызывается и конструктор, и деструктор. Префиксная инкрементная функция вообще не генерирует временных объектов. Это приводит к впечатляющему выводу: из соображений эффективности клиенты UPInt должны всегда предпочитать префиксную форму инкрементного оператора, если им только не требуется функциональность постфиксной формы. Давайте проясним это. Работая с пользовательскими типами, программист должен применять префиксную форму при каждой возможности, потому что она обеспечивает более эффективный код.
MrCold
07.08.2014, 22:35
  #7

Не по теме:

Цитата Сообщение от gru74ik Посмотреть сообщение
Эта функция создает временный объект для возвращаемого значения (см. правило 19), а ее реализация, приведенная выше, создает также временный объект (oldValue), для которого вызывается и конструктор, и деструктор. ....
И где это у вас ?

gru74ik
07.08.2014, 22:38
  #8

Не по теме:

Цитата Сообщение от MrCold Посмотреть сообщение
И где это у вас ?
Конкретно у меня - нигде. Просто, на мой взгляд, надо изначально вырабатывать правильные привычки. Даже если нет никакой разницы, какую форму использовать префиксную или постфиксную, мне кажется, лучше выбрать префиксную.

MrCold
07.08.2014, 22:42
  #9

Не по теме:

круто что читаете Мейерса, но прежде чем что-то цитировать хорошо бы понимать самому
смысл цитаты

gru74ik
Модератор
 Аватар для gru74ik
3080 / 1325 / 164
Регистрация: 20.02.2013
Сообщений: 3,765
Записей в блоге: 17
07.08.2014, 22:57     Посчитать количество слов содержащих букву "b/B" #10

Не по теме:

Цитата Сообщение от MrCold Посмотреть сообщение
круто что читаете Мейерса, но прежде чем что-то цитировать хорошо бы понимать самому
смысл цитаты
Мне кажется, я вполне понял, о чём говорит Мейерс:
Работая с пользовательскими типами, программист должен применять префиксную форму
при каждой возможности, потому что она обеспечивает более эффективный код.
Речь о разработке своих собственных типов (классов, то есть). Да, в нашем случае нет никаких собственных типов и совершенно пофигу какой вариант применять - префиксный или постфиксный. Ещё раз повторяю - я предложил заменить постфиксный вариант на префиксный в данном задании, исходя именно из формирования правильных привычек у новичка.



Добавлено через 7 минут
И да, раз уж речь об эффективности зашла, то, я думаю, лучше так сделать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int size = myString.size() + 1;
    for (int i=0; i<size; ++i)
    {
        if (myString[i] == ' ')
        {
            word = true;
        }
        if ((myString[i] == 'b' || myString[i] == 'B') && word)
        {
            word = false;
            ++count;
        }
 
    }
чтобы вычисление происходило только один раз, а на каждом шаге цикла было только сравнение.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
08.08.2014, 14:37     Посчитать количество слов содержащих букву "b/B" #11
Просто так:
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
#include <algorithm>
#include <iostream>
using namespace std;
 
bool isB( const char &ch )
{
    if( toupper( ch ) == 'B' )
        return true;
    else
        return false;
}
 
int main() 
{ 
    std::string str = "BDSM is a variety of erotic practices involving        \
                       dominance and submission, role-playing, restraint,     \
                       and other interpersonal dynamics. Given the wide       \
                       range of practices, some of which may be engaged in    \
                       by people who do not consider themselves as practicing \
                       BDSM, inclusion in the BDSM community or subculture is \
                       usually dependent on self-identification and shared    \
                       experience. Interest in BDSM can range from one-time   \
                       experimentation to a lifestyle.";
    std::cout << std::count_if( str.begin(), str.end(), isB );
 
    std::cin.ignore();
    return 0;
}
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,283
08.08.2014, 14:53     Посчитать количество слов содержащих букву "b/B" #12
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Просто так:
Ты считаешь количество букв, а надо кол-во слов

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <algorithm>
#include <iterator>
#include <string>
#include <sstream>
 
int main() {
 
  std::string str = "a b c";
  std::istringstream ss( str );
 
  int result = std::count_if( std::istream_iterator<std::string>( ss ), std::istream_iterator<std::string>(), []( const std::string& a ) {
    return a.find_first_of( "bB" ) != std::string::npos;
  } );
 
  return 0;
}
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5547 / 2561 / 233
Регистрация: 01.11.2011
Сообщений: 6,330
Завершенные тесты: 1
08.08.2014, 14:57     Посчитать количество слов содержащих букву "b/B" #13
Цитата Сообщение от Voivoid Посмотреть сообщение
считаешь количество букв, а надо кол-во слов
А, точно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.08.2014, 15:00     Посчитать количество слов содержащих букву "b/B"
Еще ссылки по теме:

C++ Определить количество слов в предложении, заканчивающихся на букву "я"
Посчитать количество слов которые начинаются на букву "Б" C++
Посчитать количество слов "что" в заданном тексте C++

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

Или воспользуйтесь поиском по форуму:
gru74ik
Модератор
 Аватар для gru74ik
3080 / 1325 / 164
Регистрация: 20.02.2013
Сообщений: 3,765
Записей в блоге: 17
08.08.2014, 15:00     Посчитать количество слов содержащих букву "b/B" #14
Цитата Сообщение от Voivoid Посмотреть сообщение
Ты считаешь количество букв, а надо кол-во слов
Ибо BDSM. Зато весело и пятнично
Yandex
Объявления
08.08.2014, 15:00     Посчитать количество слов содержащих букву "b/B"
Ответ Создать тему
Опции темы

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