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