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

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

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

> Строки, удаление символов
Katrinka
сообщение 16.12.2006 19:57
Сообщение #1


Новичок
*

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

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


Задача такая: заменить каждую группу повторяющихся символов в строке одним символом (строка состоит из букв, отсортированных по алфавиту).
я написала так:
for i:=1 to ord(s[0]) do
if a[i]=a[i+1] then delete (s,i,1) , но почему-то не работает
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 12)
volvo
сообщение 16.12.2006 20:04
Сообщение #2


Гость






Ты при Delete изменяешь длину строки, так? А цикл будет продолжаться до той длины строки, которая была ПЕРЕД циклом, так что даже если бы это и работало - доверять результату нельзя; я уж не говорю о том, что Ord(s[0]) вообще для меня не существует, потому что моим компилятором не признается...
 К началу страницы 
+ Ответить 
Malice
сообщение 16.12.2006 20:09
Сообщение #3


Профи
****

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

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


Поменяй
if a[i]=a[i+1] then
на
while (s[i]=s[i+1]) and (I<length(s)) do
Должно работать.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Katrinka
сообщение 16.12.2006 21:05
Сообщение #4


Новичок
*

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

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


Я так написала, но все равно работает неправильно...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.12.2006 21:30
Сообщение #5


Профи
****

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

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


Приведи полный код, что вводишь и что получается.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Katrinka
сообщение 16.12.2006 23:02
Сообщение #6


Новичок
*

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

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


procedure delete_char(var s:string);
var i,j,n:integer;
s1:string;
begin


while (a[i]=a[i+1]) and (a[i]<length(s)) then delete(s,i,1)

end;

Выводится без изменения
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.12.2006 23:17
Сообщение #7


Профи
****

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

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


А что такое a[i], если строка в s ?! Да и вообще, найди в этих строках отличия:
while (a[i]=a[i+1]) and (a[i]<length(s)) then
while (s[i]=s[i+1]) and (I<length(s)) do
еще вопросы есть ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Katrinka
сообщение 16.12.2006 23:20
Сообщение #8


Новичок
*

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

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


Это понятно, это я в текстовом редакторе опечаталась.В паскале написано правильно и не работает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.12.2006 23:31
Сообщение #9


Профи
****

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

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


Проблемы с редактором- прикрепи файл.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Katrinka
сообщение 16.12.2006 23:37
Сообщение #10


Новичок
*

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

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


Так выглядит код:
procedure delete_char(var s:string);
var i:integer;
s1:string;
begin
while (s[i]=s[i+1])and(s[i]<length(s)) do begin delete(s,i,1); i:=i+1 end;
end;
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 16.12.2006 23:44
Сообщение #11


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

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


Во-первых, переменная i ничему не равна в начале. Во-вторых, лучше делать не так; лучше пройтись циклом for, и генерить вторую строку, добавляя в нее символы, отличающиеся от предыдущих (if (i = 1) or (s[i - 1] <> s[i]) then s1 := s1 + s[i]). В-третьих, если уже хочешь так, то просто на бумажке выполни несколько шагов для строки AABBCC и увидишь, что не так.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 16.12.2006 23:46
Сообщение #12


Профи
****

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

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


Издеваешься ?
В своем первом посте я сказал что на что поменять, на всякий случай приведу как оно должно выглядеть:
procedure delete_char(var s:string);
var i:integer;
begin
for i:=1 to ord(s[0]) do
while (s[i]=s[i+1]) and (I<length(s)) do
delete (s,i,1);
end;

Если не получится переписать, я могу прикрепить файл, надо ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Katrinka
сообщение 16.12.2006 23:54
Сообщение #13


Новичок
*

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

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


Спасибо, заработало. Я изначально так и писала, только в тексте основной программы не запусила процедуру...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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