Как найти наиболее частые буквы и количество вхождений из текстового файла? - PullRequest
0 голосов
/ 14 сентября 2018

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

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream inputFile;
    inputFile.open("letter_count.txt");
    string letter;

    char ch;
    char alphabet[26] = { 0 };
    int counts = 0;
    while (inputFile)
    {
        // Read file
        inputFile.get(ch); 
        if (isalpha(ch))
        {
            //Make all letters upper case    
            toupper(ch);

            //Counts number of occurrences for each letter
            if (ch >= 'A' || ch <= 'Z')
            {
                alphabet[counts++];
            }
        }
    }

    for (int i = 0; i < 26; i++) //Displays number of occurrences for each         character A-Z
    {
        cout << alphabet[i] << endl;
    }

    inputFile.close();
    system("pause");
    return 0;
}

1 Ответ

0 голосов
/ 14 сентября 2018
toupper(ch);

не меняет регистр гл. Функция toupper возвращает значение в верхнем регистре, поэтому вам нужно

ch = toupper(ch);

Далее

alphabet[counts++];

явно неверно, так как не использует значение ch. Вам нужен способ преобразования ch в целое число, чтобы вы могли использовать это целое число для индексации массива alphabet. То есть вам нужно преобразовать «A» -> 0, «B» -> 1, «C» -> 2 и т. д. Делая почти наверняка верное предположение, что вы используете набор символов ASCII, вы можете сделать это простым вычитанием

ch - 'A'

Соединяя это с инкрементным кодом, вы получаете

alphabet[ch - 'A']++;

Наконец-то это неправильно

for (int i = 0; i < 26; i++) //Displays number of occurrences for each         character A-Z
{
    cout << alphabet[counts] << endl;
}

, поскольку ваша переменная цикла i, но по какой-то причине вы использовали counts внутри цикла. Должно быть

for (int i = 0; i < 26; i++) //Displays number of occurrences for each         character A-Z
{
    cout << alphabet[i] << endl;
}

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

...