/*
 * Wyszukiwanie wartości w tablice. Program drukuje na ekranie tablicę, i
 * prosi o podanie poszukiwanej wartości, wyprowadza pozycje pierwszego
 * wystąpienia oraz ilość w calej tablice. Parametry opcjonalne.
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 * 
 */
#include <iostream>
#include <limits>

using namespace std;
//w starszych kompilatorach trzeba zakomentowa ć ten wiersz

int 
Szukaj(const unsigned short *T, unsigned N, unsigned short W, unsigned &Ilosc = *(unsigned *)0)
{
  int             Wynik = -1;
  if (&Ilosc)
    Ilosc = 0;
  for (const unsigned short *P, *K = (P = T) + N; P < K; ++P)
  {
    if (*P == W)
    {
      Wynik = P - T;
      if (!&Ilosc)
	break;
      ++Ilosc;
    }
  }
  return Wynik;
}

void 
Drukuj(const unsigned short *T, unsigned N)
{
  for (const unsigned short *K = T + N;;)
  {
    cout << *(T++);
    if (T >= K)
      break;
    cout << ',';
  }
  cout << endl;
}

int 
main()
{
  while (true)
  {
    const unsigned short T[] = {1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 1, 2, 3, 4, 1, 2, 3, 1, 2, 1};
    const unsigned  N = sizeof(T) / sizeof(*T);
    Drukuj(T, N);
    cout << "poszukiwana wartosc (!-koniec): ";
    unsigned short  W;
    cin >> W;
    if (cin)
    {
      int             Pos = Szukaj(T, N, W);
      //nie potrzebujemy ilo ś ci wyst ą pie ń -szybsze szukanie
	cout << "Wartosc " << W << ' ';
      if (Pos < 0)
	cout << "nie znaleziono w tablice" << endl;
      else
	cout << "znaleziono w pozycji " << Pos << endl;
      unsigned        Ilosc;
      Szukaj(T, N, W, Ilosc);
      //potrzebujemy ilo ś ćwyst ą pie ń -d ł u ż sze szukanie
	cout << "Wartosc " << W << ' ';
      cout << "wystepuje w tablice " << Ilosc << " razy" << endl;
    } else
    {
      cin.clear();
      if (cin.get() == '!')
	break;
      cout << "Blad wprowadzenia" << endl;
    }
    cin.ignore(INT_MAX, '\n');
    cout << endl;
  }
  return 0;
}
