Консультация № 184732
10.12.2011, 21:13
85.00 руб.
0 7 1
Уважаемые эксперты!
Убедительно прошу вас помочь мне в решении задачи по программированию, не успеваю сдавать работы, нужна ваша помощь:

Требуется подсчитать число слов в комментариях({ и } или * и * ) в программе на Паскале(с использованием простейших операторов,без усложнения,язык программирования C, среда компиляторов GNU.)
Желательно, если это не трудно, составить схематичный автомат программы.Я буду вам очень благодарен,вы меня спасете!
Заранее большое спасибо!

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

Обсуждение

давно
Академик
20764
1861
10.12.2011, 22:17
общий
это ответ
Здравствуйте, Барс Иван!

Программа на plain C. Данные считываются со стандартного ввода. Никаких проверок на вложенные скобки или на то, что скобки-звёздочки в литерале нет. Но конец комментария рассматривается как конец текущего слова.
Проверялось на GCC под Linux на собственном тексте (хоть она и не на паскале ):
[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;
}
5
Неизвестный
11.12.2011, 14:01
общий
Простите,если я затрудняю Вас,а можно ли данный код написать с использованием простейших операторов(if,for.while) на С++,чтобы выглядело примерно так(программа для подсчета символов,слов и строк):

[CODE]


#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#define eof -1
#define yes 1 //для придания значения переменной in
#define no 0 //для придания значения переменной in

int main()
{
int c; //для ввода символа
int nc; //для подсчета количества введенных символов
int n1; //счетчик строк
int nw; //счетчик слов
int in; /*флажок слежения за тем,находится ли в данный момент программа внутри слова или нет */
nc=n1=nw=0; //обнуление счетчиков
in=no; //до ввода находимся вне слова
printf("Enter your strings and press <Enter> >\n");
while((c=getchar()) !=eof)
{
if(c != '\n')
nc++;
else
n1++;
if(c==' ' || c=='\n' || c=='\t')
in=no;
else if(in==no)
{
in=yes;
nw++;
}
else
;
}
printf("Strings.....=%d\n",n1);
printf("Words.....=%d\n",nw);
printf("Characters.....=%d\n",nc);
_getch();
}
[CODE \]
Неизвестный
11.12.2011, 14:04
общий
Я так понимаю, наверное можно просто слегка видоизменить предложенную мной выше программу подсчета.Пожалуйста, посмотрите.
давно
Академик
20764
1861
11.12.2011, 17:15
общий
Что вам не нравится - switch или enum? Так ваша задача как раз на автомат состояний, а стало быть, на эти конструкции.
Насчёт c++ - вы можете скомпилировать им мою программу без каких-либо изменений.
Неизвестный
11.12.2011, 19:46
общий
Адресаты:
Суть программы я понял,но есть места,которые хотел бы прояснить для себя:
''enum Status {
NORMAL = 0, INBRACES, INSTARS,
};

int q184732(FILE *fs) {
enum Status st = NORMAL;"

Что такое enum и FILE *fs?


" char **av) {
int n;
n = q184732(stdin);"

Что такое **av и (stdin)?
и почему такое название, q184732?

Объясните пожалуйста, Вы меня просто спасли,только бы вот эти 3 момента понять
давно
Академик
20764
1861
11.12.2011, 20:11
общий
11.12.2011, 20:12
Название - это номер вашего вопроса
enum - это перечисление - объект с фиксированным набором значений, заданных их именами. Реализован как целое, а его значения - это константы с соответствующими значениями: 0,1,2,..
FILE - это описатель файла - корневой объект (структура) из библиотеки stdio. В c++ вместо него - класс iostream с совершенно другим интерфейсом (по-моему, менее удобным), но и в программе на c++ библиотекой stdio пользоваться тоже можно, а в g++ можно даже вперемешку. stdin - стандартный ввод, функция getch(FILE *) возвращает следующий символ или EOF если файл кончился или произошла ошибка
isspace() тоже библиотечная функция - возвращает ненулевое значение, если символ - пробел, табуляция, CR, LF
int main (int c, char **av) - это прототип главной программы, ac - количество передаваемых параметров, av - их список. Здесь параметры не используются, но система их всё равно передаёт процессу. Она ещё и значение возвращает, 0 означает нормальное завершение.
В c++ интерфейс точно такой же, только там для ленивых описано несколько прототипов, в том числе и без параметров
Неизвестный
11.12.2011, 21:34
общий
Все понял!Спасибо Вам большое, Сергей (отчества не знаю)!Вы мне очень сильно помогли!
Форма ответа