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

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

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

> Задача на сравнение строк
Sheriff
сообщение 21.08.2008 13:57
Сообщение #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.



 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 11)
Айра
сообщение 21.08.2008 15:59
Сообщение #2


Профи
****

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

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


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

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

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


Гость






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

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

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

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


Гость






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

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

Про лишний Readln(a) уже сказали...
 К началу страницы 
+ Ответить 
Гость
сообщение 21.08.2008 19:06
Сообщение #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;



 К началу страницы 
+ Ответить 
Айра
сообщение 22.08.2008 0:16
Сообщение #6


Профи
****

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

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


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

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

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


Гость






Цитата
Можно вместо for использовать while
Break никто не отменял. Выходит из самого внутреннего цикла, что и требуется.
Спойлер (Показать/Скрыть)
 К началу страницы 
+ Ответить 
nopsrer
сообщение 22.08.2008 3:05
Сообщение #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 
 К началу страницы 
+ Ответить 
Айра
сообщение 22.08.2008 9:11
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 22.08.2008 9:12
Сообщение #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, изменяет значение управляющей переменной, то это является ошибкой.

 К началу страницы 
+ Ответить 
nopsrer
сообщение 22.08.2008 11:14
Сообщение #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 
 К началу страницы 
+ Ответить 
Гость
сообщение 22.08.2008 12:23
Сообщение #12


Гость







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

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

 



- Текстовая версия 21.07.2025 10:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"