Newsgroup: it.comp.lang.c
Titolo: Help! programma codifica

Salve a tutti.
Ho un problema. Dovrei scrivere un programma.
Non riesco però a trovare un modo compatto/conciso per scriverlo.
Vi riporto il testo:
------------------------------------
Tema d'esame (1 ora):
Il codice Soundex costituisce un metodo per codificare nomi.
Le regole di codifica sono le seguenti:
Gruppo0: A, E, I, O, U, H, W, Y
Gruppo1: B, F, P, V
Gruppo2: C, G, J, K, Q, S, X, Z
Gruppo3: D, T
Gruppo4: L
Gruppo5: M, N
Gruppo6: R
Si intende che ogni carattere di un gruppo si mappi
sull'intero che definisce il gruppo stesso.
Esempio: il nome "Pasquale" diventa in codice 10220040.
Il codice viene poi reso compatto eliminando le repliche di valori
consecutivi
e rimuovendo gli zeri.
Scrivere un programma che legga da input una parola e ne scriva su output
il codice "Soundex compattato".
--------------------------------------------
Un modo per risolvere il problema sarebbe ovviamente
quello di scrivere (tanti!) if, cioè if(parola[0]=='A' || 'E' || 'I' || 'U'
|| 'H'.......) printf("0");  e via dicendo.
Ma questo, mi rendo conto, è un modo assurdo di scrivere il programma.
Essendo alle prime armi, mi potreste dare qualche consiglio?
Grazie a chi vorra' farlo!
Ciao!
©Scaccomatto

 che definisce il gruppo stesso.
<code>
	#define INDEX(c) (c)-'A'
	char soundex[26]={
		/* A */ 0,
		/* B */ 1,
		...
		/* Z */ 2
	};
	char *string;	/* to be initialized */
	while(*string) {
 
		if((*string<'A')||(*string>'Z'))
			printf("Invalid character\n");
		else 
			printf("%d\n",soundex[INDEX(*string)]);
		string++;
	}
</code>
	Alla prossima,
		Marco

 Scusami, ma non ho capito a cosa serve questa definizione!
  E` una macro e serve a recuperare l'indice del carattere nella tabella
di lookup utilizzata per la traduzione. Le codifiche di caratteri (ASCII
ed EBCDIC) enumerano le lettere sequenzialmente ma, generalmente, non a
partire dall'offset zero. In questo modo hai un array di dimensioni
ridotte, invece di una non portabile mappatura di tutto l'insieme dei
caratteri.
	Alla prossima,
		Marco

</code>
Scusami, ma ho appena iniziato ad imparare il C  :-)

 Ho un problema. Dovrei scrivere un programma.
In che linguaggio?  Posta su UNO SOLO dei gruppi di C e
di C++, a seconda del linguaggio da usare; non e` corretto
postare su entrambi.  Il gruppo di programmazione per Win32
poi non c'entra proprio.
In C++ sara` molto facile, in C un po' meno, scegli tu
e posta sul solo gruppo adeguato.  Se sara` uno dei gruppi
che seguo, offriro` volentieri i relativi consigli.
Alex

 che seguo, offriro` volentieri i relativi consigli.
Il programma e' in C.
Grazie!

 Essendo alle prime armi, mi potreste dare qualche consiglio?
Potresti provare qualcosa del genere:
for (; *parola; parola++) {
	if (isalpha(*parola)) {
		switch (toupper(*parola)) {
		case 'A': /* eccetera */ case 'Y':
       			putchar('0'); break;
		case 'B': /* eccetera */ case 'V':
       			putchar('1'); break;
		case 'C': /* eccetera */ case 'Z':
        		putchar('2'); break;
		case 'D': case 'T':
        		putchar('3'); break;
		case 'L':
        		putchar('4'); break;
		case 'M': case 'N':
        		putchar('5'); break;
		case 'R':
			putchar('6'); break;
		default:
        		break;
		}
	} else {
		/* non è un carattere alfabetico */
	}
}
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Grazie!!
Hai risolto il mio problema.
Ciao
©Scaccomatto