Atoi() ??

cs_cRaw Messages postés 5 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 20 octobre 2004 - 20 oct. 2004 à 19:29
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 21 oct. 2004 à 18:33
Bonjour à tous !

J'aurai voullu savoir comment marche vraiment atoi()? (ya ptet des choses mieux, mais je voudrai savoir pour atoi )

On la eu en cours mais je vois pas comment faire, c'est un système de controle de saisie, et on a utilisé atoi... pouvez vous m'aider svp ?

On converti quoi en fait en entier et dans quel cas? merci bcp !

(en fait, j'ai mon programme masi ya ds erreurs de saisies possibles et qui font des boucles infinies...)


Code :

#include
#include

int base, i, j, classe, nbreenf, don_som; //decalaration
float total, txred1, txred2;
char Nom[15], don, reponse;

void main()
{
system("color 1F");

don_som=24; //somme du don au total
txred1=0.05; //taux de réduction si le nombre d'enfants est de 2
txred2=0.08; //taux de réduction si le nombre d'enfants est de 3 ou +
nbreenf=0;

//Titre et cadre centré//

for(i=1;i<=10;i++)
{
cout<<endl;
}
cout.width(21); //1er ligne
cout.fill(' ');
cout<<' ';
cout.width(41);
cout.fill('°');

cout<<endl;

cout.width(21); //2eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(39);
cout.fill(' ');
cout<<"°"<<endl;

cout.width(21); //3eme ligne
cout.fill(' ');
cout<<' ';
cout<<"° Calcul de frais scolaire par famille °"<<endl;

cout.width(21); //4eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(39);
cout.fill(' ');
cout<<"°"<<endl;

cout.width(21); //5eme ligne
cout.fill(' ');
cout<<' ';
cout.width(41);
cout.fill('°');
cout<<endl;

for(i=1;i<=10;i++)
{
cout<<endl;
}

system("pause"); //pause
system("cls");



// Vrai Debut
do //debut boucle autre famille
{
// TITRE //

cout.width(21); //1eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(39);
cout.fill('°');
cout<<"°"<<endl;

cout.width(21); //2eme ligne
cout.fill(' ');
cout<<' ';
cout<<"° Calcul de frais scolaire par famille °"<<endl;

cout.width(21); //3eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(39);
cout.fill('°');
cout<<"°"<<endl;

// FIN TITRE //

reponse='O';
//debut boucle
cout<<endl<<">> Quel est le nom de famille ?"<<endl;
cin>>Nom;

do
{
nbreenf=0;
cout<<endl<<">> Combien d'enfant(s) scolarise(s) avez vous ?"<<endl;
cin>>nbreenf;

if (nbreenf<1)
{
cout<<endl<<">> Le nombre d enfant est incorrecte, veuillez recommencer svp"<<endl;
}
} while (nbreenf<=0);

//fin boucle

if (nbreenf==1)
{
total=110;
cout<<endl<<">> Le prix est de "<<total<<" euros car vous n'avez qu'un enfant"<<endl;
}
else
{
if (nbreenf==2)
{
total=220-(220*txred1);
cout<<">> Le prix est de "<<total<<" euros car vous avez deux enfant, et avez donc 5% de remise"<<endl;
}
else
{
total=nbreenf*110-(nbreenf*txred2);
cout<<endl<<">> Le prix est de "<<total<<" euros car vous avez plus de deux enfant et avez donc une reduction de 8%"<<endl;
}
}

j=1;
do //deb1 - Boucle pour le choix de la classe en fonction du nombre d'enfant rentré
{

do //deb2 - Boucle pour le controle de chiffre
{
cout<<endl<<"Quel est la classe de votre enfant "<<j<<": "<<endl;
cout<<"1 - Petite, Moyenne ou Grande Section"<<endl;
cout<<"2 - CP, CE1"<<endl;
cout<<"3 - CE2, CM1, CM2"<<endl;
cin>>classe;

if ((classe!=1) && (classe!=2) && (classe!=3))
{
cout<<endl<<">> Le choix de la classe est incorrecte, veuillez recommencer svp."<<endl;
}



} while ((classe!=1) && (classe!=2) && (classe!=3)); //fin2 - Boucle pour le controle de chiffre

j=j++;

switch (classe) //Selon pour ajouté une taxe par rapport a la classe
{ //deb3
case 1 :
total = total + 30;
cout<<endl<<" >> Des frais concernant le materiel pedagogique sont a rajouter, qui sont de l'ordre de 10 euros par trimestre, soit 30 euros."<<endl<<endl;
break;
case 2 :
total = total + 45;
cout<<endl<<" >> Des frais sont a rajouter, qui sont de l'ordre de 15 euros par trimestre, soit 45 euros."<<endl<<endl;
break;
case 3 :
total = total + 60;
cout<<endl<<" >> Des frais sont a rajouter, qui sont de l'ordre de 20 euros par trimestre, soit 60 euros."<<endl<<endl;
break;
} //fin3

} while (j==nbreenf);//fin1 - Boucle pour le choix de la classe en fonction du nombre d'enfant rentré

while ((don!='O') && (don!='N')) //boucle pour le don
{
cout<<">> Voullez vous faire un don pour le soutien de l'ecole et d'autres familles plus defavorisees, de la somme de 8euros par trimestre, soit 24 euros ? (O/N)"<<endl;
cin>>don;

if ((don!='O') && (don!='N'))
{
cout<<endl<<">> Le choix est incorrecte, il doit se faire entre 'O' ou 'N' veuillez recommencer svp."<<endl<<endl;
}

if (don=='O')
{
total = total + don_som;
}
}

cout<<endl<<endl<<">> La somme totale due pour la famille "<<Nom<<" est de : "<<total<<"euros"<<endl<<endl;
system("pause");

cout<<endl<<endl<<" >> Voullez vous recommencer avec une autre famille ? (O/N)"<<endl;
cin>>reponse;

while ((reponse!='O') && (reponse!='N'))//boucle1 erreur reponse
{
if ((reponse!='O') && (reponse!='N'))
{
cout<<endl<<">> Le choix est incorrecte, il doit se faire entre 'O' ou 'N' veuillez recommencer svp."<<endl<<endl;
}

}//fin boucle1 erreur reponse

} while (reponse!='N');//fin boucle autre famille

cout.width(21); //1eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(30);
cout.fill('°');
cout<<"°"<<endl;

cout.width(21); //2eme ligne
cout.fill(' ');
cout<<' ';
cout<<"° Fin du programme de calculs °"<<endl;

cout.width(21); //3eme ligne
cout.fill(' ');
cout<<' ';
cout<<"°";
cout.width(30);
cout.fill('°');
cout<<"°"<<endl;
} //fin de programme




Merci bcp d'avance !!

18 réponses

SnOOpss Messages postés 571 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 5 décembre 2013
20 oct. 2004 à 20:18
Atoi permet de convertir un CHAR ( chaine de caractere) en INT ( nombre entier)

ex

#include <stdlib.h>

char* chaine;
int nombre;

chaine="48516";

nombre=atoi(chaine);

et la tu va avoir nombre = 48516
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 oct. 2004 à 20:32
oui ya mieux, std::stringstream
0
cs_cRaw Messages postés 5 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 20 octobre 2004
20 oct. 2004 à 21:55
Ok, merci ;)
Mais ma prof nous a dis qu'on pouvait faire un controle de saisie avec atoi... mais jvois pas trop trop comment... :-/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 oct. 2004 à 22:02
ta prof ta dis ca ?

c'est justement le probleme de atoi, ca renvoi 0 en cas d'erreur (comment savoir si erreur ou zero)

prefere les entrée formatée (sscanf, scanf, ... )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_cRaw Messages postés 5 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 20 octobre 2004
20 oct. 2004 à 22:10
hum.. bah jsutement, si ca renvoi 0, alors faudrai recommencé.. ca peu etre une idée d'un atoi pour le controle de saisie non?

Mais comment formuler ca? :-/
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 oct. 2004 à 22:17
ta pas compris

#include <stdio.h>
#include <stdlib.h>

int main()
{
char str[512];

puts( "Entrez un nombre :" );
fgets( str, sizeof str, stdin );

if( !atoi( str ) )
puts( "Ce n'est pas un nombre" );
}

>Entrez un nombre :
>0
>Ce n'est pas un nombre
0
cs_cRaw Messages postés 5 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 20 octobre 2004
20 oct. 2004 à 22:22
Hum.. ok jvois a peut pres... mais je comprend aps trop un autre truc sinon.. lol (oi je sais je sui chiant :p)

Si je mets dans mon exemple atoi(nbreenf) (ki correspond a un entier que j'aurai mis a une chaine de caractère...) il va aps pouvoir faire les opérations du calculs apres... si?

(merci encore pour votre aide! ;))
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
20 oct. 2004 à 22:26
atoi renvoi un int, tu peux l'utiliser dans une expression dite "condensée" et l'entier sera retourné dans une copie temporaire

n = 5 + atoi(nbreenf);
0
cs_cRaw Messages postés 5 Date d'inscription jeudi 16 septembre 2004 Statut Membre Dernière intervention 20 octobre 2004
20 oct. 2004 à 22:36
Ok, merci :)
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
21 oct. 2004 à 09:15
system("color 1F");

ça change les couleurs en mode console ça?

sinon, proprement pr ton pb, j'aurai dit:

#include <stdio.h>
#include <stdlib.h>

int main()
{
char str[512];
do{
puts( "Entrez un nombre non nul:" );
fgets( str, sizeof str, stdin );
}
while( !atoi( str ) ) ;
...
}

Magic Nono: l'informagicien! 8-)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 oct. 2004 à 09:37
oui, celle la elle est pas mal, mais dans la vrai vie on fais

#include <stdio.h>
#include <stdlib.h>

int main()
{
char str[512];
int n;

do{
puts( "Entrez un nombre :" );
fgets( str, sizeof str, stdin );
}
while( sscanf( str, "%d", &n ) != 1 ) ;
...
}
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
21 oct. 2004 à 10:52
tout à fait

atoi disais le sujet

Rq: 512, c'est pas un poil surdimentionné?

Magic Nono: l'informagicien! 8-)
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 oct. 2004 à 11:43
on va pas se battre pour une poignée d'octets alors qu'on a des centaines de mega de plages adressables par processus :)

512 c'est bon, de meme pour un path tu mets MAX_PATH (meme si c'est pour "/" )
0
cs_hussein Messages postés 8 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 6 novembre 2004
21 oct. 2004 à 16:14
desole pour le retard mais ca peut servir?
j ai a peu pres le meme tp
#include <stdlib.h>
#include
int main()
{
char a_char[10];
cin>>a_char;
cout<<"As an integer: "<<atoi(a_char);
return 0;
}
0
cs_hussein Messages postés 8 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 6 novembre 2004
21 oct. 2004 à 16:14
desole pour le retard mais ca peut servir?
j ai a peu pres le meme tp
#include <stdlib.h>
#include
int main()
{
char a_char[10];
cin>>a_char;
cout<<"As an integer: "<<atoi(a_char);
return 0;
}
0
cs_hussein Messages postés 8 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 6 novembre 2004
21 oct. 2004 à 16:14
desole pour le retard mais ca peut servir?
j ai a peu pres le meme tp
#include <stdlib.h>
#include
int main()
{
char a_char[10];
cin>>a_char;
cout<<"As an integer: "<<atoi(a_char);
return 0;
}
0
cs_hussein Messages postés 8 Date d'inscription jeudi 21 octobre 2004 Statut Membre Dernière intervention 6 novembre 2004
21 oct. 2004 à 16:21
desole pour le retard mais ca peut servir?
j ai a peu pres le meme tp

#include <stdlib.h>
#include
int main()
{
char a_char[10];
cin>>a_char;
cout<<"As an integer: "<<atoi(a_char);
return 0;
}
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
21 oct. 2004 à 18:33
hussein > le fin mot de ce topic, c'est que atoi c'est pourri pour la gestion d'erreur

si en c on fais ca avec sscanf, en c++ c'est l'equivalent avec un std::istringstream

#include
#include <sstream>
#include <string>

int main()
{
int n;

do
{
std::cout << "Entrez un nombre :\n";

std::string str;
std::getline( std::cin, str );

std::istringstream iss( str );
if( iss >> n ) break;

} while( 1 );
}
0
Rejoignez-nous