dissabte, 22 d’abril del 2017

Els punters en C#

Què és un punter? 

La paraula "punter" s'usa per a referir-se a una direcció de memòria. El que té d'especial és que normalment un punter tindrà un tipus de dades associat: per exemple, un "puntero a entero" serà una direcció de memòria en què haurà emmagatzemat (o podrem emmagatzemar) un nombre enter. 

El fet de poder accedir directament al contingut de certes posicions de memòria dóna una major versatilitat a un programa, perquè permet fer quasi qualsevol cosa, però a canvi d'un risc d'errors molt major.

En llenguatges com C, és imprescindible utilitzar punters per a poder crear estructures dinàmiques, però en C# podem "esquivarlos", atés que tenim diverses estructures dinàmiques ja creades com a part de les biblioteques auxiliars que acompanyen al llenguatge bàsic. Així i tot, veurem algun exemple que ens mostre què és un punter i com s'utilitza. 

En primer lloc, comentem la sintaxi bàsica que utilitzarem:

int numere;         /* "numero" és un nombre enter */ 
int* posició;       /* "posicion" és un "puntero a entero" (direcció                      de memòria en què podrem guardar un sencer) */


És a dir, escriurem un asterisc entre el tipus de dades i el nom de la variable. Eixe asterisc pot anar junt amb qualsevol d'ambdós, per la qual cosa també és correcte escriure.

int *posicio;

El valor que guarda "posicion" és una direcció de memòria. Generalment no podrem fer coses com posicion=5; perquè res ens garantix que la posició 5 de la memòria estiga disponible perquè nosaltres la usem. Serà més habitual que prenguem una direcció de memòria que ja conté una altra dada, o bé que li demanem al compilador que ens reserve un espai de memòria (més avant veurem com).

Si volem que "posicion" continga la direcció de memòria que el compilador havia reservat per a la variable "numero", ho faríem usant el símbol "&", així:

posicio = №


dimecres, 19 d’abril del 2017

Els "enumeradores"


Un enumerador és una estructura auxiliar que permet recórrer les estructures dinàmiques de forma seqüencial. Quasi totes elles contenen un mètode GetEnumerator, que permet obtindre un enumerador per a recórrer tots els seus elements. Per exemple, en una taula hash podríem fer:



Com es pot veure, els enumeradores tindran un mètode "MoveNext", que intenta moure's al següent element i torna "false" si no ho aconseguix. En el cas de les taules hash, que tenen dos camps (clau i valor) , l'enumerador a usar serà un "enumerador de diccionario" (IDictionaryEnumerator) , que conté els camps Key i Vaig valorar. Com es veu en l'exemple, és habitual que en una taula Hash no obtinguem la llista d'elements en el mateix orde en què els vam introduir, pel fet que es col·loquen seguint la funció de dispersió. Per a les col·leccions "normales", com les piles i les cues, el tipus d'Enumerador a usar serà un IEnumerator, amb un camp Current per a saber el valor actual:


Nota: els "enumeradores" existixen també en altres plataformes, com Java, encara que allí reben el nom de "iteradores".

Es pot saber més sobre les estructures dinàmiques que hi ha disponibles en la plataforma .Net consultant la referència en línia de MSDN (molta de la qual està sense traduir a l'espanyol):


diumenge, 9 d’abril del 2017

Taules Hash

En una Taula Hash,  els elements estan formats per una parella: una clau i un valor, com en un SortedList, però la diferència està en la forma en què es manegen internament aquestes dades: la Taula Hash usa una "funció de dispersió" per col·locar els elements, de manera que no es poden recórrer seqüencialment i ocupen més espai, però a canvi l'accés a partir de la clau és molt ràpid, més que si fem una cerca seqüencial (com en un array) o binària (com en un ArrayList ordenat).

Una Taula Hash té una certa capacitat inicial, que s'amplia automàticament quan és necessari. Com la Taula Hash és molt més ràpida quan està bastant buida que quan està gairebé plena, podem usar un constructor alternatiu, en el qual se li indica la capacitat inicial que volem, si tenim una idea aproximada de quantes dades anem a guardar.

Exemples C#:

Hashtable meuDiccio = new Hashtable();
meuDiccio.Add("byte", "8 bits");
meuDiccio.Add("pc", "personal computer");

Console.WriteLine( "El significat de PC es: {0}",  meuDiccio["pc"]);
Es pot comprovar si está amb: if (meuDiccio.Contains("pc"))

Altres mètodes:

Count
Remove
Clear
ContainsKey(Object)
ContainsValue(Object)
CopyTo(Array, Int32)

GetEnumerator()

Deixe aquest enllaç per a consultar la Clase Hash Table en C#:

https://msdn.microsoft.com/es-es/library/system.collections.hashtable(v=vs.110).aspx

dimarts, 4 d’abril del 2017

Llistes en C#: SortedList


SortedList


En un SortedList, els elements estan formats per una parella: una clau i un valor (com en un diccionari: la paraula i la seua definició). Es pot afegir elements amb "Add", o accedir als elements mitjançant el seu índex numèric (amb "GetKey") o mitjançant la seua clau (amb claudàtors), com en aquest exemple:


using System;
using System.Collections;
public class SamplesSortedList  {

   public static void Main()  {

      // // Crea i inicialitza un nou SortedList.
      SortedList meuSL = new SortedList();
       meuSL.Add("Tercer", "!");
       meuSL.Add("Segon", "Món");
       meuSL.Add("Primer", "Hola");

      //  Visualitza les propietats i valors delSortedList.
      Console.WriteLine( "meuSL" );
      Console.WriteLine( "  Recompte:    {0}", meuSL.Count );
      Console.WriteLine( "  Capacitat: {0}", meuSL.Capacity );
      Console.WriteLine( "  Claus and Valors:" );
      IMprimerClausIValors( meuSL );
   }


   public static void ImprimirClausIValors( SortedList meuList )  {
      Console.WriteLine( "\t-CLAU-\t-VALLOR-" );
      for ( int i = 0; i < meuList.Count; i++ )  {
         Console.WriteLine( "\t{0}:\t{1}", meuList.GetKey(i), meuList.GetByIndex(i) );
      }
      Console.WriteLine();
   }
}
/*
Sortida del codi:

meuSL
  Recompte:    3
  Capacitat: 16
  Claus i Valors:
    -CLAU-    -VALOR-
    Primer:    Hola
    Segon:    Món
    Tercer:    !
*/

Altres possibilitats de la classe SortedList són:

Exercicis:
1. Crea un programa que, quan l'usuari introdueix el nom d'un nombre de l'1 al 10 en 
anglès (per exemple, "two"),diga la seua traducció en valencià  (per exemple, "dos"). 

2. Crea un programa que, quan l'usuari introdueix el nom d'un mes en valencià  
(per exemple, "abril"), mostra la seua traducció en anglès (per exemple, "april").




dilluns, 3 d’abril del 2017

Llistes en C#: ArrayList



Una llista és una estructura dinàmica en la qual es pot afegir elements sense tantes restriccions. És habitual que es puguem introduir noves dades en tots dos extrems, així com entre dos elements existents, o bé fins i tot de forma ordenada, de manera que cada nova dada s'introdueix automàticament en la posició adequada perquè tots ells queden en ordre.

En el cas de C#, tenim dues variants especialment útils: una llista als elements de la qual es pot accedir com als d'un array ("ArrayList") i una llista ordenada ("SortedList").

ArrayList

En un ArrayList, podem afegir dades en l'última posició amb "Add", inserir en qualsevol altra amb "Insert", recuperar qualsevol element usant claudàtors (igual que fèiem amb els "arrays"), o fins i tot ordenar tota la llista amb "Sort" (si les dades que hi ha guardats són "fàcils de comparar", però no servirà si són dades més complexes, com un "struct").  Anem a veure alguns dels mètodes podem utilitzar:



Nom
Descripció
Add(Object)
Agrega un objecte al final de ArrayList.
Clear()
Lleva tots els elements de ArrayList.
Clone()
Crea una còpia superficial de la col·lecció ArrayList.
Contains(Object)
Determina si un element es troba en ArrayList.
CopyTo(Array)
Copia la ArrayList completa en una Array unidimensional compatible, començant en el principi de la matriu de destinació.
GetType()
Obté el Type de la instància actual.(Heretat de Object).
Insert(Int32, Object)

Insereix un element en ArrayList, en l'índex especificat.
RemoveAt(Int32)
Lleva l'element situat en l'índex especificat de ArrayList.
Reverse()

Inverteix l'ordre dels elements en la ArrayList completa.
Sort()
Ordena tots els elements de ArrayList.

Exemple:
using System;
using System.Collections;
public class SamplesArrayList  {

   public static void Main()  {

      // Crea i inicialitza un nou ArrayList.
      ArrayList meuAL = new ArrayList();
      meuAL.Add("Hola");
      meuAL.Add("Món");
      meuAL.Add("!");

      // Visualitza les propietats i valors del ArrayList.
      Console.WriteLine( "meuAL" );
      Console.WriteLine( "    Recompte:    {0}", meuAL.Count );
      Console.WriteLine( "    Capacitat: {0}", meuAL.Capacity );
      Console.Write( "    Valors:" );
      PrintValues( meuAL );
   }

   public static void ImprimirValors( IEnumerable meuaLlista )  {
      foreach ( Object obj in meuaLlista )
         Console.Write( "   {0}", obj );
      Console.WriteLine();
   }

}


/* 
Sortida del codi:

meuAL
    Recompte:    3
    Capaacitat: 4
    Valors:   Hola  Món   !

*/
Exercici: Concessionari de vehicles: Cotxes i Motos 
 El programa haurà de llegir un fitxer que conté vehicles (cotxes i motos) emmagatzemats de la següent manera:




En llegir el fitxer s'haurà d'emmagatzemar cada vehicle en una llista genèrica de la classe Vehicle (classe pare) amb els atributs descripció, preu i categoria, cada vehicle serà un Cotxe o una Moto (classes filles) segons corresponga.
 (Per diferenciar-los en la descripció de cada vehicle sempre ha de contenir la paraula cotxe o moto respectivament com es pot veure en el fitxer d'exemple).
 Per assignar una categoria a cada vehicle s'ha de crear una funció que reba el preu de cada vehicle i aquesta assigne una categoria segons aquests criteris:
 Baixa <= 3000
 Mitjana > 3000 i Mitjana <= 10000
 Alta > 10000
 Una vegada tenim la llista amb tots els vehicles emmagatzemats hem de preguntar a l'usuari si vol visualitzar cotxes o motos i que categoria.  Una vegada tenim aquestes dues dades el programa haurà de mostrar a l'usuari els vehicles que compleixen aquestes condicions. Exemple: 


Per a això hem de consultar en la llista de vehicles el tipus de vehicle Cotxe o Moto, podem utilitzar GetType sobre un dels elements de la nostra llista de vehicles (en aquest cas no contemplem l'opció de mirar la descripció). A més de consultar la categoria de cada vehicle. Exemple:

meusVehicles [i] GetType() == typeof(Cotxe)
meusVehicles[i]. GetCategoria()