Outils pour utilisateurs

Outils du site


tpethindus2soluce
solucetest.cpp
#include "math.h"
#include "stdio.h"
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////
char parseFloatField(char c, float * ptr_val, unsigned char * ptr_count, unsigned char * ptr_dp_count) 
//La fonction renvoie 0 tant que le décodage n'est pas terminé
//                    1 lorsque le décodage est terminé correctement
//                   -1 lorsque le décodage a échoué
//val est mis à NAN si la chaine décodée est ","
{
if (c >= '0' && c <= '9') 
  {
  (*ptr_val) *= 10;
  (*ptr_val) += c - '0';
  (*ptr_count) = (*ptr_count) + 1;
  return 0;
  } 
else if (c == '.') 
  {
  (*ptr_count) = 0;
  (*ptr_dp_count) ++ ;
  return 0;
  } 
else if (c == ',') 
  {
   if ( ((*ptr_count) ==0) &&  ((*ptr_dp_count) ==0) )
    {
    (*ptr_val) =NAN; // faire un #include <math.h>
    return 1; //OK
    }
  while ((*ptr_count) > 0 && (*ptr_dp_count) > 0)  // équiptr_valent à (*ptr_val) = (*ptr_val)/(10^*count)
    {
    (*ptr_val) = (*ptr_val) / 10;
    (*ptr_count) = (*ptr_count) - 1;
    }
  if((*ptr_dp_count) > 1) 
    return -1 ;
  (*ptr_count) = 0 ;
  (*ptr_dp_count) = 0 ;
  return 1;
  } 
else     // caractère non supporté dans un nombre
  {
  (*ptr_count) = 0; 
  return -1;
  }
}
////////////////////////////////////////////////////////////////////////
struct jeuTestParseFloatField{
    char * chaine;
    float resAttendu;
    char retAttendu;
    float resObtenu;
    char retObtenu;
    bool ok;
};
////////////////////////////////////////////////////////////////////////
#define EPS 0.000001
#define NBTESTS 40
jeuTestParseFloatField test[NBTESTS];
char chaine1[10]="123.456,\0";
char chaine2[10]="789,\0";
char chaine3[10]=".45,\0";
char chaine4[10]=".,\0";
char chaine5[20]="123.456.789,\0";
char chaine6[10]="78a9,\0";
char chaine7[10]=",\0";
////////////////////////////////////////////////////////////////////////
 
void testParseFloatField(){
 
    test[0].chaine=chaine1;
    test[0].resAttendu=123.456;
    test[0].retAttendu=1;
 
    test[1].chaine=chaine2;
    test[1].resAttendu=789;
    test[1].retAttendu=1;
 
    test[2].chaine=chaine3;
    test[2].resAttendu=.45;
    test[2].retAttendu=1;
 
    test[3].chaine=chaine4;
    test[3].resAttendu=0;
    test[3].retAttendu=1;
 
    test[4].chaine=chaine5;
    test[4].retAttendu=-1;
 
    test[5].chaine=chaine6;
    test[5].retAttendu=-1;
 
    test[6].chaine=chaine7;
    test[6].resAttendu=NAN;
    test[6].retAttendu=1;
 
    //génération de valeurs aléatoires pour compléter le test
    for (int nn=7;nn<NBTESTS;nn++){
        test[nn].chaine=(char*)malloc(20);
        test[nn].retAttendu=1;
        test[nn].resAttendu=rand()%100000+(rand()%100000)/100000.;
        sprintf(test[nn].chaine,"%f,",test[nn].resAttendu);
    }
 
    for (int numtest=0;numtest<NBTESTS;numtest++){
        int numcar=0;
        char ret=0;
        unsigned char  count=0;
        unsigned char  dp_count=0;
        float val=0;
        while ( (test[numtest].chaine[numcar]!=0) && (ret==0)  ){
            ret=parseFloatField(test[numtest].chaine[numcar],&val, &count, &dp_count);
            numcar++;
        }
        test[numtest].resObtenu=val;
        test[numtest].retObtenu=ret;
        if ((test[numtest].retObtenu==-1 ) && (test[numtest].retAttendu==-1)) //le décodage échoue
            test[numtest].ok=true;
        else if ((test[numtest].retObtenu==1 ) && (test[numtest].retAttendu==1) //le décodage réussi
                 && (  (isnan(test[numtest].resObtenu) && isnan(test[numtest].resAttendu)) //les 2 sont à Nan (==NAN ne fonctionne pas)
                       || ( (fabs(test[numtest].resObtenu)< EPS )  && ( fabs(test[numtest].resAttendu)< EPS ) )//les 2 sont proches de 0
                       || ( (fabs((test[numtest].resObtenu - test[numtest].resAttendu )/test[numtest].resObtenu )<=EPS)  ) ) ) //les 2 sont proches à 10-7 près en relatif
            test[numtest].ok=true;
        else
            test[numtest].ok=false;
///affichage:
        if (test[numtest].ok==true)
            printf("OK: décodage de %s\n",test[numtest].chaine);
        else
            printf("NOK: décodage de %s\n",test[numtest].chaine);
 
    }
}
////////////////////////////////////////////////////////////////////////
int main(int argc, char *argv[])
{
    testParseFloatField();
}
tpethindus2soluce.txt · Dernière modification: 2021/02/19 21:20 (modification externe)

Outils de la page