Здравствуйте, Барс Иван!
Программа на plain C. Данные считываются со стандартного ввода. Никаких проверок на вложенные скобки или на то, что скобки-звёздочки в литерале нет. Но конец комментария рассматривается как конец текущего слова.
Проверялось на GCC под Linux на собственном тексте (хоть она и не на паскале
![](https://rfpro.ru/images/smiles/5.gif)
):
[code lang=shell]$ build/q184732 < q184732.c
count: 127[/code]
Приложение:
#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;
}