Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

22.4.3 alusta_jarjestys

Kirjainten samaistus suoritettaisiin siten, että olisi käytössä taulukko, jossa olisi kunkin kirjaimen ASCII- koodiarvon kohdalla kirjaimelle uusi koodi, sen mukaan mihin kohti kirjain lajitellaan. Voisimme esimerkiksi numeroida:

	
	0x20  = välimerkit
	0x30 = '0'
	0x31 = '1'
	..
	0x39 = '9'
	0x41 = 'A' ja 'a' (saksassa myös 'Ä' ja 'ä')
	0x42 = 'B' ja 'b'
	... 

Tätä varten tarvitsemme luokan:

	
	cJarjestys_avain {   /* Avaimen muodostuksessa käytettä tyyppi             */
	  char avainarvo[MERKKEJA];     /* Miten kukin kirjain muuttuu              */
	  void alusta();
	public:
	 cJarjestys_avain() { alusta(); )
	 char Avainarvo(char i) { return avainarvo[(unsigned int)i]; }
	};      
	
	static cJarjestys_avain JARJESTYS;

Taulukko alustettaisiin seuraavasti:

	void cJarjestys_avain::alusta() {
	 avainarvo[(unsigned char) ','] = 0x20;
	 avainarvo[(unsigned char) ' '] = 0x20;
	...
	 avainarvo[(unsigned char) 'A'] = 0x41;
	 avainarvo[(unsigned char) 'a'] = 0x41;
	 avainarvo[(unsigned char) 'B'] = 0x42;
	 avainarvo[(unsigned char) 'b'] = 0x42;
	...
	 avainarvo[(unsigned char) 'Ä'] = 0x5c;
	 avainarvo[(unsigned char) 'ä'] = 0x5c;
	... 
	}

Ehkä on kuitenkin helpompi käyttää muutamaa makroa:

	
	#define A_1 (mika,miksi) avainarvo[(unsigned char)mika] = miksi
	#define A_A (mi,mp,miksi) A_1(mi,miksi); A_1(mp,miksi)
	
	/****************************************************************************/
	void cJarjestys_avain::alusta() {
	{
	  int i;
	
	  for (i=0; i<MERKKEJA; i++) A_1(i,0x20); /* Kaikki tuntemat. merkit välil. */
	
	  A_1('0',0x30); A_1('1',0x31); A_1('2',0x32); A_1('3',0x33); A_1('4',0x34); 
	  A_1('5',0x35); A_1('6',0x36); A_1('7',0x37); A_1('8',0x38); A_1('9',0x39); 
	
	  A_A('A','a',0x41);  A_A('B','b',0x42);  A_A('C','c',0x43);  
	  A_A('D','d',0x44);  A_A('E','e',0x45);  A_A('F','f',0x46);
	  A_A('G','g',0x47);  A_A('H','h',0x48);  A_A('I','i',0x49);
	  A_A('J','j',0x4a);  A_A('K','k',0x4b);  A_A('L','l',0x4c);
	  A_A('M','m',0x4d);  A_A('N','n',0x4e);  A_A('O','o',0x4f);
	  A_A('P','p',0x50);  A_A('Q','q',0x51);  A_A('R','r',0x52);
	  A_A('S','s',0x53);  A_A('T','t',0x54);  A_A('U','u',0x55);
	  A_A('V','v',0x56);  A_A('W','w',0x57);  A_A('X','x',0x58);
	  A_A('Y','y',0x59);  A_A('Z','z',0x5a);
	  A_A('[sinvcircumflex]','',0x59);  
	  A_A('Å','å',0x5b);  A_A('Ä','ä',0x5c);  A_A('Ö','ö',0x5d);
	
	}
	#undef A_1
	#undef A_A

Avain muodostetaan nyt JARJESTYS.avainarvo - taulukkoa käyttäen. Kuitenkin erikoistapaukset kuten Mac ja Mc täytyisi käsitellä ensin erikseen vaikkapa Mc - > Mac.

Tehtävä 22.174 A_1 ja A_A

Kirjoita auki muutama makrojen A_1 ja A_A esiintymä.


Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys