Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на строки!
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Akella
Условие: Дана непустая последовательность слов из строчных латинских букв; слова разделяются запятыми или пробелами (без разницы). Среди всех пар Ai, Bi, где Ai - первая, Bi - последняя буква i-го слова пос-ти, определить наиболее часто встречающуюся пару!

Пример: abcd abd adc bcd Чаще всего встречается пара a и d!

Заранее ОГРОМНОЕ спасибо! А то я в строках не очень разбираюсь!
Lapp
Цитата(Akella @ 9.11.2008 14:00) *
А то я в строках не очень разбираюсь!

А чего в них разбираться?
Чтобы слова выделить, вот тут почитай: Разбиение на слова. Все способы.
А потом сделай двумерный массив целых:
n: array['a'..'z','a'..'z']of integer;
Заполни его нулями. А потом пройдись по всем словам (допустим, s[i]) и делай вот такую операцию:
Inc(n[s[i][1],s[i][Length(s[i])]]);

В результате в массиве n будут лежать количества всех пар. Найди в нем максимум, его координаты и будут нужной парой.
Akella
эээээ.....не очень понятно... wacko.gif и какие-то длинные способы разбивки на слова...
Lapp
Цитата(Akella @ 9.11.2008 14:29) *
эээээ.....не очень понятно...

ыыыыы... совсем непонятно, что именно тебе не очень понятно..


Добавлено через 1 мин.
Цитата(Akella @ 9.11.2008 14:29) *
какие-то длинные способы разбивки на слова...

Ага - уже лучше! smile.gif
ну, вот этот не очень длинный: Разбиение на слова. Все способы.
Akella
можно сказать что все...
Lapp
Цитата(Akella @ 9.11.2008 14:33) *
можно сказать что все...

И тем не менее, давай конкретные вопросы. В способе klem4 разбивки на слова что неясно?
Akella
так что такое inc ?? мы этого не проходили вроде... что он делает? и что такое copy?
Lapp
Цитата(Akella @ 9.11.2008 14:40) *
что такое inc ??

В данном случае - прибавляет единицу к аргументу. От английского increase, увеличивать.


Добавлено через 1 мин.
Цитата(Akella @ 9.11.2008 14:40) *
что такое copy?

Цитата
Function Copy(S: String; Index, Count: Integer): String
Возвращает подстроку из строки S, начиная с позиции Index и длиной Count символов.
Akella
ну с функцией вроде разобрался, теперь собственно сама прога....
Lapp
Цитата(Akella @ 9.11.2008 14:53) *
теперь собственно сама прога....

Если ты разобрался с функцией, "собственно сама прога" будет состоять из:
а. описания массива n;
б. заполнения его нулями;
с. разбиения на слова;
д. цикла по всем словам с упомянутым мной оператором в теле;
е. поиска макимума по массиву n.

Собственно, все то, что я уже сказал выше..
Akella
как перевести из string в char из строковой переменной в символьную т.е ?
Lapp
Цитата(Akella @ 9.11.2008 16:13) *
как перевести из string в char из строковой переменной в символьную т.е ?

Что значит перевести? Как ты собираешься засунуть строку в один символ?? blink.gif
С другой стороны, i-й символ строки s - это символьная переменная, s[i]
Я использовал это в своем первом сообщении. Разбери его внимательно. По косточкам smile.gif
Akella
у меня тут несростаются типы и переменные - ошибки.... например когда я массив n заполняю нулями...
Lapp
покажи, как ты это делаешь. Желательно, со всеми объявлениями переменных. Короче, покажи всю прогу.
Akella
в принципе я еще мало сделал, потому, что мне тут объясняли что к чему.... так что воть

program lab_3_16;

const

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

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

var
text : string;
words : TWords;
n:array['a'..'z','a'..'z'] of integer;
i,j : integer;


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;
begin
for i:=1 to 60 do
for j:=1 to 60 do
n[i,j]=0;

end.
Lapp
не так:
  for i:=1 to 60 do
for j:=1 to 60 do
n[i,j]=0;

а вот так:
  for c:='a' to 'z' do
for d:='a' to 'z' do
n[c,d]:=0;

- где c и d - переменные типа char
Akella
что-то у меня цикл не получается, не могли бы вы мне его написать поподробнее...
Lapp
Цитата(Akella @ 9.11.2008 17:13) *
что-то у меня цикл не получается, не могли бы вы мне его написать поподробнее...


Вот так:
  m:=GetWords(text,Words);
for i:=1 to m do Inc(n[Words[i][1],Words[i][Length(Words[i])]]);

Только я оччень не советую называть переменную text, так как text - это зарезервированное слово Паскаля.

Все, я пошел спать, скоро не жди. Сам думай. Все сказано уже.
smile.gif
Akella
я не понимаю почему кампилтору не нравится тип переменной text вот тут wacko.gif
m:=GetWords(text,Words);

вроде бы все должно быть окей!
Lapp
Цитата(Akella @ 10.11.2008 3:43) *
кампилтору не нравится тип переменной text вот тут wacko.gif
m:=GetWords(text,Words);

вроде бы все должно быть окей!

Я не знаю, что не нравится твоему "кампилтору", моему компилятору все нравится.
Приводи полную и точную информацию об ошибке, а не свою интерпретацию.
Akella
ну пишет type mismatch и курсор под переменной text ставит
m:=GetWords(text,Words);
Archon
Цитата(Lapp @ 9.11.2008 19:19) *
Только я оччень не советую называть переменную text, так как text - это зарезервированное слово Паскаля.

Akella
все равно, я заменя text на t и такая же беда... если честно я ваще уже запутался и не понимаю что куда=(((
volvo
Цитата(Lapp @ 9.11.2008 16:19) *
Только я оччень не советую называть переменную text, так как text - это зарезервированное слово Паскаля.
blink.gif Я что-то пропустил?

Руководство по языку B.Pascal 7 & Objects/LR: Зарезервированные слова и стандартные директивы Borland Pascal об этом ничего не знает... А то, что идентификатор совпадает с названием какого-то типа, совсем не запрещает его использовать по-своему. Word тоже может быть названием переменной (и не обязательно целочисленной).
Lapp
2 volvo:
Извиняюсь, с зарезервированным словом я перебрал smile.gif. Но -
Цитата(volvo @ 10.11.2008 10:07) *
то, что идентификатор совпадает с названием какого-то типа, совсем не запрещает его использовать по-своему
- про запрещение у меня ничего не было. Я просто не рекомендовал. Оччень. И сейчас тоже не рекомендую. Оччень smile.gif

2 Akella:
Под каким конкретно символом среда ставит курсор при ошибке? И какой у тебя Паскаль?


Добавлено через 1 мин.
И, пожалуйста, приведи еще раз полный код текущей версии проги. Мало ли что..
Akella
турбо паскаль 7.0...
в проге у меня практически не чо не изменилась -ну не понимаю я... wacko.gif

program lab_3_16;    
const
limits = [#0..#32,'.',',',':',';','!','?','"'];
type
TWords = array[1..40] of string;
var m : string;
text: TWords;
n:array['a'..'z','a'..'z'] of integer;
c,d : char;
i,j : integer;
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 i
nc(i);
inc(n);
w[n] := copy(s, back, i-back);
end;
end;
GetWords := n;
end;
begin
for c:='a' to 'z' do
for d:='a' to 'z' do
n[c,d]:=0;
begin
writeln('vvedite stroku slov');
read(m);
m:=GetWords(text,words);
for i:=1 to m do Inc(n[Words[i][1],Words[i][Length(Words[i])]]);
end;
end.
volvo
Ты бы нормально программу отформатировал, а не в одну строку, увидел бы что переменная Words у тебя просто не определена... А text (ну, или назвать ее по другому) должна быть String-ом, а не массивом строк, иначе у тебя будет ошибка несоответствия типов...
Lapp
Ну, вот, все и выяснилось. А я смотрю на предыдущий вариант проги и не понимаю, в чем дело - там-то text определена как string.. Ну, и зачем ты ее поменял? Короче, "в интересах следствия" (С) smile.gif старайся давать как можно больше информации.
Ну, и замечание volvo про Words тоже учти..


Добавлено через 1 мин.
Цитата(Akella @ 10.11.2008 15:18) *
практически не чо не изменилась

То, что ты считаешь мелочью, для программирования совсем мелочью не является
Akella
Цитата
Ты бы нормально программу отформатировал, а не в одну строку, увидел бы что переменная Words у тебя просто не определена...

по идее она должна быть TWords правильно? или я опять что-то не догоняю?
Lapp
Цитата(Akella @ 10.11.2008 15:55) *
по идее она должна быть TWords правильно?

Да.
Akella
нууу, а у меня опять шибка вылезает!
samec
всмотрись внимательно:

m : string;


function GetWords(s : string; var w : TWords) : byte;  


m:=GetWords(text,words);


вот от того и ошибка, что несоответствие типов. Функция GetWords возвращает byte, а ты его присваиваешь переменной m типа string.

ну и соответсвенно вот тут:

writeln('vvedite stroku slov');
read(m); {скорее всего вместо m нужно написать text}

Akella
а как делать пункт д) и е) ??? wacko.gif
Lapp
Цитата(Akella @ 11.11.2008 11:23) *
а как делать пункт д) и е) ??? wacko.gif

Пункт Д описан полностью в моем мессадже выше (#18).
Пункт Е вот.
x:='a';
y:='a';
for c:='a' to 'z' do for d:='a' to 'z' do if n[c,d]>n[x,y] then begin
x:=c;
y:=d
end;

После выполнения цикла x и y представляют искомую пару.
Akella
а у вас есть на сайте где можно почитать об операторах, о строках и массивах поподробнее?
Lapp
Цитата(Akella @ 12.11.2008 15:19) *
на сайте где можно почитать об операторах, о строках и массивах

О строках, например, вот: Строки
И вообще, посмотри FAQ (ссылка вверху красная) и используй поиск. Но думается мне, что и обычный учебник тебе не помешает..
Akella
а есть что-то типа списка операторов, где о каждом все написано?
Lapp
Цитата(Akella @ 12.11.2008 15:34) *
а есть что-то типа списка операторов, где о каждом все написано?

Я же говорю: учебник. Есть и электронные варианты. Где-то была тема со ссылками.. Поищи.
samec
Цитата(Akella @ 12.11.2008 18:34) *

а есть что-то типа списка операторов, где о каждом все написано?

ещё есть встроенный в среду раработки help smile.gif
Akella
Цитата(samec @ 13.11.2008 3:50) *

ещё есть встроенный в среду раработки help smile.gif

там все на английском написано, поэтому это не очень помогет мне!
Lapp
Цитата(Akella @ 15.11.2008 4:26) *
это не очень помогет мне!

Помоги себе сам - выучи английский! smile.gif
samec
есть и русский help к Borland Pascal 7.0. (в прикреплённом к сообщению файле freeware версия)
Akella

блин, как сделать чтобы ответ выводился 1 раз, а не по количеству слов?

program lab_3_16;    
const limits = [#0..#32,'.',',',':',';','!','?','"'];
type TWords = array[1..40] of string;
var stroka : string;
m : byte;
slova : TWords;
massiv:array['a'..'z','a'..'z'] of integer;
c,d,x,y : char;
i : integer;

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;
begin for c:='a' to 'z' do
for d:='a' to 'z' do
massiv[c,d]:=0;
begin writeln('vvedite stroku slov'); read(stroka);
m:=GetWords(stroka,slova);
for i:=1 to m do
begin
Inc(massiv[slova[i][1],slova[i][Length(slova[i])]]);
x:='a';
y:='a';
for c:='a' to 'z' do
for d:='a' to 'z' do if massiv[c,d]>massiv[x,y] then begin
x:=c;
y:=d;
writeln(x,y)
end;
end;
end;
end.
Akella
помогите плиз, не могу сдать эту работу...=( сам понять не смогу=(
Lapp
program lab_3_16;

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

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

var
stroka: string;
m: byte;
slova: TWords;
n: array['a'..'z','a'..'z'] of integer;
c,d,x,y: char;
i: integer;

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;

begin
for c:='a' to 'z' do for d:='a' to 'z' do n[c,d]:=0;
writeln('vvedite stroku slov');
read(stroka);
m:=GetWords(stroka,slova);
for i:=1 to m do begin
Inc(n[slova[i][1], slova[i][Length(slova[i])]]);
x:='a';
y:='a';
for c:='a' to 'z' do for d:='a' to 'z' do if n[c,d]>n[x,y] then begin
x:=c;
y:=d
end;
end;
WriteLn('Naibolee chastaya para: ',x,y)
end.
Akella
и еще одна просьба, подпишите мне, пожалуйста, строчки функции, что в каждой получается, на примере, а то я не сдам эту работу=(
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.