IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> задача по теме Символьные данные
kvadrat
сообщение 18.05.2008 20:57
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской

Репутация: -  0  +


Задан текст. Выкинуть из текста вхождения заданого символа.

Прочитал 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 10)
Айра
сообщение 18.05.2008 21:32
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


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

Сообщение отредактировано: Айра - 18.05.2008 22:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
kvadrat
сообщение 18.05.2008 22:08
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 81
Пол: Мужской

Репутация: -  0  +


Я про эти операторы в вашем 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 18.05.2008 22:16
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
думаю тут чтото нужно зациклить тока какое будет условие в цикле?

Тебе нужно будет удалять 2-ки (представим, что мы удаляем именно их)) до тех пор, пока pos их не перестанет находить..
Вывод? smile.gif


Сообщение отредактировано: Айра - 18.05.2008 22:17
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mind abuse
сообщение 18.05.2008 22:36
Сообщение #5


Студент
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: Владимир

Репутация: -  3  +


В паскалевом хэлпе по функциям 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.




Сообщение отредактировано: mind abuse - 18.05.2008 22:38


--------------------
...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.05.2008 22:41
Сообщение #6


Гость






mind abuse, я бы не стал этого делать - зачем 2 раза вызывать Pos, вместо того, чтобы использовать постусловие и вызвать его только один раз на каждой итерации?
 К началу страницы 
+ Ответить 
Айра
сообщение 18.05.2008 22:54
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


[off-top]
Цитата
В паскалевом хэлпе по функциям Pos и Delete программа почти написана

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


Сообщение отредактировано: Айра - 18.05.2008 22:55
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mind abuse
сообщение 18.05.2008 23:33
Сообщение #8


Студент
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: Владимир

Репутация: -  3  +


Айра , не спорю, иначе текст просто набор буковок, я имел в виду, что там в коротком примере как раз был оформлен цикл, которого не хватало в программе.

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


--------------------
...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 18.05.2008 23:40
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
а в чём принципиальная экономия

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

добавлено: хм.. "Ооочень баальшая".. а ведь на сколько я знаю больше 255 быть не может.. тогда может еще что-то есть..

Сообщение отредактировано: Айра - 18.05.2008 23:44
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mind abuse
сообщение 18.05.2008 23:54
Сообщение #10


Студент
*

Группа: Пользователи
Сообщений: 35
Пол: Мужской
Реальное имя: Владимир

Репутация: -  3  +


Так я и не догоняю, где в
Код
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 прогонял.


--------------------
...Чего-то хотелось: не то конституции, не то севрюжины с хреном, не то кого-нибудь ободрать.
(М. Е. Салтыков-Щедрин)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 19.05.2008 5:34
Сообщение #11


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Здесь: smile.gif

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

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

Сообщение отредактировано: Айра - 19.05.2008 5:38
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 29.07.2025 21:21
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"