Sort an array of composite structures: Difference between revisions

Added solution for Action!
(Frink)
(Added solution for Action!)
Line 403:
(WEIGHT . 153)
(VALUE . 200)))</pre>
 
=={{header|Action!}}==
<lang Action!>DEFINE PTR="CARD"
DEFINE PAIR_SIZE="4"
DEFINE PAIR_COUNT="1"
 
TYPE Pair=[PTR name,value]
 
BYTE ARRAY pairs(100)
BYTE count=[0]
 
PTR FUNC GetItemAddr(INT index)
PTR addr
 
addr=pairs+index*PAIR_SIZE
RETURN (addr)
 
PROC PrintArray()
INT i
Pair POINTER p
 
Put('[)
FOR i=0 TO count-1
DO
IF i>0 THEN Put(' ) FI
p=GetItemAddr(i)
PrintF("(%S,%S)",p.name,p.value)
OD
Put(']) PutE()
RETURN
 
PROC Append(CHAR ARRAY n,v)
Pair POINTER dst
 
dst=GetItemAddr(count)
dst.name=n
dst.value=v
count==+1
RETURN
 
PROC InitData()
Append("Warsaw","Poland")
Append("Prague","Czech Republic")
Append("London","United Kingdom")
Append("Paris","France")
Append("Madrit","Spain")
Append("Berlin","Germany")
Append("Rome","Italy")
Append("Moscow","Russia")
Append("Budapest","Hungary")
RETURN
 
PROC Sort()
INT i,j,minpos
CHAR ARRAY tmp
Pair POINTER p1,p2
 
FOR i=0 TO count-2
DO
minpos=i
FOR j=i+1 TO count-1
DO
p1=GetItemAddr(minpos)
p2=GetItemAddr(j)
IF SCompare(p1.name,p2.name)>0 THEN
minpos=j
FI
OD
IF minpos#i THEN
p1=GetItemAddr(minpos)
p2=GetItemAddr(i)
tmp=p1.name p1.name=p2.name p2.name=tmp
tmp=p1.value p1.value=p2.value p2.value=tmp
FI
OD
RETURN
 
PROC Main()
InitData()
PrintE("Array before sort:")
PrintArray() PutE()
Sort()
PrintE("Array after sort:")
PrintArray()
RETURN</lang>
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Sort_an_array_of_composite_structures.png Screenshot from Atari 8-bit computer]
<pre>
Array before sort:
[(Warsaw,Poland) (Prague,Czech Republic) (London,United Kingdom) (Paris,France) (Madrit,Spain) (Berlin,Germany) (Rome,Italy) (Moscow,Russia) (Budapest,Hungary)]
 
Array after sort:
[(Berlin,Germany) (Budapest,Hungary) (London,United Kingdom) (Madrit,Spain) (Moscow,Russia) (Paris,France) (Prague,Czech Republic) (Rome,Italy) (Warsaw,Poland)]
</pre>
 
=={{header|Ada}}==
Anonymous user