Calcul Serie alphanumerique

Petit nouveau ! | 5 Messages

15 nov. 2011, 23:56

bonjour,

j'ai besoin d'effectuer des opérations arithmétiques sur une série alphanumérique
je m'explique:
on me fournit un code de début et un code de fin
je dois déterminer combien ca fait de code entre codefin - codedebut

ex:
$a = "aa00";
$b = "ab01";
cela devrait donner
$b - $a = 101;

et comment vérifier si $b est supérieur a $a :?: :roll:

les codes que l'on me fournit sont de la forme 4 caracteres 4 chiffres de : aaaa0000 -> zzzz9999

merci

ViPHP
xTG
ViPHP | 7331 Messages

16 nov. 2011, 01:06

Ce sont des nombres hexadécimaux non ?
echo dechex(hexdec('aa') - hexdec('99'));
11
Et pour les tests de supériorité ou autre, tu passes aussi par le décimal et on en parle plus. ;)

Petit nouveau ! | 5 Messages

16 nov. 2011, 01:18

bonjour,

non ce ne sont pas des hexa
vu que cela va de A a Z l'hexa cela va jusque F

c'est une simple incrementation de AAAA0000 a ZZZZ9999

ViPHP
xTG
ViPHP | 7331 Messages

16 nov. 2011, 10:31

Dans ce cas il te faut te faire ta propre fonction de transfert vers le décimal pour remplacer les fonctions que j'ai utilisé.

Mammouth du PHP | 2278 Messages

16 nov. 2011, 22:38

here you are, avec les fonctions standard de PHP . J'ai la flegme de commenter, et je suppose que ça fonctionne dans le cas général
<?PHP
$a = "aa00";
$b = "ab01";
$a10= intval ( $a , 35 );
$b10= intval ( $b , 35 );
$c = $b10 -$a10;

$c35 = base_convert($c, 10, 35);
print "$a10 $b10 $c $c35";
?>
Ce que je n'ai pas testé, c'est si c'est sensible à la casse...
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

17 nov. 2011, 11:06

Bonjour,

Merci
cela fonctionne pour l'exemple
mais pas pour

$a = "AAAA0000";
$b = "AAAB0000";

//En fait la valeur ne correspond pas a une base 35 (enfin je pense)
//La partie lettre evolue de A - > Z (les 26 lettres de l'alphabet quel base :?: :roll: :?: base 26 :roll: )
//et la partie chiffre 0 -> 9 (base 10)
//donc pour obtenir $b il faudrait additionner $a + 10000

Dois je decouper en 2, les chiffres et les lettres ?

Merci

Mammouth du PHP | 2278 Messages

17 nov. 2011, 12:50

si tu utilises l'alphabet complet tu es en base 35 qui est la plus grande base que PHP sait gérer...
facile à vérifier
base 2 se sert de 0 et 1 où 35 se noterait : 100011
de droite à gauche
1: (2^0)*1
2 : (2^1)*1
0 : (2^2)*0
0: (2^3) *0
0 : (2^4)*0
32 : (2^5)*1
base 10 :35 se note 35
5 : (10^0)*5
3: (10^1)*3
base 16 :
10 se note 0A ou 0a, 15 OF et 16: 10
Il te faut six symboles de plus qu'en base 10, ou, si tu préfères, autant de symboles que le nombre de ta base
L'erreur doit venir de ma programmation. Il se trouve que mon texte trainait encore dans mon éditeur, et que je m'amusais à le modifier pour le généraliser:
/* 
* (c) Michel Barthélémy Billard Sirakawa 11/2011
* GPL
*function operations: do any operation between two numbers in any base from 2 to 35.
* parameters :
* mandatory
* $operateur : string: the operation to be done : *,/,+,*
* $operande_1 : string : first number
* $operande_2 string the secund number
* $base_1 integer: the base in which the first number is wtiten
* $resultat var in which the result is put
* optional
* $base_2 integer : the base in which the secund number is writen
* if no base_2 is given, $base_2 is assumed to be the same as $base_1
* $base_retour : integer : the base in which the result has to be writen; default = $base_1
* returns: THE BASE IN WHICH THE RESULT IS WRITEN

* exécute les quatre opérations entre deux nombres qui peuvent être de bases différentes entre 2 et .35 et retourne le résultat
* dans toute base entre 2 et 35

* parametres :
* obligatoires
* $operateur : string: opération à faire : *,/,+,*
* $operande_1 : string : premier nombre
* $operande_2 string : deuxième nombre
* $base_1 integer: base du premier nombre
* $resultat variable où le résultat est écrit
* optionnels
* $base_2 integer : base du deuxième nombre, non fournie, égale à $base_1

* $base_retour : integer : base du résultat, non fournie, égale à $base_1
* retourne : la  base dans laquelle le résultat est écrit.
*/
function operations ($operateur, $operande_1, $operande_2,  $base_1,  &$resultat, $base_2 = "", $base_retour =  "")
{
	$base_2 = ($base_2 == "")? $base_1: $base_2;
	$base_retour = ($base_retour == "") ? $base_1: $base_retour;
	$a = intval ($operande_1, $base_1);
	$b = intval ($operande_2, $base_2);
	$alerte = $base_retour;
	switch ($operateur)
	{
		case "*":
			$c = $a * $b;
			$resultat = base_convert ($c, 10, $base_retour);
		break;
		case "/":
			$resultat = floatval ($a) / floatval ($b);
			$alerte = 10;
		break;
		case "+":
			$c = $a + $b;
			$resultat = base_convert ($c, 10, $base_retour);
		break;
		case "-":
			$c = $a - $b;
			$resultat = base_convert ($c, 10, $base_retour);
		break;
	}
	return $alerte;
}	
$a = "aaaa0000";
$b = "aaab0000";
$c = ""; // impératif de déclarer la variable qui contiendra le résultat
$base_result = operations ("-",$b, $a, 35, $c);
print "$b - $a =  $c en base $base_result";
$base_result = operations("/", $a, $b, 35, $c, "",10);
print "<br>$b / $a =  $c en base $base_result";
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

17 nov. 2011, 14:40

Merci
si je comprends bien une base commence de 0 a quelquechose
mais le code que l'on me fournit les 4 premiers caracteres sont des lettres de A -> Z et les 4 suivants sont des chiffres de 0 -> 9
en fait si j'ai bien compris on m'envoie un numero de serie realise comme suite:
// il commence de cette valeur 'AAAA0000' et effectue une simple incrementation
// ce qui me donne 
$a = "AAAA0000";
$a++;
print $a; // AAAA0001

$a = "AAAA9999";
$a++;
print $a; // AAAB0000

$a = "AAAZ9999";
$a++;
print $a; // AABA0000
dans ce cas peut ton parler de base
vu que pour la premiere partie ca ne part pas de 0 (zero) vers Z mais de A vers Z

mon probleme c'est que je dois determine combien de produits ont ete traites
en ayant le premier numero de serie et le dernier
:?: :?:

Mammouth du PHP | 2278 Messages

18 nov. 2011, 20:59

Désolé, mais hier ce forum était inaccessible de chez moi.
Si tes valeurs sont des séries de huit caractères où chaque caractère peut être une lettre de A à Z ou un chiffre de 0 à 9, on peut parler de nombres en base 35; ça veut dire que :
"00000001" est possible aussi bien que "0000Z25T" ou "A33Z00B2"...
Si, comme je crois comprendre, les valeurs à traiter sont toujours composées de 4 lettres de A à Z suivies de 4 chiffres de 0 à 9; il s'agit d'un sous-ensemble des nombres exprimés en base 35 et la solution que je propose doit continuer à fonctionner.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 5 Messages

22 nov. 2011, 22:29

Bonsoir,

Desole j'etais en deplacement.

Merci je comprends bien mais si je teste
avec ton script
aaab0000 - aaaa0000 = 0 en base 35
aaab0000 - aaaa0000 = 0 en base 10

le resultat devrait etre 10000 en base 35

je ne comprends pas ou ca coince

Mammouth du PHP | 2278 Messages

23 nov. 2011, 10:47

la fonction que j'ai jointe fonctionne
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD