% -*- coding: iso-8859-2 -*-
\documentclass[a4paper]{article}
\usepackage{progm}
\analpacks
\analoldal{3. feladatsor, 2008.,  6. ZH feladatai, függvényabsztrakció}
\begin{document}
\noindent
Egy file-nak azt a szakaszát, amely csupa negatív elemet tartalmaz
úgy, hogy a szakaszt jobbról és balról nemnegatív elem, vagy a file
vége határolja, a file negatív szigetének nevezzük.

\emph{1. feladat:} Számoljuk meg egy $sx,dx,x:\Read$ művelettel
ellátott file-ban a negatív szigetek számát!

\emph{2. feladat:} Állítsuk elő azt az $y$ kimeneti file-t, ami az $sx,dx,x:\Read$
művelettel ellátott file-hoz a benne lévő szigetek hosszát tartalmazza.
Péládul az $x=<0, -1, -4, 6, 1, -3>$ file-hoz az $y=<2, 1>$ file-t kell előállítani!

\emph{Specifikáció:}\\
$\F=\file(\Z)$
$A_1 = \alatt{\F}{x} \times \alatt{\N_0}{d}$\\
$B_1 = \alatt{\F}{x'}$\\
$Q_1 = ( x = x')$ \\
$R_1 = ( d = f(dom(x')_1))$

$\F'=\file(\N)$
$A_2 = \alatt{\F}{x} \times \alatt{\F'}{y}$\\
$B_2 = \alatt{\F}{x'}$\\
$Q_2 = ( x = x')$ \\
$R_2 = ( y = g(dom(x')_1))$

A feladat megoldása során szükségünk van arra, hogy a fájl végén
legyen egy extra nemnegatív szám (extremális elem).  Ez
adatabsztrakcióval elérhető, a 18-as, illetve a 21-es feladatban
látott módon.  Mostantól feltételezzük ennek ott létét.

Ezen feltétetelezés mellett az $f$, illetve $g$ rekurzív függvények definíciója:

$f:[0,dom(x)]\nyil \N_0\times \N_0, f(0):=(0, 0), \forall i\in[1, dom(x)]: f(i) = F(i, f(i-1))$\\
$F(i, z):=\begin{cases}
  (z_1, z_2+1) & \text{, ha } x_i<0 \\
  (z_1+1, 0) & \text{, ha } x_i\ge0 \es z_2\ne0 \\
  z & \text{, ha } x_i\ge0 \es z_2=0
\end{cases}$

$g:[0,dom(x)]\nyil \N_0\times \F', g(0):=(0, <>), \forall i\in[1, dom(x)]: g(i) = G(i, g(i-1))$\\
$G(i, z):=\begin{cases}
  (z_1, z_2+1) & \text{, ha } x_i<0 \\
  (z_1:\hiext(z_2), 0) & \text{, ha } x_i\ge0 \es z_2\ne0 \\
  z & \text{, ha } x_i\ge0 \es z_2=0
\end{cases}$

1. feladat:
\begin{stuki}
  \stm{d,z:=0,0}
  \stm{sx,dx,x:\Read}
  \begin{WHILE}{3}{\stm{sx=\norm}}
    \begin{CASE}{1}{3}
      \WHEN{\stm{dx<0}}
      \stm{z:=z+1}
      \WHEN{\stm{dx\ge0 \es z\ne0}}
      \stm{d,z:=d+1, 0}
      \WHEN{\stm{dx\ge0 \es z=0}}
      \SKIP
    \end{CASE}
    \stm{sx,dx,x:\Read}
  \end{WHILE}
\end{stuki}

2. feladat:
\begin{stuki}
  \stm{y,z:=<>,0}
  \stm{sx,dx,x:\Read}
  \begin{WHILE}{4}{\stm{sx=\norm}}
    \begin{CASE}{2}{3}
      \WHEN{\stm{dx<0}}
      \stm{z:=z+1}
      \WHEN{\stm{dx\ge0 \es z\ne0}}
      \stm{y:\hiext(z)}
      \stm{z:=0}
      \WHEN{\stm{dx\ge0 \es z=0}}
      \SKIP
    \end{CASE}
    \stm{sx,dx,x:\Read}
  \end{WHILE}
\end{stuki}

\end{document}
