1

Тема: Допоможіть з завданням

3 клавіатури вводиться текстовий рядок. Скласти програму, яка підраховує кількість слів у тексті, які закінчуються на голосну літеру, виводить на екран всі слова, довжина яких менша п'яти символів, видаляє всі слова, як містять хоча б одну латинську літеру

2

Re: Допоможіть з завданням

передай кошти ЗСУ і я негайно викладу код

3

Re: Допоможіть з завданням

[img]file:///C:/Users/%D0%9E%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80%D0%B0/Desktop/photo_2022-11-06_20-43-45.jpg[/img]

4

Re: Допоможіть з завданням

https://i.ibb.co/q7BvW7G/photo-2022-11-06-20-43-45.jpg
https://ibb.co/xXhNfXv

Подякували: Chemist-i, Tarpan87, leofun01, koala4

5

Re: Допоможіть з завданням

Як тобі таке olmovc ?

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

6

Re: Допоможіть з завданням

Lazy написав:

3 клавіатури вводиться текстовий рядок. Скласти програму, яка підраховує кількість слів у тексті, які закінчуються на голосну літеру, виводить на екран всі слова, довжина яких менша п'яти символів, видаляє всі слова, як містять хоча б одну латинську літеру

#include<algorithm>
#include<cstring>
#include<functional>
#include<iterator>
#include<iostream>
#include<sstream>
#include<vector>

using namespace std;

vector<string> get_words(string const, string const);
int get_count(vector<string> const, function<bool(string)> const);
void print_if(vector<string> const, function<bool(string)> const, ostream &);
void delete_if(vector<string> &, function<bool(string)> const);
int main(int const argc, char const *const argv[]) {
    string text;
    cout << "Enter text: ";
    getline(cin, text);
    auto v = get_words(text, " ,.!?\"\t\r\n");
    /*// Uncomment to check input
    for(int i = 0; i < v.size(); ++i)
        cout << "i: " << i << "  w: \"" << v[i] << "\"\r\n";
    cout << "All words count: " << v.size() << "\r\n";
    //*/
    vector<string> a;
    copy_if(v.begin(), v.end(), inserter(a, a.end()), [](string const s) {
        return strchr("aeiouy", s[s.length() - 1]);
    });
    cout << "Selected words count: " << a.size() << "\r\n";
    cout << "\r\n";
    print_if(v, [](string s) { return s.length() < 5; }, cout);
    cout << "\r\n";
    delete_if(v, [](string const s) {
        int len = s.length();
        for(int i = 0; i < len; ++i) {
            char c = s[i] | ' ';
            if('a' <= c && c <= 'z')
                return true;
        }
        return false;
    });
    for(int i = 0; i < v.size(); ++i)
        cout << "i: " << i << "  w: \"" << v[i] << "\"\r\n";
    cout << "Words count: " << v.size() << "\r\n";
    return 0;
}
vector<string> get_words(string const str, string const separators) {
    vector<string> v;
    int len = str.length(), s = -1, w = 0,
        sep_len = separators.length();
    for(int i = 0; i < len; ++i) {
        if(strchr(separators.c_str(), str[i])) {
            if(w > 0)
                v.push_back(str.substr(s + 1, w));
            s = i;
            w = 0;
        }
        else ++w;
    }
    if(w > 0)
        v.push_back(str.substr(s + 1, w));
    return v;
}
int get_count(vector<string> const v, function<bool(string)> const match) {
    int count = 0;
    auto iter = v.begin(), end = v.end();
    while(iter != end) {
        if(match(*iter))
            ++count;
        ++iter;
    }
    return count;
}
void print_if(vector<string> const v, function<bool(string)> const match, ostream &out) {
    auto iter = v.begin(), end = v.end();
    while(iter != end) {
        if(match(*iter))
            out << *iter << "\r\n";
        ++iter;
    }
}
void delete_if(vector<string> &v, function<bool(string)> const match) {
    int count = v.size();
    auto iter = v.begin();
    while(iter != v.end()) {
        if(match(*iter)) {
            iter = v.erase(iter);
            --count;
        }
        else ++iter;
    }
    v.resize(count);
}
Подякували: Betterthanyou, Lazy2

7 Востаннє редагувалося koala (07.11.2022 13:25:03)

Re: Допоможіть з завданням

Це ви щойно std::accumulate, std::for_each і std::remove_if переписали, ще й без використання циклів по інтервалах?

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

8

Re: Допоможіть з завданням

koala написав:

Це ви щойно std::accumulate, std::for_each і std::remove_if переписали, ще й без використання циклів по інтервалах?

Так. Компілятор, який мені доступний на даний момент, матюкає мене, коли я хочу використовувати ці функції (C++20), тому я підкинув туди трохи костилів. Але зауваженя хороше, так як я зробив, загалом робити не варто.

Подякували: Lazy, Tarpan872

9

Re: Допоможіть з завданням

olmovc, схоже, зник з форуму :)

Подякували: Lazy, olmovc2

10

Re: Допоможіть з завданням

leofun01 написав:
koala написав:

Це ви щойно std::accumulate, std::for_each і std::remove_if переписали, ще й без використання циклів по інтервалах?

Так. Компілятор, який мені доступний на даний момент, матюкає мене, коли я хочу використовувати ці функції (C++20), тому я підкинув туди трохи костилів. Але зауваженя хороше, так як я зробив, загалом робити не варто.

Гм, а до чого тут С++20?

Подякували: Lazy, leofun012

11

Re: Допоможіть з завданням

leofun01 написав:

Як тобі таке olmovc ?

lдай час шановний

12

Re: Допоможіть з завданням

olmovc написав:

і я НЕГАЙНО викладу код

Подякували: Lazy, leofun012

13

Re: Допоможіть з завданням

wander написав:
leofun01 написав:
koala написав:

Це ви щойно std::accumulate, std::for_each і std::remove_if переписали, ще й без використання циклів по інтервалах?

Так. Компілятор, який мені доступний на даний момент, матюкає мене, коли я хочу використовувати ці функції (C++20), тому я підкинув туди трохи костилів. Але зауваженя хороше, так як я зробив, загалом робити не варто.

Гм, а до чого тут С++20?

Ну, якісь із цих функцій появились зовсім не давно.

По правді, я взагалі не знаю з якого C++ вони доступні, я таких функцій не вивчав, і здається вперше намагався їх використати, і отримав пачку помилок, з якими не хотів розбиратися (я то писав під VS2017).

Дивно, що std::copy_if пішов як треба.

14 Востаннє редагувалося wander (09.11.2022 01:37:32)

Re: Допоможіть з завданням

Всі три ф-ї були наявні до С++11, отже були доступні або з самого початку, або їх докинули десь у 03х стандарті, але точно не у С++20 :)

UPD.
https://open-std.org/JTC1/SC22/WG21/doc … f/nov97-2/
Дивіться у body, там є вся братія

Подякували: Lazy, leofun012

15

Re: Допоможіть з завданням

Ладно, на вихідних попробую з ними розібратись. Якщо все вийде, то докину рішеня сюди. Якщо не вийде, то створю окрему тему, і будемо розбирати де я обісрався.

16

Re: Допоможіть з завданням

#include<algorithm>
#include<cctype>
#include<cstring>
#include<functional>
#include<iostream>
#include<iterator>
#include<sstream>
#include<vector>

using namespace std;

vector<string> get_words(string const, string const);

int main(int const argc, char const *const argv[]) {
    string text;
    cout << "Enter text: ";
    getline(cin, text);
    auto v = get_words(text, " ,.!?\"\t\r\n");
    /*// Uncomment to check input
    for(int i = 0; i < v.size(); ++i)
        cout << "i: " << i << "  w: \"" << v[i] << "\"\r\n";
    cout << "All words count: " << v.size() << "\r\n";
    //*/
    vector<string> a;
    copy_if(v.begin(), v.end(), inserter(a, a.end()), [](string const s) {
        return strchr("aeiouy", s[s.length() - 1]);
    });
    cout << "Selected words count: " << a.size() << "\r\n";
    cout << "\r\n";
    std::for_each(v.begin(), v.end(), [](string const s) {
        if(s.length() < 5)
            cout << s << "\r\n";
    });
    cout << "\r\n";
    v.erase(
        remove_if(v.begin(), v.end(), [](string s) {
            return std::find_if(s.begin(), s.end(), isalpha) != s.end();
        }), v.end()
    );
    for(int i = 0; i < v.size(); ++i)
        cout << "i: " << i << "  w: \"" << v[i] << "\"\r\n";
    cout << "Words count: " << v.size() << "\r\n";
    return 0;
}
vector<string> get_words(string const str, string const separators) {
    vector<string> v;
    int len = str.length(), s = -1, w = 0;
    for(int i = 0; i < len; ++i)
        if(separators.find(str[i]) != string::npos) {
            if(w > 0)
                v.push_back(str.substr(s + 1, w));
            s = i;
            w = 0;
        }
        else ++w;
    if(w > 0)
        v.push_back(str.substr(s + 1, w));
    return v;
}
Подякували: Lazy1

17

Re: Допоможіть з завданням

Можна навіть так:

const char SEPARATORS[] = " ,.!?\"\t\r\n";
struct Delimiters : std::ctype<char> {
  Delimiters() : std::ctype<char>(get_table()) {}
  static mask const* get_table()
  {
    static vector<mask> table(classic_table(),classic_table()+table_size);
    for(char c: SEPARATORS)
        table[c] = std::ctype_base::space;
    return &table[0];
  }
};

int main(int const argc, char const *const argv[]) {
    Delimiters delim;
    cin.imbue(locale(cin.getloc(), &delim));
    vector<string> v;
    while(cin>>inp)
        v.push_back(inp);
...

Як на мене, красивіше за get_words. Особливо для новачків.

Подякували: Lazy, leofun012

18

Re: Допоможіть з завданням

// 3 клавіатури вводиться текстовий рядок. 
// Скласти програму, яка підраховує кількість слів у тексті, 
// які закінчуються на голосну літеру, виводить на екран всі слова, 
// довжина яких менша п'яти символів, 
// видаляє всі слова, як містять хоча б одну латинську літеру

#include <iostream>
#include <locale>
#include <string>
#include <sstream>
#include <vector>
#include <Windows.h>

std::vector<char> vomelLetters = { 'а','е','є','и','і','ї','о','у','ю','я' };
//std::vector<char> vomelLetters = { (char)'а',(char)'е',(char)'є',(char)'и',(char)'і',(char)'ї',(char)'о',(char)'у',(char)'ю',(char)'я' };

std::string delimiters = " ,-";

std::vector<std::string> split(const std::string, const std::string);

bool IsVomLetters(char);
size_t WordsCount(std::vector<std::string>);
void PrintVector(std::vector<std::string>);
//bool IsDelim(char);


int main()
{
    std::cout << "Input Line" << std::endl;
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    //SetConsoleCP(CP_UTF8);
    //SetConsoleOutputCP(CP_UTF8);
    std::string inputline;

    std::getline(std::cin, inputline);
    std::vector<std::string> wordsArray = split(inputline, delimiters);
        
    PrintVector(wordsArray);
    std::cout << "\n1. The number of words in the text that end with a vowel = " << WordsCount(wordsArray) << std::endl;
    std::cout << "2. All words whose length is less than five characters = " << std::endl;
    //
    for (size_t i = 0; i < wordsArray.size(); i++)
    {
        if (wordsArray[i].size() < 5)
            std::cout << " " << i << "\t" << wordsArray[i] << std::endl;
    }

}


size_t WordsCount(std::vector<std::string> vwords)
{
    char ch;
    //bool b = false;
    size_t count = 0;
    for (size_t i = 0; i < vwords.size(); i++)
    {
        ch = vwords[i].back();
        if ( IsVomLetters( ch ) )
        {
            //std::cout << "w[" << i << "] " << vwords[i] << " " << ch << std::endl;
            count++;
        }
    }
    return count;
}

bool IsVomLetters(char ch)
{
    for (size_t i = 0; i < vomelLetters.size(); i++)
    {
        if (vomelLetters[i] == ch)
            return true;
    }
    return false;
}

std::vector<std::string> split(const std::string str, std::string delim)
{
    std::vector<std::string> wordVector;
    std::string line = str;
    std::size_t prev = 0, pos;
    while ((pos = line.find_first_of(delim, prev)) != std::string::npos)
    {
        if (pos > prev)
            wordVector.push_back(line.substr(prev, pos - prev));
        prev = pos + 1;
    }
    if (prev < line.length())
        wordVector.push_back(line.substr(prev, std::string::npos));
    return wordVector;
}



void PrintVector(std::vector<std::string> v)
{
    for (size_t i = 0; i < v.size(); i++)
    {
        std::cout << "[" << i << "] = " << v[i] << '\t';
    }
    std::cout << "\n";
}
Подякували: Lazy1

19

Re: Допоможіть з завданням

Вибачаюся забув ще одне підзавдання
3.видаляє всі слова, як містять хоча б одну латинську літеру
добавте цю функцію
оголошення

void RemoveLatinWords(std::vector<std::string> &);
void RemoveLatinWords(std::vector<std::string> & vwords)
{    
    std::string word;
    char ch;
    for (size_t i = 0; i < vwords.size(); i++)
    {        
        word = vwords[i];
        for (size_t j = 0; j < word.size(); j++)
        {
            ch = word[j];
            //if ( (ch < 65) || (ch > 122) || ((ch > 90) && (ch < 97)) )  //if (std::isalpha(ch))
            if ( ( (ch >= 'A') && (ch <= 'Z')) || ((ch > 'a') && (ch < 'z')) )
            {
                //For capital alphabets 65 – 90
                    //For small alphabets 97 – 122
                vwords.erase(vwords.begin() + i);
                std::cout << "i=" << i << " ch= " << ch << std::endl;
                
                i--;
                break;
            }
        }            
    }
    
}

20

Re: Допоможіть з завданням

olmovc написав:
if ( ( (ch >= 'A') && (ch <= 'Z')) || ((ch > 'a') && (ch < 'z')) )

Ви забули >=/<= для маленьких літер. І взагалі це

if(std::isalpha(ch))
Подякували: leofun011