[C] Un prog simple qui déconne

Un prog simple qui déconne [C] - C - Programmation

Marsh Posté le 06-01-2006 à 22:51:31    

J'ai essayé de faire un programme en C mais celà déconne (vous en comprendrez vite le principe, il est enfantin):

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #define LONG43
  4. main () {
  5.      printf ("Caractéristiques des ecrans:" );
  6.      printf ("+------+------+-----+----------+---------+\n" );
  7.      printf ("|Pouces|  CM  | 4/3 | Longueur | Largeur |\n" );
  8.      printf ("+------+------+-----+----------+---------+\n" );
  9.      int pouce, x, y;
  10.      float cm, long1, long2, larg1, larg2;
  11.      for (pouce=10;pouce<=22;pouce++) {
  12.          long1=cm/(5/4);
  13.          larg1=long1*0.5625;
  14.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm=pouce*2.54, long1, larg1);
  15.          printf ("+------+------+-----+----------+---------+\n" );
  16.          }
  17.      for (pouce=24;pouce<=40;pouce=pouce+2) {
  18.          long1=cm/(5/4);
  19.          larg1=long1*0.5625;
  20.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm=pouce*2.54, long1, larg1);
  21.          printf ("+------+------+-----+----------+---------+\n" );
  22.          }
  23.      for (pouce=43;pouce<=70;pouce=pouce+3) {
  24.          long1=cm/(5/4);
  25.          larg1=long1*0.5625;
  26.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm=pouce*2.54, long1, larg1);
  27.          printf ("+------+------+-----+----------+---------+\n" );
  28.          }
  29.      getch ();
  30.      }


 
Et regardez ce que celà affiche à l'écran:
http://images5.theimagehosting.com/bazar.jpg
 
Que dois-je faire pour corriger ce problème a la 10° ligne sous les étiquettes du tableau?

Reply

Marsh Posté le 06-01-2006 à 22:51:31   

Reply

Marsh Posté le 07-01-2006 à 00:05:18    

Pcsnake a écrit :

J'ai essayé de faire un programme en C mais celà déconne (vous en comprendrez vite le principe, il est enfantin):

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #define LONG43
  4.      float cm, long1, long2, larg1, larg2;
  5.      for (pouce=10;pouce<=22;pouce++) {
  6.          long1=cm/(5/4);
  7.          larg1=long1*0.5625;
  8.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm=pouce*2.54, long1, larg1);
  9.          printf ("+------+------+-----+----------+---------+\n" );
  10.          }
  11.           }


 


 
bon je suis pas sur mais bon...tu declares tes variables -> ok
tu fais tes calculs -> ok? ben nan paske tu utilises cm que tu as pas initialisé!!
tu l'initialise que lors du printf donc premier resultat completement biizarre et la suite ca passe [:petrus75]
 
normalement si tu met ca ca devrait marcher (initialiser cm avant tes boucles et mettre juste cm dans ton printf.)
 

Code :
  1. float cm, long1, long2, larg1, larg2;
  2. cm=pouce*2.54;
  3.      for (pouce=10;pouce<=22;pouce++) {
  4.          long1=cm/(5/4);
  5.          larg1=long1*0.5625;
  6.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm, long1, larg1);
  7.          printf ("+------+------+-----+----------+---------+\n" );
  8.          }

Reply

Marsh Posté le 07-01-2006 à 09:03:30    

gocho a écrit :


normalement si tu met ca ca devrait marcher (initialiser cm avant tes boucles et mettre juste cm dans ton printf.)


 
Je crois pas non ....
ca ca marche par contre :
 

Code :
  1. float cm, long1, long2, larg1, larg2;
  2.      for (pouce=10;pouce<=22;pouce++)
  3.      {
  4.          cm=pouce*2.54;
  5.          long1=cm/(5/4);
  6.          larg1=long1*0.5625;
  7.          printf ("|%4d  |%5.1f |XXXXX|  %5.1f   |  %5.1f  |\n", pouce, cm, long1, larg1);
  8.          printf ("+------+------+-----+----------+---------+\n" );
  9.          }


Reply

Marsh Posté le 07-01-2006 à 09:56:35    

gocho a écrit :

bon je suis pas sur mais bon...tu declares tes variables -> ok
tu fais tes calculs -> ok? ben nan paske tu utilises cm que tu as pas initialisé!!
tu l'initialise que lors du printf donc premier resultat completement biizarre et la suite ca passe [:petrus75]


 
Le raisonnement est bon, par contre tu utilises la variable "pouce" pour initialiser "cm"... et "pouce" n'est pas défini non plus à cet endroit du programme, donc tu retrouves le même problème :o
Il faut savoir qu'une variable non initialisée contient potentiellement n'importe quelle valeur, elle est non définie. La variable "pouce" peut donc virtuellement contenir 0.0, 3.14159, la réponse à LA question de l'univers, l'âge du capitaine, ou le nombre de mailles tricotées par ma grand-mère depuis 1942.
(je mets en fait en clair ce que dit Joel F par son code, juste mes yeux ont mis plus de 3min derrière leurs cernes pour voir la différence entre les deux codes [:dawa] )
 
 
Sinon petite remarque au passage : le prototype de main() est incorrect.
main() doit explicitement retourner un entier, la norme admet deux prototypes possibles :
   int main(void);
ou
   int main(int argc, char * const * argv);
 
Et donc, par conséquent, un "return" en fin de main() est requis. On retourne 0 en cas de succès, et toute autre valeur en cas d'échec ou de warning. En général on utilise les constantes EXIT_SUCCESS et EXIT_FAILURE, définies dans stdlib.h, pour que ce soit plus clair. :)

Message cité 1 fois
Message édité par Elmoricq le 07-01-2006 à 10:03:08
Reply

Marsh Posté le 07-01-2006 à 11:54:00    

J'ai modifié mon programme et maintenant ça marche:
Parce que de la manière de Joel F la variable cm n'était pas encore déclarée (en tout cas sa valeur) lors de la déclaration de larg1.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #define LONG43
  4. main () {
  5.      printf ("Caractéristiques des ecrans:\n" );
  6.      printf ("+------+------+-----+----------+---------+\n" );
  7.      printf ("|Pouces|  CM  | 4/3 | Longueur | Largeur |\n" );
  8.      printf ("+------+------+-----+----------+---------+\n" );
  9.      int pouce, x, y;
  10.      float cm, long1, long2, larg1, larg2;
  11.      for (pouce=10;pouce<=22;pouce++) {
  12.          printf ("|%4d  |%5.1f |XXXXX", pouce, cm=pouce*2.54);
  13.          long1=cm/(5/4);
  14.          larg1=long1*0.5625;
  15.          printf ("|  %5.1f   |  %5.1f  |\n", long1, larg1);
  16.          printf ("+------+------+-----+----------+---------+\n" );
  17.          }
  18.      for (pouce=24;pouce<=40;pouce=pouce+2) {
  19.          printf ("|%4d  |%5.1f |XXXXX", pouce, cm=pouce*2.54);
  20.          long1=cm/(5/4);
  21.          larg1=long1*0.5625;
  22.          printf ("|  %5.1f   |  %5.1f  |\n", long1, larg1);
  23.          printf ("+------+------+-----+----------+---------+\n" );
  24.          }
  25.      for (pouce=43;pouce<=70;pouce=pouce+3) {
  26.          printf ("|%4d  |%5.1f |XXXXX", pouce, cm=pouce*2.54);
  27.          long1=cm/(5/4);
  28.          larg1=long1*0.5625;
  29.          printf ("|  %5.1f   |  %5.1f  |\n", long1, larg1);
  30.          printf ("+------+------+-----+----------+---------+\n" );
  31.          }
  32.      getch ();
  33.      }

Message cité 2 fois
Message édité par Pcsnake le 07-01-2006 à 11:55:56
Reply

Marsh Posté le 07-01-2006 à 12:00:44    

Pcsnake a écrit :

J'ai modifié mon programme et maintenant ça marche:
Parce que de la manière de Joel F la variable cm n'était pas encore déclarée (en tout cas sa valeur) lors de la déclaration de larg1.


 
larg1 n'a rien à voir avec la définition de cm.
Le code de Joel F est correct.
 
Et je t'ai dis que ton prototype de main() était faux, tout comme l'absence de return en fin de code :


test.c:4: warning: return-type defaults to `int'
test.c: In function `main':
test.c:6: warning: unused variable `larg2'
test.c:6: warning: unused variable `long2'
test.c:5: warning: unused variable `y'
test.c:5: warning: unused variable `x'
test.c:33: warning: control reaches end of non-void function


 

Reply

Marsh Posté le 07-01-2006 à 13:33:05    

Pcsnake a écrit :

J'ai modifié mon programme et maintenant ça marche:


Lourdingue... 'double' est le type 'naturel (et précis) des flottants. Il faut apprendre à factoriser le code...

Code :
  1. #include <stdio.h>
  2.  
  3. static void print_screen (int from, int to, int step)
  4. {
  5.   int pouce;
  6.  
  7.   for (pouce = from; pouce <= to; pouce += step)
  8.   {
  9.      double cm = pouce * 2.54;
  10.      printf ("|%4d  |%5.1f |XXXXX", pouce, cm);
  11.      {
  12.         double long1 = cm / (5 / 4);
  13.         double larg1 = long1 * 0.5625;
  14.         printf ("|  %5.1f   |  %5.1f  |\n", long1, larg1);
  15.      }
  16.      printf ("+------+------+-----+----------+---------+\n" );
  17.   }
  18. }
  19.  
  20. int main (void)
  21. {
  22.   printf ("Caracteristiques des ecrans:\n" );
  23.   printf ("+------+------+-----+----------+---------+\n" );
  24.   printf ("|Pouces|  CM  | 4/3 | Longueur | Largeur |\n" );
  25.   printf ("+------+------+-----+----------+---------+\n" );
  26.  
  27.   print_screen (10, 22, 1);
  28.   print_screen (24, 40, 2);
  29.   print_screen (43, 70, 3);
  30.  
  31.   return 0;
  32. }


Message édité par Emmanuel Delahaye le 07-01-2006 à 13:33:49

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-01-2006 à 01:40:44    

Joel F a écrit :

Je crois pas non ....
ca ca marche par contre :
 


 

Elmoricq a écrit :

Le raisonnement est bon, par contre tu utilises la variable "pouce" pour initialiser "cm"... et "pouce" n'est pas défini non plus à cet endroit du programme, donc tu retrouves le même problème :o[...]
juste mes yeux ont mis plus de 3min derrière leurs cernes pour voir la différence entre les deux codes [:dawa] )  
 


 
 
'tin le con que j'suis pas!!! [:kiki]  
J'avais carrement pas fait attention  a l'autre variable  [:sygus]  
Enfin mes cernes sont pas mal non plus et j'viens de galerer quelques temps a trouver ce que signifiait le from dans le code d'Emmanuel  [:benou]  
Je vois ca mais je pense pas a regarder la boucle donc forcement je comprends pas....
'fin bref l'idee c'etait qu'il fallait initialiser avant quoi [:dawao]
 
sur ce bonne nuit, j'en ai besoin [:fatigue]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed