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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2012, 16:17   #1
ali23210275
Пользователь
 
Аватар для ali23210275
 
Регистрация: 06.03.2012
Сообщений: 17
По умолчанию обработка текста и чисел. Паскаль

Составте программу, удаляющую из текста слова, которые встречаются в нем N раз.
вот что получилось:
uses crt;
var s,s1,a:string;
i:integer;
k:byte absolute s;
begin
s:='';s1:='';
clrscr;
write('Input phrase: ');readln(s);
while s[1]=' ' do delete(s,1,1);
while s[k]=' ' do dec(k);
while pos(' ',s)<>0 do delete (s,pos(' ',s),1);
a:='';s:=s+' ';
repeat
s1:=copy(s,1,pos(' ',s)-1);
delete(s,1,length(s1)+1);
if pos(s1,s)=0 then a:=a+' '+s1;
until length(s)=0;
write('Modified string: ',a);
readln
end.
но она делает не совсе то что надо.
ali23210275 вне форума Ответить с цитированием
Старый 25.04.2012, 20:13   #2
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Ну, в этой программе даже отдаленно нет кода, который хотя бы подсчитывал количество вхождений того или иного слова.
Кроме того, в программе вообще отсутствует константа или переменная N, заявленная в условии.

Лично я не знаю, как бы эту задачу можно было решить _просто_, т.е. так, чтобы объем программы увеличился не более, чем в 2-3 раза.

Может, не совсем точно сформулировано условие?
s-andriano вне форума Ответить с цитированием
Старый 26.04.2012, 01:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Лично я не знаю, как бы эту задачу можно было решить _просто_, т.е. так, чтобы объем программы увеличился не более, чем в 2-3 раза.
а всё более чем просто.
вот один из вариантов решения.
т.к. мы видим, что речь идёт о TurboPascal и под текстом понимается строка (string), то она не может быть длинее, чем 255 символов. следовательно, в этой строке не может быть более 128 слов.
дальше уже всё просто. массив words : array[1..128] of string;
дальше берём любой парсер, разбирающий строку на отдельные слова (простейший - поискать на форуме (с) Stilet, вот ТУТ, например, можно взять.

дальше возможны варианты. можно завести массив счётчиков, сколько встречается i-е слово. а можно и сортировкой воспользоваться.
я бы лично отсортировал полученный массив слов.
ну, дальше просто, идём (однопроходный цикл) по осортированному массиву, подсчитывая одинаковые слова.
если счётчик совпал с N - то удаляем текущее слово из исходной строки.
всё. профит.


p.s. вся программа будет примерно 35-40 строк кода...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 26.04.2012, 13:31   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Да, первой приходит в голову именно мысль насчет массива из 128 строк. Правда, я бы не стал сортировать, а завел отдельный массив счетчиков (или даже объединил счетчик в одну структуру со строкой) и проверял повторения при первом проходе.
Но я сомневаюсь, что полный алгоритм уместится в 24-36 сток (чтобы, как я сказал, увеличить объем программы не более чем в 2-3 раза).
В принципе, не страшно, но...
У меня, например, модуль для хранения "слов" содержит несколько сотен строк. Он, правда, позволяет за разумное время обрабатывать миллиарды запросов и хранить десятки миллионов уникальных "слов", но это просто пример, показывающий, что любая задача может быть решена на разных уровнях. И, соответственно, с разным объемом кода.
У меня обычно получается достаточно объемный код. Поэтому я решение данной задачи вряд ли бы впихнул в 36 строк.
s-andriano вне форума Ответить с цитированием
Старый 26.04.2012, 14:42   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну вот, около 50 строк кода (у TC строк в коде 20, поэтому в ~2.5 раза больше )...
Код:
uses crt;
var s, st :string; 
    a :array[1..129] of string;
    i, j, Count, N :integer;
begin   
 clrscr;
 { s := 'Hello my world my world it crazy world'; }
 write('Input phrase: '); readln(s); 
 s := s+' ';
 repeat
   write('Input N: '); readln(N); { N:=3; }
 until (N>0) and (N<128);
 count:=1;
 i:=1; 
 while (i<=length(s)) do begin
   if s[i]=' ' then begin inc(count);inc(i);end;
   a[count]:=a[count]+s[i];
   inc(i);
 end;
 if Count<N then begin WriteLn('Нечего удалять в строке! BYE!'); Readln; Halt(100) end;
 { отсортируем слова в массиве : }
 for i := 1 to count - 1 do begin
      for j := i + 1 to count  do
        if a[j] < a[i] then begin
          st := a[i];
          a[i] := a[j];
          a[j] := st;
        end;
    end;
 {удалим слова, которые встречаются N раз}
 st := ''; 
 j := 0;
 a[count+1] := ''; {стоп-слово}
 for i:=1 to count+1 do begin
    if a[i]<>st then begin
      if j=N then begin
         while Pos(st+' ',s)>0 do Delete(s, Pos(st+' ',s), Length(st));
      end;
      st := a[i]; j := 1; 
    end
    else Inc(j);
 end;

 write('Modified string: ', s);
 readln
end.

код писал около 18 минут... что, разумеется, для подобной задачи непростительно много...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка текста и чисел в паскале. ali23210275 Помощь студентам 9 09.04.2012 22:15
Обработка файла на Турбо Паскаль - Удалить из файла файл вещественных чисел максимальную компоненту chudo*** Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2011 22:51
Дано n вещественных чисел а1, а2,…,аn. Определите число соседств двух чисел разного знака (Паскаль) bambam Помощь студентам 1 29.11.2011 11:36
Обработка текста в C++ Novichel Помощь студентам 25 16.04.2011 19:12
Обработка текста [Паскаль] Zigi Помощь студентам 1 13.12.2010 18:44