% -*- coding: iso-8859-2 -*-
\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{3. feladatsor, 32. feladat, függvényabsztrakcióval}
\renewcommand{\P}{\mathbb{P}}
\renewcommand{\D}{\mathbb{D}}
\newcommand{\Hh}{\mathbb{H}}
\newcommand{\NEV}{\text{NÉV}}
\newcommand{\EHA}{\text{EHA}}
\newcommand{\nev}{\text{név}}
\newcommand{\eha}{\text{eha}}
\newcommand{\RE}{\text{RE}}
\begin{document}
\noindent

Adott az $x$ szekvenciális input fájl (megengedett művelet az $sx, dx,
x\colon read$), ami egy bevezetés a programozáshoz csoport elért
eredményeit tartalmazza.  Egy hallgató nevét és EHA kódját tartalmazó
rekord után mindig a ZH-inak és a plusz--mínusz dolgozatainak
eredményei következnek dolgozatonként külön-külön rekordban (ezek a
rekordok idő sorrendben vannak, tehát vegyesen a ZH-k és a
plusz-mínuszok, azonban természetesen mindegyik még a következő
hallgató neve előtt).  Tegyük fel, hogy mindenki \hbox{maximum} 3 dolgozatot
írt (senki nem írt pótdolgozatot), az elérhető 180 pontszám azok
egyszerű összege.  Azt is tegyük fel, hogy a gyakorlatvezető (gondolva
a későbbi feldolgozásra) az olyan plusz--mínusz dolgozatok eredményét
is rögzítette mínuszként, amikor a hallgató nem jelent meg.

\emph{Feladat:}
Adjuk meg azon hallgatók nevét, akik jeles gyakorlati jegyet kaphatnak,
tehát teljesítik a plusz-mínusz követelményt és 151 vagy annál több
pontot értek el a 3 ZH-n!

\emph{Specifikáció:}\\
$\Hh = (\nev\colon\NEV, \eha\colon \EHA)$\\
$I_\EHA(\eha) = (\tau(\eha)=7)$\\
$\P = \{-1, 0, 1\}$\\
$\D = [0, 60]$\\
$\R = (h:\Hh;p:\P;d:\D)$\\
$\F = \file(\R)$\\
$I_\F(f) = (\dom(f)>0 \nyil \lov(f)_h)$\\
$\F_\NEV = \file(\NEV)$\\
$A = \alatt{\F}{x} \times \alatt{\F_\NEV}{z}$

\vspace{1cm}

A feladat állapotterét először áttranszformáljuk egy olyanra, ahol a
file végén van extremális elem, még mielőtt az olvasás során abnorm
értéket kapnánk, mert így könnyebb lesz felírni a kiértékelendő
rekurzív függvényt.

$\RE=\R \cup \{(``",``")\}, \F'=file(\RE)$\\
$A' = \alatt{\F'}{y} \times \alatt{\F_\NEV}{z}$\\
$y=\con(x,<(``",``")>)$

$B = \alatt{\F'}{y'}$\\
$Q = ( y=y' )$\\
$R = ( z = f(dom(y'))_1)$, ahol $f:[0,dom(y')]\nyil \F_\NEV\times\Hh\times\Z\times\N_0, f(0):=(<>,(``", ``"), -1, 0)$\\
$\forall i\in[1,dom(y')]:f(i):=F(i, f(i-1))$, ahol 
\[
F(k,z):= \left\{
\begin{array}{ll}
(\hiext(z_1, z_2.\nev), {y_k}_h, 0, 0) & \text{, ha } {y_k}.h \es z_3\ge0 \es z_4>150 \\
(z_1, {y_k}_h, 0, 0) & \text{, ha } {y_k}.h \es (z_3<0 \vagy z_4\le150) \\
(z_1, z_2, z_3+{y_k}_p, z_4) & \text{, ha } y_k.p \\
(z_1, z_2, z_3, z_4+{y_k}_d) & \text{, ha } y_k.d
\end{array}
\right.
\]

\begin{textblock}{1}(7.0,-3.7)
\begin{stuki*}[4cm]{open($y$)}
  \stm{sx,dx,x:\Read}
  \stm{dy_h:=(\text{``üres'', ``''})}
\end{stuki*}
\end{textblock}

\begin{textblock}{1}(6.0,-7.2)
\begin{stuki*}[8.5cm]{$sy,dy,y:\Read$}
\begin{IF}{4}{\stm{dy_h=\text{(``'', ``'')}}}
  \stm{sy:=\norm}
  \begin{IF}{2}{\stm{sx=\norm}}
    \stm{dy:=dx}
    \stm{sx,dx,x:\Read}
    \ELSE
    \stm{dy_h:=\text{(``'',``'')}}
  \end{IF}
  \ELSE
  \stm{sy:=\abnorm}
\end{IF}
\end{stuki*}
\end{textblock}

A megoldóprogramot a rekurzív függvényérték kiszámításának tételével kapjuk:

\begin{stuki}[16cm]
  \stm{\open(y)}
  \stm{sy,dy,y:\Read}
  \stm{z,h,p,d:=<>,\text{(``'', ``'')},0,0}
  \begin{WHILE}{4}{\stm{sy=\norm}}
    \begin{CASE}{2}{4}
      \WHEN{\stm{dy.h \es p<0 \es d>60}}
      \stm{z:hiext(h.\nev)}
      \stm{h,p,d:=,dy_h,0,0}
      \WHEN{\stm{dy.h \es (p\ge0 \vagy d\le60)}}
      \stm{h,p,d:=dy_h,0,0}
      \WHEN{\stm{dy.p}}
      \stm{p:=p+dy_p}
      \WHEN{\stm{dy.d}}
      \stm{d:=d+dy_d}
    \end{CASE}
    \stm{sy,dy,y:\Read}
  \end{WHILE}
\end{stuki}

\end{document}
