Conversion HH:MM:SS [Résolu]

TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 24 sept. 2015 à 12:08 - Dernière réponse : nagaD.scar 4267 Messages postés samedi 8 septembre 2007Date d'inscription 23 juillet 2018 Dernière intervention
- 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 !
Afficher la suite 

Votre réponse

9 réponses

cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - Modifié par cptpingu le 25/09/2015 à 12:33
0
Merci
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
Commenter la réponse de cptpingu
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 25 sept. 2015 à 14:18
0
Merci
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 !
nagaD.scar 4267 Messages postés samedi 8 septembre 2007Date d'inscription 23 juillet 2018 Dernière intervention - 28 sept. 2015 à 15:14
en fait je pense que tu es censé écrire aussi les méthodes utilisée, soit "val" et "std".
Commenter la réponse de TheRogerFederer
cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - 25 sept. 2015 à 14:45
0
Merci
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é.
Commenter la réponse de cptpingu
nagaD.scar 4267 Messages postés samedi 8 septembre 2007Date d'inscription 23 juillet 2018 Dernière intervention - 25 sept. 2015 à 15:46
0
Merci
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
Commenter la réponse de nagaD.scar
cptpingu 3797 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 13 août 2018 Dernière intervention - 25 sept. 2015 à 15:55
0
Merci
@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 :).
Commenter la réponse de cptpingu
nagaD.scar 4267 Messages postés samedi 8 septembre 2007Date d'inscription 23 juillet 2018 Dernière intervention - Modifié par cptpingu le 25/09/2015 à 16:19
0
Merci
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/
nagaD.scar 4267 Messages postés samedi 8 septembre 2007Date d'inscription 23 juillet 2018 Dernière intervention - 28 sept. 2015 à 15:12
au temps .... magnifique ... autant donc ><
Commenter la réponse de nagaD.scar
TheRogerFederer 256 Messages postés mercredi 31 mars 2010Date d'inscription 10 mars 2016 Dernière intervention - 28 sept. 2015 à 14:49
0
Merci
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...............
Commenter la réponse de TheRogerFederer

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.