Outils pour utilisateurs

Outils du site


tpethindus2soluce

Ceci est une ancienne révision du document !


solucetest.cpp
#include "math.h"
#include "stdio.h"
#include <stdlib.h>
////////////////////////////////////////////////////////////////////////
char parseFloatField(char c, float * val, unsigned char * count, unsigned char * 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é
{
    if (c >= '0' && c <= '9')
    {
        (*val) *= 10;
        (*val) += c - '0';
        (*count) = (*count) + 1;
        return 0;
    }
    else if (c == '.')
    {
        (*count) = 0;
        (*dp_count) ++ ;
        return 0;
    }
    else if (c == ',')
    {
        if ( ((*count)==0) && ((*dp_count)==0))
        {
            (*val) = NAN;
            return 1;
        }
        while ((*count) > 0 && (*dp_count) > 0)  // équivalent à (*val) = (*val)/(10^*count)
        {
            (*val) = (*val) / 10;
            (*count) = (*count) - 1;
        }
        if((*dp_count) > 1)
            return -1 ;
        (*count) = 0 ;
        (*dp_count) = 0 ;
        return 1;
    }
    else     // caractère non supporté dans un nombre
    {
        (*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.1551799122.txt.gz · Dernière modification : 2019/03/05 16:18 de bvandepo