Помощь - Поиск - Пользователи - Календарь
Полная версия: Найти в исходном символьном массиые слово РАК ...
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Анна
Код
Найти в исходном символьном массиые слово РАК и заменить его в результирующем массиве словом ЩУКА без потери символов

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

Почему-то у Вас файлы не прикрепляются sad.gif, пришлось попросить помощи
Вот ссылка на мой алгоритм: http://ork.53535.ru/Drawing2.vsd
volvo
Анна, так не пойдет... Что такое VSD файл? CorelDraw? В правилах мы просим оффисные файлы не выкладывать, а уж третьесторонние программы так и подавно...

Неужели нельзя прикрепить изображение в распространенном формате? Вот у меня, например, нет на компьютере CorelDraw... Я думаю, кстати, что не только у меня...
hiv
Это в формате MS Visio. Там к стати есть такой вариант: файл сохранить как и выбрать PNG формат. Вот картинка:

Нажмите для просмотра прикрепленного файла
Анна
To: volvo
VSD - это расширение файлов visio, я в ней составляла алгоритм, он большой, поэтому в одну картинку поместить не могу sad.gif Вот в с раширением *doc http://ork.53535.ru/drawling.doc по-другому не могу sad.gif
Анна
Ну как алгоритм? nea.gif
Selena
Я давным давно делала что-то похожее. Вот посмотри.
Анна
To: Selena
Спасибо, но у нас совсем разные алгоритмы. И кстатит, какое у тебя задание было? Посчитать сколько раз встречается слово "стоимостью"? и потом домножить на "2" ?


ps Мне алгоритм мой нужно проверить ... правильный он или нет? Никто не разбирается что ли? sad.gif
Анна
Да и ещё, у тебя в курсовой нет описания алгоритма ... сколько тебе за неё хоть поставили?
Анна
Помогите укоратить программу, сделать её попроще, но чтобы смысл не терялся.



Program Kursovik;
var
i, j, x, k, n : Integer;
a, b : array[1..1000] of Char;
s: string;
begin
writeln('Vvedite stroku: ');
readln(s);
i:=1; j:=1; k:=0; x:=0;
repeat
x := x + 1;
a[x]:=s[x];

until x = length(s);
while not (i > x) do
begin
if not (( ( ord(a[i-1])>159 ) and (ord(a[i-1])<176) ) or ((ord(a[i-1])>223) and (ord(a[i-1])<240))) then
if a[i] = 'р' then
if a[i+1] = 'а' then
if a[i+2] = 'к' then

if not ((( ord(a[i+3])>159 ) and (ord(a[i+3])<176) ) or ((ord(a[i+3])>223) and (ord(a[i+3])<240))) then
begin

b[j] := 'щ';
b[j+1] := 'у';
b[j+2] := 'к';
b[j+3] := 'а';


i := i + 3;
j := j + 4;
end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end

end;
write('Resoult massiv:');
repeat
k := k + 1;
write(b[k]);
until k = j;
readln;
end.



Помогите упростить вот эти строчки:
not (( ( ord(a[i-1])>159 ) and  (ord(a[i-1])<176) ) or ((ord(a[i-1])>223) and  (ord(a[i-1])<240)))
volvo
not (
((ord(a[i-1])>159) and (ord(a[i-1])<176))
or
((ord(a[i-1])>223) and (ord(a[i-1])<240))
)

аналогично
not (
a[i-1] in [#160 .. #175, #224 .. #239]
)
, если я не ошибаюсь...
klem4
Хмм .. а во так интересно можно сделать ?

uses crt;
var
s : array[1..80] of char;
temp : string;
n,i,p : byte;

begin

clrscr;

write('n='); readln(n);

temp := '';

for i := 1 to n do begin
readln(s[i]);
temp := temp + s[i];
end;

writeln;

writeln(temp);

p := pos('рак', temp);
if p = 0 then writeln('N0')
else begin

delete(temp, p,3);
insert('щука',temp, p);

for i := 1 to length(temp) do
s[i] := temp[i];

inc(n);

end;

writeln;

for i := 1 to n do
write(s[i]);

readln;
end.

klem4
Еще вариант :

uses crt;
const
fish : array [0..3] of char = ('щ','у','к','а');
var

s : array[1..80] of char;
n,i,j : byte;

begin

clrscr;

write('n='); readln(n);

FillChar(s, sizeof(s),0);

for i := 1 to n do readln(s[i]);

writeln;

for i := 1 to n do write(s[i]);

{$r-}
i := 1;

while(i<=n-2) do
if (s[i] = 'р') and (s[i+1]='а') and (s[i+2]='к') then begin
for j := n + 1 downto i do s[j] := s[j-1];
for j := 0 to 3 do
s[i+j] := fish[j];
inc(i,4);
inc(n);
end
else inc(i);

writeln;

for i := 1 to n do write(s[i]);

readln
end.

Selena
Это не курсовая была, а лабораторная. Отн ас не требуют писменого описания алгоритма. Мы рассказываем устно. А получила я 4.
Анна
Вот, закончила работу над алгоритмом, а также программой, вот что получилось.
БОЛЬШАЯ просьба: подправьте меня, если что не так ...



Program Kursovik;
var
i, j, x, k, n : Integer;
a, b : array[1..1000] of Char;
s: string;
begin
writeln('Введите строку: ');
readln(s);
i:=1; j:=1; k:=0; x:=0;
repeat
x := x + 1;
a[x]:=s[x];

until x = length(s);
while not (i > x) do
begin
if not (a[i-1] in [#160.. #175, #224..#239]) then
if a[i] = 'р' then
if a[i+1] = 'а' then
if a[i+2] = 'к' then

if not (a[i+3] in [#160.. #175, #224..#239]) then
begin

b[j] := 'щ';
b[j+1] := 'у';
b[j+2] := 'к';
b[j+3] := 'а';


i := i + 3;
j := j + 4;
end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end
else begin b[j] := a[i]; i := i + 1; j := j + 1; end

end;
write('Результат: ');
repeat
k := k + 1;
write(b[k]);
until k = j;
readln;
end.
klem4
Анна, а чем мое второе решение не понравилось ? мне кажется оно проще да и по короче будет ...
Анна
Не учёл условия, что если к примеру вводить "ракрак", то результатом должно быть "ракрак". Нужно СЛОВО (отдельностоящее) заменить (т.е. нужно чтобы слева и справа от слова небыло букв, а были только либо знаки, либо пробел)
Вот в той программе это учитывается, при вводе "ракрак" или "ракапавпк" результатом эти строки и остаются.
klem4
Цитата
Нужно СЛОВО (отдельностоящее) заменить


В том чтобыло написано тобой выше я такой фразы не видел no1.gif
Анна
По мне это само собой подразумевало. Сказано "Найти в исходном символьном массиые слово ..." Разве, к примеру ввести строчку "раки" - то результатом не будет являться "щукаи", т.к. в этом случае слово РАКИ, а не РАК wacko.gif
volvo
Анна, проверь:
const
alpha = [#160.. #175, #224..#239];
var
s: string;
p, start: integer;

begin
write('s = '); readln(s);
p := 0;

repeat
start := p;
p := start + pos('рак', copy(s, start + 1, 255));
if
(
(p <> start)
and
((p = 1) or ( (p > 1) and not(s[p-1] in alpha)))
and
((p + 2 = length(s)) or ((p + 2 < length(s)) and not(s[p+3] in alpha)))
) then

begin
delete(s, p, 3);
insert('щука', s, p);
end;
until p = start;

writeln(s);
end.

cool.gif
Анна
volvo
Правильно, только небольшая поправка в строке:
alpha = [#48..#57, #160.. #175, #224..#239];

Чтобы при наличии цифр в начале или в конце слова, результат оставался тот же.

И ещё, sad.gif, алгоритм был сделан под мою задачу, переделывать что ли .. даже и не знаю sad.gif. Да и вообще с pos, delete ... плохо знакома. И поэтому сама программа не так понятна sad.gif
klem4
Цитата
Да и вообще с pos, delete ... плохо знакома. И поэтому сама программа не так понятна


goto FAQ : Строки. blum.gif
klem4
вот так лучше ?

uses crt;
const
fish : array [0..3] of char = ('щ','у','к','а');
limits = [#0..#32,'.',',','!','?',':','"'];

var

s : array[1..80] of char;
n,i,j : byte;

begin

clrscr;

write('n='); readln(n); // количество элементов в массиве

FillChar(s, sizeof(s),0);

for i := 1 to n do readln(s[i]); // посимвольный ввод строки

writeln;

for i := 1 to n do write(s[i]); // вывод строки на экран

{$r-} // отключение проверки выхода за границы массива
i := 1;

while(i<=length(s)-2) do begin (* внешний цикл до момента достижения
i = length(s) -2, так как это последнй шанс когда там может находиться слово РАК *)
while(i<=length(s)-2) and (s[i] in limits)
do inc(i); // проходим по массиву пока не найдем букву

if (i<=length(s)-2) and (s[i] = 'р') and (s[i+1]='а') and (s[i+2]='к') and (s[i+3] in limits) then begin
(* Если начиная с найденной буквы следует слово РАК и за ним следует НЕ буква или оно стоит в конце массива,
то сдвигаем все символы на один элемент вправо и
начиная с символа хранащего букву Р слова РАК вставляем слово ЩУКА
*)
for j := n + 1 downto i do s[j] := s[j-1];
for j := 0 to 3 do
s[i+j] := fish[j];
inc(i,4); // проскакивае далее по массиву через добавленое слово ЩУКА
inc(n); (* длина массива увеличилась на единицу, так как щука длинее рака на один символ smile.gif)
*)
end
(* Если найденная группа букв НЕ слово рак с пробелом до и после него или
стоящее в конце строки, то идем по массиву дальше пока не закончится этот набор букв или строка
*)
else repeat
inc(i);
until (s[i] in limits) or (i=length(s)-2);
end;

writeln;

for i := 1 to n do write(s[i]); // выводм результат на экран.

readln
end.

Altair
const
r='rak';
h='hyka';
var

s: string;
begin
writeln('Enter string: ');
readln(s);
while pos(r,s)<>0 do begin
insert(h,s,pos(r,s));
delete(s,pos(r,s),3);
end;
writeln(s); readln
end.
klem4
Олег !!! Ухаха, надо символьный массив использовать !!! Задание читал ? lol.gif good.gif blum.gif
Altair
To: klem4 , ты меня начинаешь выводить из себя... своим гонором и неоправданным самомнением...
перевести символьный массив в строку ....

у меня скомпилилось и сработало так:

Program Kursovik;
{$R+}
const
r='rak';
h='hyka';
var

s: string;
c:array[1..5] of char;
begin
c[1]:='r';
c[2]:='a';
c[3]:='k';
c[4]:='1';
c[5]:='2';
s:=c;
writeln('Enter string: ');
{ readln(s);}
while pos(r,s)<>0 do begin
insert(h,s,pos(r,s));
delete(s,pos(r,s),3);
end;
writeln(s); readln
end.

klem4
из строки rak12 должна получиться строка rak12
Altair
Цитата
Найти в исходном символьном массиые слово РАК и заменить его в результирующем массиве словом ЩУКА без потери символов

Цитата
из строки rak12 должна получиться строка rak12

исходя из условия должно быть hyka12
ибо нигде не сказанно что слова долдны чем то разделятся (ты на это типа намекнул )

вобщем если каша в теме будет продолжаться, она будет закрыта, из-за отсутствия темы обсуждения как таковой!
klem4
Э-эх, ну ладно, понеслась!
это что : http://forum.pascal.net.ru/index.php?showt...indpost&p=51619

+

Цитата(Анна)
Не учёл условия, что если к примеру вводить "ракрак", то результатом должно быть "ракрак". Нужно СЛОВО (отдельностоящее) заменить (т.е. нужно чтобы слева и справа от слова небыло букв, а были только либо знаки, либо пробел)
Вот в той программе это учитывается, при вводе "ракрак" или "ракапавпк" результатом эти строки и остаются.
volvo
mad.gif Сколько еще вариантов решения надо предложить, чтобы это НАКОНЕЦ-ТО устроило автора темы???
Altair
Цитата
Сколько еще вариантов решения надо предложить, чтобы это НАКОНЕЦ-ТО устроило автора темы???
4.gif
Уже предложенно порядочно что бы удовлетворить всех и все...
Анна
Давайте не будем ругаться. Я вообще не просила писать мне программу, я выложила свою программу и алгоритм на ваш суд.

А тему закрывать не надо. Ещё может будет обсуждение самого алгоритма.
volvo
Цитата
Ещё может будет обсуждение самого алгоритма.

Правда? А зачем? Чтобы тебе написали еще 3-4 версии, а ты сказала, "Я не просила мне ничего писать, я хотела только пообсуждать"? Спасибо, второй раз такой вариант не проходит...

Кроме этого, я бы порекомендовал разобраться с терминологией. Что есть Алгоритм? Этот твой рисунок? Ха... Тогда что есть блок-схема этого самого алгоритма? Так вот в этом и есть вся проблема: сначала надо было придумать АЛГОРИТМ (словесное описание процесса решения задачи), и пообсуждать его, если тебе очень этого хотелось. А теперь обсуждать нечего, ты всем навязала свой способ решения. Ну, так пользуйся.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.