Как посчитать, сколько раз конкретная буква появляется в строке?(C ++) - PullRequest
0 голосов
/ 16 октября 2018

Я боролся с домашним заданием, которое подсчитывает количество экземпляров прописных букв, строчных букв и цифр в строке.появляется в строке.

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

В настоящее время это то, на что моя домашняя работа больше всего похожа.Это работа (конечно), поэтому ошибки в коде очень вероятны.

void LetterCount(char c_input[], int l_count)
{
// code to count letters
}

void CountOut(//not sure what should go here yet until counting gets figured out)
{
// code that handles output
}

int main()
{
    const int SIZE = 132;
    char CharInput[SIZE];
    int LetterCount = 0;
    cout << "Enter a string of up to 132 characters in size: ";
    cin.getline(CharInput, SIZE); 
    cout << "You entered: " << CharInput << endl;

    Count(CharInput);
    CountOut(//not sure what goes here yet);
    return 0;
}

Вывод будет выглядеть примерно так:

  a - 2
  b - 1
  c - 1
  d - 0
  e - 1

и т. Д.

Я попытался поэкспериментировать с циклами for для подсчета букв и видел несколько примеров функции gcount (), но у меня ничего не получалось.У кого-нибудь есть предложения относительно того, как мне считать буквы во введенной строке?

Ответы [ 4 ]

0 голосов
/ 16 октября 2018

Вы можете сделать это, сравнивая c-строки с другими c-строками.Но с символами и строками вы можете получить ошибки типа: «const * char не может быть сравнен со строками».Поэтому вам придется сравнивать каждый индекс строки c (массива) с другими индексами строки c.В этой программе я использую операторы if для поиска определенных гласных.Как это работает, так это то, что каждая «строковая строчная буква алфавита» равна строчным и заглавным буквам (для сравнения).это очень избыточный способ сделать это, и, если вы хотите сосчитать все суммарные буквы, возможно, вам следует попробовать другой способ, но этот метод не использует очень сложные методы, которые требуют более глубокого понимания.

using namespace std;

int main(){
int vowel;

string A = "aA";
string E = "eE";
string I = "iI";
string O = "oO";
string U = "uU";
string str;
string str1;

bool userLength = true; 
int restart = 0;

    do{
        cout << "Enter a string." <<endl;
            getline(cin, str);
int VowelA = 0;
int VowelE = 0;
int VowelI = 0;
int VowelO = 0;
int VowelU = 0;

    for(int x = 0; x < 100; x++){

if(restart == 1){
    restart = 0;
    x = 0;
}
if(A[0] == str[x]){
    VowelA = VowelA + 1;
}
if(E[0] == str[x]){
    VowelE = VowelE + 1;
}
if(I[0] == str[x]){
    VowelI = VowelI + 1;
}
if(O[0] == str[x]){
    VowelO = VowelO + 1;    
}
if(U[0] == str[x]){
    VowelU = VowelU + 1;    
}

if(A[1] == str[x]){
    VowelA = VowelA + 1;
}
if(E[1] == str[x]){
    VowelE = VowelE + 1;
}
if(I[1] == str[x]){
    VowelI = VowelI + 1;
}
if(O[1] == str[x]){
    VowelO = VowelO + 1;    
}
if(U[1] == str[x]){
    VowelU = VowelU + 1;    
}
int strL = str.length();
if(x == strL){
    cout << "The original string is: " << str << endl;
cout << "Vowel A: "<< VowelA << endl;
cout << "Vowel E: "<< VowelE << endl;
cout << "Vowel I: "<< VowelI << endl;
cout << "Vowel O: "<< VowelO << endl;
cout << "Vowel U: "<< VowelU << endl;
cout << " " << endl;
}
}

char choice;
cout << "Again? " << endl;

cin >> choice;

if(choice == 'n' || choice == 'N'){userLength = false;}
if(choice == 'y' || choice =='Y')
{
restart = 1;  userLength = true;
cin.clear();
cin.ignore();

}
//cout << "What string?";
//cin.get(str, sizeof(str),'\n');

}while(userLength == true);
}



/*
Sources:


printf help
http://www.cplusplus.com/reference/cstdio/printf/

This helped me with the idea of what's a vowel and whats not.
http://www.cplusplus.com/forum/general/71805/

understanding gets()
https://www.programiz.com/cpp-programming/library-function/cstdio/gets

Very important functional part of my program...Logic behind my if statements, fixed my issues with string comparison
What i needed to do was compare each part of one cstring with another c string
strstr compares two strings to see if they are alike to one another this source includes that idea-> https://www.youtube.com/watch?v=hGrKX0edRFg
so I got the idea: What is one c string was all e's, I could then compare each index for similarities with a c string whos definition was all e's.  
At this point, why not just go back to standard comparison with strings?  But you cant compare const chars to regular chars, so I needed to compare const chars to const chars
hence the idea sparked about the c strings that contained both e and E.
https://stackoverflow.com/questions/18794793/c-comparing-the-index-of-a-string-to-another-string
https://stackoverflow.com/questions/18794793/c-comparing-the-index-of-a-string-to-another-string

Fixed Error with using incremented numbers outside of involved forloop.
https://stackoverflow.com/questions/24117264/error-name-lookup-of-i-changed-for-iso-for-scoping-fpermissive

understanding the use of getline(cin, str_name)
https://stackoverflow.com/questions/5882872/reading-a-full-line-of-input
http://www.cplusplus.com/reference/istream/istream/getline/
http://www.cplusplus.com/forum/beginner/45169/

cin.clear - cin.ignore --fixing issue with cin buffer not accepting new input.
https://stackoverflow.com/questions/46204672/getlinecin-string-not-giving-expected-output


*/
0 голосов
/ 16 октября 2018

То, что вы хотите - это построить простую гистограмму , и это довольно легко сделать.Поскольку вы смотрите chars, и может быть 256 возможных значений 8-битного char (на практике ваша входная строка, вероятно, использует меньше, но мы будем консервативны здесь, потому что память дешева),Вы захотите начать с массива 256 ints, все они инициализированы нулем.Затем выполните итерацию над chars вашей строкой, и для каждого char в вашей строке используйте это значение char в качестве смещения в массиве (*) и просто увеличьте значение этого элемента в массиве.

Когда вы закончите, все, что вам остается, это перебрать ints в массиве и распечатать те, которые не равны нулю, и все готово.

(*) вы можете захотетьприведите char к unsigned char перед тем, как использовать его в качестве смещения в массиве, просто чтобы избежать любой вероятности того, что он будет интерпретирован как отрицательный индекс массива, что приведет к неопределенному поведению (это проблема, только если ваш вводстрока содержит ASCII символов от 128 и выше, поэтому в вашем случае это может не иметь значения, но всегда полезно создать код, который будет работать правильно во всех случаях, если вы можете)

0 голосов
/ 16 октября 2018

Как сказал Джереми Фриснер, вы строите гистограмму, но я не согласен с используемыми типами.

Вы захотите объявить свою гистограмму так:

size_t histogram[sizeof(char)*CHAR_BIT] = {0};

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

Что касается распечатки.Вы должны взглянуть на таблицу ASCII и проверить, какие значения вам нужно распечатать.

0 голосов
/ 16 октября 2018

map очень эффективная структура данных здесь

#include <iostream>
#include <map>
using namespace std;

int main(){
    string str = "a boy caught 2 fireflies";
    map<char, int> str_map;
    for(auto x : str) ++str_map[x];
    for(auto x : str_map) cout << x.first << ' ' << x.second << '\n';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...