Программа, которая принимает введенные пользователем символы и отображает их в порядке убывания - PullRequest
0 голосов
/ 25 июня 2018

"Напишите программу, которая читает последовательность символов, введенную пользователем и завершенную точкой ('.'). Ваша программа должна позволять пользователю вводить несколько строк ввода, нажимая клавишу ввода наконец каждой строки. Программа должна распечатать таблицу частот, отсортированную в порядке убывания по количеству вхождений, перечисляя каждую встречающуюся букву, а также количество повторений. Все не алфавитные символы должны игнорироваться. Любые введенные символыпосле того, как точка ('.') должна быть оставлена ​​во входном потоке необработанной. Не допускается ограничение длины входных данных. "

Я не знаю, с чего начать.Пока что это то, что я придумал:

#include<iostream>
using namespace std;



  int main(){


        int count=0;
    char ch[count];
    int i=0;

    cout<<"Enter a sequence of characters (end with '.'): ";
    cin>>ch[count];
    while(ch[count]!='.')
    {
        count++;
        cin>>ch[count];


    }

    cout<<"There were "<<count<<" characters in the string"<<endl;
    return 0;
 }

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

Мой инструктор предложил использовать структуру, но сейчас мне просто нужно направление.Вывод должен быть отформатирован следующим образом:

Enter a sequence of characters (end with '.'): do be Do bo. xyz


Letter:    Number of Occurrences

o     3
d     2
b     2
e     1

Я не прошу, чтобы кто-нибудь сделал кодирование для меня, мне просто нужна помощь о том, с чего начать и как заставить отображать символы.Мы не можем использовать строковый класс и, следовательно, любые строковые функции, кроме strlen().

Ответы [ 2 ]

0 голосов
/ 26 июня 2018

Есть две части, которые необходимо решить.Во-первых, читая один за другим символы, игнорируя любой не-альфа-символ и считая остальные;Во-вторых, выведите результаты в порядке убывания.

Первая часть может быть решена путем простой обработки символа как значения ASCII от 0 до 255 (т. Е. В диапазоне без знака) и наличия массиварассчитывает для каждого из этих значений.

Во-вторых, вы можете просто просмотреть счетчик, найти максимум и распечатать его.Продолжайте до тех пор, пока все значения> 0 не будут учтены.

См. Следующий код, иллюстрирующий этот подход:

#include <sstream>

int main() {

    stringstream ss("do be Do bo. xyz");
    unsigned char c;
    unsigned int counts[256] = {0};
    while (ss >> c && c != '.') {
        if (! isalpha(c)) {
            continue;
        }
        c = tolower(c);
        counts[c]++;
    }

    while (1) {
        // find next maximum
        int max = 0;
        int maxPos = -1;
        for (int i=0; i<256; i++) {
            if (counts[i] > max) {
                max = counts[i];
                maxPos = i;
            }
        }
        if (max == 0) {
            break;
        }
        else {
            cout << (char)maxPos << ":" << max << endl;
            counts[maxPos] = 0; // don't consider this pos in next run
        }
    }
}

Вывод:

o:3
b:2
d:2
e:1
0 голосов
/ 26 июня 2018

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

Прежде всего, я бы начал с добавления этой строки в ваш код в начале вашего main

ios::sync_with_stdio(false);

Эта строка значительно ускорит ваш код, потому что ввод-вывод C ++ больше не синхронизируется с вводом-выводом C, поэтому он устраняет значительные накладные расходы, но имейте в виду, что вы получите бессмысленный мусор, если вы смешаете два ввода-выводаO библиотеки после этой строки.

Как только ввод / вывод будет готов, я бы добавил код, который считывает входные данные и подсчитывает вхождения.Для этого вас должна заинтересовать одна конкретная функция - get .Теперь вам просто нужен массив целых чисел, который больше 0 (должен соответствовать любым символам, которые могут появиться в качестве входных данных, набор символов должен быть указан где-то, но безопасное число будет равно 256 для ASCII), цикл, условиеэто завершает цикл (char из input == '.'), и вы почти закончили чтение и подсчет (для этого не нужно никаких функций!).

Сортировка не так уж и ужасна.Скорее всего, пузырьковая сортировка - это не самый лучший способ, но сколько там символов?40-иш?50-иш?100-иш?Если вы не превысите 300-500 символов, не стоит реализовывать лучший из когда-либо неизвестных makind O(lgn) время, O(1) пространство, алгоритм устойчивой сортировки, потому что он может работать в среднем хуже, чем более простые алгоритмы.Ищите сортировку слиянием или быструю сортировку, если вам нужен сверхмощный алгоритм, или ищите более простые альтернативы, например, пузырьковую сортировку (самый простой и самый медленный) или сортировку вставкой.

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