Помощь - Поиск - Пользователи - Календарь
Полная версия: задача по теме Символьные данные
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
kvadrat
Задан текст. Выкинуть из текста вхождения заданого символа.

Прочитал 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.
Айра
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
Я про эти операторы в вашем 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.
Айра
Цитата
думаю тут чтото нужно зациклить тока какое будет условие в цикле?

Тебе нужно будет удалять 2-ки (представим, что мы удаляем именно их)) до тех пор, пока pos их не перестанет находить..
Вывод? smile.gif
mind abuse
В паскалевом хэлпе по функциям 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
mind abuse, я бы не стал этого делать - зачем 2 раза вызывать Pos, вместо того, чтобы использовать постусловие и вызвать его только один раз на каждой итерации?
Айра
[off-top]
Цитата
В паскалевом хэлпе по функциям Pos и Delete программа почти написана

Знаешь, мне кажется, что очень важно самому до чего-то додуматься, особенно в самом начале.. а не переписывать программы из хелпа..
[\off-top]
mind abuse
Айра , не спорю, иначе текст просто набор буковок, я имел в виду, что там в коротком примере как раз был оформлен цикл, которого не хватало в программе.

volvo, а в чём принципиальная экономия "repeat delete until pos=0" от представленного? Объясните пожалуйста,- у меня на самом деле всегда с программированием проблемы были, это я сейчас наверстать пытаюсь(
Айра
Цитата
а в чём принципиальная экономия

Думаю в скорости выполнения.. тебе же 2 раза придется считать одно и тоже.. а если строка ооочень баальшая)), да еще и нужный элемент только в самом конце будет?

добавлено: хм.. "Ооочень баальшая".. а ведь на сколько я знаю больше 255 быть не может.. тогда может еще что-то есть..
mind abuse
Так я и не догоняю, где в
Код
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 прогонял.
Айра
Здесь: smile.gif

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

Дело не в количестве просто действий, а в количестве вызываний функции..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.