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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.10.2011, 17:30   #1
topside
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию Количество одинаковых слов в строке. Delphi

Требуется написать программу, которая выводит слова, встречающиеся более одного раза и пишет количество повторов. Так происходит для каждого слова. Вот мой код, но я видимо как-то не так организовал поиск равных элементов, подскажите пожалуйста как надо. Или может есть вообще другой вариант, без доп. массивов? Количество пробелов между словами - любое.
Код:
program Words;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  S: string;
  A: array of string;
  B: array of Integer;
  I, J, K: Integer;
  Rez, Kol: Integer;

begin
  WriteLn('Введите строку');
  ReadLn(S);

  I := 1;
  while S[1] = ' ' do
    Delete(S, 1, 1);
  while I <= Length(S) do
  begin
    if S[I] = ' ' then
    while (S[I+1] = ' ') and (Length(S) >= I) do
      Delete(S, I, 1);
    Inc(I);
  end;
  WriteLn(S);

  S := ' ' + S;
  K := 0;
  SetLength(A, 1);
  for I := 1 to Length(S) do
    if S[I] = ' ' then
      Inc(K)
    else
      begin
        SetLength(A, Length(A)+1);
        A[K] := A[K] + S[I];
      end;

  SetLength(B, 1);
  for I := 1 to High(A)-1 do
    for J := I+1 to High(A) do
      if A[I] = A[J] then
      begin
        SetLength(B, Length(B)+1);
        Inc(B[I]);
      end;
  for I := 1 to High(A) do
    Write(A[I], '  ', B[I]);   


  ReadLn;
  end.
topside вне форума Ответить с цитированием
Старый 28.10.2011, 20:08   #2
topside
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию

Попробовал сделать без массива, сохраняя слово а затем удаляя его, но не знаю как организовать теперь его сравнение с последующими словами.
topside вне форума Ответить с цитированием
Старый 28.10.2011, 22:42   #3
alex_sed
Пользователь
 
Регистрация: 06.10.2011
Сообщений: 11
По умолчанию

Код:
var
  S, S_: String;
  n, k, m: Integer;
begin
  WriteLn('Введтите строку: ');
  ReadLn(S);
  repeat
    S:=Trim(S); // Удаляем лишние пробелы
    m:=0;
    n:=Pos(' ', S);
    if n>0 then S_:=Copy(S, 1, n-1) else S_:=S;
    repeat
      k:=Pos(S_, S);
      if k>0 then
        begin
          S:=Copy(S, 1, k-1)+Copy(S, k+Length(S_), Length(S)); // Выкусываем слово
          inc(m);
        end;
    until k=0;
    WriteLn(S_, '  ', m);
  until S='';
  ReadLn;
end.

________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 29.10.2011 в 09:25.
alex_sed вне форума Ответить с цитированием
Старый 28.10.2011, 23:45   #4
topside
 
Регистрация: 29.09.2011
Сообщений: 8
По умолчанию

Благодарствую.
topside вне форума Ответить с цитированием
Старый 29.10.2011, 09:41   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

topside

просто для информации.
Раз обработка строки идёт в Delphi, то можно привлечь имеющиеся компоненты. Например, TStringList.
посмотрите варианты решения в темах:
1) повторение слов в txt файле
2) Статистика слов в тексте
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2011, 10:56   #6
alex_sed
Пользователь
 
Регистрация: 06.10.2011
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
topside

просто для информации.
Раз обработка строки идёт в Delphi, то можно привлечь имеющиеся компоненты. Например, TStringList.
посмотрите варианты решения в темах:
1) повторение слов в txt файле
2) Статистика слов в тексте
В данных примерах с текстом ошибка, при переходе у следующему слову и оно уже до этого было, будет снова добавляться в список для подсчета....
Вот по этому это не самый лучший вариант....
alex_sed вне форума Ответить с цитированием
Старый 29.10.2011, 11:10   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от alex_sed
В данных примерах с текстом ошибка, при переходе у следующему слову и оно уже до этого было, будет снова добавляться в список для подсчета....
Вот по этому это не самый лучший вариант....
alex_sed, не понял. что Вы имеете в виду?!
Конкретизируйте свои замечания, пример строки и результат "неправильной работы" приведите, пожалуйста.

Добавлено
ну, и ещё, запустил я Ваш код.
в принципе, код рабочий. но есть одна весьма нехорошая ошибка.
введите такой текст:
ты тыты ты тытышь тышь
уже догадываетесь, какой результат выдаст Ваша программа?
ну, а такой текст ещё нагляднее:
a aa aaa aa aaa aa

Последний раз редактировалось Serge_Bliznykov; 29.10.2011 в 11:20.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.10.2011, 11:17   #8
alex_sed
Пользователь
 
Регистрация: 06.10.2011
Сообщений: 11
По умолчанию

Нет, все нормально считает, не учел что TStringList сортируется.
Единственное, удалять TS вконце надо так TS.Free
alex_sed вне форума Ответить с цитированием
Старый 29.10.2011, 11:50   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Единственное, удалять TS вконце надо так TS.Free
Вы невнимательно прочитали код...

в данных примерах в конце вызывается процедура FreeAndNil
Цитата:
Код:
FreeAndNil(TS);
она выполняет последовательно две операции. вызывает метод .Free для заданного объекта, а потом присваивает указателю на этот объект пустую ссылку.
т.е. FreeAndNil(TS) эквивалентно такому коду:
Код:
 TS.Free; TS := nil;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.10.2011, 13:09   #10
alex_sed
Пользователь
 
Регистрация: 06.10.2011
Сообщений: 11
По умолчанию

Исправляю, теперь различает...
Код:
var
  S, S_: String;
  n, k, m: Integer;
begin
  WriteLn('Введите строку: ');
  ReadLn(S);
  repeat
    S:=Trim(S); // Удаляем лишние пробелы
    m:=0;
    n:=Pos(' ', S);
    if n>0 then S_:=Copy(S, 1, n-1) else S_:=S;
    repeat
      k:=Pos(S_+' ', S+' ');
      if k>0 then
        begin
          S:=Copy(S, 1, k-1)+Copy(S, k+Length(S_), Length(S)); // Выкусываем слово
          inc(m);
        end;
    until k=0;
    if S_<>'' then WriteLn(S_, '  ', m);
  until S='';
  ReadLn;
end.
alex_sed вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Количество слов в строке Настя93 Помощь студентам 7 24.02.2011 19:47
Определить количество слов в строке, введенной с клавиатуры. Gohan Помощь студентам 2 20.02.2011 14:19
Определение количества одинаковых слов в строке. brainy_man Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 10.05.2010 02:58
Количество одинаковых слов в таблице K608723 Microsoft Office Excel 1 22.09.2009 00:33