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

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

Форум «Всё о Паскале» _ Задачи _ задача по теме Символьные данные

Автор: 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 возвращает ноль.

Попробуй переделать сам smile.gif

Автор: 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 их не перестанет находить..
Вывод? smile.gif

Автор: 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

Здесь: smile.gif


var k: integer;
.....
repeat
k:=pos(n,s);
delete(s,k,1);
until k=0;

Дело не в количестве просто действий, а в количестве вызываний функции..