\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{3. feladatsor, 9. feladat}
\begin{document}
\noindent
\emph{Feladat:} Adott egy fileban (megenengedett művelet az $sx,dx,x:read$)
egy bank lakossági nyilvántartása (név, összeg) párok alakjában.  Adjuk meg annak
a nevét, akinek nincs tartozása, de a legkisebb a betétállománya (ha van ilyen).

\emph{Specifikáció:}\\
$NEV = seq(Ch)$\\
$\F = \file((nev:NEV, o:\Z))$\\
$A = \alatt{\F}{x} \times \alatt{NEV}{n} \times \alatt{\L}{l}$\\
$B = \alatt{\F}{x'}$\\
$Q = ( x=x' )$\\
$R = ( l=(\exists i\in[1..x'.dom]:x'_i.o\ge 0) \es l\nyil
(\exists i\in [1..x'.dom]:(x'_i.o\ge 0 \es n=x'_i.nev \es \forall j\in[1..x'.dom]:(x'_j.o\ge 0\nyil x'_i.o\le x'_j.o))))$

Feltételes maximumkeresésre vezethető vissza a feladat azzal a megjegyzéssel, hogy
mivel mi minimumot keresünk, meg kell cserélni a stuktogram harmadik elágazáságában lévő
két ágat.

Először írjuk fel a feltételes minimumkeresést erre a feladatra, mintha file helyett függvényünk lenne:
\begin{stuki}[16cm]
  \stm{k,l:=m-1,\hamis}
  \begin{WHILE}{5}{\stm{k \ne n}}
    \begin{CASE}{3}{9}
      \WHEN[2]{\stm{f(k+1).o<0}}
      \SKIP
      \WHEN[2]{\stm{f(k+1).o\ge 0\es\nem l}}
      \stm[3]{l,i,max,n:=\\\igaz,k+1,f(k+1).o,\\f(k+1).nev}
      \WHEN[5]{\stm{f(k+1).o\ge 0\es l}}
      \begin{CASE}{2}{2}
        \WHEN{\stm{f(k+1).o\ge max}}
        \SKIP
        \WHEN{\stm{f(k+1).o\le max}}
        \stm[2]{i,max,n:=k+1,f(k+1).o,\\f(k+1).nev}
      \end{CASE}
    \end{CASE}
    \stm{k:=k+1}
  \end{WHILE}
\end{stuki}

Nekünk $sx, dx, x:read$ művelettel olvasható fileokon volt kitűzve
a feladat, de első lépésben csak sorozatra tudjuk átírni a tételünket:
\begin{stuki}[16cm]
  \stm{l:=\hamis}
  \begin{WHILE}{4}{\stm{x.dom\ne 0}}
    \begin{CASE}{2}{9}
      \WHEN[2]{\stm{x.lov.o<0}}
      \SKIP
      \WHEN[2]{\stm{x.lov.o\ge 0\es\nem l}}
      \stm[2]{l,max,n:=\\\igaz,x.lov.o,x.lov.nev}
      \WHEN[5]{\stm{x.lov.o\ge 0\es l}}
      \begin{CASE}{1}{2}
        \WHEN{\stm{x.lov.o\ge max}}
        \SKIP
        \WHEN{\stm{x.lov.o\le max}}
        \stm{n,max:=x.lov.o,x.lov.nev}
      \end{CASE}
    \end{CASE}
    \stm{x:lorem}
  \end{WHILE}
\end{stuki}

Innen már megtudjuk adni a szekveciális fileokon megoldó változatot:
\begin{stuki}[16cm]
  \stm{l:=\hamis}
  \stm{sx,dx,x:read}
  \begin{WHILE}{4}{\stm{sx=norm}}
    \begin{CASE}{2}{9}
      \WHEN[2]{\stm{dx.o<0}}
      \SKIP
      \WHEN[2]{\stm{dx.o\ge 0\es\nem l}}
      \stm[2]{l,max,n:=\\\igaz,dx.o,dx.nev}
      \WHEN[5]{\stm{dx.o\ge 0\es l}}
      \begin{CASE}{1}{2}
        \WHEN{\stm{dx.o\ge max}}
        \SKIP
        \WHEN{\stm{dx.o\le max}}
        \stm{max,n:=dx.o,dx.nev}
      \end{CASE}
    \end{CASE}
    \stm{sx,dx,x:read}
  \end{WHILE}
\end{stuki}

Az $n$-re vonatkozó értékadások beszűrása légből kapottnak tűnhet.
Igazából arról van szó, hogy az $(n,max)$ egy számlarekordnak
tekinthető.  Két ilyen rekord közül pedig azt tekintjük nagyobbnak, amelyiknek az összeg tagja nagyobb.
\end{document}
