Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2011, 21:08   #1
Basiclan
 
Регистрация: 07.04.2011
Сообщений: 8
По умолчанию Найти обратные слова

Дан текст заканчивающейся точкой. Вывести все слова из этого текста в котором первые 2 буквы встречаются еще раз подряд, но в обратном порядке.( пример :САВРАСЫЙ, ПОТОП)
Basiclan вне форума Ответить с цитированием
Старый 07.04.2011, 22:11   #2
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

А где здравствуйте? Где пожалуйста помогите решить? совсем люди оборзели... XD
ololo-schoolboy вне форума Ответить с цитированием
Старый 07.04.2011, 22:13   #3
Basiclan
 
Регистрация: 07.04.2011
Сообщений: 8
По умолчанию Sorry

Цитата:
Сообщение от ololo-schoolboy Посмотреть сообщение
А где здравствуйте? Где пожалуйста помогите решить? совсем люди оборзели... XD
sorry please help me
Basiclan вне форума Ответить с цитированием
Старый 07.04.2011, 22:15   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

язык7 сроки7 бюджет7
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"
Mad_Cat вне форума Ответить с цитированием
Старый 08.04.2011, 06:48   #5
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
По умолчанию

Код:
function IsIt(s:string):boolean;
var i:integer;
begin
     IsIt:=false;
     for i:=3 to length(s)-1 do
     if s[2]+s[1]=s[i]+s[i+1] then
     begin
          IsIt:=true;
          break;
     end;
end;

function findIt(x:string):string;
const b:set of byte=[65..90,97..122,128..175,224..241];//для кодировки 866
var s,t:string;
    i:integer;
begin
     t:='';
     s:='';
     for i:=1 to length(x) do
     if ord(x[i]) in b then
        t:=t+x[i]
     else
     begin
          if IsIt(t) then
          s:=s+t+' ';
          t:='';
     end;
     if ord(x[i]) in b then
     if IsIt(t) then
     s:=s+t;
     findIt:=s;
end;
usage:
Код:
readln(text);
writeln(findIt(text));
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.

Последний раз редактировалось Sparkman; 08.04.2011 в 06:55.
Sparkman вне форума Ответить с цитированием
Старый 08.04.2011, 08:43   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Sparman, а с чёго Вы решили, что автору топика нужен Паскаль?!

Кроме того, обычно решают задачу разбиения на слова чуток по другому - оговаривается, что является РАЗДЕЛИТЕЛЕМ слов, и все символы между разделителями являются словами. такое_вот_например_одно_слово....

Впрочем, можно и так.
а ещё можно записать Вашу константу так:
Код:
const Letters : set of char=['A'..'Z','a'..'z','А'..'Я','а'..'п','р'..'я','Ё','ё']; {для кодировки 866}
...
  for i:=1 to length(x) do
    if x[i] in Letters then
p.s. я отнюдь не критикую Ваше решение. Похоже, что оно вполне рабочее!
просто решение, записанное через разделители слов сразу становится универсальным - и будет работать вне зависимости от кодировки исходной строки!
да и наглядность только улучшится...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2011, 09:05   #7
Sparkman
220400
Форумчанин
 
Аватар для Sparkman
 
Регистрация: 21.05.2010
Сообщений: 726
Радость

1)
Цитата:
Sparkman, а с чёго Вы решили, что автору топика нужен Паскаль?!
Цитата:
Дан текст заканчивающейся точкой. Вывести все слова из этого текста в котором первые 2 буквы встречаются еще раз подряд, но в обратном порядке.( пример :САВРАСЫЙ, ПОТОП)
язык не указан, сообщение в разделе - помощь студентам, студенты начинают с изучения паскаля, если они не смогут интерпретировать код паскаля в код другого языка - то это их сложность;
2)
Цитата:
Кроме того, обычно решают задачу разбиения на слова чуток по другому - оговаривается, что является РАЗДЕЛИТЕЛЕМ слов, и все символы между разделителями являются словами. такое_вот_например_одно_слово....
свой метод решения интереснее, чем общепринятый (его можно и погуглить). я тоже не сильно отношусь к людям, подающим все готовое на блюдечке с голубой каёмочкой, поэтому иногда добавляю немного соли в код
3)
Цитата:
такое_вот_например_одно_слово
у нас общий случай (опять же ТС ничего не оговорил ), поэтому в моем коде - все что не состоит из букв - не является словом;
4)
Цитата:
Впрочем, можно и так.
а ещё можно записать Вашу константу так:
Код:
const Letters : set of char=['A'..'Z','a'..'z','А'..'Я','а'..'п','р'..'я','Ё','ё']; {для кодировки 866}
...
  for i:=1 to length(x) do
    if x[i] in Letters then
у меня в паскале русские буквы не печатаются, поэтому я все перевел в ASCII код
Цитата:
p.s. я отнюдь не критикую Ваше решение. Похоже, что оно вполне рабочее!
просто решение, записанное через разделители слов сразу становится универсальным - и будет работать вне зависимости от кодировки исходной строки!
да и наглядность только улучшится...
п. 2
Cерьёзной помощи не ждите - помогаю в перерывах на "перекур".
Не существует ничего невозможного для человека, который не собирается ничего делать сам.
Не учите человека, если вы не его учитель.
Sparkman вне форума Ответить с цитированием
Старый 08.04.2011, 10:05   #8
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
у меня в паскале русские буквы не печатаются
1) можете воспользоваться любым текстовым редактором (хоть Far Commander, хоть "продвинутым" блокнотом, лишь бы редактор поддерживал кодировку OEM (она же 866)

2) а почему не хотите настроить нормально DOS сессию? Это совсем не сложно...
и даже во всех факах на Windows XP есть...

Цитата:
свой метод решения интереснее, чем общепринятый
Я понимаю, что свой способ всегда интереснее. Просто я указал на недостатки этого Вашего метода. (неочевидность кода - не видно, где какие буквы, очень плохая совместимость и переносимость)...
Ну, согласен, что это лично Ваши (и тех, кто воспользуется Вашим решением) трудности. Каждый волен выбирать для себя...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.04.2011, 12:59   #9
Basiclan
 
Регистрация: 07.04.2011
Сообщений: 8
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Sparman, а с чёго Вы решили, что автору топика нужен Паскаль?!

Кроме того, обычно решают задачу разбиения на слова чуток по другому - оговаривается, что является РАЗДЕЛИТЕЛЕМ слов, и все символы между разделителями являются словами. такое_вот_например_одно_слово....

Впрочем, можно и так.
а ещё можно записать Вашу константу так:
Код:
const Letters : set of char=['A'..'Z','a'..'z','А'..'Я','а'..'п','р'..'я','Ё','ё']; {для кодировки 866}
...
  for i:=1 to length(x) do
    if x[i] in Letters then
p.s. я отнюдь не критикую Ваше решение. Похоже, что оно вполне рабочее!
просто решение, записанное через разделители слов сразу становится универсальным - и будет работать вне зависимости от кодировки исходной строки!
да и наглядность только улучшится...
Ссори за что в начале не указал язык мне нужно было на с++? Буду очень очень признателен если было б на с++.Заранее всем огромное спасибо
Basiclan вне форума Ответить с цитированием
Старый 08.04.2011, 16:12   #10
ololo-schoolboy
Форумчанин
 
Регистрация: 25.12.2010
Сообщений: 247
По умолчанию

На c++ можно так, правда это кривой вариант но он работает:
Код:
#include<iostream>
#include<locale.h>

using namespace std;

int main()
{
char str[]="САВРАСЫЙ, ПОТОП";
int start_word=0;

setlocale (LC_ALL,"rus");

for(int i=0;str[i] && str[i+3];++i)
{
	if(str[i]==' ' || str[i+1]==' ')
	{
		do{
			++i;
		}while(str[i]==' ');
		start_word=i;
	}
	for(int j=i+2, k=0;str[j+1] && str[j+1]!=' ';++j)
		if(str[i]==str[j+1] && str[i+1]==str[j])
		{
			for(k=start_word;str[k]!=' ' && str[k];++k)
				cout.put(str[k]);
			cout<<endl;
			i=str[k]?k:k-1;
			start_word=k+1;
			break;
		}
}
cin.get();
return 0;
}

ps мб кто знает какой крутой алгоритм как это можно сделать ? ну типа произвести сортировку подсчетом, а потом.... ну или что ни буть в таком духе, а еще круче регулярными выражениями, а то самому интересно....
ololo-schoolboy вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где можно найти англ. русские слова misher Свободное общение 9 24.10.2010 20:10
Обратные тригонометрические функции _-Re@l-_ Общие вопросы Delphi 17 03.09.2010 17:15
Найти слова с четным кол-вом символов. Си. Terror Общие вопросы C/C++ 2 28.04.2010 16:50
Найти все слова в предложении PbIska Помощь студентам 5 12.05.2009 21:23
Обратные тригонометрические функции Melok Паскаль, Turbo Pascal, PascalABC.NET 6 24.10.2007 13:06