C ++ строки манипуляции / ввода - PullRequest
0 голосов
/ 15 ноября 2009

Это для домашней работы! Но мне все равно нужна помощь. Назначение состоит в том, чтобы ввести предложение, а затем вывести количество слов и количество вхождений каждой буквы. Вывод должен иметь буквы в алфавитном порядке. До сих пор мне удавалось подсчитать количество слов и перевести все буквы в нижний регистр, чтобы я мог вести их подсчет. Мой вопрос заключается в том, как вести учет букв. Пример вывода:

I say Hi.

3 words
1 a
1 h
2 i
1 s
1 y

Вот код, который у меня есть:

#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()
{
    int letters[26];
    char letter;
    int word = 0;

    cout << "Please enter a sentence: "<< endl;

    do 
      {
        cin.get(letter);
        if(isspace(letter))
           word++;

        letter = tolower(letter);
        cout << letter;

      }
    while (letter != '\n');


cout << "The number of words = " << word << endl;

return 0;

}

Должен ли я вводить непосредственно в C-строку? или это испортит счет слов?

Ответы [ 4 ]

3 голосов
/ 15 ноября 2009

Мой вопрос, как на самом деле сохранить количество букв

Это довольно просто. Просто создайте массив из 26 целых чисел (по одному на каждую букву) и инициализируйте его нулем.

int letters[26] = { 0 }; // Initialize array to zero

Каждое значение в массиве соответствует количеству конкретной буквы. Индекс массива 0 относится к 'a', индекс массива 1 относится к 'b' и так далее. Затем каждый раз, когда вы встречаете букву, увеличивайте соответствующее значение в массиве. Вы можете использовать символ «a» (значение ASCII 97) в качестве начального смещения. Итак, с учетом переменной char letter; вы бы сделали:

++letters[tolower(letter) - 'a'];

Но всегда убедитесь, что , прежде чем увеличивать соответствующее значение в массиве, вы проверяете isalpha(letter) && islower(letter), чтобы убедиться, что ваша буква находится в диапазоне строчных букв a-z; в противном случае вы получите доступ к индексу за пределами массива. Вы также можете проверить это состояние, сказав if (letter >= 'a' && letter <= 'z').

3 голосов
/ 15 ноября 2009

Если вам разрешено использовать STL, используйте std :: map для отображения букв на счетчики. Это будет дополнительно сортировать буквы.

В противном случае обрабатывайте символы как индексы в массиве счетчиков и увеличивайте их.

0 голосов
/ 15 ноября 2009

Хм, всего несколько пунктов, чтобы сделать домашнее задание более полезным для вас (и ваш код более правильным):

  • Подумайте, что произойдет, если у вас есть файл с несколькими пробелами подряд (подсчет слов).
  • Подумайте, как быть более правильным с «буквами» (по крайней мере, проверьте isalpha ()). Также isalpha () может быть ключом для более простого подсчета с фиксированным массивом [256] (это может быть даже лучшим решением для производительности по сравнению с использованием std :: map, в любом случае проверьте документацию std :: map).
  • Подумайте о более эффективном вводе файлов. По крайней мере, строка сразу.
0 голосов
/ 15 ноября 2009

Подсказка: tolower (буква) - 'a' is:

0 if letter is a
1 if letter is b
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...