Как проверить программу подсчета слов, если есть обнаруженные ошибки? - PullRequest
6 голосов
/ 19 апреля 2011

Я только что вернулся к классическому учебнику по Си K & R. И прочитайте упражнение 1-11:

Как бы вы протестировали программу подсчета слов? Какие виды ввода чаще всего обнаруживают ошибки, если они есть?

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

Я что-то пропустил? И в чем подвох теста?

EDIT

Краткое содержание ответов:

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

  • слово для ссылки: "кошачья прогулка"
  • маленькое слово: a, b, c
  • biiiiiig слов: "fooooooooo <40MILLIONLETTERS> ooooooo a" имеет 3 слова

граничные условия:

  • Тексты с несколькими пробелами между словами.
  • Тексты больше 2ГБ
  • Слова, содержащие тире, но без пробелов.
  • Неаскские слова.
  • Файлы в другой кодировке (если ваша программа это поддерживает)
  • Символы, которые окружены пробелами, но не содержат символов слова (например, "hello - world")
  • Тексты без слов
  • Тексты со всеми словами в одной строке

Ответы [ 5 ]

2 голосов
/ 19 апреля 2011

Вот несколько примеров текстов, которые могут раскрыть ошибки:

  • Тексты с несколькими пробелами между словами.
  • Тексты больше 2 ГБ
  • Слова, содержащие тире, но без пробелов.
  • Неаскские слова.
  • Файлы в другой кодировке (если ваша программа это поддерживает)
  • Символы, которые окружены пробелами, но не содержат символов слова (например, "hello - world")
  • Тексты без слов
  • Тексты со всеми словами в одной строке
2 голосов
/ 19 апреля 2011

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

Итак, чтобы протестировать эту программу, вы должны подумать, гдеугловые случаи: " связанные слова " считаются одним или двумя словами?Вы считаете " I'm " одним или двумя?И т.д. ..

Что касается упражнения K & R, я думаю, что они добровольно забыли некоторые из этих угловых случаев, и они предлагают вам, анализируя их код, найти эти предостережения.

1 голос
/ 19 апреля 2011

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

Этот тест должен охватывать:

  • Большинство возможных комбинаций ввода;
  • «пограничных» дел. В вашем случае это может быть: одно слово, 2 слова с большим количеством разделителей, короткий текст начинается и заканчивается разделителями, и т. Д .;
  • Какой-то странный текст. Просто посмотрите на алгоритм и постарайтесь придумать странный вход, который может его сломать. Обычно это довольно маленькие текстовые (3-4) слова, но между ними есть странные разделители, например "hello,word", "hello ,word", "hello word,,,,"
1 голос
/ 19 апреля 2011

Я не перечитал упражнение 1-11 для этого ответа ... (моя книга в 60 км)

Вещи, которые могли быть закодированы неправильно

  • smallслова: "a b c d" имеет 4 слова
  • biiiiiig слов: "a fooooooooo<40MILLIONLETTERS>ooooooo a" имеет 3 слова
  • использование нескольких символов: ",.!? ...

Определения, которые могут небыли поняты

  • "cat-walk" 1 слово?2 слова?
  • "under-\nstood" перевод строки (с дефисом) в середине слова
0 голосов
/ 20 апреля 2011

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

Прежде всего, K & R не хочет, чтобы вы обнаружили все недостатки их кода.Цель этого упражнения заключается в том, чтобы вы знали о том, что часто существует фальшивый вклад и что однажды можно ожидать, что каким-то образом справится с ним в аналогичной ситуации.Как вы это делаете, полностью зависит от вас.Просто помните, что некоторые, казалось бы, легкие проблемы иногда требуют тщательного обдумывания.

Смысл в том случае: когда мой глупый iPhone получает сообщение «foo is bad.it запах», он распознает «bad.it» какURL.Кажется забавным, но пока вы не можете исправить эту ошибку, не требуя изменения самого содержимого сообщения.

И второе, ваш заголовок вводит в заблуждение.Невозможно найти все ошибки в программе, просто протестировав .Или, как однажды сказал Эдсгер Дейкстра:

Тестирование показывает наличие , а не отсутствие ошибок.

Thisявляется фундаментальным результатом теоретической информатики и может быть доказано.См. теорему Райса , если вам интересно.

РЕДАКТИРОВАТЬ: при написании этой публикации я обнаружил ошибку, которая как-то связана с нашей темой: парсер StackOverflow не распознает "http://en.wikipedia.org/wiki/Rice's_theorem" как URL.: -)

EDIT2: подал отчет об ошибке в meta здесь .

...