Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
Строки в паскале |
Философия, технологии, алгоритмы! |
|
|
Опции темы |
25.04.2006, 11:25 | #1 |
Moderator
Сообщений: 2,261
Регистрация: 21.01.2004
Не в сети |
Строки в паскале
Я только начинаю программировать. Пока знаю паскаль лишь в школьных рамках, так как сам ещё учусь в школе. Есть несколько задач, которые никак не могу решить. Помогите плз.
Вот: 1. Дана строка из цифр, надо найти и удалить повторяющиеся. 2. Надо удалить все нечетные слова из предложения, и перевернуть задом наперд четные. Вот и все, помогите плз, надеюсь это не очень сложно для вас |
25.04.2006, 16:02 | #2 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Это тебе на первое
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; |
25.04.2006, 18:58 | #3 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Если не вполне понятно, то вот более понятный, ИМХО, вариант
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; |
25.04.2006, 19:01 | #5 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Всё зависит от полнготиы налитого стакана А вообще файнал релизы - это когда ошибки замечены. Я бы по большому счету сказал, что если ошибка и есть, то не того класса, что бы быть замеченной на какой нить лабораторке.
|
25.04.2006, 19:13 | #6 |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
zalex, не дочитал задание, поэтому сначала не то решение написал.
вобщем сложность N^2 - это пара. сто пудов. вот так можно сделать на пхп (паскаль позабыл уже за долгие годы): Код:
function doIt($in_str) { $flags = array(); $out = ''; for ($i = 0; $i < strlen($in_str); $i++) { $ch = substr($in_str, $i, 1); if (!isset($flags[$ch])) { $out .= $ch; $flags[$ch] = 1; } } return $out; } echo doIt('123243234123151345432437568648567567'); |
25.04.2006, 19:14 | #7 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Вот вам файнл релиз. Имхо самый понятный.
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; |
25.04.2006, 19:15 | #8 | |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
|
|
25.04.2006, 19:23 | #11 | ||
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
Цитата:
|
||
25.04.2006, 19:28 | #12 | |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Цитата:
Чего непонятного в последнем релизе - сначала помечаем одинаковые. Поиск одинаковых ищем со следующего, после текущего и до конца строки. ОТметив одинаковые, формируем новую строку (пустую) - к которой прибавляем только неполвторяющиеся. В один цикл к сожалению сделать - не получилось. |
|
25.04.2006, 19:30 | #13 | ||
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
Цитата:
|
||
25.04.2006, 19:34 | #14 | |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
|
|
25.04.2006, 20:27 | #15 | |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Цитата:
По поводу линейности. О какой линейности идёт речь? Если о визуальной, то одно дело, если о линейности реализации - то ни в жизнь не получится эту задачу решить в один цикл и линейно. Я не специалист в PHP , но, имхо, причина нелинейности твоего варианта - substr - как раз это и есть по сути второй цикл перебора. По крайней мере её аналог в Паскале - Pos, есть именно преребор в цикле, если верить содержимому модуля System. По поводу языка реализации - да пофиг, если работает. Тут каждый кулик своё болото хвалит, и спортить принципиально не хочу. ЗЫ По поводу [code] - действельно этих тэгов не хватает. |
|
25.04.2006, 20:50 | #16 | |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
Цитата:
если словами: 1. есть массив флагов - array[0..9], первоначально там нули 2. проходишь строку посимвольно и смотришь если в массиве флагов по данному символу (у нас по условию это цифра) стоит 0 значит этой цифры еще не было, соответственно добавляешь эту цифру в результат, а в массив флагов ставишь 1 для это цифры. 3. точка |
|
25.04.2006, 20:56 | #17 |
error #65535
Сообщений: 5,240
Регистрация: 16.11.2003
Возраст: 24
Не в сети |
кстати перечитал условие и твое решение - мы делали разные задачи =)
вот решение того что делал ты, словами: 1. результат = первому символу входной строки 2. посимвольно идем по входной строке 3. если последний символ выходной строки не равен текущему символу входной, добавляем этот символ в выходную строку. 4. точка пысы. автор - напиши условие нормально, а не "своими словами" |
25.04.2006, 21:13 | #19 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Что то вечер, и я уже ничего не соображаю. Теперь я попытаюсь сфлрмулировать, что же я делал.
1.Создал массив флагов. Каждый элемнт этого массива отвечает каждому символу входной строки. Инициализировал, что никакой символ не повторяется. 2. Для первого символа проверяю, есть ли такой же во входной строке. Каждый встреченный такой же помечаю в массиве флагов. Затем беру следующий. Если он уже помечен - пропускаю, ибо идентичные ему уже были ранее найдены, если не помечен - то делаю всё, как для первого символа, только не с начала, а с текущей позиции+1. И т.д. 3.Затем формирую выходную строку на основе массива флагов. |
25.04.2006, 21:40 | #20 | |
Форумец
Сообщений: 12,346
Регистрация: 28.07.2003
Не в сети |
Цитата:
это не условие задачи. цифры - целые, не целые, сколько их, они константы или их вводить надо? про предложение понятно, прога в уме набросана, писать ее щас лееееееень |
|
25.04.2006, 22:00 | #21 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Во понесло, блин, на тебе автор еще )
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; 2 maximn - теперь алгоритм понятен |
26.04.2006, 00:24 | #23 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
И еще
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; Я думаю с первым вопросом достаточно. Второй желательно конкретизировать - какие разделители слов и т.д., что бы лишний код не писать. |
26.04.2006, 09:59 | #25 | |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Цитата:
Автор, видимо ты обиделся, что предложено только 4 работающих варианта+вариант на РНР, но не обижайся - действительно, тут люди суровые и злые |
|
26.04.2006, 11:29 | #26 |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Вот тебе пятый вариант, благодарный автор
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; end; |
26.04.2006, 19:05 | #29 | |
Покинул БВФ
Сообщений: 469
Регистрация: 28.06.2005
Не в сети |
Цитата:
|
|