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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2008, 14:21   #11
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Поскольку автору темы нужны знания по работе со строками, добавлю немного от себя.
При работе со строками часто в задании на выделение слов из строки четко не описана структура строки, а именно как разделены слова, то ли они идут через один пробел, то ли через запятую, то ли через запятую+пробел. Кроме того при вводе пользователь может ошибиться и напечатать два пробела, или два разделителя и т.д.
Чтобы избежать ошибок при работе программы я кроме той хитрости с пробелами в конце и начале слова, что применил eoln, еще делаю следующее:
1.Заменяю все разделители на пробелы.
2. Удаляю лишние пробелы.
Из любой строки получается строка типа пробел-слово-пробел-слово-пробел, с которой легко работать.
Вот пример усовершенстванного кода, приведенного выше.
Код:
uses crt;
const
    rzd = ['.',',',';',':','?','!'];//разделители слов без пробела
    NoSlovo = 'INFORMATION';
var
  s, slovo: string;
  d, f, i: integer;
  mas: array[1..250] of string;//статический массив
begin
  write('s = ');
  readln(s);
  s := ' ' + s + ' '; 
//вставляем кусок кода
\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\
  for i:=length(s) downto 1 do
      begin
        if s[i] in rzd then s[i]:=' ';//замена разделителей на пробелы
        while pos('_ _',s)>0 do   
        delete(s,pos('_ _',s),1); //удаление лишних пробелов
      end;
\- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\
  f := 0;//величина массива
  repeat
    d := pos('_' s);//ищем начало слова
    delete(s, 1, d);//удаляем всё до этого слова
    if s = '' then break;//если ничего не осталось прерываем цикл repeat
    for i := 1 to length(s) do
    if s[i] ='_' then  //здесь изменим
    begin
      slovo := copy(s, 1, i-1);
      break
    end;
    if slovo <> NoSlovo then//если слово отлично от 'INFORMATION'
    begin
      inc(f);//передвигаемся к следующей ячейки массива
      mas[f] := slovo//и записываем туда наше слово
    end
  until d = 0;
  if f = 0 then//если массив пустой
    write('not found') else//пишем нет слов
    for i := 1 to f do writeln(mas[i]);//иначе выводим массив
  readln
end.
puporev вне форума Ответить с цитированием
Старый 13.07.2008, 18:24   #12
Dexterello
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 18
По умолчанию

спасибо большое
Dexterello вне форума Ответить с цитированием
Старый 14.07.2008, 00:42   #13
Dexterello
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 18
По умолчанию

Последняя. Честное слово =)
Выяснить какое слово встречается в строке раньше - с минимальным или наибольшим количеством символов.

Последний раз редактировалось Dexterello; 14.07.2008 в 00:46.
Dexterello вне форума Ответить с цитированием
Старый 14.07.2008, 01:20   #14
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Снова чуть изменим
Код:
uses crt;
const
    rzd = ['.',',',';',':','?','!',' '];
var
  s, slovo, maxSlovo, minSlovo: string;
  d, f, i, max, min: integer;
  mas: array[1..128] of string;
begin   
  write('s = ');   
  readln(s);   
  s := ' ' + s + ' ';
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
  for i:=length(s) downto 1 do   
      begin   
        if s[i] in rzd then s[i]:='_';
        while pos('__',s)>0 do
        delete(s,pos('__',s),1);
      end;
{- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -}
  f := 0;
  repeat
    d := pos('_', s);
    delete(s, 1, d);   
    if s = '' then break;   
    for i := 1 to length(s) do   
    if s[i] ='_' then
    begin   
      slovo := copy(s, 1, i-1);   
      break   
    end;
      inc(f); //перемещаемся к следующей ячейки массива
      mas[f] := slovo //и записываем туда слово
  until d = 0;   
  max := 1; //номер самого длинного слова в начале примим = 1
  maxSlovo := mas[1]; //и запомним его
  min := 1;//номер самого короткого слова в начале примим = 1
  minSlovo := mas[1]; //и запомним его
  for i := 2 to f do //начиная со второго слова проверяем
  begin
    if length(mas[i]) > length(maxSlovo) then//если длиннее 
    begin
      maxSlovo := mas[i];//запоминаем новое самое длинное слово
      max := i //и его номер
    end;
    if length(mas[i]) < length(minSlovo) then//если короче 
    begin
      minSlovo := mas[i];//запоминаем новое самое короткое слово
      min := i //и его номер
    end
  end;
  if min < max then//если номер минимального раньше, то выводим
  writeln('min = ', minSlovo, '  max = ', maxSlovo) else
  if min > max then //далее если номер минимального позже, то выводим
  writeln('max = ', maxSlovo, '  min = ', minSlovo) else
  writeln('ne opredeleno');//это если все слова равной длины
  readln
end.
eoln вне форума Ответить с цитированием
Старый 14.07.2008, 01:24   #15
Dexterello
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 18
По умолчанию

а без модуля crt можно?
Dexterello вне форума Ответить с цитированием
Старый 14.07.2008, 01:29   #16
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно. Эт он случайно тут оказался ))
eoln вне форума Ответить с цитированием
Старый 14.07.2008, 01:37   #17
Dexterello
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 18
По умолчанию

спасибо ОГРОМНОЕ =)
Dexterello вне форума Ответить с цитированием
Старый 14.07.2008, 01:38   #18
Dexterello
Пользователь
 
Регистрация: 12.07.2008
Сообщений: 18
По умолчанию

я просто ещё операторы не все знаю... а inc(f) что делает?
Dexterello вне форума Ответить с цитированием
Старый 14.07.2008, 01:43   #19
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

inc(f) увеличивает f на 1 (f := f + 1)
Стандартные функции в help'e хорошо описаны, советую книги почитать - пригодится для поступления
eoln вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите пожалуйста исправить подправить процедуру (строки) Rumus Помощь студентам 5 02.07.2008 16:50
Строки. Помогите переделать DeeCee Общие вопросы Delphi 9 25.12.2007 22:01
Паскаль, строки, помогите zaraza21 Помощь студентам 4 23.11.2007 14:01