Я только начинаю программировать. Пока знаю паскаль лишь в школьных рамках, так как сам ещё учусь в школе. Есть несколько задач, которые никак не могу решить. Помогите плз.
Вот:
1. Дана строка из цифр, надо найти и удалить повторяющиеся.
2. Надо удалить все нечетные слова из предложения, и перевернуть задом наперд четные.
Вот и все, помогите плз, надеюсь это не очень сложно для вас[Ответ]
zalex 16:02 25.04.2006
Это тебе на первое
Function MyDeletIdentic(s:AnsiString):AnsiString;
var
j, i:LongInt;
begin
if Length(s)>1 then begin
i:=0;
repeat
i:=i+1;
j:=i+1;
repeat
if S[i]=S[j] then begin
Delete(s,j,1);
j:=j-1;
end;
j:=j+1;
until j>Length(S);
Until i>=Length(S)-1;
end;
Result:=s;
end;
[Ответ]
zalex 18:58 25.04.2006
Если не вполне понятно, то вот более понятный, ИМХО, вариант
Function MyDeleteIdentic(s:ShortString):ShortString;
var
MyArray:Array of Boolean;
i,j:LongInt;
begin
SetLength(MyArray,Length(S)+1);
For i:=1 to Length(MyArray)do
MyArray[i]:=True;
For i:=1 to Length(S)-1 do
For j:=i+1 to Length(S) do
if S[i]=S[j] then MyArray[j]:=False;
Result:='';
For i:=1 to Length(S) do
if MyArray[i] then begin
Result:=Result+S[i];
end;
end;
[Ответ]
Всё зависит от полнготиы налитого стакана А вообще файнал релизы - это когда ошибки замечены. Я бы по большому счету сказал, что если ошибка и есть, то не того класса, что бы быть замеченной на какой нить лабораторке.
[Ответ]
maximn 19:13 25.04.2006
zalex, не дочитал задание, поэтому сначала не то решение написал.
вобщем сложность N^2 - это пара. сто пудов.
вот так можно сделать на пхп (паскаль позабыл уже за долгие годы):
Вот вам файнл релиз. Имхо самый понятный.
Function MyDeleteIdentic(s:ShortString):ShortString;
var
MyArray:Array of Boolean;
i,j:LongInt;
begin
SetLength(MyArray,Length(S)+1);
For i:=1 to Length(MyArray)do
MyArray[i]:=True;
For i:=1 to Length(S)-1 do
if S[i] then begin
For j:=i+1 to Length(S) do
if S[i]=S[j] then MyArray[j]:=False;
end;
Result:='';
For i:=1 to Length(S) do
if MyArray[i] then begin
Result:=Result+S[i];
end;
end;
[Ответ]
maximn 19:15 25.04.2006
Сообщение от zalex:
Вот вам файнл релиз. Имхо самый понятный.
Function MyDeleteIdentic(s:ShortString):ShortString;
var
MyArray:Array of Boolean;
i,j:LongInt;
begin
SetLength(MyArray,Length(S)+1);
For i:=1 to Length(MyArray)do
MyArray[i]:=True;
For i:=1 to Length(S)-1 do
if S[i] then begin
For j:=i+1 to Length(S) do
if S[i]=S[j] then MyArray[j]:=False;
end;
Result:='';
For i:=1 to Length(S) do
if MyArray[i] then begin
Result:=Result+S[i];
end;
end;
Что значит не дочитал задание?
А PHP то тут причем? А по поводу сложности - я запостил два варианта. ОДин быстрый, второй понятный, как всегда.
[Ответ]
maximn 19:17 25.04.2006
Сообщение от zalex:
Что значит не дочитал задание?
я - не дочитал задание.
ты - не дочитал мой ответ.
[Ответ]
maximn 19:23 25.04.2006
Сообщение от zalex:
ОДин быстрый, второй понятный, как всегда.
они оба медленные и непонятные =)
Сообщение от zalex:
А PHP то тут причем?
воспринимай его как некий абстрактный язык, который как правило понятен программистам. как примеры в умных книжках про алгоритмы
[Ответ]
zalex 19:28 25.04.2006
Сообщение от maximn:
они оба медленные и непонятные =)
воспринимай его как некий абстрактный язык, который как правило понятен программистам. как примеры в умных книжках про алгоритмы
Вообще то у меня сложилось впечатление, что стоющие книжки _по алгоритмам приводят примеры на Паскале или Фортране.
Чего непонятного в последнем релизе - сначала помечаем одинаковые. Поиск одинаковых ищем со следующего, после текущего и до конца строки. ОТметив одинаковые, формируем новую строку (пустую) - к которой прибавляем только неполвторяющиеся.
В один цикл к сожалению сделать - не получилось.
[Ответ]
maximn 19:30 25.04.2006
Сообщение от zalex:
сначала помечаем одинаковые. Поиск одинаковых ищем со следующего, после текущего и до конца строки
уже лучше, но все еще нелинейно =)
Сообщение от zalex:
В один цикл к сожалению сделать - не получилось.
Сообщение от zalex:
Вообще то у меня сложилось впечатление, что стоющие книжки _по алгоритмам приводят примеры на Паскале или Фортране.
я не пойму, тебе это принципиально? если я перепишу на сях - тебе будет понятнее?
[Ответ]
zalex 20:27 25.04.2006
Сообщение от maximn:
уже лучше, но все еще нелинейно =)
почему?
не придумал алгоритм Мож кто словами хоть скажет - как это сделать в одном цикле, без вложенный других циклов, за один проход.
По поводу линейности. О какой линейности идёт речь? Если о визуальной, то одно дело, если о линейности реализации - то ни в жизнь не получится эту задачу решить в один цикл и линейно.
Я не специалист в PHP , но, имхо, причина нелинейности твоего варианта - substr - как раз это и есть по сути второй цикл перебора. По крайней мере её аналог в Паскале - Pos, есть именно преребор в цикле, если верить содержимому модуля System.
По поводу языка реализации - да пофиг, если работает. Тут каждый кулик своё болото хвалит, и спортить принципиально не хочу.
ЗЫ По поводу [code] - действельно этих тэгов не хватает.
[Ответ]
maximn 20:50 25.04.2006
Сообщение от zalex:
не придумал алгоритм Мож кто словами хоть скажет - как это сделать в одном цикле, без вложенный других циклов, за один проход.
да элементарно - я же всё написал.
если словами:
1. есть массив флагов - array[0..9], первоначально там нули
2. проходишь строку посимвольно и смотришь если в массиве флагов по данному символу (у нас по условию это цифра) стоит 0 значит этой цифры еще не было, соответственно добавляешь эту цифру в результат, а в массив флагов ставишь 1 для это цифры.
3. точка
[Ответ]
maximn 20:56 25.04.2006
кстати перечитал условие и твое решение - мы делали разные задачи =)
вот решение того что делал ты, словами:
1. результат = первому символу входной строки
2. посимвольно идем по входной строке
3. если последний символ выходной строки не равен текущему символу входной, добавляем этот символ в выходную строку.
4. точка
пысы. автор - напиши условие нормально, а не "своими словами"
[Ответ]
zalex 21:06 25.04.2006
Сообщение от maximn:
пысы. автор - напиши условие нормально, а не "своими словами"
Что то вечер, и я уже ничего не соображаю. Теперь я попытаюсь сфлрмулировать, что же я делал.
1.Создал массив флагов. Каждый элемнт этого массива отвечает каждому символу входной строки. Инициализировал, что никакой символ не повторяется.
2. Для первого символа проверяю, есть ли такой же во входной строке. Каждый встреченный такой же помечаю в массиве флагов. Затем беру следующий. Если он уже помечен - пропускаю, ибо идентичные ему уже были ранее найдены, если не помечен - то делаю всё, как для первого символа, только не с начала, а с текущей позиции+1. И т.д.
3.Затем формирую выходную строку на основе массива флагов.
[Ответ]
Аид 21:40 25.04.2006
Сообщение от mexx:
1. Дана строка из цифр, надо найти и удалить повторяющиеся.
2. Надо удалить все нечетные слова из предложения, и перевернуть задом наперд четные.
пойди туда - не знаю куда, найди то - не знаю что.
это не условие задачи. цифры - целые, не целые, сколько их, они константы или их вводить надо?
про предложение понятно, прога в уме набросана, писать ее щас лееееееень [Ответ]
zalex 22:00 25.04.2006
Во понесло, блин, на тебе автор еще )
Function MyDelete3(s:ShortString):ShortString;
var i:Integer;
begin
Result:='';
For i:=1 to Length(S) do
if Pos(s[i],Result)=0 then Result:=Result+S[i];
end;
Сообщение от Аид:
пойди туда - не знаю куда, найди то - не знаю что.
это не условие задачи. цифры - целые, не целые, сколько их
3.14здос-бандос, е№ать мой лысый череп!
Их десять в десятичной системе!
[Ответ]
zalex 00:24 26.04.2006
И еще
Function MyDelete4(s:ShortString):ShortString;
var i,j:Integer;
MyArray:array [1..256]of Boolean;
begin
For i:=1 to Length(S) do
MyArray[i]:=True;
Result:='';
For i:=1 to Length(S) do
if MyArray[i] then begin
Result:=Result+S[i];
For j:=i+1 to Length(S) do
if S[i]=S[j] then MyArray[j]:=False;
end;
end;
Я думаю с первым вопросом достаточно. Второй желательно конкретизировать - какие разделители слов и т.д., что бы лишний код не писать.
[Ответ]
maximn 08:13 26.04.2006
звонил автор - говорит что занят написанием диссертации, пока на форуме появиться не сможет
[Ответ]
zalex 09:59 26.04.2006
Сообщение от maximn:
звонил автор - говорит что занят написанием диссертации, пока на форуме появиться не сможет
Ну тогда тебе спасибо, я даже сам понял алгоритм
Автор, видимо ты обиделся, что предложено только 4 работающих варианта+вариант на РНР, но не обижайся - действительно, тут люди суровые и злые[Ответ]
zalex 11:29 26.04.2006
Вот тебе пятый вариант, благодарный автор
Function MyDelete5(s:ShortString):ShortString;
var i,j,k:Integer;
My:Array [1..256]of ShortInt;
begin
For i:=0 to 9 do
begin
k:=0;
For j:=1 to Length(S) do
if S[j]=IntToStr(i) then begin
k:=k+1;
My[j]:=k;
end;
end;
Result:='';
For i:=1 to Length(S) do
begin
if My[i]=1 then Result:=Result+s[i];
end;
mexx, Хоть бы что написал. Эвон, народ-то как распалился...
[Ответ]
mexx 18:48 26.04.2006
Сорри, не мог зайти в нет. За варианты спасибо большое! Я примерно так и представлял себе, но мой вариант почему то не работал. Ещё раз извиняюсь за долгий ответ!
[Ответ]
zalex 19:05 26.04.2006
Сообщение от zss_vrn: mexx, Хоть бы что написал. Эвон, народ-то как распалился...
Пока на работе сегодня сидел, еще один вариант придумал Автор, ты хоть что ли напиши - то это или нет, ибо на самом деле поставленные условия можно по-разному интерпретировать.
[Ответ]
mexx 14:10 27.04.2006
Условия задачи написал так, как нам дают в школе. Конечно спасибо за помошь, вроде бы это то, но мы всеравно как-то не так делаем, без булеана и массивов.
[Ответ]