Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 26.10.2012, 16:33   #1 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Определить минимальное количество первых символов слов

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

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

Выходные данные:
4
Black_Betty вне форума   Ответить с цитированием

Старый 26.10.2012, 16:33
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Аналогичные проблемы должны вам помочь

Один из первых отзывов о "винде"
Heretic - один из первых шутеров DOOM
Клава , один из моих первых модов
По мотивам первых карманных

Старый 26.10.2012, 16:34   #2 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Написать на Паскале
Black_Betty вне форума   Ответить с цитированием
Старый 26.10.2012, 21:30   #3 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Black_Betty Посмотреть сообщение
Написать на Паскале
Разрешите доложить: задание выполнено!
Код:
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.
Разрешите быть свободным?
Vladimir_S вне форума   Ответить с цитированием
Старый 27.10.2012, 08:29   #4 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо Вам БОЛЬШОЕ!!!
Разрешаю быть свободным=)
Black_Betty вне форума   Ответить с цитированием
Старый 27.10.2012, 08:42   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Black_Betty Посмотреть сообщение
Спасибо Вам БОЛЬШОЕ!!!
Разрешаю быть свободным=)
Есть!
__________________________________________________ ______________
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 18.11.2012, 17:23   #6 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Я понимаю что уже почти месяц прошел, но не могли бы вы описать как и что делает второй цикл Repeat?
Black_Betty вне форума   Ответить с цитированием
Старый 18.11.2012, 18:04   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

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

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

Здесь, пройдя 4 номера, обнаруживаем, что первое слово кончилось! За такую ситуацию отвечает флажок b1, и если подобное произошло, то этот флажок перебрасывается в true и программа рапортует "Решения нет!".
Vladimir_S вне форума   Ответить с цитированием
Старый 18.11.2012, 18:19   #8 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
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;
Black_Betty вне форума   Ответить с цитированием
Старый 18.11.2012, 18:42   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Black_Betty Посмотреть сообщение
Простите, я тут туплю немного (или много), но вот в этой части я вообще не понимаю как идёт подсчет
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 и т.д.
Vladimir_S вне форума   Ответить с цитированием
Старый 18.11.2012, 18:48   #10 (permalink)
Black_Betty
Member
 
Регистрация: 26.10.2012
Сообщений: 17
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо=))
Black_Betty вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




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

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.