Как подсчитать вхождения каждой цифры в строке, используя int * count (const string & s) в c ++? - PullRequest
0 голосов
/ 14 мая 2018

Примечание: я не могу использовать карты или что-либо еще в библиотеке алгоритмов

У меня есть только основная функция, но я совершенно заблудился о том, как я должен написать функцию

#include <string>
#include <iostream>


using namespace std;


int* count(const string& s);

int main() {

    string userinput = "random word";

    int *counts = count(userinput);

    for (int i = 0; i < 11; i++) {
        cout << "Letter " << i << " occured " << counts[i] << " times.";
    }




    system("pause");

    return 0;
}



int* count(const string& s) {

    for (int i = 0; i < 11; i++)
    {
        return s[i];
    }
}

Функция int * count не верна и не будет компилироваться.Как я могу написать функцию, которая будет работать при возврате вхождений?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Не уверен, что вы хотели получить этот ответ, но я надеюсь, что он поможет вам разделить его на отдельные функции, но я сделал это за один раз

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string userInput = "random word";
    int fCharacter[256];


    for (int i = 0; i <= 255; i++)
    {
        fCharacter[i] = 0;
    }

    for (int i = 0; i < userInput.length(); i++)
    {
        fCharacter[userInput[i]]++;
    }
    cout << "The character changes are as follows" << endl;
    for (int i = 0; i <= 255; i++)
    {
        if (fCharacter[i] != 0)
        {
            cout << (char)i << endl; 
        }
    }

    system("pause");
    return 0;
}
0 голосов
/ 14 мая 2018

Как подсчитать вхождения каждой цифры в строке, используя int * count (const string & s) в c ++?Примечание: я не могу использовать карты или что-либо еще в библиотеке алгоритмов

Несколько замечаний:

  1. Всегда плохая идея, если мы этого не делаемследуйте простейшему способу решения проблемы, и грустно, что учителя являются инициаторами таких ситуаций.

  2. Нет необходимости в int*.который не обеспечивает вашего решения в любом случае.Если бы это был массив для подсчета символов вашей строки, то это может иметь смысл (т. Е. Указатель на массив).

  3. Старайтесь избегать практики с using namespace std;

Вы можете сделать что-то вроде следующего, если вам не разрешено использовать std::map<char, int>(подсказка для вашего альтернативного решения).

Я прокомментировал это, для лучшего понимания.

#include <string>
#include <iostream>
#include <cstddef>

// consider 128 ASCII decimal and their coresponding character codes
int charASCIIArray[128] = {0};

void count_char(const std::string& s)
{
   for(const auto& it: s)
   {
        if(('A' <= it && it <= 'Z') ||     // if char between (A,B,....,Z) or
           ('a' <= it && it <= 'z') )      //         between (a,b,....,z)
           charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
   }
}

int main()
{
   std::string userinput = "random words WITH *- aLl";

   count_char(userinput);
   for(std::size_t index = 0; index < 128; ++index)
      if(charASCIIArray[index] != 0)
        std::cout << "Letter " << static_cast<char>(index)  // convert back to char
                  << " occured " << charASCIIArray[index] << " times.\n";

   return 0;
}

Смотрите прямую трансляцию здесь : https://www.ideone.com/uFG2HJ

Letter H occured 1 times.
Letter I occured 1 times.
Letter L occured 1 times.
Letter T occured 1 times.
Letter W occured 1 times.
Letter a occured 2 times.
Letter d occured 2 times.
Letter l occured 1 times.
Letter m occured 1 times.
Letter n occured 1 times.
Letter o occured 2 times.
Letter r occured 2 times.
Letter s occured 1 times.
Letter w occured 1 times.

ОБНОВЛЕНИЕ

Вдохновленный комментарием @Fei Xiang, вот два более инженерных решения:

Во-первых, с возвращением указателя на динамическиймассив (который будет соответствовать фактическим требованиям вопроса): https://www.ideone.com/ouHqK4

#include <string>
#include <iostream>
#include <cstddef>

int* count_char(const std::string& s)
{
    // consider 128 ASCII decimal and their coresponding character codes
    int *charASCIIArray = new int[128]{0};
    for(const auto& it: s)
    {
        if(('A' <= it && it <= 'Z') ||     // if char between (A,B,....,Z) or
           ('a' <= it && it <= 'z') )      //         between (a,b,....,z)
           charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
    }
    return charASCIIArray;
}

int main()
{
    std::string userinput = "random words WITH *- aLl";

    int *charASCIIArray = count_char(userinput);
    for(std::size_t index = 0; index < 128; ++index)
        if(charASCIIArray[index] != 0)
        std::cout << "Letter " << static_cast<char>(index)  // convert back to char
                  << " occured " << charASCIIArray[index] << " times.\n";

    delete[] charASCIIArray;
    return 0;
}

Во-вторых, с умным указателем (std::unique_ptr): https://www.ideone.com/dfc62J

#include <string>
#include <iostream>
#include <cstddef>
#include <memory>
#include <utility>

std::unique_ptr<int[]> count_char(const std::string& s)
{
    // consider 128 ASCII decimal and their coresponding character codes
    std::unique_ptr<int[]> charASCIIArray = std::unique_ptr<int[]>(new int[128]{0});
    for (const auto& it : s)
    {
        if (('A' <= it && it <= 'Z') ||     // if char between (A,B,....,Z) or
            ('a' <= it && it <= 'z'))       //         between (a,b,....,z)
            charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
    }
    return std::move(charASCIIArray);
}

int main()
{
    std::string userinput = "random words WITH *- aLl";

    std::unique_ptr<int[]> charASCIIArray = count_char(userinput);
    for (std::size_t index = 0; index < 128; ++index)
        if (charASCIIArray[index] != 0)
            std::cout << "Letter " << static_cast<char>(index)  // convert back to char
            << " occured " << charASCIIArray[index] << " times.\n";

    return 0;
}
...