• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Определить минимальное количество первых символов слов

Black_Betty

Новые
Регистрация
26 Окт 2012
Сообщения
17
Реакции
0
Баллы
0
Определить минимальное количество первых символов слов

► Задание 1
Строка состоит из нескольких слов, разделенных пробелом. Определить минимальное количество первых символов слов, по которым можно различить слова в строке.

Входные данные:
abc5 abc0 abcde abcfg

Выходные данные:
4
 
Написать на Паскале
Разрешите доложить: задание выполнено!
Код:
Var
 S:String;
 W:Array[1..100] of String;
 i,j,Nw,Nsymb:Byte;
 b,b1:boolean;
Begin
 Writeln('Enter the string:');
 Readln(S);
 Nw:=1;
 i:=0;
 W[Nw]:='';
 Repeat
  Inc(i);
  If (S[i]<>' ') and (i<=Length(S)) then
   W[Nw]:=W[Nw]+S[i]
  else
  If S[i]=' ' then
   begin
    Inc(Nw);
    W[Nw]:='';
   end;
 Until i>Length(S);
 Nsymb:=0;
 Repeat
  Inc(Nsymb);
  b:=true;
  b1:=false;
  For i:=1 to Nw do
   If Length(W[i])<Nsymb then b1:=true;
  If Not(b1) then
   For i:=1 to Nw-1 do
    For j:=i+1 to Nw do
     If W[i][Nsymb]=W[j][Nsymb] then b:=false;
 Until b or b1;
 If b1 then
  Writeln('No solution!')
 else
  Writeln('Minimal number of symbols is ',Nsymb);
 Readln
End.
Разрешите быть свободным?
 
Спасибо Вам БОЛЬШОЕ!!!
Разрешаю быть свободным=)
 
Я понимаю что уже почти месяц прошел, но не могли бы вы описать как и что делает второй цикл Repeat?
 
Я понимаю что уже почти месяц прошел, но не могли бы вы описать как и что делает второй цикл Repeat?
Да без проблем.
Как Вы, вероятно, поняли, в первой части программы из строки выделяются отдельные слова и записываются в строковый массив W. Также определяется количество слов Nw.
Дальше начинаем анализировать полученный массив. Делается это так. Последовательно увеличиваем номер символа Nsymb, начиная с первого, до тех пор, пока не убедимся, что во всех без исключения словах на позиции, соответствующей текущему номеру, стоят различные буквы без единого совпадения. Тогда булевский флажок b сохраняет значение true и текущий номер принимается за ответ. Но! Представьте себе, что строка такая:

приз призёр призовой

Здесь, пройдя 4 номера, обнаруживаем, что первое слово кончилось! За такую ситуацию отвечает флажок b1, и если подобное произошло, то этот флажок перебрасывается в true и программа рапортует "Решения нет!".
 
Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
For i:=1 to Nw do
If Length(W)<Nsymb then b1:=true;
If Not(b1) then
For i:=1 to Nw-1 do
For j:=i+1 to Nw do
If W[Nsymb]=W[j][Nsymb] then b:=false;
 
Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
For i:=1 to Nw do
If Length(W)<Nsymb then b1:=true;
If Not(b1) then
For i:=1 to Nw-1 do
For j:=i+1 to Nw do
If W[Nsymb]=W[j][Nsymb] then b:=false;

Ну, что касается первой части (2 строки), то тут всё просто: перебираются слова массива, и если оказывается, что длина какого-то из них меньше текущего номера, то b1 перебрасывается и дальше выводится сообщение, что решения нет. В приведенном мною примере это произойдет при Nsymb=5 для первого слова.
Дальше немного сложнее. Пусть текущий номер, например, Nsymb=3. Наша задача - сопоставить символы, стоящие на третьей позиции, для всех слов, и только если они все окажутся различными, то 3 будет ответом на задачу. Пусть, для примера, массив содержит 5 слов. Тогда третий символ первого слова сопоставляем с третьими символами второго, третьего, четвертого и пятого, затем третий символ второго слова сопоставляем с третьими символами третьего, четвертого и пятого слов (с первым словом уже не надо), затем третий символ третьего слова - с третьими символами четвертого и пятого, и, наконец, третий символ четвертого с третьим символом пятого. И если обнаружим хоть одно совпадение, то переходим к Nsymb=4, потом к Nsymb=5 и т.д.
 
Назад
Сверху