Fréquences d'apparition [Résolu]

Utilisation de Xcas

Modérateur : xcasadmin

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Fréquences d'apparition [Résolu]

Message par slejoly » mer. déc. 01, 2010 10:14 pm

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
Dernière modification par slejoly le jeu. déc. 02, 2010 8:56 am, modifié 1 fois.

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Re: Fréquences d'apparition

Message par slejoly » mer. déc. 01, 2010 11:38 pm

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)

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]);
 }:;
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 :

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]);
 }:;
ça ne marche plus du tout ?

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Fréquences d'apparition

Message par parisse » jeu. déc. 02, 2010 8:25 am

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

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]);
}:;
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);

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Re: Fréquences d'apparition

Message par slejoly » jeu. déc. 02, 2010 8:55 am

si je comprends bien L:=[],s,L1 veut dire L:=([],s,L1), je peux donc aussi déclarer L à la fin :

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]);
}:;
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 !

parisse
Messages : 5743
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Fréquences d'apparition [Résolu]

Message par parisse » jeu. déc. 02, 2010 8:59 am

le mac, j'espere plutot en recuperer un l'an prochain avec des credits de la fac, on verra...

slejoly
Messages : 194
Inscription : sam. oct. 14, 2006 10:17 am
Localisation : Lorient

Re: Fréquences d'apparition

Message par slejoly » jeu. déc. 02, 2010 3:19 pm

slejoly a écrit : je passe sous Windows !
Ha, ha, mais non, sous Linux ! ;)

Répondre