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

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

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

Автор: PALADIN 3.12.2008 21:49

Условие:
Написать программу, заменяющую все подсловия abc на def. Удалить все пробелы и точки. Процедуры НЕ использовать.


После значительной мозговой атаки получилось у меня вот что :



str: string[1..255];
for i = 1 to lenght (str) do
begin
if ((str[i]="a") and
(str[i+1]="b") and
(str[i+2]="c")) then
str[i]:="d";
str[i+1]:="e";
str[i+2]:="f";


if (str[j] = ".") then
for j = i+1 to lenght
str[j-1] := str [j];




помогите привести задачку к окончательному варианту, а то скоро сдавать

Автор: S!n 3.12.2008 22:00

Мне нечто подобное на экзамене попалось. Подожди-ка немного...

Добавлено через 13 мин.
Что-то я рано начал тебе приводить задачку к окончательному варианту... Код неправильный вообще. Вы изучали стандартные процедуры и функции для строк?

Автор: PALADIN 3.12.2008 22:20

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

Автор: S!n 3.12.2008 22:41

Значит так, предложенная тобой программа не будет работать, так как str[i] - это номер символа. Ты пытаешься найти номер символа, равный А, B или C и заменить его на другой символ. Т.е. в твоем цикле ты обрабатываешь ТОЛЬКО НОМЕР символа (или его индекс по другому), но ни в коем-случае не сам символ. Надеюсь, это ясно. Идем дальше. Если нельзя использовать процедуры, значит используй функции. Например с помощью функции POS ты можешь найти подстроку в своей строке и заменить её. Вот тебе часть моего конспекта по строкам: "Функция POS(str1,str2) определяет позицию подстроки в строке. Результат - целое число, определяющее номер элемента с которого начинается ПЕРВОЕ вхождение подстроки str1 в строку в строку str2. Если str1 не входит в str2, то значение функции равно нулю. Пример:

k1=Pos('ша','Наша Раша'); 
k1=3
;" Дальше - проще. С помощью этой функции ищи символы пробела и точки в строке и меняй их на любой другой, например запятую. Затем, с помощью этой же функции ищи символы а,b,c и меняй их на d,e,f. Вопросы есть?

Автор: PALADIN 3.12.2008 22:55

В целом, кроме вопроса как выглядит теперь программа,вопросов нет.

Автор: S!n 3.12.2008 23:07

Вот тебе начало:

 
var
str: string[255];
i,x:integer;
begin
write('Введите строку символов -> ');
Readln(str);
for i:=1 to length(str) do
x:=pos(str,'a'); {Поиск символа 'a'}
x:='d';
... {Дальше делай сам}


Полностью исходник предоставить тебе не могу, т.к. писать его нет времени, да и получится не честно. Ты должен сам разобраться. Символы вводишь с клавиатуры. Главное, не забудь, что бы в вводимых тобой символах были нужные тебе abc. Дальше следуй по примеру. Удачи.

Автор: volvo 3.12.2008 23:08

Цитата
кроме вопроса как выглядит теперь программа,вопросов нет.
Очень просто:

  p := 1;
while p <= length(s) do begin
if (s[p] = ' ') or (s[p] = '.') then delete(s, p, 1) { удаляем символ, если он точка или пробел }
else inc(p);
end;

repeat
p := pos('abc', s); { ищем позицию ABC }
if p > 0 then begin
delete(s, p, 3); insert('def', s, p); { Не 0? Значит удаляем ABC и на то же место ставим DEF }
end;
until p = 0;

(закончишь самостоятельно, осталось совсем чуть-чуть)...

Я надеюсь, что
Цитата
Процедуры НЕ использовать.
относилось НЕ к процедурам работы со строками, присутствующим в языке?

Автор: S!n 3.12.2008 23:11

Целых два исходника ) И, кстати, правильный вопрос, о каких именно процедурах идет речь? Delete и insert?

2volvo, а если символы abc разделены между собой другими символами?

Автор: volvo 3.12.2008 23:11

Цитата
Вот тебе начало:
dry.gif Как это "начало" относится к заданию? Предлагаешь искать посимвольно, и менять A на D, B на E, и C на F? Ну-ну...

Автор: S!n 3.12.2008 23:19

2volvo, я ответил на твой вопрос заранее =)

Цитата
а если символы abc разделены между собой другими символами?

К примеру, строка будет выглядеть вот так: 'a..htds btf gh. fgch'

Автор: PALADIN 3.12.2008 23:29

Как я понял из условия задачи конструкция abc должна быть единой, а вот точка и пробел могут находиться где угодно.

Автор: S!n 3.12.2008 23:56

У меня есть ошибка в коде, причем довольно глупая. Забыл поставить оператор условия, следовательно вся прога неработоспособна. Вот исправленный код с единой конструкцией:

var
str:string[255];
i:integer;
begin
write('Введите строку символов -> ');
Readln(str);
for i:=1 to length(str) do
if i=pos(str,'abc') then {Поиск подстроки 'abc'}
i:='def'; {Замена подстроки 'abc' на подстроку 'def'}

У себя не проверял, но работать должно.

Автор: Kascader 4.12.2008 0:26

Program lab1;
uses crt;
var
stroka: string;
i:integer;
bukvi: set of char;
begin
randomize;
for i:=1 to 50 do
stroka:=stroka+char(97+random(26));
writeln(stroka);
for i:=1 to length(stroka)-2 do
if ((stroka[i]='a')and
(stroka[i+1]='b')and
(stroka[i+2]='c')) then
begin
stroka[i]:='d';
stroka[i+1]:='e';
stroka[i+2]:='f';
end;
writeln(stroka);
readln;
end.



СПС за замечание но ,Вместо того чтобы кричать исправил бы...

Автор: volvo 4.12.2008 1:25

S!n

Цитата
У себя не проверял, но работать должно.
Что именно? Присвоение строки в переменную типа Integer? Каким компилятором, если не секрет, пользуешься, что там ТАКОЕ должно работать?

Kascader-у: за намеренное введение в заблуждение в следующий раз получишь минус, предупреждаю сразу... Вот за это в частности:
Цитата
for i:=1 to 50 do { <--- Запомни, цикл по i }
begin
stroka:=stroka+char(97+random(26));
for i:=1 to length(stroka) do; { <--- Еще один по i - НЕЛЬЗЯ !!! }
Это я не говорю о том, что у тебя второй цикл вообще ПУСТОЙ, точка с запятой его закрывает сразу же... А говоришь "Юзай". Чего тут юзать-то?

Напоминаю, вверху написано:
Цитата(Правила Раздела)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
Это написано далеко не просто так...

Автор: S!n 4.12.2008 3:25

i:='def';

Сорри, здесь моя ошибка. Давно не работал со строками...