Newsgroup: it.comp.lang.c++
Titolo: Problema con gli array!

Salve ragazzi/e!
Avrei un problema  nel creare un applicazione che data una parola di n
lettere come input, mi dia in output un insieme di n numeri associati
all'insieme delle lettere dell'alfabeto!
Mi spiego meglio, ad ogni lettera dell'alfabeto č associato un numero (ke
poi sarebbe l'indirizzo dell'array alfabeto!)
es a=1 b=2 c=3 ... e cosě via.
se ioi provo a scrivere la parola "ace" come output finale dovrei avere la
serie di numeri 0 2 4 !
Il mio problema č che quando provo a scrivere parole del tipo abcd, invece
di restituire 0123 , il prog mi restituisce 0012, insomma le prime due
lettere dell'alfabeto hanno lo stesso indirizzo e la cosa mi sembra
abbastanza strana!
cmq qui sotto ho riportato il mini programma:
#include <iostream>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main() {
 const char alfabeto[]="abcdefghijklmnopqrstuvwxyz";
 char parola[100]={0};
 char output[100]={0};
 int cod[100]={0};
 int chaive=0;
cout<<"Inserisci la parola da criptare:\n";
cin>>parola;
for(int i=0;parola[i]!='\0';i++){
for(int j=0;parola[i]!=alfabeto[j];j++)
 cod[i]=j;
}
for(int j=0;j<i;j++)
 cout<<cod[j]<<" ";
 return 0;
}
Aiutatemi!grazie!

 cin>>parola;
Cicla in questo modo:
for(int i = 0; parola[i] != '\0'; i++) {
   printf("%d", alfabeto[i] - 97);
--------------------------------
Inviato via 
http://usenet.libero.it

 }
io ti consiglio di riscrivere il programma da capo... poi, se ti va bene
fatto in questo modo,
allora devi mettere un ' ; ' subito dopo il secondo for e magari usa una
indentazione migliore!
for(int i=0;parola[i]!='\0';i++){
     for(int j=0;parola[i]!=alfabeto[j];j++)
          ;
     cod[i]=j;
}
In questo modo dovrebbe funzionare.
Se non ti piace il ' ; ' messo cosi' allora puoi usare { } al posto del ;
L'importante e non fare:
for(int j=0;parola[i]!=alfabeto[j];j++);
altrimenti non e' chiaro quello che succede.
quindi una alternativa e':
for(int j=0;parola[i]!=alfabeto[j];j++){
     // nulla
}
ma a me non dispiace il ; messo cosi', intendato come fosse una istruzione.
Ad ogni modo e' questione di stile ;-)
Tommy

Scusa, ma nella fretta di scappare a ca ;-))) ho dimenticato aggiungere un
pezzo, e siccome faccio prima a postarlo anzicchč spiegartelo, ecco il
codice funzionante:
int main() {
	 const char alfabeto[]="abcdefghijklmnopqrstuvwxyz";
	 char parola[100]={0};
	 char output[100]={0};
	 int cod[100]={0};
	 int chaive=0;
	printf("Inserisci la parola da criptare:\n");
	scanf("%s", parola);
	for (int j = 0; j < strlen(alfabeto); j++)
		if (alfabeto[j] == parola[0])
			break;
	printf("\nParola: '%s'\n", parola);
	for(int i = 0;parola[i] != '\0'; i++) {
	   printf("%d ", alfabeto[i] - 97 + j);
	}
	 getchar();
	 getchar();
	 return (0);
	}
ciao


    printf("%d", alfabeto[i] - 97);
Cosi' non funziona!
al limite cosi':
for(int i = 0; parola[i] != '\0'; i++) {
     printf("%d ", parola[i] - 'a');
}
Poi al usa - 'a' e non -97.
Pero' il punto non era questo credo.... credo il tuo codice non soffisfi le
esigenze....
Il punto di avere:
const char alfabeto[]="abcdefghijklmnopqrstuvwxyz";
e' che se un domani lo cambi in:
const char alfabeto[]="vwxyzhijklcmadbefgnopqrstu";
la chiave per "criptare" cambia....
ed i numeri prodotti dalla stessa parola cambiano.
Ad esempio con "abcdefghijklmnopqrstuvwxyz" la parola "tommaso" produce:
19 14 12 12 0 18 14 (e questo il tuo metodo lo fa....)
con "vwxyzhijklcmadbefgnopqrstu" la stessa parola deve produrre:
24 19 11 11 12 23 19
(e questo il tuo metodo non lo fa).
se tu fai parola[i]-97 non hai modo di definirti un tuo "alfabeto" cioe' un
tuo codice per criptare, verra' sempre la stessa cosa...
Credo lo scopo dell'esercizio fosse questo. Il codice di Eagle, una volta
messo quel ; "dovrebbe" funzionare. Certo non e' scritto molto bene...
Tommy

 }
Questo codice non funziona....
A cosa serve? Davvero non capisco cosa vuoi fare...
Ad ogni modo e' errato, non produce quello che Eagle voleva...
Tommy

for(int j=0;j<i;j++)
   Problema 2: questo non va bene, perche` qui `i' e` fuori dalla sua
area di visibilita`. Probabilmente sul tuo compilatore funziona, ma
non e` portabile.
-- 
S.L.

}
   E` sempre brutto, pero` e fa assunzioni sul set di caratteri...
   Allora meglio (?):
   `printf("%d", strchr(alfabeto, parola[i]) - alfabeto);'
-- 
S.L.

 strchr(alfabeto, parola[i]) - alfabeto)
qua stai usando 'alfabeto', ma non credo tu abbia compreso il problema...
questo era quello che volevo dire nel mio msg precedente, non proporre
nessun codice....
volevo solo dire che AlterX era fuori strada con quel tipo di codice.
Tommy


certo che funziona!! l'ho provato ieri e va...
in ogni caso lui voleva una crittazione a partire dall'alfabeto, non da
caratteri a caso!


Non sarà il massimo del funzionamento, ma comunque è un buon passo per
iniziare


 caratteri a caso!
Credo l'OP volesse questo:
Ad esempio con "abcdefghijklmnopqrstuvwxyz" la parola "tommaso" produce:
19 14 12 12 0 18 14
con "vwxyzhijklcmadbefgnopqrstu" la stessa parola deve produrre:
24 19 11 11 12 23 19
mi pare proprio che il tuo programma non lo faccia, tutto qui....
(il suo che ha postato all'inizio lo fa, ma mancava un ; )
Tommy

Okkey sorry!
ho letto in modo troppo superficiale.


volevo solo dire che AlterX era fuori strada con quel tipo di codice.
   Boh? L'avevo capito invece, piu` che altro mi "accodavo" a te.
   E` che di solito non mi piacciono "- 'a'", "- '0'" e tutte quelle
operazioni che fanno assunzioni sul set di caratteri (anche se ormai
e` un atteggiamento anacronistico).
-- 
S.L.

 e` un atteggiamento anacronistico).
Su questo concordo con te (anche se devo ammettere che la tua soluzione era
piu' pesante in termini prestazionali).
Non bisognerebbe fare nessuna "assunzione" sul set di caratteri, anche se di
fatto non credo che attualmente e' quasi impossibile trovarne uno in cui le
lettere minuscole non siano piu' in ordine alfabetico, ma soprattuto, visto
che lo citi, in cui i caratteri dei numeri '0'-'9' non siano in ordine come
nel set ASCII.
Ad ogni modo concordo con te.
Non bisognerebbe mai affidarsi ad un character-set in particolare.
Tommy

 piu' pesante in termini prestazionali).
Questo era riferito al tuo frammento di codice come modifica del codice di
AlterX.
Riferito invece come possibile soluzione per l'OP e' una soluzione breve ed
elante e che funziona, anche se in stile C.
Tommy

Non bisognerebbe mai affidarsi ad un character-set in particolare.
   Insomma, a me non piace, anche se e` difficile che non sia
portabile oggigiorno. E` piu` una questione di gusto (o di paranoia?).
-- 
S.L.

 pezzo, e siccome faccio prima a postarlo anzicchè spiegartelo, ecco il


Lo sò che funziona in modo limitato...ma non c'è limite alle tecniche di
criptazione!
E' comunque un codice da cui iniziare a lavorare per migliorarlo come vuoi
tu.
Ciao


Non sarebbe meglio una cosa di questo genere?
(Naturalmente e' possibile sost il metodo di codifica)
<CODE>
#include <iostream>
using namespace std;
int main() {
	const int chiave_per_minusc[26] = { 12, 345, 45, ecc. };
	char parola[100];
	int parola_cod[100];
	cout<<"Inserisci la parola da criptare:\n";
	cin>>parola;
	for(int i=0; parola[i]; i++)
		parola_cod[i] = chiave_per_minusc[ parola[i]- 'a'];
	for(int j=0;j<i;j++)
		cout << parola_cod[j] << " ";
	return 0;
}
</CODE>
-- 
Ciao,
Andrea (uno dei tanti)

		parola_cod[i] = chiave_per_minusc[ parola[i]- 'a'];
	for(int i=0; parola[i]; i++)
		cout << parola_cod[i] << " ";
