Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ слова с повторяющимися символами

Автор: 18192123 14.11.2006 23:53

Дана строка, состоящая из слов, разделенных пробелом. Удалить из строки слова, содержащие повторяющиеся символы. ( c помощью функций, не использовать стандартн. ф-ции и процедуры для строк, кроме lenght,ord,char)


единственное, что пока сделала , нашла количество слов в строке


var
st:string[40];
i,k:integer;
begin
readln (st);
for i:=1 to length(st) do
if st[i]=' ' then k:=k+1;
writeln ('k=', k);



не пойму, как теперь работать с отдельными словами

Автор: volvo 15.11.2006 0:10

Зайди вот сюда: http://forum.pascal.net.ru/index.php?showtopic=6972

и посмотри...

Автор: 18192123 19.11.2006 1:52

Цитата(volvo @ 14.11.2006 20:10) *

Зайди вот сюда: http://forum.pascal.net.ru/index.php?showtopic=6972

и посмотри...

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

Автор: 18192123 19.11.2006 17:30

Цитата(18192123 @ 18.11.2006 21:52) *

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

решила разбить строку на слова по этому образцу

const

limits = [#0..#32,'.',',',':',';','!','?','"'];
type

TWords = array[1..40] of string;

var
text : string;
words : TWords;

function GetWords(s : string; var w : TWords) : byte;
var
i,back,n : byte;
begin
i := 1;
n := 0;
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in limits) do
inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in limits) do
inc(i);
inc(n);
w[n] := copy(s, back, i-back);
end;
end;

GetWords := n;
end;


а дальше - не знаю,
подскажите алгоритм дальнейших действий пожалуйста

Автор: 18192123 19.11.2006 23:55

Цитата(18192123 @ 18.11.2006 21:52) *

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

помогите пожалуйста с алгоритмом решения,
а дальше я сама попробую, только подскажите, как дальше !help.gif

Автор: 18192123 20.11.2006 1:50

Цитата(18192123 @ 19.11.2006 19:55) *

помогите пожалуйста с алгоритмом решения,
а дальше я сама попробую, только подскажите, как дальше !help.gif

ну пожалуйста, помогите, мне эта задача уже чуть ли не снится, а сдать надо уже в четверг

Автор: мисс_граффити 20.11.2006 2:37

а чего она тебе снится? из-за того, что скопировала кусок кода из FAQ?
ты сама хоть что-нибудь попробуй делать - тогда поможем.

Автор: 18192123 20.11.2006 2:56

Цитата(мисс_граффити @ 19.11.2006 22:37) *

а чего она тебе снится? из-за того, что скопировала кусок кода из FAQ?
ты сама хоть что-нибудь попробуй делать - тогда поможем.

проблема в том, что я не знаю, как сделать, поэтому и прошу помочь

Автор: мисс_граффити 20.11.2006 3:41

взяла слово-строчку, считала из нее символ (первый). удалила. смотришь - если он еще раз встречается в строчке, удаляешь ее всю. если нет - читаешь следующий.

Автор: 18192123 20.11.2006 4:18

Цитата(мисс_граффити @ 19.11.2006 23:41) *

взяла слово-строчку, считала из нее символ (первый). удалила. смотришь - если он еще раз встречается в строчке, удаляешь ее всю. если нет - читаешь следующий.
а для чего мне удалять первый символ? на каком основании?

Автор: 18192123 20.11.2006 19:29

Цитата(18192123 @ 20.11.2006 0:18) *

а для чего мне удалять первый символ? на каком основании?

а как разбить строчку на слова, если мне запрещено использовать любые стандартные процедуры и функции для строк за исключением ord, lenght

Автор: мисс_граффити 20.11.2006 20:29

а где про это сказано???

если запрещено - не разбивай.
запоминаешь первый символ. идешь до пробела... если этот символ встретился - удаляешь слово (кусок до пробела. как это сделать - подумай сама). если не встретился - берешь второй символ. идешь до пробела.... и так далее. потом анализируешь промежуток между следующими пробелами.

Автор: 18192123 20.11.2006 21:35

Цитата(мисс_граффити @ 20.11.2006 16:29) *

а где про это сказано???

если запрещено - не разбивай.
запоминаешь первый символ. идешь до пробела... если этот символ встретился - удаляешь слово (кусок до пробела. как это сделать - подумай сама). если не встретился - берешь второй символ. идешь до пробела.... и так далее. потом анализируешь промежуток между следующими пробелами.


вот... но только не поняла, как применить ко всем словам в строке,
мож сначала посчитать их количество или с использованием lenght?

я пока попыталась разобраться с первым словом


uses crt;
const p=' ';
function one(var st:string; c:char):string;
var k,i:integer;
begin
k:=0;
while st[i]<>p do k:=k+1; {хочу посчит. сколько символов в первом слове}
c:=st[1];
for i:=1 to k do
while st[i]<>p do if st[i]=c then st[0]:=char(ord(st[0]-k);
one:=st;
end;



Автор: мисс_граффити 20.11.2006 22:21

а зачем тебе их количество?
ты же идешь по строке последовательно... просто отслеживай пробелы.

Автор: 18192123 21.11.2006 0:56

Цитата(мисс_граффити @ 20.11.2006 18:21) *

а зачем тебе их количество?
ты же идешь по строке последовательно... просто отслеживай пробелы.


uses crt;
const p=' ';
function one(var st:string; c:char):string;
var k,i:integer;
begin
for i:=1 to length(st) do
while st[i]<>p do
begin
k:=0;
while st[i]<>p do k:=k+1;
c:=st[1];
for i:=1 to k do
while st[i]<>p do if st[i]=c then st[0]:=char(ord(st[0])-k);
end;
one:=st;
end;
VAR
st:string;
c:char;
BEGIN
read (st);
write (one(st,c));
readkey;
end.

дальше этой строчки компиляция не идет, выдает несоответствие типов



st[0]:=char(ord(st[0]-k);



Автор: мисс_граффити 21.11.2006 3:02

у тебя скобочек в ней не хватает.

Автор: 18192123 21.11.2006 3:38

Цитата(мисс_граффити @ 20.11.2006 23:02) *

у тебя скобочек в ней не хватает.

скобочку я доставила, но теперь я ввожу строку и все...... дальше ничего не выдает

Автор: мисс_граффити 21.11.2006 5:51

если ты хочешь делать

c:=st[1];

то исправь вот это:
function one(var st:string; var c:char):string;


Можно использовать такой алгоритм: заводим дополнительную строку - результирующую.
Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования.
//описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ
Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку.
Начинаем анализировать исходную строку с запомненного места.

Автор: 18192123 21.11.2006 22:23

Цитата(мисс_граффити @ 21.11.2006 1:51) *


Можно использовать такой алгоритм: заводим дополнительную строку - результирующую.
Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования.
//описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ
Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку.
Начинаем анализировать исходную строку с запомненного места.


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

Автор: мисс_граффити 21.11.2006 22:48

написать за тебя код?
нет, не могу.
потому что ты даже пробовать не хочешь! я тебе алгоритм подробно расписала. если какие-то моменты неясные - спрашивай.

Автор: 18192123 21.11.2006 23:05

Цитата(мисс_граффити @ 21.11.2006 18:48) *

написать за тебя код?
нет, не могу.
потому что ты даже пробовать не хочешь! я тебе алгоритм подробно расписала. если какие-то моменты неясные - спрашивай.

мне непонятно, как после проверки на стречаемость 1-го символа перейти к проверке 2,3..
получается, мне все-таки нужно определить в нем количество символов? или нет?
и ещё: я могу произвольно выбрать количество слов в строке? алгоритм тогда меняется?

Автор: мисс_граффити 21.11.2006 23:22

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

Автор: 18192123 21.11.2006 23:38

Цитата(мисс_граффити @ 21.11.2006 19:22) *

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

спасибо, буду дальше делать!

Автор: 18192123 22.11.2006 1:25

Цитата(мисс_граффити @ 21.11.2006 19:22) *

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

ещё вопрос:
что понимается под "Запоминаем позицию пробела.
Это будет начало нашего следующего исследования." это насчет остальных слов, ведь так? тогда как вставить туда запомненный пробел, где учесть "Начинаем анализировать исходную строку с запомненного места"?

Автор: 18192123 22.11.2006 3:45

Цитата(мисс_граффити @ 21.11.2006 1:51) *


Можно использовать такой алгоритм: заводим дополнительную строку - результирующую.
Анализируем первое слово в строке (посимвольно сравниваем. то есть берем первый символ и сравниваем с каждым следующим, пока не встретим такой же или пробел). Потом так же со вторым символом, с третьим... Пока не дойдем до пробела. Для того, чтобы отследить, были ли повторы, можно использовать логическую переменную. Запоминаем позицию пробела. Это будет начало нашего следующего исследования.
//описанное выше - по сути, 2 цикла. Внешний - пока не встретим пробел, внутренний - пока не встретим пробел или аналогичный символ
Смотрим на флажок - если повторов не было, аккуратненько по символам перекидываем кусок до пробела в новую строку.
Начинаем анализировать исходную строку с запомненного места.

пытаюсь что-то сделать по этому алгоритму, но это все, что смогла, дальше - просто не знаю как реализовывать. помогите..... mega_chok.gif


uses crt;
function one(var st:string;var c:char):string;
var i:integer; f:boolean;
begin
writeln ('vvedite stroky');
read (st);
while i<>length(st) do
begin
f:=true;
for i:=1 to ' ' do
begin
c:=s[1];
while s[i]<>' ' or c:=s[i] do
if c=s[i] then f:=true; c:=c+1;
end;
end;