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

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

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

> Строки!Помогите. пожалуйста
Дымка
сообщение 9.07.2005 17:42
Сообщение #1


Новичок
*

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

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


Дана строка, содержащая текст на русском языке. В предложениях некоторые из слов записаны подряд несколько раз (предложение заканчивается точкой или восклицательным знаком). Получить в новой строке отредактированный текст, в котором удалены подряд идущие вхождения слов в предложениях.
Не понимаю, как ее сделать!!Помогите, пожалуйста!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 17)
volvo
сообщение 9.07.2005 18:02
Сообщение #2


Гость






Поиском не пробовал пользоваться? Я по-моему уже выкладывал что-то подобное...
const
{ Здесь - символы, составляющие слова (без разделителей) }
abc = ['а'..'п', 'р'..'я', 'А'..'П', 'Р'..'Я'];
s: string = ' да да нет да нет три три три три.';

var
s_res, prev, _word: string;
p: byte;

begin
s_res := s; prev := '';

p := 1;
repeat
while not (s_res[p] in abc) and (p <= length(s_res))
do inc(p);

while (s_res[p] in abc) and (p <= length(s_res)) do begin
_word := _word + s_res[p];
inc(p);
end;

if _word = prev then begin
delete(s_res, p - length(_word), length(_word));
dec(p, length(_word));
end
else prev := _word;

_word := '';

until p > length(s_res);
writeln(s_res)
end.
 К началу страницы 
+ Ответить 
Дымка
сообщение 9.07.2005 18:17
Сообщение #3


Новичок
*

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

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


Спасибо большое!!!...Только почему-то после нажатия сtrl F9 ничего не происходит sad.gif что не так?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.07.2005 18:21
Сообщение #4


Гость






Может уже произошло, и надо нажать на Alt+F5 чтобы посмотреть результат?
 К началу страницы 
+ Ответить 
Дымка
сообщение 9.07.2005 18:26
Сообщение #5


Новичок
*

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

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


Выдает измененную строку, но 33 раза подряд...sad.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.07.2005 18:34
Сообщение #6


Гость






Ну, я же не просто так сюда решение закинул, наверное... Почему у меня работает, а у тебя нет? Значит, код менял... Или столько раз запускал программу до этого... Попробуй в начало поставить ClrScr и потом запустить...

В-общем, вот тебе файл (с латинскими символами, извини, но кириллица есть не у всех...) - запусти, а потом поменяй алфавит и строку на русские...


Прикрепленные файлы
Прикрепленный файл  __432.PAS ( 658 байт ) Кол-во скачиваний: 204
 К началу страницы 
+ Ответить 
Дымка
сообщение 9.07.2005 18:44
Сообщение #7


Новичок
*

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

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


Еще раз огромное спасибо...И еще один дурацкий вопрос, прости, но как еще можно сделать, чтобы вне зависимости от регистра повторные слова удалялись? Т.е программа не удаляет Ya ya, к примеру...Из-за первой Y
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.07.2005 19:38
Сообщение #8


Гость






Переводи всю строку в верхний регистр:
s_res := StrUpper(s); { вместо s_res := s; }

Саму функцию StrUpper можешь взять здесь: FAQ: Модуль для работы со строками
 К началу страницы 
+ Ответить 
Дымка
сообщение 9.07.2005 23:39
Сообщение #9


Новичок
*

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

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


И за это спасибо...Хотя возник еще один вопрос...Удаляет правильно. Потом, с помощью StrLower возвращаюсь к первоначальному виду.Как сделать, чтобы заглавная буква была. а не все маленькие?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 9.07.2005 23:45
Сообщение #10


Гость






А, так тебе же к первоначальному виду возврашаться надо... rolleyes.gif Тогда все еще проще: измени тот фрагмент, что сейчас в программе на вот этот -
    if StrUpper(_word) = StrUpper(prev) then begin
delete(s_res, p - length(_word), length(_word));
dec(p, length(_word));
end


и не надо исправлений, о которых я говорил в посте №8...
 К началу страницы 
+ Ответить 
Дымка
сообщение 9.07.2005 23:59
Сообщение #11


Новичок
*

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

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


Че-то я совсем запуталась...
Код

Program Stroki;
uses crt;
Function StrUpper(s: String): String;
Var i: Byte;
 Begin
   For i := 1 To Ord(s[0]) Do
     Case s[i] Of
       'a' .. 'z': s[i] := Chr(Ord(s[i])-$20);
       #160 .. #175: s[i] := Chr(Ord(s[i])-$20);
       #224 .. #239: s[i] := Chr(Ord(s[i])-$50)
     End;
   StrUpper := s
 End;
Function StrLower(s: String):String;
 Var i: Byte;
 Begin
   For i := 1 To Ord(s[0]) Do
     Case s[i] Of
       'A' .. 'Z': s[i] := Chr(Ord(s[i])+$20);
       #128 .. #143: s[i] := Chr(Ord(s[i])+$20);
       #144 .. #159: s[i] := Chr(Ord(s[i])+$50)
     End;
   StrLower := s
 End;

const
  stUpper  = ['A' .. 'Z', #128 .. #159];
  abc = ['a'..'z','A'..'Z','1'..'9'];
var
  s_res, prev, word: string;
  p: integer;
  S: string;
  stnew: string;
  blank: boolean;
  i: integer;
begin
  clrscr;
  Write('Vvedite stroku,kotoraya zakan4ivaetsya');
  Writeln(' na vosklicatelniy znak ili to4ku');
  Readln(s);
  s_res :=StrUpper(s);
  prev := '';
  p := 1;
  repeat
     while not (s_res[p] in abc) and (p <= length(s_res)) do
        P:=p+1;
     while (s_res[p] in abc) and (p <= length(s_res)) do
     begin
        word := word + s_res[p];
        P:=p+1;
     end;
     if word = prev then
     begin
        delete(s_res, p - length(word), length(word));
        dec(p, length(word));
     end
     else
        prev := word;
     word := '';
  until p > length(s_res);
  blank:= false;
  stnew:= ' ';
  for i:= 1 to length(s_res) do
  begin
     if s_res[i] <>' ' then
     begin
        stnew:= stnew + s_res[i];
        blank:= false;
     end
     else if (not blank) then
     begin
         stnew:= stnew +s_res[i];
         blank:=true;
     end;
  end;
  while stnew[1]=' ' do
     stnew:=copy(stnew,2,255);
  while stnew[length(stnew)]=' ' do
     delete(stnew,length(stnew),1);
     s_res:=StrLower(stnew);
  writeln (s_res);

end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.07.2005 0:29
Сообщение #12


Гость






Ну не надо ничего придумывать... Я же сказал, что надо было сделать:

Function StrUpper(s: String): String;
Var i: Byte;
Begin
For i := 1 To Ord(s[0]) Do
Case s[i] Of
'a' .. 'z': s[i] := Chr(Ord(s[i])-$20);
#160 .. #175: s[i] := Chr(Ord(s[i])-$20);
#224 .. #239: s[i] := Chr(Ord(s[i])-$50)
End;
StrUpper := s
End;

const
abc = ['a'..'z','A'..'Z','1'..'9'];
var
s_res, prev, _word: string;
p: byte;

begin
clrscr;
Write('Vvedite stroku,kotoraya zakan4ivaetsya');
Writeln(' na vosklicatelniy znak ili to4ku');
Readln(s);

s_res := s; prev := '';

p := 1;
repeat
while not (s_res[p] in abc) and (p <= length(s_res))
do inc(p);

while (s_res[p] in abc) and (p <= length(s_res)) do begin
_word := _word + s_res[p];
inc(p);
end;

if strUpper(_word) = strUpper(prev) then begin { <--- только здесь !!! }
delete(s_res, p - length(_word), length(_word));
dec(p, length(_word));
end
else prev := _word;

_word := '';

until p > length(s_res);
writeln(s_res)
end.
 К началу страницы 
+ Ответить 
Дымка
сообщение 10.07.2005 13:11
Сообщение #13


Новичок
*

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

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


Запихнула туда еще удаление пробелов и все пошло замечательно!! Спасибо огромное smile.gif
Теперь еще одна задача, и можно приступать к созданию меню....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Дымка
сообщение 10.07.2005 13:27
Сообщение #14


Новичок
*

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

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


А можно еще пару глупых вопросов и с этой задачей покончено?!
For i := 1 To Ord(s[0]) Do
Case s[i] Of
'a' .. 'z': s[i] := Chr(Ord(s[i])-$20);
#160 .. #175: s[i] := Chr(Ord(s[i])-$20);
#224 .. #239: s[i] := Chr(Ord(s[i])-$50)
End;
Паскаль мой почти на школьном уровне, поясните . пожалуйста про Chr и Ord . Не совсем понимаю, что будет выполняться. и что значит -$20

И вот эту строчку...dec(p, length(_word))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 10.07.2005 13:41
Сообщение #15


Perl. Just code it!
******

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

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


Цитата(Дымка @ 10.07.05 14:27)
А можно еще пару глупых вопросов и с этой задачей покончено?!
   For i := 1 To Ord(s[0]) Do
     Case s[i] Of
       'a' .. 'z': s[i] := Chr(Ord(s[i])-$20);
       #160 .. #175: s[i] := Chr(Ord(s[i])-$20);
       #224 .. #239: s[i] := Chr(Ord(s[i])-$50)
     End;
Паскаль мой почти на школьном уровне, поясните . пожалуйста про Chr и Ord . Не совсем понимаю, что будет выполняться. и что значит -$20

И вот эту строчку...dec(p, length(_word))


Все просто :

Chr(97)='a'

ord('a')=97

обратные друг к другу ф-и одна возвращает код по символу, а другая символ по коду

dec( a,b ) равносильно a:=a-b;
inc( a,b ) равносильно a:=a+b;

dec(a) равносильно a:=a-1;
inc(a) равносильно a:=a+1;

соответственно dec(p, length(_word)) - уменьшает p на величину, равную длинне строки _word

Сообщение отредактировано: klem4 - 10.07.2005 13:42


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.07.2005 13:46
Сообщение #16


Гость






Цитата(Дымка @ 10.07.05 13:11)
Запихнула туда еще удаление пробелов и все пошло замечательно!!

Ты тот модуль, на который я ссылку давал, внимательно смотрела? Функцию
Function StrOneSpace(s: String): String;
там видела? Она как раз и удаляет из строки все лишние пробелы... rolleyes.gif
 К началу страницы 
+ Ответить 
Дымка
сообщение 10.07.2005 15:47
Сообщение #17


Новичок
*

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

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


а -$20, -$50?? это надо понимать, шестнадцатиричные числа...при чем тут они?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 10.07.2005 16:01
Сообщение #18


Гость






При том, что разность кодов символов в верхнем и нижнем регистре составляет или $20 (оно же 32 десятичное) или $50 (80 десятичное) в зависимости от самого символа...
 К началу страницы 
+ Ответить 

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

 



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