2015-06-25 2 views
-1

Я хочу иметь многострочный ввод текста и иметь возможность подсчитывать количество строчных букв, прописных букв, периодов , запятые, пробелы, разрывы строк и другие символы на входе.Программа, которая подсчитывает количество типов букв в абзаце, C++

Я пытаюсь использовать только одну строку с getline для входов в цикле while с количеством запусков для каждой категории препинания.

Я просто не знаю, как на самом деле выяснить, сколько из каждого типа символов есть в каждой строке. Учитывая строку, как я могу подсчитать количество каждого типа?

Вот мой код до сих пор (очевидно, неполным):

#include <iostream> 
#include <iomanip> 
#include <cstdlib> 
#include <cmath> 
#include <string> 

using namespace std; 

int main(){ 
    cout << "This program takes any number of sentences as inputs. " << endl; 
    cout << "It will count the number of lower-case letters and upper-case letters. " << endl; 
    cout << "It will also count the number of periods, exclamation marks, spaces, end-lines, etc. " << endl; 
    cout << " " << endl; 
    cout << "Please type your text, pressing enter whenever you wish to end a line. " << endl; 
    cout << "Use the EOF key (CTRL + Z on Windows) when you are finished. " << endl; 

    string InputString; // This is the string that will be used iteratively, for each line. 

    int NumberOfLowerCase = 0; 
    int NumberOfUpperCase = 0; 
    int NumberOfSpaces = 0;  // spaces 
    int NumberOfTabs = 0;  // tabs 
    int NumberOfPeriods = 0; // periods 
    int NumberOfCommas = 0;  // commas 
    int NumberOfOtherChars = 0; // other characters 
    int NumberOfEnters = 0;  // end of line, will be incremented each loop 

    do { 
     getline(cin, InputString); // input 
     cout << InputString << endl; // filler just to test the input 
     NumberOfLowerCase = NumberOfLowerCase + 0 // I don't know what I should be adding 
                // (obviously not zero, that's just a filler) 
    } while (!cin.eof() && cin.good()); 

    system("pause"); 
    return 0; 
} 
+0

Почему downvotes? – terrace

+0

Проверьте каждый символ в коммутаторе или с помощью if-утверждений. Постройте соответствующий счетчик соответственно. – Matt

+0

Я не проголосовал за вас, но есть ряд вопросов, которые уже затрагивают это, и, вероятно, много ресурсов в Интернете. Вот один из них: http://stackoverflow.com/questions/28948722/how-to-code-ac-program-which-counts-the-number-of-uppercase-letters-lowercas – DigitalNinja

ответ

1

Если вы просто хотите, количество уникальных символов, используйте set! Вы можете подтолкнуть всех своих персонажей к набору, а затем просто проверить, насколько большой набор, и вам будет хорошо!

Если вы действительно хотите знать, сколько из каждого персонажа есть, вы можете использовать map (который на самом деле использует комплект под капотом!). С картой, учитывая некоторый характер c, вы могли бы сделать

std::map<char, int> counter; 
//do stuff... 
counter[c]++; //increment the number of character c we've found 
//do more stuff... 
std::cout << "Found " << counter['A'] << " A's!" << std::endl; 
+0

Я не могу выдвинуть этот ответ .. Этот сайт wtf – terrace

+0

В любом случае, спасибо :) – terrace

+0

@TerrenceTown, если это был ответ, который вы искали, пожалуйста [примите это] (http://stackoverflow.com/help/accepted-answer). Если нет, дайте мне знать, что еще вы хотите знать! – scohe001

1

См these полезных функций. Вот что вы бы сделали:

std::string s = /*...*/; 

for(auto c : s) { 
    if(std::islower(c))  ++NumberOfLowerCase; 
    else if(std::isupper(c)) ++NumberOfUpperCase; 
    else if(c == ' ')  ++NumberOfSpaces; 
    else if(c == '\t')  ++NumberOfTabs; 
    else if(c == '.')  ++NumberOfPeriods; 
    else if(c == ',')  ++NumberOfCommas; 
    else      ++NumberOfOtherChars; 
} 
0

Вот очень простой пример, который я написал очень быстро. Конечно, есть лучшие способы сделать это, но это должно дать вам представление о том, как вы могли это сделать. Один вопрос: читаете ли вы из файла или из istream непосредственно с консоли?

int lowerCase = 0; 
int upperCase = 0; 
int spaces = 0;  // spaces 
int tabs = 0;  // tabs 
int newLines = 0; // end of line, will be incremented each loop 
int periods = 0; // periods 
int commas = 0;  // commas 
int otherChars = 0; 

// read from istream, char by char 
for (char ch; cin >> noskipws >> ch;) { 
    // test which classification or char ch is and increment its count 
    if (islower(ch)) 
     ++lowerCase; 
    else if (isupper(ch)) 
     ++upperCase; 
    else if (ch == ' ') 
     ++spaces; 
    else if (ch == '\t') 
     ++tabs; 
    else if (ch == '\n') 
     ++newLines; 
    else if (ch == '.') 
     ++periods; 
    else if (ch == ',') 
     ++commas; 
    else 
     ++otherChars; 
} 

cout << "Number of characters of each type:\n"; 

cout << "lowerCase:\t" << lowerCase << '\n' 
    << "upperCase:\t" << upperCase << '\n' 
    << "spaces:\t\t" << spaces << '\n' 
    << "tabs:\t\t" << tabs << '\n' 
    << "periods:\t" << periods << '\n' 
    << "commas:\t\t" << commas << '\n' 
    << "newLines:\t" << newLines << '\n' 
    << "otherChars:\t" << otherChars << '\n'; 
Смежные вопросы