Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2 / 2 / 0
Регистрация: 08.12.2017
Сообщений: 31

Посчитать количество слов содержащих определённые буквы

20.09.2018, 16:28. Показов 3979. Ответов 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
48
#include "stdafx.h"
#include <iostream>
#include <cstdio>
#include <windows.h>
using namespace std;
int i, j;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    char str[1024] = "Текст завершается точкой.";
    char token[1024];
    char *p, *q;
 
    //cout << "Введите предложение: ";
    //gets_s(str);
 
    cout <<"Введённый текст:\n" << str <<"\n" << '\n';
    
    p = str;
    //Считываем лексемму из строки.
    cout << "Текст после разбиения на слова:\n\n";
    while (*p) {
        q = token; //Устанавливаем q для указания на начало массива token.
                   //Считываем символы до тех пор, пока не встретится либо пробел ' ', либо точки,
                   //либо нулевой символ (признак завершения строки \0).
        while (*p != ' '&& *p != '.'&& *p) {
            *q = *p;
            q++; p++;
        }
        if (*p) p++; //Перемщаемся за пробелом.
        *q = '\0'; //Завершаем лексемму нулевым символом.
        
        cout << token <<" - адрес этого слова: " << &token << '\n' << '\n';
    }
 
    /*for (i = 0; i < 12; i++) {
    if (token[i] = 'а'/* && token[i] = 'т') j = j + 1;
    cout << token;
    }
    */
    cout << "\n";
    system("pause");
    return 0;
}
Добавлено через 7 минут
Вопрос: Можно ли в С++ сделать так что-бы каждое слово из заданного предложения помещалось в "ячейку",что-бы потом я смог взять данные из этой "ячейки и использовать"?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.09.2018, 16:28
Ответы с готовыми решениями:

Посчитать количество слов в строке, содержащих 4 буквы
Дорогие форумчане! Пол дня воюю с этой задачей. Разобрался с решением: как сосчитать кол-во слов в общем, а вот состоящих именно из 4-х...

В заданной строке посчитать количество слов, содержащих только строчные латинские буквы
Здравствуйте. Столкнулся с такой проблемой, что при вводе, например, строки &quot;AAAA aaaa AAAAaaa aaaAAA&quot; она выводит ответ 2 слова,...

Посчитать количество слов, не содержащих цифр
1) Посчитать количество слов, не содержащих цифр. подскажите где ошибка, никак не пойму. #include &quot;stdafx.h&quot; #include...

6
59 / 54 / 34
Регистрация: 18.04.2014
Сообщений: 122
20.09.2018, 21:14
NAN_13, Можно. Если вам обязательно нужно работать с массивом символов,
то это делается объвлением двумерного массива.
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
#include <iostream>
using namespace std;
 
int main() {
    char str[1024]; // так вы объявили строку
    
    using MyString = char [1024]; // создаем псевдоним для типа строки
    MyString arrStr[3] = {"It", " isn't", " all\n"}; // объявляем массив этих строк
    cout << "1. " << arrStr[0] << arrStr[1] << arrStr[2];
    
    char myToken[3][100] = {"It", " isn't", " all\n"}; // можно и сразу объявить двумерный массив
    cout << "2. " << myToken[0] << myToken[1] << myToken[2];
    
    cout << "3. " << *myToken << *(myToken + 1) << *(myToken + 2); // тоже вывод, но через указатель
    
    cout << "4. ";
    char (*p)[100] = myToken; // указатель на массив символов 
    for (size_t i = 0; i < 3; i++) 
        for (size_t j = 0; *(*(p + i) + j) != 0; j++)
            if ((*(*(p + i) + j) != 'n' &&   // выводим
                 *(*(p + i) + j) != 't' &&    // только те символы
                 *(*(p + i) + j) != '\'')       // что нам нужны
                 || i == 0) 
                cout << *(*(p + i) + j);
    return 0;
}
1
2 / 2 / 0
Регистрация: 08.12.2017
Сообщений: 31
21.09.2018, 00:34  [ТС]
Это ни то. В этом и есть загвоздка. Дана строка текста для примера взял "Текст завершается точкой.", т.к. соответствует требованием теста:
1) есть слово с "т" но без "а";
2) есть слово с "т" и "а";
3) Есть точка и пробелы.
Ну и чтобы каждый раз при тесте не использовать gets_s() я и присвоил строку.
По этому ручками вбить каждое слово в ячейку - это решение, но не в этот раз.

И вторая загвоздка именно в счёте слов содержащих одновременно "а" и "т" при чём в обеих последовательностях, а ни просто счёт количества раз упоминания символа, таких решений в сети более чем.
Тут что-то с адресной арифметикой, массив - это прошлая тема.

Тем не менее спасибо за пищу для дальнейшего размышления.
0
59 / 54 / 34
Регистрация: 18.04.2014
Сообщений: 122
21.09.2018, 00:57
NAN_13, конечно это не решение вашей задачи. Это пример из которого
понятно, как мне кажется, как решать вашу. Каждый элемент массива myToken
это "строка". Туда и копируйте ваши слова, после каждого слова индекс в массиве
увеличивается. Таким образом на выходе получите массив слов, адреса на которые
сможете вернуть. Т.е. myToken[0] - это первое слово, myToken[1] это второе и т.д.

Естественно я ручками вбил, чобы показать как хранятся в памяти. Вам же нужно
слова из входной строки копировать посимвольно в двумерный массив. Наверное
я слишком абстрагированно от вашей задачи написал.

По поводу второй загвоздки предлагаю вам вынести это в отдельную функцию.
А алгоритм простой:
1. Создаем два флага:
C++
1
2
bool charAisHere = false;
bool charTisHere = false;
2. Посимвольно в цикле проходим по слову и проверяем если символ найден,
то выставляем флаг соответствующий. А цикл выполняется пока не найдены
буквы, или пока не достигнут конец слова.
3. Функция возвращает charAisHere && charTisHere. Т.е. если обе буквы найдены
то это нужное нам слово.
1
166 / 109 / 57
Регистрация: 30.08.2018
Сообщений: 357
21.09.2018, 01:24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <cstring>
 
int main()
{
    char str[] = "Character to be located.";
    char *token = nullptr;
    std::size_t i = 0;
    for (token = std::strtok(str, " ,.-"); token != nullptr;
         token = std::strtok(nullptr, " ,.-"))
    {
        if (std::strchr(token, 't') && std::strchr(token, 'a'))
            i++;
        std::cout << token << " - address: " << static_cast<void *>(&token) << std::endl;
 
    }
    std::cout << "\nWords with 'a' & 't': " << i << std::endl;
    return 0;
}
1
2 / 2 / 0
Регистрация: 08.12.2017
Сообщений: 31
28.09.2018, 01:56  [ТС]
Спасибо конечно, но strtook(); nullptr и подобное для нуба с 2х недельным стажем программирования еще рановато.
0
2 / 2 / 0
Регистрация: 08.12.2017
Сообщений: 31
04.10.2018, 18:05  [ТС]
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 <iostream>
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    const int token_len = 13;
    char token[token_len];
    char *arrtoken[10];
    const char *text;
    char *q;
    int counter = 0, g = 0;
 
    text = "Текста завершаются точкой.";
    std::cout << text << std::endl;
    while (*text) {//Считываем лексемму из строки
        q = token; //Устанавливаем q для указания на начало массива token.
                   //Считываем символы до тех пор, пока не встретится либо пробел ' ', либо точки,
                   //либо нулевой символ (признак завершения строки \0).
        while (*text != ' '&& *text != '.'&& *text) {
            *q = *text;
            q++; text++;
        }
        if (*text) text++; //Перемещаемся за пробелом.
        *q = '\0'; //Завершаем лексемму нулевым символом.
        bool f1 = false, f2 = false; //Находим словас А и Т
        for (const char *letter = token; *letter; letter++) {
            if (*letter == 'а' || *letter == 'А') f1++;
            if (*letter == 'т' || *letter == 'Т') f2++;
        }
        if (f1 && f2)counter++; // Считает колличество слов содержащих А и Т одновременно
        if (f1 && f2) std::cout << "Адрес слова с А и Т: " << &token << " это слово: " << token << std::endl;
        g++;
    }
    std::cout << "Всего слов с А и Т: " << counter << std::endl;
    std::cout << "\n";
    system("pause");
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.10.2018, 18:05
Помогаю со студенческими работами здесь

Подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах
Во введённой строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах. Слова разделены пробелами....

В строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах
Во введённой строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах. Слова разделены пробелами....

Посчитать в тексте количество слов с заглавной буквы
сколько в заданом тексте собственных имен? :-|немогу написать код в лабе.. в итоге программа должно посчитать количество слов с большой...

Во введённой строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах
Во введённой строке подсчитать количество слов, содержащих строчные буквы «t» и «s», стоящие на соседних местах. Слова разделены пробелами....

Посчитать количество слов в заданной последовательности, начинающиеся с буквы B
Группы символов, разграничены пробелами (одним или несколькими) и не содержат пробелов в середине себя, называются словами. Посчитать...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Создаем микросервисы с Go и Kubernetes
golander 02.07.2025
Когда я только начинал с микросервисами, все спорили о том, какой язык юзать. Сейчас Go (или Golang) фактически захватил эту нишу. И вот почему этот язык настолько заходит для этих задач: . . .
C++23, квантовые вычисления и взаимодействие с Q#
bytestream 02.07.2025
Я всегда с некоторым скептицизмом относился к громким заявлениям о революциях в IT, но квантовые вычисления - это тот случай, когда революция действительно происходит прямо у нас на глазах. Последние. . .
Вот в чем сила LM.
Hrethgir 02.07.2025
как на английском будет “обслуживание“ Слово «обслуживание» на английском языке может переводиться несколькими способами в зависимости от контекста: * **Service** — самый распространённый. . .
Использование Keycloak со Spring Boot и интеграция Identity Provider
Javaican 01.07.2025
Два года назад я получил задачу, которая сначала показалась тривиальной: интегрировать корпоративную аутентификацию в микросервисную архитектуру. На тот момент у нас было семь Spring Boot приложений,. . .
Содержание темы с примерами на WebGL
8Observer8 01.07.2025
Все примеры из книги Мацуды и Ли в песочнице JSFiddle Пример выводит точку красного цвета размером 10 пикселей на WebGL 1. 0 и 2. 0 WebGL 1. 0. Передача координаты точки из главной программы в. . .
Основы WebGL. Простой треугольник
8Observer8 01.07.2025
Простой треугольник без трансформаций. Для трансформаций можно использовать glMatrix, как в примере: https:/ / plnkr. co/ edit/ qT6ZTwvncLPRamK5?preview На русском: . . .
Полиглотные микросервисы на C# и .NET
ArchitectMsa 30.06.2025
Полиглотная архитектура появилась не из желания усложнить жизнь разработчикам. Она родилась из практической необходимости решать разные задачи наиболее эффективным способом. В одном из проектов. . .
Стратегии кеширования
Javaican 29.06.2025
Кеширование — это хранение часто запрашиваемых данных в быстром хранилище (обычно в памяти), чтобы не обращаться к более медленному первоисточнику. Казалось бы, все просто. Но за этой простотой. . .
Наблюдаемость приложений ASP.NET Core с OpenTelemetry, Prometheus и Grafana
ArchitectMsa 29.06.2025
Наблюдаемость (observability) – это ключевое свойство современной системы, позволяющее понимать её внутреннее состояние на основе внешних данных. Если мониторинг отвечает на вопрос "что случилось?",. . .
Четыре главных модели отношений классов в с++
russiannick 28.06.2025
Продолжаю крестовый поход против c++. ideone. com/ юзаю для проверки валидности кода. Насчитал 4 модели отношений классов: одиночный класс, равноправные классы, слейв - мастер, терминатор. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »