Idée de concours : Optimisation de code

Proposition de cahier des charges:

écrire la fonction bool extraireNombres(const char * entree, int16_t * tableauEntiers, size_t& nbEntiers, float * tableauDecimaux, size_t& nbDecimaux, const char separateurDecimal) qui analyse la c-string (tableau de caractères terminée par un caractère NULL '\0') entree pour extraire et ranger dans les tableaux tableauEntiers et tableauDecimaux respectivement les nombres entiers et décimaux acceptables trouvés lors de l'analyse. Le nombre d'éléments trouvés sera à reporter respectivement dans nbEntiers et nbDecimaux.

On a le droit d'utiliser les fonctions c standard de stdlib.h ou string.h lors de l'analyse.

la c-string entree ne peut pas contenir plus de 10 nombres au total.

Les entiers acceptables sont les short aussi connus sous le type formel int16_t, donc entre -32768 to 32767, représentés en ASCII et base 10. Un seul signe - en début de séquence de chiffres est traité (par exemple aaa--[color=green]-12[/color]bbb sera reconnu comme [color=green]-12[/color]). Le caractère + dénote un entier positif (qui est le défaut), de même un seul plus en début de nombre. Si l'entier reconnu est en dehors des bornes autorisées alors l'intégralité de la séquence numérique est consommée par l'analyseur, la fonction reportera une erreur ERANGE dans errno pour et retournera le plus petit ou plus grand nombre représentable en fonction du sens de dépassement (par exemple si l'entier est -32769 alors on stocke dans le tableau -32768 et on met le errno sur ERANGE. Si la chaine est aaaaa[color=green]-3276900000000000000[/color]bbbb l'intégralité de la séquence -3276900000000000000 est consommée par l'analyseur et on continue à lire à partir du b). on peut avoir autant de 0 en début de nombre que l'on veut. 0000001 sera reconnu comme 1.

Les nombre décimaux sont les float en Single Precision sur 32 bits, donc entre -3.4e38 .. 3.4e38. la représentation autorisée est proche de celle que l'on a prise pour les entiers, pas de notation scientifique. Un nombre décimal contient donc un entier, suivi obligatoirement d'un seul symbole séparateur entre la partie entière et la partie décimale suivi d'un autre entier qui comportera au moins 1 chiffre valide. Par exemple aaa25,bbb ne sera pas reconnu comme un nombre décimal et donner juste un entier 25. mais aaa25,0bbb reconnaitra le nombre décimal 25,0

Le séparateur separateurDecimal est optionnel dans l'appel de la fonction. Il dénote quel symbole (de type char) est utilisé pour représenter un nombre décimal (les anglo-saxons et la programmation utilisent le point '.' mais en France on utilise la virgule ',' - d'autres symboles non numérique sont acceptables. Un chiffre passé comme séparateur devra faire que la fonction retourne immédiatement en revoyant false.)

Par défaut la fonction prendra la virgule française comme séparateur s'il n'est pas précisé lors de l'appel.

la fonction retourne true si elle a pu s'exécuter correctement, false si une incompatibilité a été détectée (y compris de représentation de nombre).

Donc par exemple -az---a//+[color=green]0123.45[/color]-----azlkkma[color=green]678,900[/color]blabla doit identifier comme entiers 123 et 45 et comme décimal 678,900 si le separateurDecimal n'est pas précisé (on prend alors la ',') mais si on précise que c'est '.' alors il faudra extraire en décimal 123.45 et en entiers 678 ainsi que 900

Critères d'évaluation dans l'ordre d'importance:

  • résultat correct
  • respect du cahier des charges
  • vitesse d'exécution de la fonction telle que calculé avec un appel à micros() avant la fonction et en sortie de fonction (avec interdiction de toucher aux interruptions ni au timer contrôlant micros())
  • impact sur l'utilisation de la mémoire (nombre d'octets nécessaires au bon déroulement de la fonction en dehors des paramètres).

tapé un peu vite, des avis ?