Пользователь вводит натуральное число n. Это – длина нашей строки. Необходимо вырезать из этой строки все слова, встречающиеся более двух раз.
Если никто не решится помочь мне с кодом, то киньте хотя бы идею решения. А если решитесь, то очень прошу, делайте комментарии, чтобы мне было понятно. Благодарю!
12 ноября 2009 в 20:02
Пашка ت Джиоев:
И вправду не верно, спасибо. Не правильно понял.
И Антон RichDad Кононов:
єто не Си — С++.
Андрей (aka_Кэп) Горбоконь:
думаю никогда "чем дальше в лес, тем больше дров" Зато много хороших либ. И этот язык мне уже почти родной.
12 ноября 2009 в 13:02
Троллинг удался.
Вот на дельфи
var s,t: TstringList;
begin
s := TStringList.Create;
t := TStringList.Create;
s.Text := StringReplace('one words count words telephone words words telephone',' ',#13#10,[rfReplaceAll]);
t.Text := s.Text;
t.Sort;
for i:=0 to t.Count-2 do
if t[i]=t[i+1] then while s.IndexOf(t[i])>-1 do s.Delete(s.IndexOf(t[i]));
result := StringReplace(s.Text,#13#10,' ',[rfReplaceAll]);
s.Free;
t.Free;
end;
ps. немного не оптимально, но работает
12 ноября 2009 в 9:01
В паскале строка без указания ограничения по длине занимает 256 байт и имеет максимальную длину в 255 символов.
12 ноября 2009 в 9:01
Выглядит так себе учитывая там наличие еще Сишных strtok'ов, которые ни разу не типобезопасные и не контролирующие буфер.
Использовали бы уж boost.string что ли ^^
Троллинга ради, решение на Сишарпе
var list = "one words count words telephone words words telephone".Split(' ');
var unique = from u in list where list.Count(s => s == u) == 1 select u;
var result = string.Join(" ", unique);
Когда же мы сможем получать, то что хотим без головной боли и на плюсах?
12 ноября 2009 в 8:04
Только неправильная реализация похоже. Как я понял задачу, надо удалить повторяющиеся слова, а те что не повторяются оставить в исходном порядке. В приведеном коде:
1) Каждого слова остается по одной копии, а надо если какое-то слово встречается, например, дважды, удалить оба вхождения.
2) В итоге оставшиеся слова идут в лексикографическом порядке, а надо в исходном.
12 ноября 2009 в 8:03
мда) ниче не понял в си, но выглядит прикольно
11 ноября 2009 в 19:04
С STL реализация метода который предложил АнтонКононов выглядит очень привлекательно:
//paste.org.ru/?qjc19d
11 ноября 2009 в 15:03
#21
ну вот.. STL твой друг )
11 ноября 2009 в 15:03
#3 красивое решение. Думал примерно так же.
11 ноября 2009 в 15:00
#19: опять же, есть еще FreePascal
11 ноября 2009 в 15:00
C++
11 ноября 2009 в 14:05
#15:в FreePascal – есть.
11 ноября 2009 в 14:05
#13 Это видимо для delphi только прокатит.
Для TP прийдется поизвращаться немного
//forum.sources.ru/index.php?showtopic=51192
11 ноября 2009 в 14:04
254 по-моему ограничение, там вроде любая строка занимает 255 байт, но нулевой байт используется для хранения длины строки
11 ноября 2009 в 14:03
#13: в паскале нет, а в дельфи будет
но! динамические массивы появились в дельфи начиная с 4.01 версии (в 4.0 еще не было)
11 ноября 2009 в 14:03
#10: врать не буду, но мне помнится чуть меньше 255… может 254 или 250… но 255 у меня в прошлом не получалось запихать в TP7
11 ноября 2009 в 14:01
понятно, спасибо
11 ноября 2009 в 14:00
#8 мне помниться, что там ограничена 255 символами
11 ноября 2009 в 14:00
Строки в паскале… Смотря какая версия) В поздних версиях есть ansistring – строка неограниченной длины.
#9
Нету, но можно обявить динамический массив и потом по мере надобности менять его длину.
11 ноября 2009 в 14:00
#11
приведите код плиз как объявитьдинамический массив
11 ноября 2009 в 14:00
a:array of longint;
…
setlength(a,100); //массив начинается с 0
Не уверен правда, будет ли это работать в TP
11 ноября 2009 в 13:05
Ну на паскале тоже можно с динамической памятью работать.
11 ноября 2009 в 13:05
на паскале строка у нас не ограничена ли случайно? 250 символов
11 ноября 2009 в 13:05
#7
можно. а там есть аналогstd::list ?
если нет, то надо самому писать класс – двусвязного списка
11 ноября 2009 в 13:03
#5 вы верно подметили, я знал об этом перед тем как писать. Написал так для простоты. А может человеку вообще на паскале прога надо?
11 ноября 2009 в 13:01
#4 уж очень вы расточительно память используете!!!
char s_word[100]; – а если у меня слово будет 101 байт?
- поменять на std::string
struct word words[200]; – а если будет только 2 слова? тогда 198 структур на стеке в пустую?или например 202 слова – тогда срыв стека!!!
- поменять на std::list<struct word>
11 ноября 2009 в 13:00
да просто. создаём структуру вида
struct word
{
char s_word[100]; // слово
int n_repeat; // количество повторений этого слова
}
создаём массив этой структуры, скажем так из 200 элементов:
struct word words[200];
сканируем строку. если встречаем новое слово, то заполняем новый элемент этого массива, где в поле s_word пишем это слово, а в
поле n_repeat пишем единицу, а если встречаем слово, которое уже было ранее (повторяющееся), то в элементе массива с этим
словом увеличиваем поле n_repeat на единицу.
все, массив сформирован. теперь перебираем по порядку каждый элемент массива и слова с полем n_repeat>1 удаляем из строки.
11 ноября 2009 в 12:01
Ну… создаем новую строку и структуту строк. В структуру забиваем все слова, которые нам встречаются при движении по строке с проверкой, не всречалось ли такое слово раньше. Если встречалось, то увеличиваем счетчик у данного слова. Так мы узнаем слова, которые нужно выкинуть. А потом записываем в новую строку нашу изначальную строку без тех слов, которые нам надо выкинуть.
Как я тебе код напишу, если ты даже язык не сказал?!
11 ноября 2009 в 12:01
1) режем строку на слова, слова суем в массив
2) сортируем массив
3) если в массиве предыдущий и текущий элемент одинаковы, то это слово удаляем из строки
как-то так на вскидку