// convertir.cpp Conversions et utilitaires // (auteur: R.Astier) // 1. conversion chaîne de caractères vers entier(int) // obtenir la valeur numérique // 2. conversion chaîne de caractères vers décimal(double) // obtenir la valeur numérique // 3. conversion d'un entier (long) vers une chaîne // obtenir la suite de caractères // 4. conversion d'un double vers une chaîne // obtenir la suite de caractères // 5. chiffres d'un entier positif // obtenir la suite des chiffres dans une base fournie // 6. suppression d'espaces non significatifs // 7 partie utile d'une chaîne de caractères // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + #include <iostream.h> #include <string.h> #include <ctype.h> #include <stdlib.h> // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // 1. Conversion chaîne de caractères vers entier(int) // --------------------------------------------------- // Renvoie vrai si cc représente un nombre entier (int) // (des espaces avant et après le nombre sont autorisés). // Exemples: // entiers(int): "8", "-8", " +123", "2147483647"(maximum) // non int : " ", "8-", " 12Z3", "2147483649"(dépassement) int estEntier(const char cc[], long &v) { const int BASE=10; int iFin; // délimite la partie utile char *pFin; // Trouver premier caractère espace en partant de la fin for(iFin=strlen(cc); iFin>0 && isspace(cc[iFin-1]); iFin--); // Les cas 1.chaine absente, 2.vide, 3.que des espaces: if(cc==NULL || cc[0]=='\0' || iFin==0) return 0; // Conversion, puis on teste que la conversion se fait jusqu'au bout des // caractères de la chaîne, puis que la capacité n'est pas dépassée v=strtol(cc,&pFin,BASE); int entier = (cc+iFin==pFin); if(entier) { double d=strtod(cc,NULL); entier = (v==d); // ? dépassement de capacité } return entier; } // 2. Conversion chaîne de caractères vers décimal(double) // ------------------------------------------------------- // Renvoie vrai si cc représente un nombre décimal (double) // (des espaces avant et après le nombre sont autorisés). // Exemples: // décimaux(double): "8", "-.8", " .8", ".8e4", " -.8e-5" // non décimaux : " ", "8-", " . 5", ".5 a ", ".5e 2" int estDecimal(const char cc[], double &v) { int iFin; // pour délimiter la partie utile char *pFin; // Trouver premier caractère espace en partant de la fin for(iFin=strlen(cc); iFin>0 && isspace(cc[iFin-1]); iFin--); // Les cas 1.chaine absente, 2.vide, 3.que des espaces: if(cc==NULL || cc[0]=='\0' || iFin==0) return 0; // Conversion, puis on teste que la conversion se fait jusqu'au bout des // caractères de la chaîne v=strtod(cc,&pFin); // conversion du langage (trop laxiste) int decimal = (cc+iFin==pFin); return decimal; } // 3. Conversion d'un entier vers une chaîne // ----------------------------------------- void chaine_c(long e, char cc[80]) { int posp, signe; char *pc=cc, *pchif=fcvt(e,0,&posp,&signe); if(signe==1) {*pc='-'; pc++; } strncpy(pc,pchif,posp); pc[posp]='\0'; strcat(pc+posp,pchif+posp); } // 4. Conversion d'un double vers une chaîne // ----------------------------------------- // ncav: nombre de chiffres après la virgule void chaine_c(double v, int ncav, char cc[80]) { const char SEPDECIMAL='.'; int posp, signe; char *pc=cc, *pchif=fcvt(v,ncav,&posp,&signe); if(signe==1) {*pc='-'; pc++; } if(posp<=0) {*pc='0'; pc++; } if(posp>=0) { strncpy(pc,pchif,posp); pc[posp]=SEPDECIMAL; pc[posp+1]='\0'; strcat(pc+posp+1,pchif+posp); } else { *pc=SEPDECIMAL; for(int i=1;i<=-posp; i++) pc[i]='0'; pc+=1-posp; *pc='\0'; strcat(pc,pchif); } } // 5. Chiffres d'un entier positif, dans une base fournie // ------------------------------------------------------ // Exemples: // nc=chiffres(17,tc) ==> nc=2, tc={1,7} // nc=chiffres(257,tc) ==> nc=3, tc={2,5,7} // nc=chiffres(17,tc,2) ==> nc=5, tc={1,0,0,0,1} // nc=chiffres(267,tc,16) ==> nc=3, tc={1,0,11} // Condition d'emploi: e>=0, base>1 int chiffres(int long e, int tc[32], int base=10) { int i,aux=e,nc=0; // nc=nombre de chiffres // Extraire les chiffres par divisions successives do { tc[nc]=e%base; nc++; e=e/base; } while(e>0); // Rétablir l'ordre naturel, par inversion du tableau for(i=0; 2*i<nc; i++) { aux=tc[nc-1-i]; tc[nc-1-i]=tc[i]; tc[i]=aux; } return nc; } // 6. Suppression d'espaces non significatifs // ------------------------------------------ // Modifie cc (chaine c) en éliminant les espaces en début et en fin // de chaîne // Condition: cc!=NULL void gererEspaces(char cc[]) { int i, jj; // Trouver premier caractère non espace for(i=0; cc[i]!='\0' && isspace(cc[i]); i++); // Déplacer; à la fin for(jj=0; cc[i]!='\0'; i++, jj++) cc[jj]=cc[i]; cc[jj]='\0'; // ignorer les espaces en fin de chaîne for(; jj>0 && isspace(cc[jj-1]); jj--); cc[jj]='\0'; } // 7. Partie utile d'une chaîne de caractères // ------------------------------------------ // Indices délimitant la partie utile d'une chaîne // ip = indice du premier caractère non espace // id = indice du premier espace qui termine // " abc " ip=1; id=4; // "a c " ip=0; id=3; // Condition: cc!=NULL void gererEspaces(const char cc[],int & ip, int & id ) { // Trouver indice du premier caractère non espace for(ip=0; cc[ip]!='\0' && isspace(cc[ip]); ip++); // Trouver indice du premier espace qui termine cc for(id=strlen(cc); id>ip && isspace(cc[id-1]); id--); } // - - - - - - - Q u e l q u e s u t i l i s a t i o n s - - - - - + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + int main( int nm, char *mots[]) { /* Test gererEspaces char cc[80],tc[80],*p; int id,ip; p="abcdef"; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"1 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<"puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; p=" abcdef"; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"2 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<" puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; p="abcdef "; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"3 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<" puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; p="a "; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"4 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<" puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; p=" "; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"5 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<" puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; p=""; strcpy(tc,p);strcpy(cc,p); gererEspaces(p,ip,id); gererEspaces(cc); cout<<"6 tc='"<<tc<<"'";cout.width(16-strlen(tc)); cout<<" puis '"<<cc<<"' ip="<<ip<<",id="<<id<<endl; cout<<endl; */ /* Test estEntier int entier, ee; char * pe;long v; pe="8 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="-8 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" -8 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" +8 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="12345 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="1234567890 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; // entier maximum; entier minimum pe="2147483647 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="-2147483648";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" - ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" - 8 ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" 8a ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" 8 a ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" 8- ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" 8 - ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe=" ";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="" ;ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; // plus grand que entier maximum; plus petit que entier minimum pe="2147483648 " ;ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; pe="-2147483649";ee=estEntier(pe,v);cout<<pe<<"' "<<ee<<" "<<v<<endl; cout<<endl; */ /* Test estDecimal double x; int ed; char * px; px="8 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px="8. ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px="8.123 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=".8 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" .8 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" .8e4 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8e+0 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8e-20 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=". ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=". 8 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" .8 e4 ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8e -20";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8e- 20";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" -.8e-20a";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; px=" ";ed=estDecimal(px,x);cout<<px<<"' "<<ed<<" : "<<x<<endl; cout<<endl; */ /* Test conversion entier -> chaîne (fonction chaine_c) int e; char ce[80]; e=0; chaine_c(e,ce); cout<<e<<" "<<ce<<endl; e=7; chaine_c(e,ce); cout<<e<<" "<<ce<<endl; e=2147483647; chaine_c(e,ce); cout<<e<<" "<<ce<<endl; e=-6; chaine_c(e,ce); cout<<e<<" "<<ce<<endl; e=-2147483648; chaine_c(e,ce); cout<<e<<" "<<ce<<endl; cout<<endl; */ /* Test conversion double -> chaîne (fonction chaine_c) double y; char cy[80]; cout.width(11);cout<<"numérique"<<" chaine"<<endl; y= 0.276543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= 2.76543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= 27.6543; chaine_c(y,7,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y=-0.276543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y=-2.76543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y=-27.6543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= 0.2876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= 0.02876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= 0.002876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= -0.2876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= -0.02876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= -0.002876543; chaine_c(y,5,cy); cout.width(11);cout<<y<<" "<<cy <<endl; y= -0.002876543; chaine_c(y,7,cy); cout.width(11);cout<<y<<" "<<cy <<endl; cout<<endl; */ // Les chiffres d'un nombre entier long ue; int iu, nu, tu[32]; ue=0; nu=chiffres(ue,tu); cout<<"\n"<<ue<<">10 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=01; nu=chiffres(ue,tu); cout<<"\n"<<ue<<">10 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=128; nu=chiffres(ue,tu); cout<<"\n"<<ue<<">10 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=1025; nu=chiffres(ue,tu); cout<<"\n"<<ue<<">10 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=16385; nu=chiffres(ue,tu); cout<<"\n"<<ue<<">10 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=0; nu=chiffres(ue,tu,2); cout<<"\n"<<ue<<">2 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=1; nu=chiffres(ue,tu,2); cout<<"\n"<<ue<<">2 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=126; nu=chiffres(ue,tu,2); cout<<"\n"<<ue<<">2 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=128; nu=chiffres(ue,tu,2); cout<<"\n"<<ue<<">2 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=267; nu=chiffres(ue,tu,16); cout<<"\n"<<ue<<">16 nu="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; ue=16385; nu=chiffres(ue,tu,16); cout<<"\n"<<ue<<">16 nc="<<nu<<" ";for(iu=0;iu<nu;iu++)cout<<tu[iu]<<'.'; cout<<endl<<endl; // // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + cout<<"\n> > > "; cin.getline( new char[80],80); return 0; } //fin convertir.cpp