previous next Up Title Contents Index

22.3.5 Aliohjelmien yhteiset muuttujat


Haluamme lisäksi säilyttää koko kerhorekisterin läpi säilyneen ominaisuuden, että meillä olisi mahdollista rinnakkain käsitellä useita eri kerhoja (!), joten myös kerho pitäisi välittää tavalla tai toisella vertailu- aliohjelmalle.

Aliohjelmien väliseen tiedonvälitykseen tehdään tietue, johon kasataan kaikki yhteisesti tarvittavat muuttujat. Ongelmassamme niitä on kentan_nro ja osoitin käyttämämme kerhon jasenet - taulukon alkuun. Siis ne tietueeseen. Seuraavasta esimerkistä puuttuvat saantimetodit, joten se on vain hahmotelma:

	typedef struct {   /* Lajittelussa apuna käytettävä tietue.                 */
	  int kentan_nro;               /* Kenttä jonka mukaan lajitellaan.         */
	  cKerho *kerho;                /* Lajiteltava kerho                        */
	} tVertaa;                      /*                                          */
	
	static tVertaa VERTAA;          /* Tiedonvälitys lajittele - > vertaile      */
	
	int vertaile(const void *a, const void *b)
	{
	  string s1,s2;
	  s1 = VERTAA.kerho->anna(*(int *)a).kentta_jonoksi(VERTAA.kentan_nro,);
	  s2 = VERTAA.kerho->anna(*(int *)b).kentta_jonoksi(VERTAA.kentan_nro,);
	  return (strcmp(s1.c_str(),s2.c_str());
	}
	
	void cKerho::lajittele(cJarjestys *jarj,int kentan_nro)
	{
	  int j,ind,max_ind;
	
	  if ( (kentan_nro < 0) || !jarj- >jarjesta ) return;
	
	  if ( jarj- >Indekseja() == 0 ) { /* Alustetaan perm. taulukko */
	    for (j=0; j<jasenia; j++) 
	       jarj- >lisaa(j);
	  }
	
	  VERTAA.kentan_nro = kentan_nro;
	  VERTAA.kerho      = this;
	
	  qsort( (void *)(jarj- >Indeksit()), /* Lajiteltava taulukko                 */
	         jarj- >Indekseja(),          /* Taulukon alkioiden lukumäärä         */
	         sizeof(jarj- >anna(0)),      /* Yksittäisen alkion koko              */
	         vertaile);                  /* Vertailualiohjelman nimi             */
	}

lajittele - aliohjelma tekee tarvittavat alustukset, mm. laittaa permutaatiotaulukon johonkin järjestykseen (tässä tapauksessa ehdollisesti, eli jos taulukolla jo on järjestys, ei sitä sotketa), laittaa arvot yhteisille muuttujille ja kutsuu qsort - aliohjelmaa tarvittavilla parametreilla.

Tehtävä 22.178 Etsimisen tuloksen lajittelu

Tarvitseeko lajittele - aliohjelma muutoksia, jotta se voisi lajitella myös etsimisen tuloksena saadun taulukon? Miten etsimisen tulos lajiteltaisiin etsimisen päätteeksi?

Tehtävä 22.179 Selailu puhelinnumeron mukaan

Miten käyttäjä voisi selata koko kerhon jäsenistöä puhelinnumeron mukaisessa järjestyksessä?

Tehtävä 22.180 Vertailu isot ja pienet samaistaen

Mikäli haluttaisiin järjestys, jossa aapinen < Zorro, pitäisi vertailun ajaksi isot ja pienet kirjaimet samaistaa. Ongelmaa voitaisiin ratkaista seuraavalla aliohjelmalla
	int vertaile(const void *a, const void *b)
	{
	  string s1,s2;
	  s1 = VERTAA.kerho->anna(*(int *)a).kentta_jonoksi(VERTAA.kentan_nro,);
	  s2 = VERTAA.kerho->anna(*(int *)b).kentta_jonoksi(VERTAA.kentan_nro,);
	  jono_isoksi(s1); jono_isoksi(s2);
	  return (strcmp(s1.c_str(),s2.c_str());
	}
	
Mitä vikaa aliohjelmassa kuitenkin on?


previous next Up Title Contents Index