Программа для поиска статистики по длине слова - PullRequest
0 голосов
/ 07 июня 2019

Ожидается, что я сделаю программу для расчета и отображения статистики о длине слов в текстовом файле.Мне был предоставлен следующий файл

int readFile(const char fName[], char textStr[]){
    FILE *fPtr;
    char ch;
    int size = 0;

    if ((fPtr = fopen(fName, "r")) == NULL) {
        fprintf(stderr, "Error, failed to open %s: ", fName);
        perror("");
        return 1;
    }

    while ((ch = fgetc(fPtr)) != EOF) {
        if (size >= MAX_FILE - 1)
            break;
        textStr[size++] = ch;
    }

    textStr[size] = '\0';

    return size;
}

Я смог проверить, могу ли я получить доступ к файлу, используя следующий код

int main() {
    char str[MAX_FILE];
    int len = readFile("test.txt", str);
    if (len == -1) {
        printf("An error occurred\n");
    } else {
        printf("file read");
    }
}

Файл test.txt содержит

The quick brown fox jumps over the lazy dog

Что я хочу сделать, так это получить содержимое test.txt и найти длину каждого слова в нем, например: -

1 letter words- 0
2 letter words - 0
3 letter words - 3
4 letter words -4

и т. Д. *

1 Ответ

1 голос
/ 07 июня 2019

Как новый сотрудник, я собираюсь дать вам перерыв и постараюсь ответить на вопрос, который вы не задавали. ;)

Я полагаю, что вопрос "как действовать". Это будет длинный ответ , так как я постараюсь быть очень подробным, поскольку вы, кажется, новичок. Надеюсь, это поможет вам или кому-то еще.

Хитрость заключается в том, чтобы взять словесную задачу и преобразовать ее в математическое решение. Лучший способ сделать это - написать «псевдокод». (См. Википедия для получения дополнительной информации, если вам нужно.) В конце я собираюсь дать вам некоторый псевдокод, но поскольку это, кажется, домашнее задание, пожалуйста, попробуйте сначала написать свой собственный псевдокод. , Если вы читаете псевдокод, и он все равно не помогает, я могу опубликовать свое решение позже. (Я не очень хороший программист, так что это может быть не самая лучшая программа 1010 *. И это потребовало слишком много времени, чтобы придумать это.)

Перво-наперво: в коде, который вы разместили, есть опечатка. В предоставленном вами исходном коде проблема заключается в операторе return 1, если файл не найден. Это должно быть return -1, потому что, что случилось бы, если бы у вас был тестовый файл, который имел ровно 1 букву? Код не будет работать правильно.

Теперь, чтобы сначала преобразовать проблему слова, которую вам дали: вам нужно иметь массив слов, чтобы отслеживать 1-буквенные, 2-буквенные и т. Д. Слова. Теперь согласно это самое длинное слово в словаре английского языка - 45 букв. Итак, теоретически, вам нужно иметь массив из 45 элементов wordCounts. Вы можете сократить это по мере необходимости.

Теперь, чтобы обработать переменную str, вам нужен оператор while, чтобы пройти по одному символу за раз. Поскольку символы в строке идут от элемента 0 до единицы, меньшего, чем переменная len, вам необходимо соответствующим образом кодировать while.

В этом while вам нужно еще while. Это время должно подсчитывать wordLength по одному символу за раз, пока вы не увидите пробел или завершающий символ '/ 0' str. Для этого вы инициализируете wordLength на ноль прямо перед вторым временем. Затем добавьте 1 к wordLength для каждого подсчитанного вами символа и увеличьте значение subscript.

В конце этого внутреннего while вам нужно накопить свои wordCounts. Имейте в виду, что ваши однобуквенные слова будут накапливаться в элементе 0 вашего массива. Поэтому вам нужно настроить элемент массива wordLength - 1. После этого вам нужно увеличить свой индекс, который вы используете, чтобы пройти по str, по одному символу за раз.

В конце вам нужно распечатать значения массива wordCounts. Так как большинство длин слов будет иметь значение ноль, я бы не стал их печатать. Если вы не установите максимальную длину массива wordCounts равной 10, а не 45. Вы хотите, чтобы цикл for проходил через ваш массив wordCounts и делал что-то вроде этого: printf("%2d letter words = %d", ..., ...);. Имейте в виду, что ваши однобуквенные слова будут в элементе 0;

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

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

Объявите числовой массив wordCounts и subscript.

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

Повторная инициализация subscript до нуля.

Пока (while) нижний индекс меньше len, продолжайте.

Инициализировать wordLength на ноль.

Пока str[subscript] не является пустым или нулевым символом, добавьте 1 к длине слова.

Увеличить индекс.

После того, как оба while выражения завершены, распечатайте массив wordLengths, как описано выше.

Готово!

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

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