
/*
 * Przykladowe zastosowanie stosu
 * [c] piotao, 20051105
 * Ten program korzysta z pliku naglowkowego Stos.h, ktory musi byc
 * dostepny dla kompilatora.
 *
 * Program normalizuje dowolna ilosc liczb wczytywanych z klawiatury, uzywajac
 * do ich przechowywania stosu. Mozna oczywiscie zrobic takie sumowanie
 * zupelnie inaczej (i prosciej), ale tutaj chodzi o zilustrowanie
 * zastosowania.
 *
 * Normalizacja w tym przypadku polega na podzieleniu wszystkich liczb przez
 * liczbe najwieksza ze zbioru.
 */

#include <stdio.h>

// dolaczamy do programu nasz wlasny plik naglowkowy - zostanie on wstawiony
// w TO miejsce fizycznie, a linia z #include zniknie (tuz przed kompilacja)
// zadanie to wykona oczywiscie preprocesor kodu.
#include "Stos.h"

// We wczytanym pliku naglowkowym znajduja sie procedury obslugi stosu oraz
// definicje typow danych. Dzieki temu NodeData jest w programie ponizej znane
// i kompilator nie zglasza bledu.


// Funkcja wczytuje liczby podawane z klawiatury lub plik tak dlugo, az napotka
// wartosc 0. Wtedy wczytywanie zostaje zakonczone. Po kazdym wczytaniu liczby
// funkcja zwraca wartosc 1 (wczytywac dalej) lub 0 (przerwac wczytywanie).
int wczytaj_liczbe( NodeData *x ){
	printf("? ");
	scanf("%f",x);
	return *x == 0.0 ? 0 : 1;  // operator 3argumentowy, cos jak if(*x==0.0){0}else{1}
}



// no i teraz program glowny
int main(){

	// najpierw troche zmiennych
	NodeData liczba;   // nasz typ danych trzymany na stosie (liczba rzeczywista)

	Stack *Stos;       // bohater glowny: stos we wlasnej osobie (zmiennej) :)

	float maks = 0.0;  // zmienna do przechowywania wartosc maksymalnej, ktora znajdziemy

	// No i teraz glowna zabawa: wczytujemy liczby z klawiatury (funkcja 'wczytaj_liczbe' bedzie
	// wczytane dane umieszczala w zmiennej 'liczba', a my wtedy mozemy z ta zmienna robic rozne
	// rzeczy, np. dla podawanego ciagu znajdowac maksymalna wartosc (za jednym zamachem!)
	printf("Podawaj liczby rzeczywiste. Podaj 0 aby zakonczyc.\n");

	while( wczytaj_liczbe(&liczba) ){     // wczytujemy dopoki funkcja zwracac bedzie 1
		
		if(liczba>maks) maks = liczba;      // najwieksza liczbe zawsze zapamietujemy

		Stos = pushStack(Stos, liczba);     // dodajemy liczbe do stosu (na kupke!)

	}

	printf("Podano %i liczb.\n", Stos->size);  // to dla bajeru.

	// normalizacja liczb, wystarczy kazda z nich podzielic przez liczbe maks.
	while( Stos && Stos->size > 0 ){   // dopoki na stosie siedzi jakis element
		liczba = popStack(&Stos);       // wyciagnij pierwszy z wierzchu
		liczba = liczba / maks;        // oblicz liczbe znormalizowana do jeden
		printf("%1.4f\n",liczba);     // wypisz wynik
	}

	// wywolanie freeStack jest niepotrzebne, poniewaz dla kazdego elementu
	// stosu wolany jest popStack, ktory po kolei usuwa elementy, az na koncu
	// nie bedzie zadnego z nich.

}

