Консультация № 184927
22.12.2011, 18:47
61.71 руб.
0 6 0
Здравствуйте,уважаемые эксперты!
Помогите, пожалуйста, доработать программу, считающую количество слов в комментариях на Паскале(т.е. { и } или * и *) так,чтобы она не заваливалась на тестах:
1.Незакрытый комментарий(прим. {фыв вффв фвфв - ответом будет 3,а должно быть 0).
2.2 или более идущих подряд скобки "{" (прим. {{{ - выводит 1,а должно быть 0).
3.Комментарий,заключенный между { и *(прим. {фывва фвфв фвф вф* - ответом будет 4,а должно быть 0).

Очень нужна ваша помощь,желательно до завтра!

Заранее огромное спасибо!

С уважением,
Иван.

Приложение:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <ctype.h>

enum Status {
NORMAL = 0, INBRACES, INSTARS,
};

int q184732(FILE *fs) {
enum Status st = NORMAL;
int inword = 0;
int w_count = 0;
int c;
while ((c = getc(fs)) != EOF) {
switch (st) {
case NORMAL:
switch (c) {
case '{':
st = INBRACES;
break;
case '*':
st = INSTARS;
break;
}
continue; /* не считаю */
case INBRACES:
if (c == '}') {
st = NORMAL;
/* имитирую конец слова и отправляю в подсчёт */
c = ' ';
}
break;
case INSTARS:
if (c == '*') {
st = NORMAL;
/* имитирую конец слова и отправляю в подсчёт */
c = ' ';
}
break;
}
/* здесь подсчитываю слова
* Словами считаю любые символы, окружённые пробелами,
* новыми строками, табуляциями
*/
int new_inword = !isspace (c);
if (new_inword != inword) {
inword = new_inword;
if (inword) /* началось новое слово */
++w_count;
}
}
return w_count;
}

int main (int c, char **av) {
int n;
n = q184732(stdin);
printf ("count: %d\n", n);
return 0;
}

Обсуждение

давно
Академик
20764
1861
22.12.2011, 21:21
общий
Объясните точно, что и когда считать, а когда нет. Про незакрытые комментарии (случаи 1 и 3) я ещё понять могу (хотя это надо оговаривать заранее), а про случай 2 - совсем непонятно.
И что считать? Если требовать, чтобы начало и конец комментария были отдельными словами, то это уже другой алгоритм разбора.
давно
Старший Модератор
31795
6196
23.12.2011, 22:46
общий
23.12.2011, 22:59
Цитата: 388307
Помогите, пожалуйста, доработать программу, считающую количество слов в комментариях на Паскале


Цитата: хелп паскаля
Комментарии
Следующие конструкции являются комментариями и игнорируются компилятором:

{ Любой текст не содержащий правой фигурной скобки }
(* Любой текст не содержащий звездочки / правой круглой скобки *)

Комментарий, который содержит знак доллара ($) сразу после открывающей "{" или "(*" является директивой компилятора. Мнемоника команды компилятора следует за знаком доллара.


в первом случае правильно - нужно ловить "правую фигурную скобку", но во втором, простите нужно ловить АЖ два символа "*" и ")"
т.е. если текущий "звездочка", то следующий должен быть правой скобкой, т.е. нужно запоминать предыдущий символ и анализировать пару или как вариант добавить ещё пару значений состояния анализатора.

Вы используете NORMAL = 0, INBRACES, INSTARS и сравнививаете его с байтом, компилятор под это множество выделит один байт, а это 256 значений из которых Ваши только три. Блин расточительство.


Т.е. Вам нужно использовать : NORMAL = 0, INBRACES, LBRACES, STARS, DOUBLESTAR
Второй тип: ловится скобка, ожидается звездочка(да - комментарий, иначе всё нормально), комментарий- ожидается звездочка(да - ожидается звездочка, нет - продолжается комментарий), "две звездочки" ожидается скобка(да - стоп комментарию, нет - комментарий продолжается. При получении положительного результата сравнения - состояние анализатора переводится в следующее.

ps:это всё для стандарта ВР и ТР, для FP есть ещё и аналог С.
pps: обратите внимание на: [color=red]Любой текст не содержащий, т.е. комментарий нужно считать после закрытия[/color]
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
24.12.2011, 19:51
общий
Адресаты:
Так,я почти со всем разобрался
Осталось только понять,почему программа 2+ идущие подряд левые скобки распознает как слово и отправляет в подсчет,т.е. при вводе {{ ответ 1, {{{ - ответ 1, {{{{{{{ - ответ 1.
Подскажите,пожалуйста с этим.
Неизвестный
24.12.2011, 19:52
общий
Адресаты:
Спасибо,попробую реализовать!
давно
Академик
20764
1861
26.12.2011, 10:52
общий
Цитата: 388307
почему программа 2+ идущие подряд левые скобки распознает как слово и отправляет в подсчет,т.е. при вводе {{ ответ 1, {{{ - ответ 1, {{{{{{{ - ответ 1.
первая скобка открывает комментарий, а следующие - это уже содержимое этого комментария - первое слово. Я словами считаю последовательности смиволов, ограниченные пробелами, новыми строками и табуляциями. Ещё там между комментариями неявно вставляется пробел, поэтому если что-то прижать к скобке, закрывающей комментарий, а потом к скобке, открывающей следующей, то это будут два слова.
Как на самом деле выглядят комментарии на Паскале, я давно забыл и реализовывал то, что было дважды повторено в условии, а все неоднозначности трактовал в свою пользу (и если эти неоднозначности действительно были в задании, то вы имели право на такую реализацию, правда свой выбор придётся защищать ). Про (* , *) , и то, что это должно быть обязательно изолированно от окружающих символов пробелами там не было. Я поэтому во второй раз и попросил уточнить.
Неизвестный
26.12.2011, 15:30
общий
Адресаты:
Спасибо огромное за объяснение,теперь я все понял
Действительно,комментарий на Паскале выглядит немного по-другому.Но я уже сдал и защитил свою работу,благодаря Вам

Еще раз большое спасибо,
С уважением,
Иван.
Форма ответа