2013-03-19 2 views
0

Я работаю через C++ Primer 5th edition, чтобы научить себя C++. Я столкнулся с проблемой в книге, которую я не знаю, как решить в главе 5, используя инструменты, которые они мне дали до сих пор. У меня есть предыдущий опыт программирования, и я решил это самостоятельно, используя noskipws. Я ищу помощь в решении этой проблемы при минимальном использовании библиотек, подумайте о первых 4-5 главах книги для начинающих.Подсчет новых строк, вкладок и пробелов

Проблема заключается в том, чтобы находить и подсчитывать все гласные, пробелы, символы табуляции и символы новой строки, поскольку они читаются с использованием операторов if. Мое решение проблемы:

// Exercise 5.9 
int main() 
{ 
char c; 
int aCount = 0; 
int eCount = 0; 
int iCount = 0; 
int oCount = 0; 
int uCount = 0; 
int blankCount = 0; 
int newLineCount = 0; 
int tabCount = 0; 
while (cin >> noskipws >> c) 
{  
    if(c == 'a' || c == 'A') 
     aCount++; 
    else if(c == 'e' || c == 'E') 
     eCount++; 
    else if(c == 'i' || c == 'I') 
     iCount++; 
    else if(c == 'o' || c == 'O') 
     oCount++; 
    else if(c == 'u' || c == 'U') 
     uCount++;  
    else if(c == ' ') 
     blankCount++;  
    else if(c == '\t') 
     tabCount++;  
    else if(c == '\n') 
     newLineCount++;  
} 
cout << "The number of a's: " << aCount << endl; 
cout << "The number of e's: " << eCount << endl; 
cout << "The number of i's: " << iCount << endl; 
cout << "The number of o's: " << oCount << endl; 
cout << "The number of u's: " << uCount << endl; 
cout << "The number of blanks: " << blankCount << endl; 
cout << "The number of tabs: " << tabCount << endl; 
cout << "The number of new lines: " << newLineCount << endl;  
return 0; 
} 

Единственный способ, которым я могу думать, чтобы решить это с помощью GetLine(), а затем рассчитывает количество раз это петли, чтобы получить «/ п» подсчитывать, а затем пошагово каждой строке, чтобы найти '/ t' и ''.

Благодарим за помощь заранее.

+5

В чем ваш вопрос? –

+0

То, как вы это делаете, кажется мне прекрасным! Если вы ищете способ сократить свой код, вы можете разместить символы, которые вы ищете, в структуре данных, а затем проверить каждый символ против него. Но ваша реализация выполняет свою работу. –

+1

Я ищу, как решить эту проблему, не используя что-то вроде noskipws. Я хочу знать, как книга ожидает, что эта проблема будет решена с ограниченными вещами, которые они мне дали до сих пор. noskipws не воспитывается еще в 10 главах. –

ответ

5

Вы можете избежать noskipws, заменив этот

while (cin >> noskipws >> c) 

с

while (cin.get(c)) 

Оператор экстракции >> соблюдает правила разделителей, включая пробелы.

istream::get не делает и извлекает данные стенографически.

+0

Это работает, но моя единственная проблема с этим - получить также не упоминается в книге еще на 8 или около того, только ссылка getline() уже упоминалась. Я начинаю думать, что решение этого конкретного вопроса было недосмотром авторов, потому что инструменты, такие как get и noskipws, не были введены. –

+0

@MK И в чем проблема с 'getline()'? Конечно, он переносит новую строку, но вы можете проверить для потока 'eof()', и если он не установлен, там была новая строка. – Angew

+0

@MK Возможно. «Только другой способ», который вы упомянули, также прочен. –

0

Ваш код работает perfectly fine:

Вход:

This is a test or something 
New line 
12345 
Test 21 

Выход:

The number of a's: 1 
The number of e's: 5 
The number of i's: 4 
The number of o's: 2 
The number of u's: 0 
The number of blanks: 7 
The number of tabs: 0 
The number of new lines: 3 

Я бы рекомендовал проверить функцию std::tolower(), для тестирования верхней и символы нижнего регистра в одно и то же время. Кроме того, для проверки на любой вид письма, посмотрите на std::isalpha() std::isdigit(), std::isspace() и аналогичные функции.

Кроме того, вы можете сделать функцию не зависящей от std :: cin, а вместо этого использовать std :: cin для получения строки и передать строку в функцию, таким образом, эту функцию можно использовать для любой строки, а не только вход std :: cin.

Чтобы избежать использования noskipws (который лично я считаю, это хорошо), один вариант, чтобы сделать это: (в качестве альтернативного варианта для других решений уже предложенных)

std::string str; 
//Continue grabbing text up until the first '#' is entered. 
std::getline(cin, str, '#'); 
//Pass the string into your own custom function, to keep your function detached from the input. 
countCharacters(str); 

(см here for an example)

+0

Спасибо, я проверю их. –

Смежные вопросы