Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Определить минимальное количество первых символов слов (http://www.tehnari.ru/f41/t79731/)

Black_Betty 26.10.2012 16:33

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

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

Выходные данные:
4

Black_Betty 26.10.2012 16:34

Написать на Паскале

Vladimir_S 26.10.2012 21:30

Цитата:

Сообщение от Black_Betty (Сообщение 810475)
Написать на Паскале

Разрешите доложить: задание выполнено!
Код:

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.

Разрешите быть свободным?

Black_Betty 27.10.2012 08:29

Спасибо Вам БОЛЬШОЕ!!!
Разрешаю быть свободным=)

Vladimir_S 27.10.2012 08:42

Цитата:

Сообщение от Black_Betty (Сообщение 810819)
Спасибо Вам БОЛЬШОЕ!!!
Разрешаю быть свободным=)

Есть!
__________________________________________________ ______________

Black_Betty 18.11.2012 17:23

Я понимаю что уже почти месяц прошел, но не могли бы вы описать как и что делает второй цикл Repeat?

Vladimir_S 18.11.2012 18:04

Цитата:

Сообщение от Black_Betty (Сообщение 821186)
Я понимаю что уже почти месяц прошел, но не могли бы вы описать как и что делает второй цикл Repeat?

Да без проблем.
Как Вы, вероятно, поняли, в первой части программы из строки выделяются отдельные слова и записываются в строковый массив W. Также определяется количество слов Nw.
Дальше начинаем анализировать полученный массив. Делается это так. Последовательно увеличиваем номер символа Nsymb, начиная с первого, до тех пор, пока не убедимся, что во всех без исключения словах на позиции, соответствующей текущему номеру, стоят различные буквы без единого совпадения. Тогда булевский флажок b сохраняет значение true и текущий номер принимается за ответ. Но! Представьте себе, что строка такая:

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

Здесь, пройдя 4 номера, обнаруживаем, что первое слово кончилось! За такую ситуацию отвечает флажок b1, и если подобное произошло, то этот флажок перебрасывается в true и программа рапортует "Решения нет!".

Black_Betty 18.11.2012 18:19

Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
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;

Vladimir_S 18.11.2012 18:42

Цитата:

Сообщение от Black_Betty (Сообщение 821213)
Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
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;

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

Black_Betty 18.11.2012 18:48

Спасибо=))


Часовой пояс GMT +4, время: 00:32.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.