IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> на списки... плз, помоните написать процедуру
сообщение
Сообщение #1


Гость






помогите пожалуйста написать процедуру... unsure.gif
Дан текст, состоящий из слов, пробелов, и знаков препинания(запятая, точка с запятой, двоеточие) и завершается точкой. текст начинается со слова, а слова отделяются друг от друга пробелом или одним знаком припинания. слова состоят из букв латинского алфавита. найти все слова, состоящие из вхождений не более чем 20 букв.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Во-первых, неизвестно, что такое текст, в каком виде он представлен.
Если это строка, то разумнее пользоваться операциями над строками, если массив символов или файл, целесообразнее делать конечный автомат.
Во-вторых, что делать с одинаковыми словами? Если слово встретилось дважды и более, учитывать все вхождения или только единственное? И какте слова считать одинаковыми: "HUMAN" и "human" - это разные или одинаковые слова?
В-третьих, что делать, если в тексте попадется символ, не входящий в список допустимых?
В-четвертых, есть ли известные ограничения на длину текста или максимальное количество слов?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(andriano @ 17.02.2008 15:07) *

Во-первых, неизвестно, что такое текст, в каком виде он представлен.
Если это строка, то разумнее пользоваться операциями над строками, если массив символов или файл, целесообразнее делать конечный автомат.
Во-вторых, что делать с одинаковыми словами? Если слово встретилось дважды и более, учитывать все вхождения или только единственное? И какте слова считать одинаковыми: "HUMAN" и "human" - это разные или одинаковые слова?
В-третьих, что делать, если в тексте попадется символ, не входящий в список допустимых?
В-четвертых, есть ли известные ограничения на длину текста или максимальное количество слов?


в теле программы написана строка, что то наподобии (SourceText := 'asd, bdf cdfsw ,4 4 4 4 4 4 4 .derwer.ierwer.f .ge.hwe.i .ler. me') ...Пользователь ничего вводить не будет!... Задание написать функцию, которая будет распозновать слова из строки, обязательно слова из латинских букв. и как я понял, задание заключается в том чтобы проссумировать (inc(i)) все слова длинной < или = 20 символов. Идет проверка посимвольно, если встречается пробел или один из знаков препинания (, ; smile.gif или пробел, то мы разумеется ничего не сумируем и переходим проверять слова далее..... PS: по этому заданию должен быть написан листинг функции на сдачу экзаменатору... никаких замутов.
Как я понимаю начало может выглядеть примерно так:


function Letters(SourceText :string):string;
var
StrLetter :string;
i :integer;
begin
StrLetter := '';
i := 1;
while i < Length(SourceText) do begin
if SourceText[i] in ['a'..'z', 'A'..'Z'] then begin
if i+1 <= Length(SourceText) then begin
.
. {не знаю как дальше}
.

Inc(i);
end;
end;




 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


1. Из 4 моих вопросов ответ был только на 2: 1-й и 4-й. А как с остальными?
2. Что должна возвращать функция? Количество слов? Массив слов? Список слов? Если один из двух последних, то это глобальные объекты или передаваемые через параметры?
3. Судя по стилю того, что написано, предполагается реализация конечного автомата. Это не самый рациональный способ в данной ситуации. Но если идти по нему, необходимо ввести переменную, описывающую состояние автомата. Например, принадлежал ли предыдущий символ слову или был разделителем. И, соответственно, для различных сочетаний типа (буква/разделитель) текущего и предыдущего символа производятся те или иные действия. Например, если оба - символы, то продолжаем обработку текущего слова.
4. Лучше, на мой взгляд, разбирать строковыми операциями. Выглядеть должно примерно так:
- заменяем все разделители пробелами.
- заменяем все двойные пробелы одинарными (после чего слова у нас оказываются разделенными единственным пробелом.
- цикл, на каждом шаге которого находим очередной пробел, обрабатываем слово от начал строки до пробела, удаляем из строки слово вместе с пробелом.
- когда в строке не осталось пробелов, обрабатываем последнее входящее в нее слово.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(andriano @ 17.02.2008 18:34) *

1. Из 4 моих вопросов ответ был только на 2: 1-й и 4-й. А как с остальными?
2. Что должна возвращать функция? Количество слов? Массив слов? Список слов? Если один из двух последних, то это глобальные объекты или передаваемые через параметры?
....


Если я правильно тебя понимаю (паскаль я знаю постольку поскольку...и впринципе программирование)..
Функция должна просто выводить число(цифру - количество слов, которое подсчитывается после прохождении всех оговорочных проверок цикла и в итоге Inc(i)).. Задача сама из контрольной работы, на которую отводится 10 минут. Ничего глобального здесь нет, точнее не подразумевается для данного результата.
Напиши пожалуйста мне для понимания...Если упростить задачу до минимума и считать символы (кроме пробела) за часть слова, то как будет выглядеть цикл, который подсчитывает слова из строки, которые состоят не более 5 символов?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Примерно так (писал прямо здесь):

const
MaxWordLength = 5;

function NumberOfWords(s : string): integer;
var i,j : integer;
begin
while pos(',',s) > 0 do s[pos(',',s)] := ' ';
while pos(':',s) > 0 do s[pos(':',s)] := ' ';
while pos(';',s) > 0 do s[pos(';',s)] := ' ';
while pos(' ',s) > 0 do delete(s,pos(' ',s),1);
i := 0; // counter
repeat
j := pos(' ',s);
if (j > 0) then begin
delete(s,1,j); // remove first word & space
if ((j-1) <= MaxWordLength) then
inc(i);
end;
until j = 0;
if (length(s) <= MaxWordLength) and (length(s) > 0) then
inc(i);
NumberOfWords := i;
end;



Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(andriano @ 17.02.2008 21:09) *

Примерно так (писал прямо здесь):
.
.
.


спасибоза ответы give_rose.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Если текст задан именно так, как сказано в задании, то вот такую можно функцию для определения сколько в строке слов, длина которых не превышает max_len

const
max_len = 5;

function get_count(s: String): Byte;
const
letters = ['.', ',', ':', ';', ' ', '!', '?'];
var
i: Byte;
begin
if length(s) = 0 then get_count := 0 else begin
i := 1;
while (i <= length(s)) and not (s[i] in letters) do
inc(i);
get_count := Byte (i <= max_len + 1) + get_count(copy(s, i + 1, 255));
end;
end;


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
Если текст задан именно так, как сказано в задании, то вот такую можно функцию для определения сколько в строке слов, длина которых не превышает max_len
Правда? Ну, давай посмотрим:

{ здесь - твоя функция }

var
sourcetext: string;

begin
SourceText := 'asd, bdf cdfsw ,4 4 4 4 4 4 4 .derwer.ierwer.f .ge.hwe.i .ler. me';
writeln(get_count(sourcetext));
end.

Что должен получить (сначала посчитай вручную, потом - запусти программу)...

Ну не вижу я тут 22 слова длиной меньше 6-ти символов... Можно перечислить их все? smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


на сколько я понял из условия между 2-мя словами может быть ровно 1 разделитель (только в этом случае функция отработает корректно)

Цитата(задание)
лова отделяются друг от друга пробелом или одним знаком припинания


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Значит, автор дает пример, противоречащий условию. Я ничего не придумывал, просто скопировал строку из поста №3...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Я дал решение в предположении, что несколько разделителей могут следовать друг за другом. Именно для этого нужна строка:

while pos(' ',s) > 0 do delete(s,pos(' ',s),1);

Вместе с тем, я учел, что самих разделителей перечислено ТОЛЬКО 4, поэтому прописал каждый в свою строку.
Если их будет больше, разумно будет вместо нескольких строк вида:

while pos(':',s) > 0 do s[pos(':',s)] := ' ';

Пробежаться по строке, заменяя любой из них на пробел примерно следующей конструкцией:

  for i := 1 to length(s) do
if s[i] in delimiters then
s[i] := ' ';
while pos(' ',s) > 0 do delete(s,pos(' ',s),1);
В принципе это стандартный метод поэтапного решения задачи:
1. Преобразовать все разделители к одному.
2. Избавиться от повторяющихся разделителей.
3. Провести обработку, исходя из того, что встречается ровно по одному разделителю единственного вида.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 3.12.2021 4:01
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name