Voilà je continue les exercices de mon bouquin de C.
J'en suis au chapitre concernant les structures et ils demandent de créer
une structure contenant le temps et la date. (Puis de calculer l'espace
entre deux temps en minutes).
Ma question est :
Est-il mieux de demander à l'utilisateur de rentrer la date comme ceci :
- mm/jj/aaaa
Puis de prendre les valeurs mm et jj, avec un srtoi (C99) ou un strtod
(Ansi) quit à caster en int après, et de les vérifier. Ou
- mm jj aaaa
Puis de prendre après les valeurs à l'aide d'un sscanf(input,"%d %d %d",
...) pour les vérifier après.
Et pour le temps vous avez une idée ?
J'ai pensé que la méthode 88:88 serait pas mal mais si vous avez une autre
idée ;).
C'est pour avoir une gestion d'erreur, or comme je ne peux renvoyer qu'une structure, j'ai mis la gestion d'erreur dans la structure, maintenant, y'a peut être un autre moyen, mais je ne vois pas lequel.
Souvent, les fonctions ont un pointeur en argument qui permet de remplir une structure : ce sont les valeurs de retour de la fonction. Par ailleurs, la fonction renvoie un int dont la valeur indique le déroulement de l'opération :
c'est comme cela que fonctionnent beaucoup de fonctions de la biliothèque standard.
Oui.
et non.
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux types de fonctions dans mon code. Les fonctions de creations d'objets, d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet nouvellement cree, et les autres, qui le cas echeant modifient les objets passes en argument, et renvoient un code d'erreur. Dans cette optique, ta fonction d'exemple, je la place plutot dans ma premiere categorie:
... et la, je voulais ajouter un exemple de fonction qui modifierait un complexe et renverrait un code d'erreur, et j'ai rien trouve :-(
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime bien la convention du "retourner NULL si la creation de l'objet echoue". -- Bertrand Mollinier Toublet Currently looking for employment in the San Francisco Bay Area http://www.bmt.dnsalias.org/employment
AG wrote:
C'est pour avoir une gestion d'erreur, or comme je ne peux renvoyer
qu'une
structure, j'ai mis la gestion d'erreur dans la structure, maintenant,
y'a
peut être un autre moyen, mais je ne vois pas lequel.
Souvent, les fonctions ont un pointeur en argument qui permet de remplir
une structure : ce sont les valeurs de retour de la fonction.
Par ailleurs, la fonction renvoie un int dont la valeur indique le
déroulement de l'opération :
c'est comme cela que fonctionnent beaucoup de fonctions de la
biliothèque standard.
Oui.
et non.
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux
types de fonctions dans mon code. Les fonctions de creations d'objets,
d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet
nouvellement cree, et les autres, qui le cas echeant modifient les
objets passes en argument, et renvoient un code d'erreur. Dans cette
optique, ta fonction d'exemple, je la place plutot dans ma premiere
categorie:
... et la, je voulais ajouter un exemple de fonction qui modifierait un
complexe et renverrait un code d'erreur, et j'ai rien trouve :-(
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime
bien la convention du "retourner NULL si la creation de l'objet echoue".
--
Bertrand Mollinier Toublet
Currently looking for employment in the San Francisco Bay Area
http://www.bmt.dnsalias.org/employment
C'est pour avoir une gestion d'erreur, or comme je ne peux renvoyer qu'une structure, j'ai mis la gestion d'erreur dans la structure, maintenant, y'a peut être un autre moyen, mais je ne vois pas lequel.
Souvent, les fonctions ont un pointeur en argument qui permet de remplir une structure : ce sont les valeurs de retour de la fonction. Par ailleurs, la fonction renvoie un int dont la valeur indique le déroulement de l'opération :
c'est comme cela que fonctionnent beaucoup de fonctions de la biliothèque standard.
Oui.
et non.
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux types de fonctions dans mon code. Les fonctions de creations d'objets, d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet nouvellement cree, et les autres, qui le cas echeant modifient les objets passes en argument, et renvoient un code d'erreur. Dans cette optique, ta fonction d'exemple, je la place plutot dans ma premiere categorie:
... et la, je voulais ajouter un exemple de fonction qui modifierait un complexe et renverrait un code d'erreur, et j'ai rien trouve :-(
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime bien la convention du "retourner NULL si la creation de l'objet echoue". -- Bertrand Mollinier Toublet Currently looking for employment in the San Francisco Bay Area http://www.bmt.dnsalias.org/employment
Emmanuel Delahaye
In 'fr.comp.lang.c', Bertrand Mollinier Toublet wrote:
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux types de fonctions dans mon code. Les fonctions de creations d'objets, d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet nouvellement cree, et les autres, qui le cas echeant modifient les objets passes en argument, et renvoient un code d'erreur.
<...>
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime bien la convention du "retourner NULL si la creation de l'objet echoue".
Tout à fait d'accord.
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', Bertrand Mollinier Toublet
<bertrand.molliniertoublet@enst-bretagne.fr> wrote:
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux
types de fonctions dans mon code. Les fonctions de creations d'objets,
d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet
nouvellement cree, et les autres, qui le cas echeant modifient les
objets passes en argument, et renvoient un code d'erreur.
<...>
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime
bien la convention du "retourner NULL si la creation de l'objet echoue".
Tout à fait d'accord.
--
-ed- emdelYOURBRA@noos.fr [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
<blank line>
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
In 'fr.comp.lang.c', Bertrand Mollinier Toublet wrote:
Recement, je me suis mis d'accord avec moi-meme que j'allais avoir deux types de fonctions dans mon code. Les fonctions de creations d'objets, d'instanciation, si l'on veut, qui renvoient un pointeur sur l'objet nouvellement cree, et les autres, qui le cas echeant modifient les objets passes en argument, et renvoient un code d'erreur.
<...>
Bref, c'etait juste pour prendre la tete, et faire remarquer que j'aime bien la convention du "retourner NULL si la creation de l'objet echoue".
Tout à fait d'accord.
-- -ed- [remove YOURBRA before answering me] The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html <blank line> FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/
EpSyLOn
On Fri, 25 Jul 2003 18:49:52 +0200, EpSyLOn wrote:
[...] Merde ! Cette fois c'est la bonne. Encore désolé.
EpSyLOn writes: | >Et les deux documents en question ne parlent pas de la longueur | >des signatures ? | | Sisi. | Vala, c'est réglé
en es-tu sûr ?
-- Gaby
EpSyLOn <sasDOTepsylon@wanadoo.fr> writes:
| >Et les deux documents en question ne parlent pas de la longueur
| >des signatures ?
|
| Sisi.
| Vala, c'est réglé
static int checkdate ( unsigned short int month, unsigned short int day, unsigned short int year) { /* The number of days in each month. There's 13 values, because the first value is 0 and month 0 doesn't exist */ static unsigned short int days_in_month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/* The error value */ int err = EXIT_SUCCESS;
/* If the year is leap and the month is Februar */ if ( (month == 2) && (year % 4 == 0) && (( year % 100 != 100 ) || ( year % 400 == 0)) && (( day < 1) || ( day > 29 )) ) { printf("Month or day invalid"); err = EXIT_FAILURE; }
/* If the day or the month isn't valid at all, we don't continue */ else if ((day < 1 ) || (day > 31) || (month < 1) || (month > 12)) { fprintf(stderr, "Month or day invalid.n"); err = EXIT_FAILURE; } /* If the day is superior to the max in the month entered */ else if ( day > days_in_month[month] ) { (void) fprintf(stderr, "Day invalid according to the month.n"); err = EXIT_FAILURE; }
static int takedate (date *p_userdate) { /* Error management */ int err = EXIT_SUCCESS;
/* Improve visibility with clear names */ unsigned short int month = p_userdate->month; unsigned short int day = p_userdate->day; unsigned short int year = p_userdate->year;
/* We check the pointer and the variables */ assert ( p_userdate != NULL && month == 0 && day == 0 && year == 0 );
/* If we point to nothing, stop */ if ( p_userdate == NULL ) { printf("Invalid structure pointer.n"); err = EXIT_FAILURE; }
else { (void) printf("Enter a date (mm/dd/yyyy) : "); (void) fflush(stdout);
/* If nothing is wrong with the input itself, we check if the user followed the instructions */ err = getstring( p_userdate->input, sizeof(p_userdate->input) );
if ( err == EXIT_SUCCESS ) { if ( sscanf(p_userdate->input, "%02hu/%02hu/%04hu", &month, &day, &year) != 3 ) { (void) fprintf(stderr, "Invalid date or bad separator.n"); err = EXIT_FAILURE; } }
/* If nothing is wrong, check if the date is correct */ if ( err == EXIT_SUCCESS ) err = checkdate(month, day, year);
/* If the date is correct, we display it */ if ( err == EXIT_SUCCESS ) printf("You have entered : %s.n", p_userdate->input);
/* If everything was ok, we update the structure values */ if ( err == EXIT_SUCCESS ) { p_userdate->month = month; p_userdate->year = year; p_userdate->day = day; } }
return err; }
int main (void) { /* Error management */ int err = EXIT_SUCCESS;
/* Index array */ int index = 0;
/* The initialisation of the array of structures input, month, day, year, err */ date userdate[2] = { {{0}, 0, 0, 0}, {{0}, 0, 0, 0} };
for ( index = 0; index < 2 && err == EXIT_SUCCESS; index++ ) { err = takedate( &userdate[index] ); }
return err;
}
Tiens en passant, serait il moins bien de faire comme ceci pour les commentaires :
int main ( void ) { /* This function does something, somewhere in the world */ function(args);
/* And this functions does another thing */ function2(args);
static int
checkdate ( unsigned short int month, unsigned short int day,
unsigned short int year)
{
/* The number of days in each month.
There's 13 values, because the first value is 0 and month 0
doesn't exist */
static unsigned short int days_in_month[13] = {
0,
31,
28,
31,
30,
31,
30,
31,
31,
30,
31,
30,
31
};
/* The error value */
int err = EXIT_SUCCESS;
/* If the year is leap and the month is Februar */
if ( (month == 2)
&& (year % 4 == 0)
&& (( year % 100 != 100 ) || ( year % 400 == 0))
&& (( day < 1) || ( day > 29 ))
)
{
printf("Month or day invalid");
err = EXIT_FAILURE;
}
/* If the day or the month isn't valid at all, we don't continue */
else if ((day < 1 ) || (day > 31) || (month < 1) || (month > 12))
{
fprintf(stderr, "Month or day invalid.n");
err = EXIT_FAILURE;
}
/* If the day is superior to the max in the month entered */
else if ( day > days_in_month[month] )
{
(void) fprintf(stderr, "Day invalid according to the month.n");
err = EXIT_FAILURE;
}
static int
takedate (date *p_userdate)
{
/* Error management */
int err = EXIT_SUCCESS;
/* Improve visibility with clear names */
unsigned short int month = p_userdate->month;
unsigned short int day = p_userdate->day;
unsigned short int year = p_userdate->year;
/* We check the pointer and the variables */
assert ( p_userdate != NULL
&& month == 0 && day == 0 && year == 0 );
/* If we point to nothing, stop */
if ( p_userdate == NULL )
{
printf("Invalid structure pointer.n");
err = EXIT_FAILURE;
}
else
{
(void) printf("Enter a date (mm/dd/yyyy) : ");
(void) fflush(stdout);
/* If nothing is wrong with the input itself, we check if the user
followed the instructions */
err = getstring( p_userdate->input, sizeof(p_userdate->input) );
if ( err == EXIT_SUCCESS )
{
if ( sscanf(p_userdate->input, "%02hu/%02hu/%04hu",
&month, &day, &year) != 3 )
{
(void) fprintf(stderr, "Invalid date or bad separator.n");
err = EXIT_FAILURE;
}
}
/* If nothing is wrong, check if the date is correct */
if ( err == EXIT_SUCCESS )
err = checkdate(month, day, year);
/* If the date is correct, we display it */
if ( err == EXIT_SUCCESS )
printf("You have entered : %s.n", p_userdate->input);
/* If everything was ok, we update the structure values */
if ( err == EXIT_SUCCESS )
{
p_userdate->month = month;
p_userdate->year = year;
p_userdate->day = day;
}
}
return err;
}
int
main (void)
{
/* Error management */
int err = EXIT_SUCCESS;
/* Index array */
int index = 0;
/* The initialisation of the array of structures
input, month, day, year, err */
date userdate[2] = {
{{0}, 0, 0, 0},
{{0}, 0, 0, 0}
};
for ( index = 0; index < 2 && err == EXIT_SUCCESS; index++ )
{
err = takedate( &userdate[index] );
}
return err;
}
Tiens en passant, serait il moins bien de faire comme ceci pour les
commentaires :
int main ( void )
{
/* This function does something, somewhere in the world */
function(args);
/* And this functions does another thing */
function2(args);
static int checkdate ( unsigned short int month, unsigned short int day, unsigned short int year) { /* The number of days in each month. There's 13 values, because the first value is 0 and month 0 doesn't exist */ static unsigned short int days_in_month[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
/* The error value */ int err = EXIT_SUCCESS;
/* If the year is leap and the month is Februar */ if ( (month == 2) && (year % 4 == 0) && (( year % 100 != 100 ) || ( year % 400 == 0)) && (( day < 1) || ( day > 29 )) ) { printf("Month or day invalid"); err = EXIT_FAILURE; }
/* If the day or the month isn't valid at all, we don't continue */ else if ((day < 1 ) || (day > 31) || (month < 1) || (month > 12)) { fprintf(stderr, "Month or day invalid.n"); err = EXIT_FAILURE; } /* If the day is superior to the max in the month entered */ else if ( day > days_in_month[month] ) { (void) fprintf(stderr, "Day invalid according to the month.n"); err = EXIT_FAILURE; }
static int takedate (date *p_userdate) { /* Error management */ int err = EXIT_SUCCESS;
/* Improve visibility with clear names */ unsigned short int month = p_userdate->month; unsigned short int day = p_userdate->day; unsigned short int year = p_userdate->year;
/* We check the pointer and the variables */ assert ( p_userdate != NULL && month == 0 && day == 0 && year == 0 );
/* If we point to nothing, stop */ if ( p_userdate == NULL ) { printf("Invalid structure pointer.n"); err = EXIT_FAILURE; }
else { (void) printf("Enter a date (mm/dd/yyyy) : "); (void) fflush(stdout);
/* If nothing is wrong with the input itself, we check if the user followed the instructions */ err = getstring( p_userdate->input, sizeof(p_userdate->input) );
if ( err == EXIT_SUCCESS ) { if ( sscanf(p_userdate->input, "%02hu/%02hu/%04hu", &month, &day, &year) != 3 ) { (void) fprintf(stderr, "Invalid date or bad separator.n"); err = EXIT_FAILURE; } }
/* If nothing is wrong, check if the date is correct */ if ( err == EXIT_SUCCESS ) err = checkdate(month, day, year);
/* If the date is correct, we display it */ if ( err == EXIT_SUCCESS ) printf("You have entered : %s.n", p_userdate->input);
/* If everything was ok, we update the structure values */ if ( err == EXIT_SUCCESS ) { p_userdate->month = month; p_userdate->year = year; p_userdate->day = day; } }
return err; }
int main (void) { /* Error management */ int err = EXIT_SUCCESS;
/* Index array */ int index = 0;
/* The initialisation of the array of structures input, month, day, year, err */ date userdate[2] = { {{0}, 0, 0, 0}, {{0}, 0, 0, 0} };
for ( index = 0; index < 2 && err == EXIT_SUCCESS; index++ ) { err = takedate( &userdate[index] ); }
return err;
}
Tiens en passant, serait il moins bien de faire comme ceci pour les commentaires :
int main ( void ) { /* This function does something, somewhere in the world */ function(args);
/* And this functions does another thing */ function2(args);
"Laurent Wacrenier" <lwa@ teaser . fr> a écrit dans le message news:
Eddahbi Karim écrit:
&& (( year % 100 != 100 ) ||
Ça ne doit pas arriver souvent.
Ce ne serait pas plutôt le contraire ? % donne le reste d'une division entière, donc year % 100 a pour résultat un entier compris entre 0 et 99, bornes comprises, et donc year % 100 != 100 est toujours vérifié.
--
Jean Claude Calvez
"Laurent Wacrenier" <lwa@ teaser . fr> a écrit dans le message news:
slrnbi3etf.i83.lwa@victor.teaser.fr...
Ce ne serait pas plutôt le contraire ?
% donne le reste d'une division entière, donc
year % 100 a pour résultat un entier compris
entre 0 et 99, bornes comprises, et donc
year % 100 != 100 est toujours vérifié.
"Laurent Wacrenier" <lwa@ teaser . fr> a écrit dans le message news:
Eddahbi Karim écrit:
&& (( year % 100 != 100 ) ||
Ça ne doit pas arriver souvent.
Ce ne serait pas plutôt le contraire ? % donne le reste d'une division entière, donc year % 100 a pour résultat un entier compris entre 0 et 99, bornes comprises, et donc year % 100 != 100 est toujours vérifié.
--
Jean Claude Calvez
Eddahbi Karim
"Laurent Wacrenier" <lwa@ teaser . fr> a écrit dans le message news:
[snip]
Mais qu'est ce je suis c...
C'est corrigé merci :).
Voila ;), ThE_TemPLaR
"Laurent Wacrenier" <lwa@ teaser . fr> a écrit dans le message news:
slrnbi3etf.i83.lwa@victor.teaser.fr...