1

Тема: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

/* Сьогодні 19:59:25
Вивести кількість букв у реченні, введеному з клавіатури, не враховуючи
пропуски.
2. Визначити скільки букв ‘d’ є у реченні, введеному з клавіатури..
3. Вивести абревіатуру зі слів, введених з клавіатури – передостанні літери
кожного слова.
4. Вивести найменше слово у зворотньому порядку.
5. Ввести з клавіатури літеру. Замінити всі перші літери слів на введену літеру.
6. Вивести всі слова без останньої літери (можна останні літери не виводити на
екран, не видаляючи їх як символи з масиву). */
#include <iostream>
#include <vector>
#include <string>
#include <iomanip>

size_t NumLetters(std::string);
size_t NumLetters(std::string, char);//num letters in a sentence
std::vector<std::string> split(const std::string&, const std::string&);
std::string Abbrev(std::vector<std::string>&);
std::string SmallestWord(std::vector<std::string>&);
std::string ReverseString(std::string);
void ReplaceFirstLetter(std::vector<std::string>&, char&);

int main()
{
    std::string inputsring("fhfh hh_d087dd dgf hghgjsdd fhkkj[-09 dgf 7777 uiiopm_78 8++++ ytty /ytytd");
    std::cout << "Input string " << std::endl;
    //std::getline(std::cin,inputsring);
    std::cout << inputsring << std::endl;
    //std::string inputsring
    size_t value;
    value = NumLetters(inputsring);
    std::cout << "1.Numbers of letters = " << value << std::endl;
    char ch = 'd';
    value = NumLetters(inputsring, 'd');
    std::cout << "2.Numbers of letters '" << ch << "' = " << value << std::endl;
    std::string delim(" ");
    std::vector<std::string> vwords;
    vwords = split(inputsring, delim);
    for (size_t i = 0; i < vwords.size(); i++)
        std::cout << "words[" << i << "] = " << vwords[i] << "\t";
    std::cout << std::endl;
    std::string str, rstr;
    str = Abbrev(vwords);
    std::cout << "3.abbreviation " << str << std::endl;
    str = SmallestWord(vwords);
    rstr = ReverseString(str);
    std::cout << "4. smallest word in reverse order " << rstr << std::endl;
    std::cout << "5. enter letter ";
    std::cin >> ch;
    ReplaceFirstLetter(vwords, ch);
    for (size_t i = 0; i < vwords.size(); i++)
        std::cout << "words[" << i << "] = " << vwords[i] << "\t";
    return 0;
}

void ReplaceFirstLetter(std::vector<std::string>& vwords, char& c)
{
    std::string str;
    char    tmp(c);
    //std::string delim(c);
    for (size_t i = 0; i < vwords.size(); i++)
    {
        str = vwords[i];
        //for (size_t j = 0; j <  )
        str[0] = tmp; //.replace(0, 1, c);//str);
        vwords[i] = str;
    }
}

std::string ReverseString(std::string str)
{
    std::string result;
    for (int i = str.length() - 1; i >= 0; i--)
        result += str[i];
    return result;
}

std::string SmallestWord(std::vector<std::string>& v)
{
    size_t len = v[0].size();
    size_t pos = 0;
    //std::string result;
    for (size_t i = 0; i < v.size(); i++)
    {
        if (len > v[i].size())
        {
            len = v[i].size();
            pos = i;
        }
    }
    return v[pos];
}

std::string Abbrev(std::vector<std::string>& v)
{
    std::string str;
    std::string result;
    for (size_t i = 0; i < v.size(); i++)
    {
        str = v[i];
        if (str.size() < 2) continue;
        result += str.substr((str.size() - 2), 1);
    }
    return result;
}

std::vector<std::string> split(const std::string& str, const std::string& delim)
{
    std::vector<std::string> result;

    size_t found = str.find(delim);
    size_t startIndex = 0;

    while (found != std::string::npos)
    {
        result.emplace_back(str.begin() + startIndex, str.begin() + found);
        startIndex = found + delim.size();
        found = str.find(delim, startIndex);
    }
    if (startIndex != str.size())
        result.emplace_back(str.begin() + startIndex, str.end());
    return result;
}

size_t NumLetters(std::string str, char c)
{
    size_t num = 0;
    for (size_t i = 0; i < str.size(); i++)
    {
        if (str[i] == c)
        {
            num++;
        }
    }
    return num;
}

size_t NumLetters(std::string str)
{
    size_t num = 0;
    for (size_t i = 0; i < str.size(); i++)
    {
        if (!std::isspace(str[i]))
        {
            num++;
        }
    }
    // str[i] == '\t' || str[i] == )
    return num;
}

2

Re: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

1. Ви не дотримуєтеся єдиного стилю назв, це погано. Або split і replace_first_letter, або Split і ReplaceFirstLetter, але не одночасно.
2. Дуже багато зайвих рухів, копіювань у проміжні змінні і т.д. Наприклад

void ReplaceFirstLetter(std::vector<std::string>& vwords, char c)
{
    for (size_t i = 0; i < vwords.size(); i++)
    {
        vwords[i][0] = c;
    }
}

А починаючи з C++11, це можна скоротити до

void ReplaceFirstLetter(std::vector<std::string>& vwords, char c)
{
    for (std::string& str: vwords)
    {
        str[0] = c;
    }
}

3. Зайві копіювання при передачі в параметри

std::string ReverseString(const std::string& str)

4. Невикористання стандартних функцій

std::string ReverseString(const std::string& str)
{
    std::string result = str;
    std::reverse(result.begin(), result.end());
    return result;
}

Ну а так видно, що старалися. Але до джуна ще рости.

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

3

Re: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

А так нормально? Ну можна ж по різному назвати?

size_t NumLetters(std::string str, char c)
{
    size_t num = 0;
    for (size_t i = 0; i < str.size(); i++)
    {
        if (str[i] == c)
        {
            num++;
        }
    }
    return num;
}

size_t NumLetters(std::string str)
{
    size_t num = 0;
    for (size_t i = 0; i < str.size(); i++)
    {
        if (!std::isspace(str[i]))
        {
            num++;
        }
    }
    // str[i] == '\t' || str[i] == )
    return num;
}

4

Re: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

Olex_V написав:

А так нормально? Ну можна ж по різному назвати?

Ви маєте на увазі, що функція перевантажена? C++ це дозволяє і навіть певним чином заохочує.
Хоча, звісно, писати цілі дві функції для

value = std::count_if(inputsring.begin(), inputsring.end(), c);
...
value = std::count_if(inputsring.begin(), inputsring.end(), [](char c){return !isspace(c);});
...

дійсно трохи надмірно.

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

5

Re: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

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

А як на рахунок Regex? я кілька разів зустрічав рішення на кодеварс, які короткі та незрозумілі.

6

Re: Вивести кількість букв у реченні, введеному з клавіатури, не враховуюч

Olex_V написав:

та незрозумілі.

Ви просто чудово сформулювали основну проблему регулярок.