K & R Глава 1.5.4: «Как бы вы протестировали программу подсчета слов?» - PullRequest
0 голосов
/ 06 апреля 2020

Начинающий здесь.

В учебнике ANSI C от K & R, стр. 20, они спрашивают: Как бы вы протестировали программу подсчета слов?

Я скопировал именно из текста книга, используя CodeBlocks IDE, консольное приложение. Я видел много отличных входных тестов онлайн, но мой вопрос еще тупее. Как мне на самом деле что-то ввести? Ничего не происходит, когда я нажимаю Enter. У меня есть эта проблема, потому что я использую IDE и поэтому не учусь правильно запускать программы C? Заранее спасибо. Я добавил картинку, чтобы показать вам, что я имею в виду

Вот код:

#include <stdio.h>

#define IN 1    /* inside a word */
#define OUT 0   /* outside a word */

/* counts lines, words and characters as input */

main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    /* set these three constants to 0: */
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF){
        ++nc;
        if (c == '\n')
            ++nl;
            /* || == OR (&& == AND)
            evaluation of the following line
            will stop as soon as the truth or
            falsehood is known, so the order matters */
        if (c == ' ' || c == '\n' == c == '\t')
            state = OUT;
        else if (state == OUT){
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Программа для подсчета слов в K & R 2nd edition предназначена для работы в среде, в которой вы как-то сигнализируете о конце ввода. Обычно, так как они использовали UNIX все время, они использовали последовательность Ctrl-D (которая действительна, если вы запускаете программу в Linux или любой Unix -подобной операционной системе). Так было с раннего начала UNIX system.

Windows сигнализирует об окончании ввода в консольном приложении вводом Ctrl-Z (возможно, за которым следует клавиша возврата на клавиатуре)

Если вы перенаправляете ввод из файла (например, когда вы говорите a.out <my_input_file.txt), вы получите количество слов в конце, когда в файле больше нет ввода.

Вы запускаете программу в IDE, это то, что обычно скрывает вас там, где стандартный ввод и стандартный вывод go, или как сигнализировать окну, которое вы показываете, как сказать, что в программе больше нет ввода.

Для программы, чтобы добраться до нее конец, вы должны сначала узнать, как закончить ввод.

0 голосов
/ 06 апреля 2020

В примерах в K & R не указывается тип возврата main, который недопустим в современном C, поэтому добавьте int до main():

#include <stdio.h>

#define IN 1    /* inside a word */
#define OUT 0   /* outside a word */

/* counts lines, words and characters as input */

int main()
{
    int c, nl, nw, nc, state;

    state = OUT;
    /* set these three constants to 0: */
    nl = nw = nc = 0;
    while ((c = getchar()) != EOF){
        ++nc;
        if (c == '\n')
            ++nl;
            /* || == OR (&& == AND)
            evaluation of the following line
            will stop as soon as the truth or
            falsehood is known, so the order matters */
        if (c == ' ' || c == '\n' == c == '\t')
            state = OUT;
        else if (state == OUT){
            state = IN;
            ++nw;
        }
    }
    printf("%d %d %d\n", nl, nw, nc);
}

" Как на самом деле что-то вводить? Когда я нажимаю клавишу ввода, ничего не происходит."

Если у вас возникли проблемы с вашей средой IDE, просто запустите ее онлайн .

" Как бы вы протестировали программу подсчета слов "?

Чтобы привести авторов пакета решений K & R с ответом на этот конкретный вопрос здесь :

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

  1. входной файл содержит ноль слов
  2. входной файл содержит 1 огромное слово без каких-либо переносов
  3. входной файл содержит все пробелы без переносов
  4. входной файл содержит 66000 новых строк
  5. входной файл содержит слово / {огромная последовательность пробелов различных> видов} / word
  6. входной файл содержит 66000 однобуквенных слов, от 66 до строка
  7. входной файл содержит 66000 слов без перевода строки
  8. входной файл представляет собой содержимое / usr / dict (или эквивалентное)
  9. входной файл представляет собой полную коллекцию слов
  10. входной файл является двоичным (например, его собственный исполняемый файл)
  11. входной файл / dev / null (или эквивалентный)

66000 выбран для проверки целочисленного переполнения на маленькое целое число машины.

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