Вобщем задач в том что дана строка с несколькими словами и нужна функция которая из этой строки выдирает первые буквы от слов и записывает в другую строку, например отедл маркетинговых услуг нада получить ому, или еще пример отдел планирования аэронавигационного обеспечения\служба аэронавигационного обеспечения из этого должно получится опао сао кто может помогите решить сию задачу пжлст
volvo
13.07.2007 14:28
Проходи по всем буквам строки, начиная со второй, и для каждой проверяй, если она НЕ пробел, а предыдущая - ДА пробел, то ее заноси в новую строку... Чтобы этот алгоритм сработал правильно, надо в самом начале к исходной строке спереди приписать дополнительный пробел...
Puzo
13.07.2007 14:30
а можно текст программы, а то в паскале не бум бум а нужно желательно седня сделать, разбираться времени нету
может, несколько кривовато но работает. признак окончания ввода - точка. дополнительно выделен "/" - вот пример: если на вход подана строка "abc ba/xz wy", на выходе получим "ab xw"
Neznaika
13.07.2007 19:03
Алгоритм: 0: Результат := ПУСТАЯ СТРОКА 1: Удалить лидирующие пробелы из исходной строки. 2: Cтрока пуста? ДА - ВЫХОД, НЕТ - СЛЕДУЮЩИЙ ШАГ. 3: К результату прибавляем(справа естественно) первый символ исходной строки. 4: Удалить все первые символы исходной строки, не являющиеся пробелами. 5: Перейти к шагу 1.
Программа:
function Abbreviatura( S : String ) : String; var Res : String; I : Integer; begin {0} Res := ''; I := 1; repeat {1} while (I<=Length(S)) and (S[I] = ' ') do Inc(I); {2} if I > Length(S) then Break; {3} Res := Res + S[I]; {4} repeat Inc(I) until (I > Length(S)) or (S[I] = ' ') until FALSE; Abbreviatura := Res end;
{ Основная программа. } var S : String; begin S := 'НАУЧНО ИССЛЕДОВАТЕЛЬСКИЙ ИНСТИТУТ Ч АРОДЕЙСТВА В ОЛШЕБСТВА'; Write(S,' = ',Abbreviatura(S)) end.
Работает, корректно обрабатывает пустую строку.
PS Мне сегодня явно нечего делать
compiler
13.07.2007 19:13
Цитата(Neznaika @ 13.07.2007 15:03)
Работает, корректно обрабатывает пустую строку.
дана строка с несколькими словами
Цитата(Neznaika @ 13.07.2007 15:03)
Мне сегодня явно нечего делать
тогда ответь в соседнею тему...
Puzo
16.07.2007 12:43
спасибо за проги, премного благодарен, еще появилось дополнение к этой задаче, нужно чтобы аббревиатура записалась наоборот, если в строке присутствует /, т.е. отдел маркетинговых сетей/служба авиационной безопасности->саб омс, или еще пример отдел компьютерных технологий и информационных систем/служба локальных сетей->слс октис Буду благадарен, если и эту задачку решите)
Neznaika
16.07.2007 16:14
Если '/' входит в строку 1(ОДИН) раз, то можно попробовать использовать мою вышеописанную функцию:
function Abbreviatura( S : String ) : String; ... end;
function Abbreviatura2( S : String ) : String; var SlashPosition : Integer; begin SlashPosition := Pos('/',S); if SlashPosition = 0 then { В строке S нет символа '/'. } Abbreviatura2 := Abbreviatura(S) else { В строке S есть символ '/'. } Abbreviatura2 := Abbreviatura(Copy(S,SlashPosition+1,Length(S)-SlashPosition)) + ' ' + Abbreviatura(Copy(S,1,SlashPosition-1)) end;
{ Основная программа. } var S : String; begin S := 'НАУЧНО ИССЛЕДОВАТЕЛЬСКИЙ ИНСТИТУТ Ч АРОДЕЙСТВА В ОЛШЕБСТВА'; WriteLn(S,' = ',Abbreviatura2(S)); S := 'отдел маркетинговых сетей/служба авиационной безопасности'; WriteLn(S,' = ',Abbreviatura2(S)); S := 'отдел компьютерных технологий информационных систем/служба локальных сетей'; WriteLn(S,' = ',Abbreviatura2(S)) end.
Puzo
16.07.2007 17:34
а если у нас есть файл текстовый с этими же отделами например otdeli.txt , в который входят все отделы, т.е. в каждой строчке по отделу, например отдел лизинговых связей/служба маркетинга отдел маркетинга/экономическая служба информационный отдел/служба безопасности и тд и тп то как в этом случае будет выглядеть текст программы. и еще вопрос можно ли чтобы вместо .txt данные брались из .xls?
klem4
16.07.2007 19:31
функция для первого варианта (без '/')
function get_abbreviation(const s: string; i: byte): string; begin if i > length(s) then get_abbreviation := '' else if (s[i] <> ' ') and (i = 1) or (s[i - 1] = ' ') then get_abbreviation := s[i] + get_abbreviation(s, succ(i)) else get_abbreviation := get_abbreviation(s, succ(i)); end;
writeln(get_abbreviation(s, 1))
Neznaika
16.07.2007 20:15
Цитата
1)а если у нас есть файл текстовый с этими же отделами например otdeli.txt , в который входят все отделы, т.е. в каждой строчке по отделу, например отдел лизинговых связей/служба маркетинга отдел маркетинга/экономическая служба информационный отдел/служба безопасности и тд и тп то как в этом случае будет выглядеть текст программы.
2)и еще вопрос можно ли чтобы вместо .txt данные брались из .xls?
1) - это несложно(компилятор Delphi):
... var F : TextFile; S : String; begin AssignFile(F,'otdeli.txt'); Reset(F); ReadLn(F,S); S := Abbreviatura2(S); Что-нибудь делаем с S ... CloseFile(F)
2) - это уже посложнее. Наверно нужно использовать OLE. Программа установит связь с Excel(он соответственно будет сервером) и попросит его открыть документ например otdeli.xls. Далее нужно посылать OLE-серверу запросы на чтение нужных строк (аббревиатуры которых нужно создать). Вроде не очень сложно, но я помочь не смогу(не знаю как точно нужно запрограммировать обмен данными и Excel отсутствует). Есть ещё вариант - узнать в каком формате хранятся нужные строки в XLS файле, но тогда придётся бороться с переносимостью(то есть с НЕПЕРЕНОСИМОСТЬЮ - с одной версией XLS будет работать, с другой нет)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.