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 20:20 (modification externe)