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 de 127.0.0.1