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

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

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

Автор: Sheriff 21.08.2008 17:57

Заведите массив из десяти элементов символьного типа - Char. Введите его с клавиатуры. Далее - прочитайте строку и проверьте, возможно ли из символов, введенных в массив составить заданную строку.

Пример:
Массив: А,Р,У,П,Q,К,W,Ф,О,S.
Строка: УРОК
Ответ: возможно. (В веденном массиве существуют сиволы "У", "Р", "О", "К").
Пытался сделать, так ничего и не получилось, помогите пжл!!(выложу свой код, не смейтесь).


var
A,S:string;
M:array [1..10] of char;
i,j:byte;
begin
for i:=1 to 10 do
begin
write('Symbol',i,': ');
readln(M[i]);
end;
Write('Введите строку: ');
readln(s);
for j:=1 to length(s) do
for i:=1 to 10 do
begin
if S[j]=m[i] then
A:=A+M[i];
end;
Write('A= ',A);
readln(a);
if A=S then
Write('Возможно');
end.




Автор: Айра 21.08.2008 19:59

А какой-то из символов массива можно использовать несколько раз? Например, в массиве "М" и "А", а слово "мама"..

Смотри, если у тебя, наприме, массив будет "кккурокккк", то слово А получится равным "уроккккккк", и оно уже не будет совпадать с исходным.. Тебе нужно это обойти. Т.е. внутренний цикл при нахождении подходящего символа должен останавливаться. Подумай над этим))
И еще, зачем тебе readln(a) перед последним оператором сравнения?

Автор: Sheriff 21.08.2008 20:38

Цитата(Айра @ 21.08.2008 15:59) *

А какой-то из символов массива можно использовать несколько раз? Например, в массиве "М" и "А", а слово "мама"..

Смотри, если у тебя, наприме, массив будет "кккурокккк", то слово А получится равным "уроккккккк", и оно уже не будет совпадать с исходным.. Тебе нужно это обойти. Т.е. внутренний цикл при нахождении подходящего символа должен останавливаться. Подумай над этим))
И еще, зачем тебе readln(a) перед последним оператором сравнения?

Я думаю, что каждый символ используется 1 раз только.
По поводу 2 части сообщения, то мне это тоже в голову пришло, но как остановить внутренний цикл не знаю.
И как можно убрать уже найденный символ из массива M[i]?

Автор: volvo 21.08.2008 21:25

Цитата
if S[j]=m[i] then
A:=A+M[i]; { <--- Этого недостаточно... }

... тебе нужно еще "обнулить" символ M[ i ], чтобы при следующем проходе он же не был найден второй раз. Для этого занеси в M[ i ] любой символ, который не будет встречаться в строке, скажем, #0...

Про лишний Readln(a) уже сказали...

Автор: Гость 21.08.2008 23:06

Цитата(volvo @ 21.08.2008 17:25) *

... тебе нужно еще "обнулить" символ M[ i ], чтобы при следующем проходе он же не был найден второй раз. Для этого занеси в M[ i ] любой символ, который не будет встречаться в строке, скажем, #0...

Про лишний Readln(a) уже сказали...

Так?

if S[j]=m[i] then
begin
A:=A+M[i];
m[i]:='0';
end;




Автор: Айра 22.08.2008 4:16

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

Можно вместо for использовать while smile.gif
Цитата
Так?

Если у тебя в строке не попадутся цифры, то можно и так.. А вообще, думаю, предполагалось такое присваивание
m[i]:=#0;

Автор: volvo 22.08.2008 4:29

Цитата
Можно вместо for использовать while
Break никто не отменял. Выходит из самого внутреннего цикла, что и требуется.
Спойлер (Показать/Скрыть)

Автор: nopsrer 22.08.2008 7:05

uses crt;
var mas: array [1..10] of char;
i,j: integer;
str: string;
a: boolean;
begin
writeln('Введите массив');
for i:=1 to 10 do begin

mas[i]:=readkey;
write(mas[i]);
end;
writeln;
writeln('Введите строку');
readln(str);
i:=1;
a:=true;
while (a=true) and (length(str)>=i) do begin
for j:=1 to 10 do begin
if mas[j]=str[i] then begin a:=true; mas[j]:=#0; j:=10 end else a:=false;
end;
inc(i);
end;
if a=true then writeln('yes') else writeln('no');
readkey;

end.



Автор: Айра 22.08.2008 13:11

for j:=1 to 10 do 
begin
if mas[j]=str[i] then
begin
a:=true; mas[j]:=#0;
j:=10 <- а вот так делать очень не хорошо
end
else
a:=false;

Автор: volvo 22.08.2008 13:12

В следующий раз вот за такое:

Цитата
for j:=1 to 10 do begin { <-- цикл по J }
if mas[j]=str[i] then begin a:=true; mas[j]:=#0; j:=10 end else a:=false; { <-- изменение J в цикле }
end;
получишь -1 в репутацию, и не говори, что я тебя не предупредил...

Срочно читать доки: http://zeus.sai.msu.ru:7000/programming/bp70_lr/index.shtml, и только потом, когда прочитаешь и поймешь все, о чем там написано, будешь отвечать. Особое внимание обратить на: http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr7.shtml#14, конкретно - вот тут:
Цитата
Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой.


Автор: nopsrer 22.08.2008 15:14

Ну раз нельзя, так нельзя. Тогда или просто использовать break

for j:=1 to 10 do begin
if mas[j]=str[i] then
begin
a:=true;
mas[j]:=#0;
break;
end
else a:=false;
end;

или цикл while
j:=1;
a:=false;
while (j<=10) and (a=false) do begin
if mas[j]=str[i] then
begin
a:=true;
mas[j]:=#0;
end;
inc(j);
end;



ЗЫ: не судите строго, паскаль знаю только с школьного курса...

Автор: Гость 22.08.2008 16:23


Спасибо всем, работает!
но есть 1 вопрос, а как в этой программе можно было использовать goto?