1

Тема: C++ кількість різних слів

З клавіатури вводиться текстовий рядок. Написати програму, яка підраховує кількість різних слів, що входять до заданого тексту;видаляє всі слова, що мають подвоєнні літери.

Пробував різні способи і шось не розумію(можливо тому що пишу код тіки місяць без наполегливо навчання)

2

Re: C++ кількість різних слів

Будь ласка, продемонструйте хоча б один із тих різних способів, якими ви намагалися це зробити, а ми підкажемо, як виправити помилку.

3

Re: C++ кількість різних слів

#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
    cout << "\n Input String:  ";
    char s[80];
    gets(s);
    int n = strlen(s);
    char* s1 = new char[n];
    for (int i = 0; i < n; i++)
        s1[i] = s[strlen(s) - i - 1];
    s1[n] = '\0';
    cout << "\n Reverse String:  " << s1;
    strcpy(s1, s);  
    cout << "\n\n\n Words in string:  \n";
    char* word;
    word = strtok(s, " ");
    while (word != NULL)
    {
        printf("\n\t%s", word);
        word = strtok(NULL, " ");
    }
    
    strcpy(s, s1);   
    cout << "\n\n\n String without first digits:  \n";
    char* s2 = new char[n];
    strcpy(s2, "");
    word = strtok(s, " ");
    while (word != NULL)
    {
        if (strpbrk(word, "0123456789") == NULL)
            strcat(s2, word);
        strcat(s2, " ");
        word = strtok(NULL, " ");
    }
    strcat(s2, "\0");
    printf("\n\t%s", s2);
    delete[] s1;
    delete[] s2;
    return 0;

4

Re: C++ кількість різних слів

Цей код я знайшов на сайті і пробую переробити

5 Востаннє редагувалося koala (22.10.2022 10:51:06)

Re: C++ кількість різних слів

А в якому підручнику ви прочитали, що треба шукати на сайтах, а потім переробляти?
Де особисто ваші напрацювання?

6

Re: C++ кількість різних слів

Ось особиста робота(просто умінь не вистачає)

#include<iostream>
#include <cstring>
using namespace std;
int main()
{
    // підрахунок кількості слів у рядку
    char s[250]; // рядок символів
    int o;
    int k;
    int totChar = 0;
    bool f; // допоміжна змінна - визначає кінець попереднього слова

    cin.getline(s, 250);

    k = 0; // онулити лічильник
    f = true;

    // обчислення k
    for (o = 0; i < strlen(s); o++) {
        if (s[o] != ' ')
        {
            totChar++;
        }
        //Початковий спосіб пошуку слів
        if ((s[o] == ' ')  (s[o] == ',')  (s[o] == '.'))
        {
            f = true; // кінець слова
        }
        else
        {
            if (f)
            {
                // початок нового слова
                k++;
                f = false;
            }
        }
    }
    // вивід результату
    cout << totChar << endl;
    cout << k << endl;
    char* pch;
    printf("Splitting string \"%s\" into tokens:\n", s);
    pch = strtok(s, " ,.-");

    while (pch != NULL)
    {
        printf("%s\n", pch);
        pch = strtok(NULL, " ,.-");
    }
    return 0;
}

7

Re: C++ кількість різних слів

У мене ваш код не компілюється, показує дві помилки:

prog.cpp:19:17: error: ‘i’ was not declared in this scope
     for (o = 0; i < strlen(s); o++) {

Назва змінної o - це трохи незвично, порівняння з strlen у циклі - стандартна помилка новачка, але ви чомусь порівнюєте strlen не з o, а з i. Про яку компілятор нічого не знає, про що і пише. Це так складно для вас - виправити таку помилку? Тоді вам варто поки що займатися простішими завданнями, ви в змінних та ідентифікаторах плаваєте, а тут на вас алгоритм звалили.

prog.cpp:25:40: error: expression cannot be used as a function
         if ((s[o] == ' ')  (s[o] == ',')  (s[o] == '.'))

Тут компілятор узагалі не може зрозуміти, що вам треба, і припускає, що ви намагаєтеся викликати функцію. А ви, наскільки я розумію, хотіли написати "або" (||) між цими виразами. Знову ж таки: у вас проблеми з базовим синтаксисом, вам би задачки по типу "намалюй будинок" розв'язувати, а не оце.

Подякували: leofun011

8

Re: C++ кількість різних слів

Вибачте я код в з тг копіював він замість || робить зникаючий текст. Згоден навичок у мене ще недостатньо і завдання як на мене для 1 курсу заважке, але з часом думаю я розбуруся сам або з чиєюсь допомогою .

9

Re: C++ кількість різних слів

А змінну о я поставив бо сайт не дає змоги вводити змінну "і " в середині тексту і помилився переправляючи.А що замість strlеn потрібно ставити?

10

Re: C++ кількість різних слів

VADUMr написав:

Вибачте я код в з тг копіював він замість || робить зникаючий текст.

Тг має моноширинне форматування, туди легко вставити будь-який код. Якщо ви нездатні навіть з месенджером розібратися, то забудьте про  програмування - воно на ваше.

koala написав:

У мене ваш код не компілюється, показує дві помилки:

VADUMr, за вас зкомпілювали код навіть, ви не сказали що вас не влаштовує в написаному вами коді. Чому ви навіть не намагалися запустити власний код?

11

Re: C++ кількість різних слів

Я тільки початківець програмувати почав місяць назад і усі аспекти ще не освоїв не кажучи про те що це мій 3 код.

12

Re: C++ кількість різних слів

У будь-якому разі, вам треба спершу продумати алгоритм.
Тут треба:
- поділити стрічку на слова;
- зібрати всі слова в окрему колекцію, найпростіше - вектор (std::vector<std::string>);
- для кожного слова порахувати, скільки разів воно зустрічається у векторі, вивести кількість унікальних;
- переглянути кожне слово, видалити ті, що мають подвійні літери;
- зібрати слова назад у стрічку і вивести.

Подякували: Olex_V1

13

Re: C++ кількість різних слів

Дякую спробую.

14

Re: C++ кількість різних слів

koala написав:

- зібрати всі слова в окрему колекцію, найпростіше - вектор (std::vector<std::string>);
- для кожного слова порахувати, скільки разів воно зустрічається у векторі, вивести кількість унікальних;

хіба тут не можна використать set? тоді кількість унікальних це розмір set

Подякували: leofun011

15

Re: C++ кількість різних слів

Можна. Але людина щойно почала вивчати контейнери. І вектор усе одно знадобиться, бо потім треба збирати назад.

16

Re: C++ кількість різних слів

// .
// З клавіатури вводиться текстовий рядок. Написати програму, 
// яка підраховує кількість різних слів, 
// що входять до заданого тексту;видаляє всі слова, що мають подвоєнні літери.

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <string>
//#include <unordered_set>

std::vector<std::string> split(std::string,std::string);
std::vector<size_t> words_count(std::vector<std::string>);

bool IsDoubleChars(std::string);

int _tmain(int argc, _TCHAR* argv[])
{    
    std::string delimiter(" .,!");
    std::string instr;
    
    std::getline(std::cin,instr);
    //instr = "wordd1 word2 word2 44455, Hello word2 r4556788. Hello fryier World!";
        
    std::cout << instr << std::endl;
    std::vector<std::string> strarray = split(instr, delimiter);
    for (int i = 0; i < strarray.size(); i++)
        std::cout << strarray[i] << std::endl;
    
    std::vector<size_t> array_counts = words_count(strarray);

    size_t num_uniq_word = 0;

    for (size_t i = 0;i < array_counts.size(); i++)
    {
        std::cout << "string [" << i << "] = "<< strarray[i] << " count = " << array_counts[i] << std::endl;
        if (array_counts[i] == 1)
            num_uniq_word++;
    }
    std::cout << "number of unique words = " << num_uniq_word << std::endl;


    std::cout << std::endl;
    std::cout << "---------------" << std::endl;
    for (size_t i = 0;i < strarray.size(); i++)
    {
        if ( !IsDoubleChars(strarray[i]) )
        {
            std::cout << strarray[i] << " "; //<< std::endl;
        }
    }
    getchar();
    return 0;
}

std::vector<std::string> split(std::string str,std::string delim)
{
    std::vector<std::string> tokens;
    char *str_c = strdup(str.c_str()); 
    char *token = NULL;

    token = strtok(str_c, delim.c_str()); 
    while (token != NULL) { 
        tokens.push_back(std::string(token));  
        token = strtok(NULL, delim.c_str()); 
    }

    delete[] str_c;

    return tokens;
}

std::vector<size_t> words_count(std::vector<std::string> str_array)
{
    std::vector<size_t> ret;
    size_t count = 0;
    size_t i = 0;
    for (i = 0; i < str_array.size(); i++)
    {
        count = 0;
        for (size_t j = 0; j < str_array.size(); j++)
        {
            if (str_array[i] == str_array[j])
            {
                count++;
            }            
        }
        ret.push_back(count);
    }
    return ret;
}


bool IsDoubleChars(std::string str)
{
    int k = 0;
    int l = str.length();
    for(int i = 0; k < l; i++) 
    {
        k = i + 1;
      if (str[i] == str[k])
        {             
            return true;
        }
    }
    return false;
}

17

Re: C++ кількість різних слів

Два питання:
1)Чого програмісти не використовують using namespace std;?
2)У мене код не запускається ні з візуал студіо ні з компіляторів , але якшо закоментувати 1 бібліотеку і _TCHAR змінити на char то текст пишеться до бескінечності. Як це пофіксити?

18 Востаннє редагувалося wander (29.10.2022 01:12:27)

Re: C++ кількість різних слів

VADUMr написав:

Два питання:
1)Чого програмісти не використовують using namespace std;?
2)У мене код не запускається ні з візуал студіо ні з компіляторів , але якшо закоментувати 1 бібліотеку і _TCHAR змінити на char то текст пишеться до бескінечності. Як це пофіксити?

1) Зустрічне питання: а чому мають використовувати?
2) _tmain - це нестандартна main функція (точніше це навіть не функція, а макрос), а майкросовтівське розширення, для підтримки utf-16, здається. Щоб воно запрацювало, тре включити відповідні опції. І, що означає: "текст пишеться до бескінечності"?

Подякували: leofun011

19

Re: C++ кількість різних слів

using namespace std, загалом, нормально, поки ви використовуєте виключно std. Але абсолютна більшість реальних проєктів використовує кілька, якщо не кілька десятків, додаткових бібліотек, назви функцій та класів в яких можуть збігатися або, принаймні, бути схожими між собою та на функції STL (про boost чули?). Може виникнути плутанина чи взагалі код може зламатися. Простори імен запровадили саме для того, щоб уникнути подібної плутанини. В результаті:
- студентів у вишах навчають using namespace std (бо це є нормально);
- студенти приходять в фірми і пишуть код із using namespace std, бо так їх навчили;
- новий код ламає старий, бо using namespace std у ньому не є нормальним;
- програмісти починають перевчати студентів на ранніх стадіях - ваше питання саме про це.

Подякували: leofun01, VADUMr2

20

Re: C++ кількість різних слів

Дякую