Listing: COMBIN.PAS   
 var i,k:Word;  
 x:string;  
 litere:array[1..52]of Char;  
 function lit_urm(x:Char):Char;  
 begin  
 if x<>'Z'  
 then lit_urm:=Succ(x)  
 else lit_urm:='a'  
 end;  
 function lit_prec(x:Char):Char;  
 begin  
 if x<>'a'  
 then lit_prec:=Pred(x)  
 else lit_prec:='Z'  
 end;  
 
  function inferior(k:Word; x:string):string;     
 var i,j:Word;  
 testjos:Boolean;  
 begin  
 inferior:='null';  
 if Length(x)>k  
 then x:=Copy(x,1,k) { trunchiere }  
 else  
 for i:=1 to k-Length(x) do x:=x+'A';     
 { completare }  
 testjos:=true;  
 for i:=1 to k do  
 begin  
 if testjos  
 then begin { test jos: }  
 if x[i]<litere[i] then Exit;  
 if x[i]>litere[i]  
 then testjos:=false;  
 end;  
 if x[i]>litere[52+i-k] { test sus: }  
 then begin  
 for j:=i to k  do     
x[j]:=litere[52+j-k];  
 inferior:=x;  
 Exit  
 end;  
 if i>1  
 then { test de ordine: }  
 if x[i]<=x[i-1]  
 then 
 begin  
 repeat Dec(i)  
 until(i=1)or(x[i]>lit_urm(x[i-1]));     
 x[i]:=lit_prec(x[i]);  
 { decrementare }  
 for j:=i+1 to k  do     
x[j]:=litere[52+j-k];  
 inferior:=x;  
 Exit  
 end  
 end;  
 inferior:=x  
 end;  
 
 function superior(k:Word; x:string):string;     
 var i,j:Word;  
 ok,testsus:Boolean;  
 begin  
 superior:='null';  
 if Length(x)>k  
 then 
 begin 
 x:=Copy(x,1,k); { trunchiere }  
 ok:=false;  
 for i:=k downto 1 do  
 if x[i]<'z'  
 then begin ok:=true; Break end;  
 if not ok then Exit;  
 { nu putem incrementa }  
 x[i]:=lit_urm(x[i]);  
 for j:=i+1to k do x[j]:='A';  
 { incrementare }  
 end  
 else for i:=1 to k-Length(x) do x:=x+'A';     
 { completare }  
 testsus:=x[1]>=litere[53-k];  
 for i:=1 to k do  
 begin  
 if testsus  
 then if x[i]>litere[52+i-k] then Exit;     
 if i>1  
 then { test de ordine: }  
 if x[i]<=x[i-1]  
 then  
 begin  
 x[i]:=x[i-1];  
 while x[i]>=litere[52+i-k] do  
 Dec(i);x[i]:=lit_urm(x[i]);  
 { incrementare }  
 for j:=i+1 to k  do     
x[j]:=lit_urm(x[j-1]);  
 superior:=x; Exit  
 end;  
 end;  
 superior:=x;  
 end;  
 
 Begin  
 for i:=1 to 26 do  
 begin  
 litere[i]:=Chr(i-1+Ord('A'));  
 litere[i+26]:=Chr(i-1+Ord('a'))  
 end;  
 Assign(input,'G.DAT'); Reset(input);  
 while not SeekEof do  
 begin  
 Read(k);  
 if SeekEof then;  
 Readln(x);  
 Writeln('inferior = ',inferior(k,x));  
 Writeln('superior = ',superior(k,x));  
 Writeln  
 end;  
 Close(input)  
 End.