Bonsoir,
une question concernant les chaînes et les listes (qui a peut être sa réponse dans le manuel mais je ne trouve pas) :
n'y a t'il que le passage par la liste des codes ASCII (asc()) pour transformer une chaîne de caractères en la liste de ses caractères ?
L'idée est de compter les fréquences d'apparition des lettres dans une chaîne de caractères
Stéphane Lejoly
Fréquences d'apparition [Résolu]
Modérateur : xcasadmin
Fréquences d'apparition [Résolu]
Dernière modification par slejoly le jeu. déc. 02, 2010 8:56 am, modifié 1 fois.
Re: Fréquences d'apparition
J'en rajoute une couche, j'ai :
alphabet:="abcdefghijklmnopkrstuvwxyz"
la liste des codes ASCII:
alphabetASCII:=asc(alphabet)
la liste des lettres :
ListAlphabet:=makelist(x->char(x),97,122)
me donne bien les lettres avec leurs nombres d'apparitions, mais en voulant rajouter une ligne à la matrice précédente, pour faire apparaître leurs fréquences d'apparitions :
ça ne marche plus du tout ?
alphabet:="abcdefghijklmnopkrstuvwxyz"
la liste des codes ASCII:
alphabetASCII:=asc(alphabet)
la liste des lettres :
ListAlphabet:=makelist(x->char(x),97,122)
Code : Tout sélectionner
compteCaractere(chaine):={
local j, s, chaineASCII,L:=[],s,L1;
chaineASCII:=asc(chaine);
pour j de 0 jusque 25 faire
L:=append(L,count_eq(alphabetASCII[j], chaineASCII));
fpour;
return([ListAlphabet,L]);
}:;
Code : Tout sélectionner
compteCaractere(chaine):={
local j, s, chaineASCII,L:=[],s,L1;
chaineASCII:=asc(chaine);
pour j de 0 jusque 25 faire
L:=append(L,count_eq(alphabetASCII[j], chaineASCII));
fpour;
s:=sum(L);
L1:=apply(x->x/s,L);
return([ListAlphabet,L,L1]);
}:;
Re: Fréquences d'apparition
C'est a cause de la declaration/initialisation de L. En effet, la priorite respective de := et de , fait que local j, s, chaineASCII,L:=[],s,L1; est interprete comme
local j, s, chaineASCII,(L:=[],s,L1);
et non comme local j, s, chaineASCII,(L:=[]),s,L1;
Solution, soit on ajoute les parentheses, soit on met plusieurs local a la suite
ca a alors l'air de marcher.
Sinon sur la question initiale, on peut recuperer les caracteres d'une chaine avec seq:
seq(chaine[j],j,0,dim(chaine)-1);
local j, s, chaineASCII,(L:=[],s,L1);
et non comme local j, s, chaineASCII,(L:=[]),s,L1;
Solution, soit on ajoute les parentheses, soit on met plusieurs local a la suite
Code : Tout sélectionner
compteCaractere(chaine):={
local j, s, chaineASCII,L1;
local L:=[];
chaineASCII:=asc(chaine);
pour j de 0 jusque 25 faire
L:=append(L,count_eq(alphabetASCII[j], chaineASCII));
fpour;
s:=sum(L);
L1:=apply(x->x/s,L);
return([ListAlphabet,L,L1]);
}:;
Sinon sur la question initiale, on peut recuperer les caracteres d'une chaine avec seq:
seq(chaine[j],j,0,dim(chaine)-1);
Re: Fréquences d'apparition
si je comprends bien L:=[],s,L1 veut dire L:=([],s,L1), je peux donc aussi déclarer L à la fin :
Très bien.
Et pour seq c'est ce que je voulais !
Merci.
P.S. J'ai laissé, pour l'instant, de coté la compilation d'Xcas sur MacOS (pas assez de temps et sûrement pas le niveau...), si vous récupérez un Mac pour Noël je vous laisserais faire, sinon, je revends tous mes ordi. et je passe sous Windows !
Code : Tout sélectionner
compteCaractere(chaine):={
local j, s, chaineASCII,s,L1,L:=[];
chaineASCII:=asc(chaine);
pour j de 0 jusque 25 faire
L:=append(L,count_eq(alphabetASCII[j], chaineASCII));
fpour;
s:=sum(L);
L1:=apply(x->x/s,L);
return([ListAlphabet,L,L1]);
}:;
Et pour seq c'est ce que je voulais !
Merci.
P.S. J'ai laissé, pour l'instant, de coté la compilation d'Xcas sur MacOS (pas assez de temps et sûrement pas le niveau...), si vous récupérez un Mac pour Noël je vous laisserais faire, sinon, je revends tous mes ordi. et je passe sous Windows !
Re: Fréquences d'apparition [Résolu]
le mac, j'espere plutot en recuperer un l'an prochain avec des credits de la fac, on verra...
Re: Fréquences d'apparition
Ha, ha, mais non, sous Linux !slejoly a écrit : je passe sous Windows !