Форум «Всё о Паскале» _ Задачи _ задача по теме Символьные данные
Автор: kvadrat 19.05.2008 0:57
Задан текст. Выкинуть из текста вхождения заданого символа.
Прочитал FAQ на эту тему и полюзуясь оператором
Цитата
Delete(VAR s : String; start, len : Integer) - Удалает подстроку длиной len начиная с позиции start строки s
Решил эту задачу, но ничё некомпилируется, сам знаю задача лёгкая, но я вэтой теме чёто пока не шарю. Как надо исправить задачу чтоб компилировалась и работала правильно?
program ertfgsd; var s:string[10];n:char;l:integer; begin l:=1; writeln('vvedite stroky'); readln(s); writeln('vvedite simvol kotorii nygno edalit'); readln(n); delete(var s:string;n,l:integer); writeln(s); end.
Автор: Айра 19.05.2008 1:32
delete(var s:string;n,l:integer);
Здесь не нужно указывать var (откуда ты его вообще взял) и тип.. компилятор сам знает какого типа должны быть параметры функции, и если передать ей что-то неправильно, он "поругается".. Как это у тебя и произойдет, потому что там, где ты передаешь n, должна быть величина целого типа.
Например, у тебя есть строка s="122233" и тебе нужно удалить двойки.. тогда ты делаешь так: delete(s,2,3);
Тебе же по заданию нужно сначала найти в строке заданный символ, а потом удалять.. В этом тебе поможет это:
Цитата
Function Pos(Substr : String; S : String) : Byte;
Параметры Substr и S - строковые выражения. Pos ищет первое вхождение строки Substr в строку S и возвращает целочисленное значение, которое является индексом первого символа Substr внутри S. Если строка Substr не найдена, то Pos возвращает ноль.
Попробуй переделать сам
Автор: kvadrat 19.05.2008 2:08
Я про эти операторы в вашем FAQ читал.
Вот исправил но она удаляет только одну двойку, думаю тут чтото нужно зациклить тока какое будет условие в цикле?
program ertfgsd; var s:string[10];n:char;l:integer; begin l:=1; writeln('vvedite stroky'); readln(s); writeln('vvedite simvol kotorii nygno edalit'); readln(n); delete(s,pos(n,s),l); writeln(s); end.
Автор: Айра 19.05.2008 2:16
Цитата
думаю тут чтото нужно зациклить тока какое будет условие в цикле?
Тебе нужно будет удалять 2-ки (представим, что мы удаляем именно их)) до тех пор, пока pos их не перестанет находить.. Вывод?
Автор: mind abuse 19.05.2008 2:36
В паскалевом хэлпе по функциям Pos и Delete программа почти написана)
Код
program ertfgsd; uses crt; var s:string[10]; n:char; i:integer; begin clrscr;
writeln('vvedite stroky'); readln(s); writeln('vvedite simvol kotorii nygno udalit'); readln(n); while pos(n,s)>0 do begin delete(s,pos(n,s),1); {<----- удаляем по одному символу} end; writeln(s); readln; end.
Автор: volvo 19.05.2008 2:41
mind abuse, я бы не стал этого делать - зачем 2 раза вызывать Pos, вместо того, чтобы использовать постусловие и вызвать его только один раз на каждой итерации?
Автор: Айра 19.05.2008 2:54
[off-top]
Цитата
В паскалевом хэлпе по функциям Pos и Delete программа почти написана
Знаешь, мне кажется, что очень важно самому до чего-то додуматься, особенно в самом начале.. а не переписывать программы из хелпа.. [\off-top]
Автор: mind abuse 19.05.2008 3:33
Айра , не спорю, иначе текст просто набор буковок, я имел в виду, что там в коротком примере как раз был оформлен цикл, которого не хватало в программе.
volvo, а в чём принципиальная экономия "repeat delete until pos=0" от представленного? Объясните пожалуйста,- у меня на самом деле всегда с программированием проблемы были, это я сейчас наверстать пытаюсь(
Автор: Айра 19.05.2008 3:40
Цитата
а в чём принципиальная экономия
Думаю в скорости выполнения.. тебе же 2 раза придется считать одно и тоже.. а если строка ооочень баальшая)), да еще и нужный элемент только в самом конце будет?
добавлено: хм.. "Ооочень баальшая".. а ведь на сколько я знаю больше 255 быть не может.. тогда может еще что-то есть..
Автор: mind abuse 19.05.2008 3:54
Так я и не догоняю, где в
Код
repeat delete(s,pos(n,s),1) until pos(n,s)=0;
меньше действий чем
Код
while pos(n,s)>0 do delete(s,pos(n,s),1);
//зачем begin-end ставил - не знаю, лишнее.
Специально F8 прогонял.
Автор: Айра 19.05.2008 9:34
Здесь:
var k: integer; ..... repeat k:=pos(n,s); delete(s,k,1); until k=0;
Дело не в количестве просто действий, а в количестве вызываний функции..