Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2012, 11:06   #1
inc1uder
Новичок
Джуниор
 
Регистрация: 02.05.2012
Сообщений: 6
Вопрос Подсчет количества операторов в одномерном массиве

Есть такое задание:
1) Составить процедуру подсчета и печати количества групп операторов заключенных в скобки "begin ... end" в исходном массиве строк
2) Составить функцию возвращающую количество символов ";" в строке.

Вопрос исключительно по первому, как это возможно реализовать?
Как определить что слово является оператором?
Я в Паскале новичек, и пишу опираясь на знания php =)
На данный момент у меня написано:

Код:
uses CRT;
var n,i:integer;
f:text;
s:string;
begin
clrscr;
n:=0;
assign(f,'d:\1.txt');
reset (f);
while not eof(f) do begin
readln(f,s);
for i:=1 to length(s) do
if s[i]=';' then n:=n+1;
writeln(s);
end;
writeln(n);
close (f);
readln
end.
inc1uder вне форума Ответить с цитированием
Старый 02.05.2012, 11:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

по хорошему надо писать синтаксический аналазатор (разбирать текст на лексемы, потом определять, что представляет собой каждая из лексем). Это описано в целом ряде источников.

Но, скорее всего (особенно с учётом задания №2), вам достаточно посчитать, сколько раз встретилась точка с запятой между begin ... end. Отдельно учесть наличие точки с запятой после последнего оператора (перед крайним END).
и всё решение!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 12:05   #3
inc1uder
Новичок
Джуниор
 
Регистрация: 02.05.2012
Сообщений: 6
Радость

Если я правильно понял, то если встречается ";", то можно считать что присутствует оператор, так?

А вот на счет "end;" можно поподробнее?
inc1uder вне форума Ответить с цитированием
Старый 02.05.2012, 13:01   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Если я правильно понял, то если встречается ";", то можно считать что присутствует оператор, так?
точно так!

Цитата:
А вот на счет "end;" можно поподробнее?
наоборот, речь про случай
Код:
begin ... оператор end
если посчитать точки с запятой - то получится, что операторов нет.
бороться с этим явлением можно двумя способами.
первый. простейший.
считаем количество ;,
количество операторов := кол_во_точек_с_запятой + 1
в этом случае, если перед END стоит оператор, а после него есть точка с запятой, то эта точка с запятой означает наличие ЕЩЁ одного оператора (напоминаю, что в Паскаль допускается наличие ПУСТЫХ операторов!)

второй способ.
учитывать случай с наличием/отсутствием точки с запятой после последнего оператора отдельно. учитывать так - перебираем символы в обратном порядке от конечного END - если нашли точку с запятой - то считаем, что количество операторов РАВНО количеству точек с запятой, если НЕ НАШЛИ точку с запятой (встретился ЛЮБОЙ другой символ, отличный от табуляции/перевода строки) - то считаем, что количество операторов РАВНО количеству точек с запятой ПЛЮС ОДИН.

и ещё, решите для себя, сколько операторов содержит такая конструкция
Код:
begin 
end

ну и ещё. обязательно учтите момент наличия (возможности) комментариев в коде.
Нужно или декларировать, что их запрещено использовать,
или, если они допускаются, тогда обрабатывать отдельно (я бы удалял из текста все комментарии, чтобы они не мешали подсчётам).
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 13:38   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от inc1uder Посмотреть сообщение
Как определить что слово является оператором?
Вам это не нужно.
По условию требуется подсчитать количество групп операторов, а не количество операторов.
Соответственно пересчитывать сами операторы бессмысленно.
Учитывая, что группа может содержать любое неотрицательное количество операторов, достаточно подсчитать количество пар "скобок".
Например,
Код:
begin
  begin
  end;
end;
Включает две группы: внутреннюю пустую и внешнюю, содержащую только скобки.
s-andriano вне форума Ответить с цитированием
Старый 02.05.2012, 14:31   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от s-andriano
По условию требуется подсчитать количество групп операторов, а не количество операторов.
точно.
я был неправ (про подсчёт ";" ) - вот что значит "читать по диагонали"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 14:36   #7
inc1uder
Новичок
Джуниор
 
Регистрация: 02.05.2012
Сообщений: 6
По умолчанию

Дело в том что в задании дано подсчитать именно количество операторов, да в прочем прикреплю задание к вложениям..

прошу прощения за дикий размер изображения..
Изображения
Тип файла: jpg IMG_9212.jpg (126.0 Кб, 51 просмотров)
inc1uder вне форума Ответить с цитированием
Старый 02.05.2012, 14:57   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

всё. теперь всё более-менее встало на места:
слева задание №7 - что нужно сделать - "посчитать количество операторов в тексте программы." Причём, внимание "перед каждым end должен стоять символ ';' "
мои рассуждения насчёт проверки ; перед end отметаются - авторы задания уже это учли - так что сколько ; - столько и операторов - только с учётом ГРУПП операторов

а справа - что для выполнения задания потребуется - найти количество групп операторов (заключённых в begin .. end) и количество символов ';'


единственное, что мне не до конца понятно - как учитывать группы операторов при подсчёте общего количества операторов? я бы игнорировал.
и второе. при подсчёте и печати групп операторов как поступать со вложенными группами - считать их или нет... но тут как Вы сами решите..
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.05.2012, 15:11   #9
inc1uder
Новичок
Джуниор
 
Регистрация: 02.05.2012
Сообщений: 6
По умолчанию

то есть получается сколько ";" столько и операторов, соотвественно сколько begin end, столько и групп (если считать вложенные) ?
inc1uder вне форума Ответить с цитированием
Старый 02.05.2012, 15:18   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну, на мой взгляд, так и получается...

(насчёт вложенных групп как Вы решите, так и будет - потом с преподавателем пообщаетесь, если он будет не согласен... )
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание в одномерном массиве. torren108 Помощь студентам 2 09.12.2011 21:41
пв одномерном массиве... Avvakymova Паскаль, Turbo Pascal, PascalABC.NET 4 13.05.2011 19:53
Группа в одномерном массиве BaronVik Помощь студентам 5 21.10.2010 05:58
Поиск в одномерном массиве Joxter Помощь студентам 6 13.12.2008 14:19