/* Programa per treballar amb punters i taules. Mostrara un menu
	amb 3 opcions:
 1) introduir les dades de la taula
 2) Calcular la suma de les dades introduides
 3) Calcular els valors mes gran i mes petit
 4) Sortir del menu

	VERSIO 2
	AQUESTA VERSIO FUNCIONARA D'UNA ALTRA MANERA, PERQUE US ADONEU DE
	L'EQUIVALENCIA ENTRE PUNTERS I TAULES.
 */

 #include <stdio.h>
 #include <conio.h>
 #include "funcions.h"

 int omplirtaula (int *p, int maxim)
 {
  /* La funcio omplirtaula rep un punter al primer element de la taula
  i el maxim nombre d'elements que podem introduir. */
  int i=0;
  char siono='S';
  while (i < maxim && siono=='S')
	{
	 scanf("%d",&p[i]);
	 /* li estic passant al scanf la direccio de memoria de l'element i
	 que es igual que sumar-li i al punter p, que es el que feiem en
	 l'altra versio. */
	 i++;
	 printf("Vols continuar s/n ");
	 siono=llegir_sn(); /* aquesta funcio la tenim, espero, en funcions.h*/
	}
	return (i); /* en i tenim el nombre d'elements introduits */
 }

 int sumataula (int *p, int maxim)
 {
  /* la funcio sumataula rep un punter al primer element de la taula
  i el maxim nombre d'elements veritablement introduits */
  int i=0;
  int total=0;
  for (i=0;i<maxim;i++)	total = total + p[i];
  /* es a dir, a total, que en un principi val 0, li vaig sumant el valor
  de p[i]. Com que la i va incrementant-se es equivalent a anar fent p++
  com feiem en l'altra versio */
  return (total);
 }


 void manimix(int *min, int *max, int *p, int maxim)
 {
  /* la funcio manimix rep per referencia les variables min i max
  que haura d'omplir amb els valors corresponents. Tambe rep un punter a
  la primera posicio de la taula , i el nombre d'elements veritablement
  introduits */
  int i;
  *min = 9999; /* inicialitzo les variables */
  *max = 0;
  for (i=0;i<maxim;i++)
	{
	 /* i ara he d'anar fent la comprovacio que ja sabem */
	 if (p[i] > *max) *max = p[i];
	 if (p[i] < *min) *min = p[i];
	 /* en aquest cas no cal fer p++ ¿Per que? Doncs perque en fer i++
		 en el bucle for, i despres preguntar per p[i], ja estem fent
		 el desplaçament del punter al llarg de la taula (es , de fet, com
		 ho hem estat fent sempre ) */
	}
 }


 void main()
 {
  int t[10];
  int opcio, min, max, n, suma;
  char siono='S';
  opcio=0;
  n=0;
  do
  {
	clrscr();
	printf("1-Introduir els valors.\n");
	printf("2-Calcular la suma.\n");
	printf("3-Calcular el mes gran i el mes petit.\n");
	printf("4-Sortir del menu.\n");
	printf("\nIntrodueixi la seva opcio: ");
	/* aprofitem que ja tenim la funcio llegirnum, no ? */
	llegirnum(1,4,&opcio);
	switch(opcio)
	{
	 case 1: /* s'ha d'omplir la taula */
		 n = omplirtaula(t,10); /* aquesta es la manera de fer-ho si
										omplirtaula es una funcio */
		 gotoxy(10,20);
		 printf("S'han introduit %d valors.", n);
		 getch();
		 break;
	 case 2:
		 /* Hem de sumar els elements introduits */
		 gotoxy(10,20);
		 if (n > 0)
		 {
		  suma = sumataula(t,n); /* una altra vegada aquesta es la manera*/
		  printf("La suma dels elements es %d ", suma);
		 }
		 else printf("No es pot fer la suma, la taula no te cap valor.");
		 getch();
		 break;
	 case 3:
		 /* Hem de calcular el mes gran i el mes petit */
		 gotoxy(10,20);
		 /* en aquest cas sera una accio (tot i que ja sabem que en C tot
		 son funcions, pero les accions son funcions de tipus void) perque
		 ha de tornar 2 valors, i aixo una funcio normal no ho pot fer (be,
		 pot tornar-ne un per valor i un per referencia pero a mi m'agrada
		 mes fer les coses ben fetes). Per tant, es una funcio void a la que
		 li passem les variables min i max per referencia (amb & ), la taula
		 tambe per referencia (pero com que el nom de la taula es un punter,
		 no cal el &), i el nombre maxim d'elements, que com no s'ha de
		 modificar, por passar-se per valor. */
		 manimix(&min, &max, t, n);
		 printf("El valor mes petit es %d i el mes gran %d ", min, max);
		 getch();
		 break;
	}
  }
  while (opcio != 4);
 }

