Поместить в начало строки слова, содержащие только цифры, а затем все остальные слова

Строка состоит из слов разделенных ровно 1 пробелом, пробелов перед первым и после последнего слова нет. Поместить в начало строки слова, содержащие только цифры, а затем все остальные слова. Порядок слов внутри заданных групп не должен изменяться.

code: #delphi
var s,s1,s2,s3:string;{основная и три вспомогательные строки, так удобнее}
    i,j,k:integer;
begin
k:=0;
repeat {проверяем правильность ввода строки}
write('s: ');
readln(s);
for i:=1 to length(s) do
if (s[1]=' ')or(s[length(s)]=' ')or(pos('  ',s)>0){чтобы не было пробела в начале, конце и 2х пробелов подряд}
then k:=1;
until k=0;
s:=s+' ';s1:='';s2:='';s3:='';{добавляем пробел в конец для удобства, обнуляем строки}
while pos(' ',s)>0 do {пока есть пробелы}
  begin
    s1:=copy(s,1,pos(' ',s)-1);{смотрим очередное слово}
    k:=0;
    for j:=1 to length(s1) do
    if s1[j] in ['0'..'9'] then k:=k+1;{считаем в слове цифры}
    if k=length(s1) then s2:=s2+' '+s1 {если все цифры, в первую строку}
    else s3:=s3+' '+s1; {если нет, во вторую}
    delete(s,1,pos(' ',s));{удаляем просмотренное слово}
  end;
write(s2+s3); {складываем строки и выводим}
readln
end.

автор: Puporev



code: #delphi
program words;
{$APPTYPE CONSOLE}
 
uses
    SysUtils;
 
type
    TStrArr = array of string;
 
 
function SplitStr(const sSrc,sDelimiter:string; lLimit:integer=-1; bWithEmpty:boolean=true):TStrArr;
var i,ni,cnt,dl:integer;
begin
    dl := Length(sDelimiter);
    SetLength(result,0);
    if lLimit<=0 then lLimit := MaxInt;
    cnt := 0;
    i := 1;
    repeat
        inc(cnt);
        SetLength(result,cnt);
        ni := PosEx(sDelimiter, sSrc, i);
        if (ni=i) and not bWithEmpty then begin
            dec(cnt);
            SetLength(result,cnt);
            inc(i,dl);
        end else if (ni=0)or(cnt=lLimit) then begin
            result[cnt-1] := Copy(sSrc, i, MaxInt);
            break;
        end else begin
            result[cnt-1] := Copy(sSrc, i, ni-i);
            i := ni+dl;
        end;
    until false;
end;
 
function Join(const Arr:TStrArr; const sGlue:string; bSkipEmpty:boolean=false):string;
var i,L:Integer;
begin
    result := '';
    L := High(Arr);
    i := 0;
    while i<=L do begin
        if not bSkipEmpty or (Arr[i]<>'') then begin
            if i>0 then Insert(sGlue, result, Length(result)+1);
            Insert(Arr[i], result, Length(result)+1);
        end;
        inc(i);
    end;
end;
 
var s:string;
    arr,arr2:TStrArr;
    i,L:Integer;
 
begin
    write('Input words: ');
    readln(s);
    arr := SplitStr(s,' ',-1,false);
    L := Length(arr);
    SetLength(arr2,0);
    for i:=0 to L-1 do begin
        if StrToInt64Def(arr[i],-1)>=0 then begin
            SetLength(arr2,Length(arr2)+1);
            arr2[High(arr2)] := arr[i];
            arr[i] := '';
        end;
    end;
    s := Join(arr2, ' ')+' '+Join(arr, ' ', true);
    writeln('Result is: ',s);
    readln;
end.

автор: Vovan-VE

Поделиться:

Похожие статьи: