Conversion HH:MM:SS

Résolu
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 - Modifié par TheRogerFederer le 25/09/2015 à 09:58
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 - 28 sept. 2015 à 15:14
Bonjour, alors la on monte d'un cran au niveau de la difficulté, voici l'énoncé :

programme conversion
h, m, s : entier
result : chaine
debut
// saisie des secondes avec contrôle
repeter
afficher "entrer une durée en secondes (entre 0 et 86400) : "
saisir s
jusqu'à s >= 0 et s < 86400
// calcul des heures, minutes et secondes
h <- s div 3600
m <- (s mod 3600) div 60
s <- s mod 60
// début de création de la chaîne, avec les secondes
result <- str(s)
// ajout d'un "O" devant, si nécessaire
si s < 10 alors
result <- "0" + result
finsi
// suite de la création de la chaîne avec les minutes
result <- str(m) + ":" + result
// ajout d'un "O" devant, si nécessaire
si m < 10 alors
result <- "0" + result
finsi
// fin de la création de la chaîne avec les heures
result <- str(h) + ":" + result
// ajout d'un "O" devant, si nécessaire
si h < 10 alors
result <- "0" + result
finsi
// affichage de la chaîne complète
afficher result
fin

et j'ai codé cela :
// Programme principal
int main () {
 
 // Variables
 int h, m, s ;
 char result ;
 
 // boucle sur la saisie de contrôle
 printf(" Entrez une durée de contrôle (entre 0 et 86400) : ") ;
 scanf("%d",&s) ;
 for (s >= 0 || s <=86400) {
   
  // Calcul des heures, minutes et secondes
   h = s div 3600 ;
   m = (s % 3600) * div 60 ;
   s = s % 60 ;
   
   // Début de création de la chaîne, avec les secondes
   result = str(s) ;
   
   // ajout d'un "0" devant, si nécessaire
   if (s < 10) {
    result = "0" + result ;
   }
   
   // Suite de la création de la chaîne avec les minutes
   result = str(m) + ":" + result ;
   
   // Ajout d'un "O" devant, si nécéssaire
   if (m < 10) {
    result = "0" + result ;
   }
   
   // Fin de la création de la chaîne avec les heures
   result = str(h) + ":" + result ;
   
   // Ajout d'un "O" devant, si nécessaire
   if (h < 10) {
    result = "0" + result  ;
   }
 }
   // Affichage de la chaîne complète 
   printf (" Afficher le résultat ", result) ;
   
     getch () ;
     return 0 ;

}

Mais alors la j'ai pas moins de 6 erreurs et 4 warnings ! Je sais que le str transforme des variable de type numérique en chaine de caractères mais la ce n'est pas simple pour moi !

7 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
Modifié par cptpingu le 25/09/2015 à 12:33
Bonjour.

Plusieurs remarques:
  • Pour convertir un entier en string, on peut utiliser sprintf ("str" n'existe pas, et doit être une invention de ton exercice).
  • Ne pas confondre un caractère unique "char" et une chaîne de caractères "char[X]". Il n'y pas de string en C, donc il n'est pas possible d'utiliser un signe + pour faire des concaténations. On utilisera donc strcat, strcpy, ou sprintf pour toute opérations.
  • Il faut bien comprendre, qu'en C, une chaîne possède une taille fixe, que l'on doit préciser à l'avance. La taille n'est pas dynamique/automatique.
  • Une recopie litérale du pseudo-code ne fonctionnera pas. Chaque langage a "sa manière de faire". Le pseudo-code est généralement proche du "Pascal" ou du "Delphi", mais est très éloigné du C (qui est plus "bas niveau", proche de la machine).


Pour la correction, on peut le faire comme suit:
#include <stdio.h>
#include <string.h>

/*
** Convert an int directly into a given buffer.
**
** Advice: If the given nb is > 99, then abort with assert.
*/
void int_to_str(char str_nb[2], int nb)
{
  // Attention, si nb > 99, le programme plantera
  // Cette fonction n'est donc utile que dans le cade de cet exercice.

  if (nb < 10)
    sprintf(str_nb, "0%i", nb);
  else
    sprintf(str_nb, "%i", nb);
}

int main(void)
{
  int s = 0;

  do
  {
    printf("Entrez une durée de contrôle(entre 0 et 86400): ");
    scanf("%d", &s);
  }
  while (s < 0 || s >= 86400);

  int h = s / 3600;
  int m = (s % 3600) / 60;
  s = s % 60;

  char str_s[2] = {0};
  int_to_str(str_s, s);

  char str_m[2] = {0};
  int_to_str(str_m, m);

  char str_h[2] = {0};
  int_to_str(str_h, h);

  printf("Afficher le résultat: %s:%s:%s\n", str_h, str_m, str_s);

  return 0;
}


Voir même directement ceci (en se servant des options de printf):
#include <stdio.h>

int main(void)
{
  int s = 0;

  do
  {
    printf("Entrez une durée de contrôle(entre 0 et 86400): ");
    scanf("%d", &s);
  }
  while (s < 0 || s >= 86400);

  // %02i => afficher un entier, et y mettre un 0 devant si < 10.
  printf("Afficher le résultat: %02i:%02i:%02i\n", s / 3600, (s % 3600) / 60, s % 60);

  return 0;
}


Dernière remarque, plus générale. La manière dont tu apprends (que tu soit auto-didacte ou que tu suives des cours), me fait très peur. Au lieu de faire des exercices, tu te contentes de recopier des exos déjà corrigés en C. Tu n'apprends donc rien (à part de la syntaxe). Or, c'est en écrivant de l'algorithmie que l'on apprend vraiment à coder. J'ai pas mal enseigné, et je vois immédiatemment les soucis. Je vois ici que tu ne comprends pas vraiment ce que tu fais. Tu recopies, mais si je te retire le corrigé, et te demande le code par toi même, tu serais perdu. Il y a une faute dans le pseudo-code, soit parce que tu as mal recopié, soit parce qu'il y a une coquille dans le corrigé, et tu as donc transcris un code C qui ne fait pas du tout ce qui est attendu. En ayant un peu d'intuition algorithmique, tu aurais tout de suite vu que faire une boucle sur l'ensemble et non la demande, n'avait pas de sens. Or ici, ça ne t'a pas choqué, car tu ne développes pas du tout l'algorithmie, pourtant plus importante que la syntaxe elle même.

Si tu en as la possibilité, change de méthode assez rapidement. Cherche des exercices non corrigés, sans pseudo-code, avec juste un énoncé dans lequel on te demande de faire quelque chose. Tu poseras alors l'algorithme sur papier dans le langage de ton choix (même en français), que tu transcriras alors en C. Tu peux même le faire directement en C. C'est de cette manière que tu progresseras.


Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
25 sept. 2015 à 14:18
Pourtant dans mon cours je peux lire ceci :

Fonctions de conversions
Ces fonctions permettent de changer le type d'une variable.
Syntaxe
// conversion d'une chaîne en numérique
unNombre <- val(uneChaine)
// conversion d'une valeur numérique en chaine
uneChaine <- str(unNombre) ???

Pour les exos, pour le moment c'est normal que les pseudos codes sont corrigés, elle ne nous fait pas apprendre tout en meme temps ! J'ai un cours programmation et un cours algorithme appliqué et j'essaie d'avancer dans les 2 mais tu comprends bien que j'ai en plus pleins d'autres cours a assurer donc..................!
Pour le moment tous ce que je t'ai présenté a été demandé ! La consigne était juste de transcrire l'algo corrigé en code C/C++ sur éclipse ! Mais c'est sure qu'en ayant travaillé sur les énoncés, l'écriture de l'algo n'a pas toujours été instantané par rapport a ca correction !
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
28 sept. 2015 à 15:14
en fait je pense que tu es censé écrire aussi les méthodes utilisée, soit "val" et "std".
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 sept. 2015 à 14:45
Au sujet de "val" et de "str", ce sont sûrement des fonctions inventées pour les besoins du pseudo-code. De la même manière que si je déclarais arbitrairement "la fonction convert() prend un entier en argument et le convertis en string". Mais ce n'est pas du C.

Au sujet de la méthode d'apprentissage, je ne te critiques pas personnellement, mais la pédagogie foireuse employée. On ne fait pas recopier du pseudo-code. On fait faire de l'algorithmie (en pseudo-code, en français ou en C directement), afin d'acquérir de solides bases. Puis on lutte (un petit peu) avec la syntaxe du langage que l'on aura choisi (ce qui prend très peu de temps, si on est solide sur ses acquis).
Là, c'est mettre la charrue avant les boeufs. C'est comme recopier du chinois en indien, sans connaître ces deux langues...

Pour apprendre la syntaxe du C (une fois la base algorithmique acquise), mieux vaut passer par des tutoriels qui ne traitent que cet aspect (et on ne parle pas de recopie, mais de réelle compréhension pas à pas). Par exemple, le tutoriel sur le site du zéro, est assez bien foutu:
https://openclassrooms.com/courses/apprenez-a-programmer-en-c (notamment toute la première section "les bases" qui te seront utiles).

En commençant par ce chapitre (que tu maîtrises sûrement, mais une révision ne fait pas de mal):
https://openclassrooms.com/courses/apprenez-a-programmer-en-c/un-monde-de-variables

Jusqu'à atteindre celui-ci (inclus):
https://openclassrooms.com/courses/apprenez-a-programmer-en-c/les-fonctions-1

Tu apprendras plus vite, et plus efficacement que de simplement recopier du code que tu comprends à moitié.
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
25 sept. 2015 à 15:46
salut !

Je reponds à ton post car c est un peu hors contexte, mais il y a un truc qui me ... trouble (?) :


result = "0" + result ;


Bon en ignorant le fait que l'on déclare un char et non un char* (ce qui deja me laisse perplexe), on fait une concaténation avec un simple "+" ... je trouve ca étonnant non ?

en fait tout ce qui concerne les caractères est, avec la connaissance que j ai du c, complètement faux ... je serai curieux de voir quel tuto propose cette solution oO
0

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

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
25 sept. 2015 à 15:55
@nagashima: Il ne dit pas que: "0" + result fonctionne en C, simplement qu'il a essayé de traduire du pseudo-code en C, sans connaître la syntaxe du C (il débute). En recopiant litérallement, il s'est alors aperçu que ça ne fonctionnait pas, raison de sa question initiale :).
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
Modifié par cptpingu le 25/09/2015 à 16:19
ah au temps pour moi, j avais cru comprendre que c etait la solution proposé et qu il avait des erreurs en le recopiant !
Bon et donc je suis pas encore a la ramasse en c, toujours bon a savoir \o/
0
nagaD.scar Messages postés 4272 Date d'inscription samedi 8 septembre 2007 Statut Membre Dernière intervention 4 janvier 2023 17
28 sept. 2015 à 15:12
au temps .... magnifique ... autant donc ><
0
TheRogerFederer Messages postés 256 Date d'inscription mercredi 31 mars 2010 Statut Membre Dernière intervention 10 mars 2016 1
28 sept. 2015 à 14:49
Pas de problème cptpingu e sais que ce n'est pas contre moi, c'est juste que comme je commence en bts info, je fait surtout comme on m'apprends avant de remettre en question ce qu'ils font...............
0
Rejoignez-nous