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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2010, 22:09   #1
bingooo
Пользователь
 
Регистрация: 04.04.2010
Сообщений: 29
Вопрос Указать минимальное количество первых букв, по которым можно различить слова из заданного списка.

В строке малыми латинскими буквами записаны слова, разделяющиеся запятыми. Первые буквы некоторых слов могут совпадать. Указать минимальное количество первых букв, по которым можно различить слова из заданного списка.
Вот мой исходник:
Код:
uses crt;
const zap:string[1]=',';
var s:string;
t,l,i,n:integer;
    begin
      clrscr;
      writeln('vvedi slova cherez zapiatuiu: ');
      readln(s);
      l:=length(s);
      t:=1;
      n:=1;
            for i:=1 to l do
             begin
               if s[i]=zap
                then
                begin
                 if s[t]<>s[i+n]
                   then writeln('t=',t) else begin
                    t:=t+1;
                   n:=n+1;
                   end;
                   end;
             end;
             writeln('t=',t);
    end.
у меня считает только когда совпадает 1 буква и не совпадают, помогите создать цикл для:

Код:
 if s[t]<>s[i+n]
                   then writeln('t=',t) else begin
                    t:=t+1;
                   n:=n+1;
Помогите плз!!!!!!

Последний раз редактировалось Stilet; 04.06.2010 в 07:36.
bingooo вне форума Ответить с цитированием
Старый 09.04.2010, 10:37   #2
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

Код:
 program analiz;
 var s,s1:string;
     i:integer;
     kilk:integer;
begin
 write('vvedite stroku -> ');
 readln(s);
 if s[1]<>','
  then
   begin
    s1:=s[1];
    kilk:=1;
   end
  else
   begin
    s1:='';
    kilk:=0;
   end;
 for i:=2 to length(s) do
   if s[i]=','
    then
     if pos(s[i+1],s1)=0
       then
        begin
         kilk:=kilk+1;
         s1:=s1+s[i+1];
        end;
  writeln(kilk);
  readln;
end.
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 09.04.2010, 13:37   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Dark_Spirit, к сожалению, реализованный Вами алгоритм неверен...
пробуйте:
Код:
vvedite stroku -> pust,rust
Ваш алгоритм сообщит, что достаточно 2 буквы.
правильный ответ 1 (одной буквы достаточно)
дальше - больше:
Код:
vvedite stroku -> pust,rust,gust
Ваш ответ: 3
правильный: 1

дальше:
Код:
vvedite stroku -> pust,ladya,pusyr
Ваш ответ: 2
но очевидно, что для того, чтобы отличить первое слово от третьего понадобится 4-ре буквы!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2010, 16:30   #4
bingooo
Пользователь
 
Регистрация: 04.04.2010
Сообщений: 29
По умолчанию

ну помогите пожалуйста правильный составить, очень нужно, уже не знаю что делать((
bingooo вне форума Ответить с цитированием
Старый 09.04.2010, 17:32   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

bingooo, сейчас времени нет.
но подсказать могу.
в паскале строка может быть длиной 255 символов максимально.
поэтому, если допустить, что введены все слова из ОДНОЙ буквы, то максимум может быть 128 слов.
поэтому заводите массив
Slova : array[1..128] of string;
разбирайте строку на слова, слова записывайте в массив.
ну а потом, я бы лично отсортировал массив (чтобы не перебирать все элементы каждый раз),
присвоил переменной NeedLetterCount := 1; (минимально одна буква, ибо пустые строчки - это не слова)

цикл по i от 1 до (КоличествоСлов - 1)
в цикле:
в отсортированном массив сравнивал, пока подстрока длиной NeedLetterCount i-го слова совпадает с подстрокой длиной NeedLetterCount i+1-го слова, то увеличивал бы NeedLetterCount. добавить проверку на то, что слово закончилось. всё. задача решена!

кстати, если в исходной строке два одинаковых слова, то данная задача вообще не имеет решения.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 09.04.2010, 20:39   #6
Dark_Spirit
Форумчанин
 
Аватар для Dark_Spirit
 
Регистрация: 05.02.2009
Сообщений: 324
По умолчанию

Serge_Bliznykov , спасибо за критику, но здаётся мне что Вы немного не внимательно прочли задание.
Цитата:
Указать минимальное количество первых букв, по которым можно различить слова из заданного списка.
Вы же предлагаете искать колличество букв которыми слова отличаются
Тяжело быть бестолковым.....
Dark_Spirit вне форума Ответить с цитированием
Старый 09.04.2010, 21:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Dark_Spirit, всё может быть..

но, я процитированный Вами текст понимаю так:
нужно найти сколько букв из любого слова нужно взять, чтобы ОДНОЗНАЧНО определить, какое слово перед нами...

Вот, смотрите, в задании даже сказано, что "Первые буквы некоторых слов могут совпадать".
Вот и нужно найти МИНИМАЛЬНОЕ количество первых букв, по которыми слова можно РАЗЛИЧИТЬ!

__________________________________
Цитата:
Вы же предлагаете искать колличество букв которыми слова отличаются
это Вы вообще о чём?!! o_O
слова bugaga и lollollol сколькими буквами отличаются?!
а слова kusok kubok ?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2010, 01:21   #8
Janch
Новичок
Джуниор
 
Регистрация: 04.06.2010
Сообщений: 1
По умолчанию

Не удержался, вот моё видение этой проблемы...
Uses crt;
Var S,Sr,Sj: String;
r,i: Integer;
BEGIN clrscr;
Write('Введите строку: '); ReadLn(S);
r:=1; Sr:=''; i:=1; Sj:='';
While (i<=Length(S))and(r<Length(S)) do begin
if (S[i]=' ') then Sj:='' else Sj:=Sj+S[i];
if (Length(Sj)=r) then begin
if (pos(Sj,Sr)>0)and( ((pos(Sj,Sr)-1) mod Length(Sj))=0) then begin
r:=r+1; Sr:=''; i:=0; Sj:='';
end else Sr:=Sr+Sj;
end;
i:=i+1;
end;
WriteLn('Минимальное количество символов для различения слов: ',r);
Repeat Until KeyPressed;
END.

Последний раз редактировалось Janch; 04.06.2010 в 01:25. Причина: Поспешил, лишнего написал
Janch вне форума Ответить с цитированием
Старый 04.06.2010, 06:59   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Janch, потестировал немножко.
Вроде бы всё работает так, как надо (с моей точки зрения!)

Но есть один недостаток! В задании сказано:
Цитата:
записаны слова, разделяющиеся запятыми.
а у Вас разделитель - пробел!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 04.06.2010, 07:42   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Хы... Ну а вот мое видение решения этой проблемы
Код:
   var s:string;i:integer;c:char;
   q:set of 'a'..'z';
begin
 s:=' Pull,me,under,pull,me,under,im,not,afride';
 for i:=1 to length(s) do  if s[i]=',' then include(q,s[i+1]);
 i:=0;
 for c:='a' to 'z' do if c in q then inc(i);
 write(i);
  { TODO -oUser -cConsole Main : Insert code here }
  readln;
end.
По-моему красиво (от скромности не умру, не правда ли? )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
все слова с нечетным количеством букв подходят для "ёлочной" рекурсии. Все буквы слова расположены в форм no_to Помощь студентам 0 04.01.2010 16:06
Организовать поиск всех вхождений заданного слова в загруженном тексте s2dentishe Помощь студентам 0 21.11.2009 18:53
Удвоить каждый из первых пяти цифровых символов и удалить 5 последних латинских букв gred Помощь студентам 5 16.05.2008 23:20
Си - Написать функцию, проверяющую наличие в строке заданного слова Cvetok Помощь студентам 1 14.05.2008 05:44