IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача на сравнение строк
сообщение
Сообщение #1


Гость






Заведите массив из десяти элементов символьного типа - 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.



 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


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

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

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






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

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

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

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


Гость






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

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

Про лишний Readln(a) уже сказали...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата(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;



 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


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

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

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


Гость






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


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


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.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


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;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






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

 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 15
Пол: Мужской
Реальное имя: Максим

Репутация: -  0  +


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



ЗЫ: не судите строго, паскаль знаю только с школьного курса...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость







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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 18.04.2024 8:10
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name