tarek_dotzero
Messages postés817Date d'inscriptionjeudi 19 juillet 2007StatutMembreDernière intervention12 avril 2022 26 janv. 2017 à 02:01
Bonjour,
Merci pour les remarques, surtout concernant la puissance.
Je veux juste clarifier un ou deux point.
Premièrement, il est évident que tout est en binaire, mais un appel l'affichage simple à l'écran (sans formatter) est en décimal.
Deuxièmement, j'ai aimé garder les 16 symboles, tout comme présenté dans les cours sur les systèmes de numération, et éviter de faire des conversion int-char ou bien de faire des calculs arithmétique sur les char.
KX
Messages postés16733Date d'inscriptionsamedi 31 mai 2008StatutModérateurDernière intervention31 janvier 2024127 Modifié par KX le 7/01/2017 à 10:24
Bonjour,
Beaucoup de chose à revoir dans ton code, "destiné au débutant" selon toi, mais surtout, fait par un débutant...
Tout d'abord, c'est bizarre de dire que tu convertis ton nombre en décimal, alors que tu renvoies un int, qui est en binaire.
Fondamentalement ce que tu calcules, ce n'est ni du décimal, ni du binaire, c'est juste la valeur du nombre (sans notion de base), la seule notion de base est dans l'entrée, pas dans la sortie.
Sinon je trouve ta boucle while particulièrement inefficace. Tu itères sur chaque valeur du tableau (jusqu'à 16 fois) alors que l'on pourrait calculer cette valeur à l'aide la conversion int-char des caractères.
Enfin, ton calcul de puissance est inutile, tu peux faire ton calcul différemment.
Si tu as '2345' ce que tu fais c'est calculer d'abord 345 et tu rajoutes 2*10^3
Or en lisant tes caractères dans l'ordre, tu pourrais avoir calculé 234 et multiplier par 10 et ajouter 5, tu n'as donc plus besoin de ta puissance.
Remarque : tu travailles sur des int, dont la taille est limitée, il serait donc intéressant de vérifier que ton calcul est correct.
public static int parse(String nbr, int base) {
if (nbr == null || nbr.isEmpty())
throw new IllegalArgumentException("Le String est vide");
if (base < 0 || base > 36)
throw new IllegalArgumentException("La base est incorrecte : " + base);
int resultat = 0;
for (int i = 0, n = nbr.length(); i != n; i++) {
char c = nbr.charAt(i);
int position;
if (c < '0' || c > 'Z') {
throw new NumberFormatException("caractère incorrect : " + i);
} else if (c <= '9') { // entre '0' et '9' inclus
position = c - '0';
} else if (c < 'A') { // entre '9' et 'A' exclus
throw new NumberFormatException("caractère incorrect : " + i);
} else { // entre 'A' et 'Z' inclus
position = 10 + c - 'A';
}
if (position >= base)
throw new NumberFormatException("caractère incorrect : " + i);
int precedent = resultat;
resultat = base * resultat + position;
if (resultat / base != precedent)
throw new ArithmeticException("la valeur est trop grande pour être un int");
}
return resultat;
}
Remarque : avec ce code tu peux aller jusqu'à la base 36 puisque tu peux utiliser tout l'alphabet.
26 janv. 2017 à 02:01
Merci pour les remarques, surtout concernant la puissance.
Je veux juste clarifier un ou deux point.
Premièrement, il est évident que tout est en binaire, mais un appel l'affichage simple à l'écran (sans formatter) est en décimal.
Deuxièmement, j'ai aimé garder les 16 symboles, tout comme présenté dans les cours sur les systèmes de numération, et éviter de faire des conversion int-char ou bien de faire des calculs arithmétique sur les char.
Modifié par KX le 7/01/2017 à 10:24
Beaucoup de chose à revoir dans ton code, "destiné au débutant" selon toi, mais surtout, fait par un débutant...
Tout d'abord, c'est bizarre de dire que tu convertis ton nombre en décimal, alors que tu renvoies un int, qui est en binaire.
Fondamentalement ce que tu calcules, ce n'est ni du décimal, ni du binaire, c'est juste la valeur du nombre (sans notion de base), la seule notion de base est dans l'entrée, pas dans la sortie.
Sinon je trouve ta boucle while particulièrement inefficace. Tu itères sur chaque valeur du tableau (jusqu'à 16 fois) alors que l'on pourrait calculer cette valeur à l'aide la conversion int-char des caractères.
Enfin, ton calcul de puissance est inutile, tu peux faire ton calcul différemment.
Si tu as '2345' ce que tu fais c'est calculer d'abord 345 et tu rajoutes 2*10^3
Or en lisant tes caractères dans l'ordre, tu pourrais avoir calculé 234 et multiplier par 10 et ajouter 5, tu n'as donc plus besoin de ta puissance.
Remarque : tu travailles sur des int, dont la taille est limitée, il serait donc intéressant de vérifier que ton calcul est correct.
Remarque : avec ce code tu peux aller jusqu'à la base 36 puisque tu peux utiliser tout l'alphabet.