Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача на сравнение строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Sheriff
Заведите массив из десяти элементов символьного типа - 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.



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

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

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

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

Я думаю, что каждый символ используется 1 раз только.
По поводу 2 части сообщения, то мне это тоже в голову пришло, но как остановить внутренний цикл не знаю.
И как можно убрать уже найденный символ из массива M[i]?
volvo
Цитата
if S[j]=m[i] then
A:=A+M[i]; { <--- Этого недостаточно... }

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

Про лишний Readln(a) уже сказали...
Гость
Цитата(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;



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

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

Если у тебя в строке не попадутся цифры, то можно и так.. А вообще, думаю, предполагалось такое присваивание
m[i]:=#0;
volvo
Цитата
Можно вместо for использовать while
Break никто не отменял. Выходит из самого внутреннего цикла, что и требуется.
Спойлер (Показать/Скрыть)
nopsrer
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.


Айра
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
В следующий раз вот за такое:
Цитата
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 в репутацию, и не говори, что я тебя не предупредил...

Срочно читать доки: Руководство по языку B.Pascal 7 & Objects/LR, и только потом, когда прочитаешь и поймешь все, о чем там написано, будешь отвечать. Особое внимание обратить на: Операторы цикла с параметром (for), конкретно - вот тут:
Цитата
Если оператор, содержащийся в теле оператора for, изменяет значение управляющей переменной, то это является ошибкой.

nopsrer
Ну раз нельзя, так нельзя. Тогда или просто использовать 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;



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

Спасибо всем, работает!
но есть 1 вопрос, а как в этой программе можно было использовать goto?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.