Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1723 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

structure if - else (débutant)

n°1295953
Joel F
Real men use unique_ptr
Posté le 31-01-2006 à 22:08:52  profilanswer
 

Reprise du message précédent :


j'ai déjà fait la remarque  :whistle:

mood
Publicité
Posté le 31-01-2006 à 22:08:52  profilanswer
 

n°1295955
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:09:18  profilanswer
 

tyler1207 a écrit :

je cherche pas à défendre l'indéfendable, mais qd je crée un nvx projet ac lcc, j'ai par défaut un code (celui du fichier d'aide je pense) qui s'affiche et il y a un void main () tout au début.


C'est un point très discutable de lcc-win32. D'ailleurs son auteur Jacob Navia est régulièrement malmené pour ça et d'autres 'mauvaises pratiques' sur comp.lang.c.

Citation :

dans les fait que je mette void ou int ça change quoi ?


Avec void, le code le comportement est indéfini. On ne sait pas ce qui est retourné au système et ça pourrait très bien le tuer...


---------------
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/
n°1295960
tyler1207
cowan, basagotia, lenosky...
Posté le 31-01-2006 à 22:12:08  profilanswer
 

Emmanuel Delahaye a écrit :

C'est un point très discutable de lcc-win32. D'ailleurs son auteur Jacob Navia est régulièrement malmené pour ça et d'autres 'mauvaises pratiques' sur comp.lang.c.

Citation :

dans les fait que je mette void ou int ça change quoi ?


Avec void, le code le comportement est indéfini. On ne sait pas ce qui est retourné au système et ça pourrait très bien le tuer...


 
j'ai lu ta page, instructif et je comprends mieux pr int et pas void. y'en a qu'on l'air de toucher au C depuis presque aussi longtemps qu'il existe ici !  :D

n°1295961
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:12:47  profilanswer
 

Encore faudrait-il qu'il ai étudié l'architecture d'Unix aussi... Car on comprend tres bien le return 0; et surtout pourquoi c'est un int une fois qu'on a etudier Unix, et surtout sachant que le C a été +/- inventé pour cet OS.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1295967
skelter
Posté le 31-01-2006 à 22:15:33  profilanswer
 

Emmanuel > meme question que Joel F, pourquoi -O2 et pas -O3 ? c'est quoi le probleme avec -finline-function ?

n°1295969
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:18:39  profilanswer
 

Et dire que moi j'utilise toujours g++ -Wall -O4 :lol: ... Enfin bon j'apprend encore... :)


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1295975
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:27:33  profilanswer
 

skelter a écrit :

Emmanuel > meme question que Joel F, pourquoi -O2 et pas -O3 ? c'est quoi le probleme avec -finline-function?


disclaimer : je ne suis pas pas spécialiste des options de gcc...

  • -O2 est un compromis entre la recherche d'un -Ox de façon à mettre en oeuvre certains tests supplémentaires (flow control) et - O3 ou -O4 qui n'apportent pas grand chose à part un ralentissement de la compilation...
  • -finline-function essaye d'inliner les fonctions (static) quand c'est possible. (gain de vitesse appréciable)


---------------
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/
n°1295979
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:30:44  profilanswer
 

MEI a écrit :

Et dire que moi j'utilise toujours g++ -Wall -O4 :lol: ... Enfin bon j'apprend encore... :)


Alors apprends ceci :  
 
C et C++ sont des langages différents.  
 
http://david.tribble.com/text/cdiffs.htm
 
Compiler du C avec un compilateur C++ produit du code qui a un comportement indéfini.
 
 


---------------
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/
n°1295981
tyler1207
cowan, basagotia, lenosky...
Posté le 31-01-2006 à 22:31:46  profilanswer
 

y'en a qui vont rire vu le d° de difficulté des questions que je pose mais dans une structure type while j'ai un souci : il n'affiche pas l'incrémentation de i qd j'exécute.  
 
voici le code :  
 

Code :
  1. while ((tab_val[i]!=0)&&(i<99))
  2.  
  3.     {
  4.         i++;
  5.         printf("saisir la ",i," eme valeur :" );
  6.         scanf("%f",&tab_val[i]);
  7.     }

n°1295983
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:33:24  profilanswer
 

A la base je fait du C++, mais bon quand je tombe sur du C je compile avec ce que je connais et/ou ai sous la main, donc cl sous Windows et g++ sous  Linux.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
mood
Publicité
Posté le 31-01-2006 à 22:33:24  profilanswer
 

n°1295984
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:33:34  profilanswer
 

tyler1207 a écrit :

Code :
  1. printf("saisir la ",i," eme valeur :" );



Ouvrir un livre de C d'urgence pour apprendre à utiliser printf()...
 


---------------
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/
n°1295985
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:35:01  profilanswer
 

MEI a écrit :

A la base je fait du C++, mais bon quand je tombe sur du C je compile avec ce que je connais et/ou ai sous la main, donc cl sous Windows et g++ sous  Linux.


Et bien c'est une erreur de croire que le résultat sera le même. Tu es prévenu, tu agis donc en connaissance de cause.
 
Pour éviter ce genre d'embrouilles, tous mes .c ont ceci :  


#ifdef __cplusplus
#error This source file is not C++ but rather C. Please use a C-compiler
#endif


Message édité par Emmanuel Delahaye le 31-01-2006 à 22:36:08

---------------
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/
n°1295986
tyler1207
cowan, basagotia, lenosky...
Posté le 31-01-2006 à 22:35:13  profilanswer
 

si j'en avais un...j'essaye de comprendre en piochant à droite à gauche sur différents sites.

n°1295987
skelter
Posté le 31-01-2006 à 22:36:05  profilanswer
 

Emmanuel Delahaye a écrit :


  • -finline-function essaye d'inliner les fonctions (static) quand c'est possible. (gain de vitesse appréciable)


d'apres la documentation avec l'option -finline-function gcc essaye d'inliner toute fonctions quand c'est possible, c'est juste que si elle est déclaré static (en particulier et aussi si elle n'est pas pointée par un pointeur sans doute) il ne gardera pas le code de la fonction (sauf si option -fkeep-inline-functions)


Message édité par skelter le 31-01-2006 à 22:37:21
n°1295988
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:36:29  profilanswer
 

tyler1207 a écrit :

y'en a qui vont rire vu le d° de difficulté des questions que je pose mais dans une structure type while j'ai un souci : il n'affiche pas l'incrémentation de i qd j'exécute.  
 
voici le code :  
 

Code :
  1. while ((tab_val[i]!=0)&&(i<99))
  2.  
  3.     {
  4.         i++;
  5.         printf("saisir la ",i," eme valeur :" );
  6.         scanf("%f",&tab_val[i]);
  7.     }



 
t'a bien creer le i juste avant le while ?
 
car tu derais avec un truc du genre

Code :
  1. int i = 0;
  2. while (condition)
  3. {
  4.    traitement;
  5.    i++; // Facultatif
  6. }


 
d'ailleurs si tu fait une iteratif, le for est peut-être plus adapté, même si les deux sont +/- equivalent.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1295990
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:39:27  profilanswer
 

Emmanuel Delahaye a écrit :

Ouvrir un livre de C d'urgence pour apprendre à utiliser printf()...


ah ouai :) faudrait fait un truc genre : printf("saisir la %d eme valeur :", i):
non ? enfin j'suis plus exactement sur :D j'l'avais pas vu... Le cout du C++ c'est quand meme plus pratique pour les debutant. :'(


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1295992
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 22:40:51  profilanswer
 

tyler1207 a écrit :

si j'en avais un...j'essaye de comprendre en piochant à droite à gauche sur différents sites.


STOP ! Le langage C n'est pas un langage que l'on apprend "en piochant à droite à gauche sur différents sites." C'est un outil puissant et extrêmement coupant. Si tu veux apprendre le C, il faut mettre les moyens. Il y a des références de livres et de tutoriels sur ce site et sur le mien. Il faut de 3 à 6 mois si on est très doué, la moyenne étant plutôt de 6 à 12.


---------------
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/
n°1295996
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:44:59  profilanswer
 

J'ai l'impression qu'il a un prof qui laisse ses eleves un peu patogé a trouver par eux meme... Donc en gros il est mal barré. :D
 
Car quand même, un cours de programmation sans polycopié définisant precisement la syntaxe, meme si c'est pas une matiere importante dans la formation, c'est abusé.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1295998
tyler1207
cowan, basagotia, lenosky...
Posté le 31-01-2006 à 22:48:22  profilanswer
 

MEI a écrit :

t'a bien creer le i juste avant le while ?
 
car tu derais avec un truc du genre

Code :
  1. int i = 0;
  2. while (condition)
  3. {
  4.    traitement;
  5.    i++; // Facultatif
  6. }


 
d'ailleurs si tu fait une iteratif, le for est peut-être plus adapté, même si les deux sont +/- equivalent.


 
j'ai pas le choix, y faut que j'utilise un tant que (donc un while si je ne m'abuse)
 
pour le int i je l'ai mis au début ac les autres var, pas juste avant le while. On peut le faire ça, déclarer int i juste avt le while en plein code  ?
 

MEI a écrit :

J'ai l'impression qu'il a un prof qui laisse ses eleves un peu patogé a trouver par eux meme... Donc en gros il est mal barré. :D
 
Car quand même, un cours de programmation sans polycopié définisant precisement la syntaxe, meme si c'est pas une matiere importante dans la formation, c'est abusé.


 
non j'ai un poly pour du pseudo code français (qu'on a fait en "intro" au C) mais qui reflète assez mal les spécificités du C je trouve, et concernant le C j'ai en effet pas de poly pour le moment, juste des notes de cours, mais le pb c'est qu'il n'y a que les cas simples, genre, printf("des choses" ) et pas les printf qui comprennent plus de choses.
 le poly viendra mais disons que ça m'intéresse alors je m'avance un peu.

Message cité 1 fois
Message édité par tyler1207 le 31-01-2006 à 22:53:34
n°1296001
MEI
|DarthPingoo(tm)|
Posté le 31-01-2006 à 22:50:33  profilanswer
 

Ouai on peut, je sais pas ce qu'en pensent les routard comme Emmanuel, mais personellement si la variable ne sert que comme un compteur pour la boucle je la meme au dessus pour bien voir que je l'ai declaré.
 
Sinon je sais pas comment tu apprend l'algorithmique donc je peut pas te dire si ton tant que est forcement un while ou peut etre un for.
 


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
n°1296013
Emmanuel D​elahaye
C is a sharp tool
Posté le 31-01-2006 à 23:07:32  profilanswer
 

tyler1207 a écrit :

pour le int i je l'ai mis au début ac les autres var, pas juste avant le while. On peut le faire ça, déclarer int i juste avt le while en plein code  ?


On peut définir une variable à n'importe quel début de bloc. Elle aura une portée limitée à ce bloc.
 
http://mapage.noos.fr/emdel/notes.htm#portee
 
En C99, on peut définir la variable n'importe où, mais je ne recommande pas cette pratique car le code devient difficile à lire et la portée n'est pas claire...


Message édité par Emmanuel Delahaye le 31-01-2006 à 23:34:44

---------------
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/
n°1296046
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 00:15:07  profilanswer
 

pourquoi ce code plante-il qd je rentre un nombre plus grande que 9 ?  
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5.  
  6. {
  7.     int i;
  8.     float tab_val[100];
  9.  
  10.     i = -1;
  11.  
  12.         do
  13.  
  14.         {
  15.             i = i+1;
  16.             printf("saisir la %deme valeur : \n",i);
  17.             scanf("%s",&tab_val[i]);
  18.         }
  19.  
  20.         while (tab_val[i] == 0 || i == 99);
  21.  
  22. }

Message cité 1 fois
Message édité par tyler1207 le 01-02-2006 à 00:18:07
n°1296086
gocho
Posté le 01-02-2006 à 01:35:04  profilanswer
 

essaie donc d'ecrire en francais ce que tu as code :  
Je vais te faire le dernier prog que tu a montre

Code :
  1. faire
  2.    incremente i
  3.    demander la ieme valeur
  4.    la mettre dans tab[i]
  5. tant que tab[i]==0 ou que i==99


Est ce que tu vois pas un probleme dans tes conditions?(a moins que je n'y arrive vraiment plus ce soir [:pingouino]
De plus il y a un probleme dans ton scanf!
Essaie de parcourir au plus le site d'Emmanuel, il est pas mal foutu du tout;)
Tu y trouveras notamment, je crois, que pour scanf il faut respecter les formats (puisque entrée formatée)
Or tu fais scanf avec %s, ce qui suppose une chaine de caracteres alors que tu veux un float
 
edit : voila c'est la http://mapage.noos.fr/emdel/inputs.htm#fun_std, je te conseille d'utiliser fgetc() au lieu de scanf(), c'est plus simple pour commencer


Message édité par gocho le 01-02-2006 à 01:38:48
n°1296104
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 08:43:33  profilanswer
 

tyler1207 a écrit :

pourquoi ce code plante-il <...>?


Comportement indéterminé :  


Compiling: main.c
main.c:6: warning: function declaration isn't a prototype
main.c: In function `main':
main.c:17: warning: char format, float arg (arg 2)
main.c:20: warning: comparing floating point with == or != is unsafe
main.c:22: warning: control reaches end of non-void function
Linking console executable: D:\dev\ed02\cb\ed02.exe
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 4 warnings


---------------
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/
n°1296109
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 08:52:30  profilanswer
 

j'ai changé l'incrémentation de i = i+1 en i++ et également l'erreur du %s et %f (tout en sachant que ce n'est pas ça qui allait corriger le pb des nombres à 2 chiffres)
 
je ne vois pas l'erreur dans les conditions qui amène à ce pb, à moins qu'il ne faille une incrémentation "dynamiqe" qui lorsque je mets un nb à 2 chiffres, incrémente i de 2 et non de 1  :??:  
 
je pense, mais là encore ptet que je dis n'importe quoi, que vu qu'à chaque fois que je rentre un chiffre, il le range dans une case du tableau, qd j'en mets deux ou plus il tente de les mettre dans la même case et bien sûr n'y arrive pas...quoique ça me semble étrange car dans un autre exo, en mettant un tab de caractères de 10 cases, je pouvais y rentrer, en un seul coup 10 caratères .  :??:  
 
pour le scanf, il m'est imposé et je sais m'en servir basiquement, hors erreurs d'inattention.

n°1296118
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 09:14:39  profilanswer
 

tyler1207 a écrit :

j'ai changé l'incrémentation de i = i+1 en i++


Ne change rien.

Citation :

et également l'erreur du %s et %f (tout en sachant que ce n'est pas ça qui allait corriger le pb des nombres à 2 chiffres)


mais ça retire un comportement indéfini, ce qui rend les choses beaucoup plus claires.

Citation :

je ne vois pas l'erreur dans les conditions qui amène à ce pb, à moins qu'il ne faille une incrémentation "dynamiqe" qui lorsque je mets un nb à 2 chiffres, incrémente i de 2 et non de 1  :??:


Le problème que je constate est si on saisie une valeur, on quitte le programme. C'est logique vu la condition de sortie :

 while (tab_val[i] == 0 || i == 99);


 
J'ai entré 1. Au moment du premier test, i vaut 0 et tab_val[i] vaut 1.0.
 

  • Mis à part que ce test ne fonctionne pas sur un flottant, l'expression 'tab_val[i] == 0' retourne donc 0
  • L'expression 'i == 99' retourne aussi 0.  
  • L'expression '0 || 0' retourne donc 0, d'où un 'while(0)', autrement dit, on sort de la boucle.


Il y a donc un problème avec cette expression qu'il faut corriger.


Message édité par Emmanuel Delahaye le 01-02-2006 à 09:15:19

---------------
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/
n°1296151
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 10:20:24  profilanswer
 

merci pour les explications ça m'a bien éclairé sauf sur un point
 
autant il est clair que le i==99 retourne 0 autant je ne saisi pas pourquoi le tab_val[i] == 0 retourne 0 vu qu'on à mis 1 pour i = 0 (enfin , on peut mettre ce qu'on veut comme réel normalement), d'ailleurs je ne sors de la boucle que pour les nombres à deux chiffres ou plus, de 0 à 9 ça passe la boucle continue bien jusqu'à 99 (oui oui j'ai testé  :D )
 
edit : j'oubliais, j'utilise do...while, ce qu'il signifie qu'il fait....tant que.  
 
ce ne serait pas plus simple de faire un faire...jusqu'à ? (si ça existe en C, je n'ai pas trouvé à ce moment)

Message cité 1 fois
Message édité par tyler1207 le 01-02-2006 à 10:22:55
n°1296205
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 11:27:46  profilanswer
 

tyler1207 a écrit :

je ne saisi pas pourquoi le tab_val[i] == 0 retourne 0 vu qu'on à mis 1 pour i = 0


donc tab_val[0] = 1, ok ?
 
donc l'expression est 1 == 0. Que retourne cette expression ? Vrai ou faux ? A mon avis faux, donc 0, non ?
 

Citation :

(enfin , on peut mettre ce qu'on veut comme réel normalement), d'ailleurs je ne sors de la boucle que pour les nombres à deux chiffres ou plus, de 0 à 9 ça passe la boucle continue bien jusqu'à 99 (oui oui j'ai testé  :D )


Tu n'as pas du tester avec le code que j'ai posté.

Citation :

edit : j'oubliais, j'utilise do...while, ce qu'il signifie qu'il fait....tant que.  
 
ce ne serait pas plus simple de faire un faire...jusqu'à ? (si ça existe en C, je n'ai pas trouvé à ce moment)


En C, il n'y a que while, do-while et for. Par rapport à l'expression d'un repeat-until, celle d'un do-while est simplement inversée :

REPEAT
UNTIL expression


est pareil que

DO
WHILE NOT expression


NOT en C, c'est l'opérateur unaire ! .

Message cité 1 fois
Message édité par Emmanuel Delahaye le 01-02-2006 à 11:30:12

---------------
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/
n°1296222
MEI
|DarthPingoo(tm)|
Posté le 01-02-2006 à 11:42:47  profilanswer
 

ouai enfin le DO {...} WHILE (...); est inutile autant ecrire WHILE (...) {...}

n°1296256
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 12:02:24  profilanswer
 

Emmanuel Delahaye a écrit :

donc tab_val[0] = 1, ok ?
 
donc l'expression est 1 == 0. Que retourne cette expression ? Vrai ou faux ? A mon avis faux, donc 0, non ?
 


 
entièrement d'accord maintenant  :jap: jla referai plus.
 

Emmanuel Delahaye a écrit :


Tu n'as pas du tester avec le code que j'ai posté.


 
lequel, le message de GCC qui donne les différentes sources d'erreur et d'indétermination ? si c'est celui-là si je l'ai lu mais y un warning que je ne comprends pas.  
 

Emmanuel Delahaye a écrit :


 
En C, il n'y a que while, do-while et for. Par rapport à l'expression d'un repeat-until, celle d'un do-while est simplement inversée :

REPEAT
UNTIL expression


est pareil que

DO
WHILE NOT expression


NOT en C, c'est l'opérateur unaire ! .


 
ok j'y vois un peu plus clair merci

n°1296271
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 12:11:33  profilanswer
 

MEI a écrit :

ouai enfin le DO {...} WHILE (...); est inutile autant ecrire WHILE (...) {...}


Ce n'est pas le même usage.


while (fgets(...) != NULL)
{
}


 


int err;
 
do
{
   err = get_something_from_some_user (...);
 
   if (!err)
   {
      /* do something smart */
   }
   else
   {
      /* warn the user... */
   }
}
while (err);


---------------
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/
n°1296272
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 12:16:31  profilanswer
 


Oups, je l'ai corrigé selon tes indications et testé, mais j'ai oublié de le poster...


#include <stdio.h>
#include <stdlib.h>
 
int main(void)
 
{
   int i;
   float tab_val[100];
 
   i = -1;
 
   do
   {
      i = i + 1;
      printf("saisir la %deme valeur : \n", i);
      scanf("%f", &tab_val[i]);
   }
   while (tab_val[i] == 0 || i == 99);
 
   return 0;
}



saisir la 0eme valeur :
1
 
Press ENTER to continue.


CQFD...


Message édité par Emmanuel Delahaye le 01-02-2006 à 12:17:25

---------------
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/
n°1296286
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 12:34:48  profilanswer
 

ah y'a besoin d'un pointeur qd on utilise des %f aussi ?
 
selon ce que notre prof nous a dit il n'y en avait besoin que pour les chaines ...

n°1296288
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 12:40:26  profilanswer
 

tyler1207 a écrit :

ah y'a besoin d'un pointeur qd on utilise des %f aussi ?


Avec scanf() et "%f", oui, l'adresse d'un float, comme l'indique ton livre de C...

Citation :

selon ce que notre prof nous a dit il n'y en avait besoin que pour les chaines ...


Il n'y en pas besoin pour le chaines, car :

  • "%s" attend l'adresse d'un char
  • une chaine est un tableau de char qui retourne l'adresse de son premier élément.

Si ton prof t'a vraiment dit ça, il est bon pour le miel et les fourmis rouges... Peut être que tu as mal compris/noté ? Ca arrive aussi...


---------------
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/
n°1296293
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 12:44:02  profilanswer
 

entièrement d'accord, j'ai peut-être mal compris et noté car je l'ai écris et me suis fais corriger une telle faute par lui. c'est ptet moi !
 
je l'ai cette aprem, donc je lui demanderai et je verai bien  :)

n°1297022
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 21:53:07  profilanswer
 

réponse de mon prof : dans un scanf on met trjs un pointeur, quel que soit le type de donnée (%d, %f, %c, %s) mais par contre le seul type de donnée qui nécessite un pointeur hors d'un scanf est le %s.  
 
voilà ce qu'il en sort.
 
sinon pourquoi ce code quitte après la saisie des 10 noms, prénoms et notes ? il faut que j'affiche toutes les données arpès les avoir rentré (ce qu'est censé faire le dernier for) :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int tab_age[10];
  7.     char tab_info[10][2][25];
  8.     int i;
  9.  
  10.     for (i = 0 ; i < 10 ; i++)
  11.  
  12.     {
  13.         printf("saisir le %d eme nom\n", i+1);
  14.         scanf("%s", &tab_info[i][0][0]);
  15.         printf("saisir le %d eme prenom\n", i+1);
  16.         scanf("%s", &tab_info[i][1][0]);
  17.         printf("saisir le %d eme age\n", i+1);
  18.         scanf("%d", &tab_age[i]);
  19.  
  20.     }
  21.  
  22.     for (i = 0 ; i < 10 ; i++)
  23.  
  24.     {
  25.         printf( "%s %s a %d ans",&tab_info[i][0][0], &tab_info[i][1][0], tab_age[i]);
  26.     }
  27.  
  28.  
  29.     return 0;

n°1297030
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 22:05:51  profilanswer
 

tyler1207 a écrit :

sinon pourquoi ce code quitte après la saisie des 10 noms, prénoms et notes ? il faut que j'affiche toutes les données arpès les avoir rentré (ce qu'est censé faire le dernier for) :


A part le manque de '\n', c'est correct, mais niveau conception, c'est un peu atroce. Pourquoi tu n'utilises pas un tableau de structures ?
 
Et puis pourquoi passer l'adresse du premier élément des tableaux :  

&tab_info[i][0][0]


c'est un peu lourd, non ? Le nom du tableau suffit avec l'indexage qui va bien:  

tab_info[i][0]

Message cité 1 fois
Message édité par Emmanuel Delahaye le 01-02-2006 à 22:11:58

---------------
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/
n°1297035
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 22:09:54  profilanswer
 

ben je n'ai pas le droit d'après l'énnoncé de l'éxo.  
 
est-ce vraiment correct ? car après la saisie, le printf qui devrait m'afficher tout ce que j'ai rentré ne m'affiche rien, je quitte la boucle prématurément  :??:
 
edit : j'ai goûté aux joies des différences de versions ajd en tp... y'a une vieille v3..3 de lcc qui traine là-bas alors que j'ai fait tout mon boulot sur du 4.0.
résultat, des prj qui ne s'importent pas tant qu'il ne sont pas ds le même répertoire que le projet en cours, l'obligation de créer un dossier par projet (bon ça je dis pas, c'est mieux niveau rigueur) etc...
 

Emmanuel Delahaye a écrit :


 
Et puis pourquoi passer l'adresse du premier élément des tableaux :  

&tab_info[i][0][0]


c'est un peu lourd, non ? Le nom du tableau suffit avec l'indexage qui va bien:  

tab_info[i][0]



 
ben c'est un conseil de mon prof pour que le code sache "où" commencer à écrire les caratères du nom ou prénom.

Message cité 1 fois
Message édité par tyler1207 le 01-02-2006 à 22:16:45
n°1297041
Emmanuel D​elahaye
C is a sharp tool
Posté le 01-02-2006 à 22:15:03  profilanswer
 

tyler1207 a écrit :

est-ce vraiment correct ? car après la saisie, le printf qui devrait m'afficher tout ce que j'ai rentré ne m'affiche rien, je quitte la boucle prématurément  :??:


 
Ceci fonctionne (3 saisies, je n'ai pas la patience). Attention à ne pas déborder, il n'y a aucun contrôle. (scanf(utilisé comme ça, c'est de la folie...)


#include <stdio.h>
#include <stdlib.h>
 
#define N 3
 
int main (void)
{
   int tab_age[N];
   char tab_info[N][2][25];
   int i;
 
   for (i = 0 ; i < N ; i++)
   {
      printf("saisir le %d eme nom\n", i + 1);
      scanf("%s", tab_info[i][0]);
      printf("saisir le %d eme prenom\n", i + 1);
      scanf("%s", tab_info[i][1]);
      printf("saisir le %d eme age\n", i + 1);
      scanf("%d", tab_age + i);
   }
 
   for (i = 0 ; i < N ; i++)
   {
      printf( "%s %s a %d ans\n", tab_info[i][0], tab_info[i][1], tab_age[i]);
   }
 
   return 0;
}

Message cité 1 fois
Message édité par Emmanuel Delahaye le 01-02-2006 à 22:16:00

---------------
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/
n°1297043
tyler1207
cowan, basagotia, lenosky...
Posté le 01-02-2006 à 22:18:47  profilanswer
 

Emmanuel Delahaye a écrit :

Ceci fonctionne (3 saisies, je n'ai pas la patience). Attention à ne pas déborder, il n'y a aucun contrôle. (scanf(utilisé comme ça, c'est de la folie...)
 


 
sans doute, mais c'est la seule façon qu'on connaisse pour le moment pour saisir des données. je ne connais pas les tenants et les aboutissants en fait...

n°1297046
Sve@r
Posté le 01-02-2006 à 22:27:41  profilanswer
 

gocho a écrit :

Si tu veux le prototype complet c'est meme

Code :
  1. int main (int argc, char * argv[])



Non,le prototype complet c'est

Code :
  1. int main (int argc, char *argv[], char *envp[])

[:aloy]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
Débutant...Structure & Actualisation d'un site ? a votre avis ?
clé sympa du registre (debutant)gro gro debutant cherche topic
commande registre windows (debutant ) :)Pblme de connexion à la BDD (gros débutant...)
HYPER DEBUTANT Page Web très très simplifiémodifier le registre windows en batch ( debutant )
Maintien rapide aisée d'une arborescence : quelle structure choisir ?Question de débutant
Plus de sujets relatifs à : structure if - else (débutant)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR