[C} DO...While + un condition

[C} DO...While + un condition - C - Programmation

Marsh Posté le 14-12-2005 à 21:54:05    

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main (void)
  5. {
  6.     int essai = 0;
  7.     int rep;
  8.         srand ((unsigned) time (NULL));
  9.         rand();/* ignorer le premier tirage */
  10. /*1*/
  11.             do
  12.             {
  13.                 int nb1 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  14.                 int nb2 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  15.                 int nb3 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  16.                 int nb4 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  17.                 int nb5 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  18.                 printf ("\n%d %d %d %d %d ", nb1, nb2, nb3, nb4, nb5);
  19.                 if (((nb1)==(nb2))&&((nb2)==(nb3))&&((nb3)==(nb4))&&((nb4)==(nb5)))
  20.                 {
  21.                 printf("\nYAmmm !!\n\n" );
  22.                 essai=(essai+1);
  23.                 getch();
  24.                 }
  25.                 else
  26.                 {
  27.                 printf("\nreesaye.\n\n" );
  28.                 essai=(essai+1);
  29.                 getch();
  30.                 }
  31. /*2*/
  32.                 printf("voulez vous recommencer (1=yes)(0=non) ?" );
  33.                 scanf("%d",&rep);
  34.             }while ((rep!=0));
  35.     return 0;
  36. }


 
 
 
je voudrais savoir comment on peut faire pour que de 1 à 2 cela s'exectue plusieur fois avant de me demander si je veux continuer ...
 
j'ai pensé a sa mais sa ne marche pas .. (la premiere fois si parfaitement mais la snd ne sarrete plus c'est a dire qu'il me demande un fois si je ve continuer puis il ne me le demande plus ..)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main (void)
  5. {
  6.     int essai = 0;
  7.     int rep;
  8.         srand ((unsigned) time (NULL));
  9.         rand();/* ignorer le premier tirage */
  10.             do
  11.             {
  12.                 int nb1 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  13.                 int nb2 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  14.                 int nb3 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  15.                 int nb4 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  16.                 int nb5 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  17.                 printf ("\n%d %d %d %d %d ", nb1, nb2, nb3, nb4, nb5);
  18.                 if (((nb1)==(nb2))&&((nb2)==(nb3))&&((nb3)==(nb4))&&((nb4)==(nb5)))
  19.                 {
  20.                 printf("\nYAmmm !!\n\n" );
  21.                 essai=(essai+1);
  22.                 getch();
  23.                 }
  24.                 else
  25.                 {
  26.                 printf("\nreesaye.\n\n" );
  27.                 essai=(essai+1);
  28.                 getch();
  29.                 }
  30.                 printf("voulez vous recommencer (1=yes)(0=non) ?" );
  31.                 scanf("%d",&rep);
  32.             }while ((rep!=0));
  33.     return 0;
  34. }


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 21:54:05   

Reply

Marsh Posté le 14-12-2005 à 21:56:16    

peut etre avec switch ??
 
la nuit porte conseil (il parait ..) je verrais demain en tout cas si vous
avez pas besoin de dormir pour voir une solution merci d'avance ..


---------------
signature du message
Reply

Marsh Posté le 14-12-2005 à 23:05:56    


Bouh que c'est pas beau... C'est quoi ce délire avec les () ?


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int main (void)
{
   int essai = 0;
   int rep;
 
   srand ((unsigned) time (NULL));
   rand(); /* ignorer le premier tirage */
 
   do
   {
      int nb[5];
      size_t i;
 
      for (i = 0; i < sizeof nb / sizeof *nb; i++)
      {
         nb[i] = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
      }
 
      for (i = 0; i < sizeof nb / sizeof *nb; i++)
      {
         printf ("%3d", nb[i]);
      }
      printf ("\n" );
 
      {
         int eq = 1;
 
         for (i = 1; eq && i < sizeof nb / sizeof *nb; i++)
         {
            eq = nb[0] == nb[i];
         }
 
         if (eq)
         {
            printf("\nYAmmm !!\n\n" );
         }
         else
         {
            printf("\nTry again ...\n\n" );
            essai++;
         }
      }
 
      printf("Play again [y/n] ?" );
 
      {
         char s[3];
         fgets(s, sizeof s, stdin);
         rep = *s;
      }
 
   }
   while (rep != 'n');
 
   return 0;
}


Pose des questions si tu ne comprends pas...

Citation :

je voudrais savoir comment on peut faire pour que de 1 à 2 cela s'exectue plusieur fois avant de me demander si je veux continuer ...


Une boucle...

Citation :

j'ai pensé a sa mais sa ne marche pas .. (la premiere fois si parfaitement mais la snd ne sarrete plus c'est a dire qu'il me demande un fois si je ve continuer puis il ne me le demande plus ..)


Un problème probablement dû au mauvais choix de la fonction de saisie. Corrigé ci-dessus. Détails ici :  
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers

Message cité 1 fois
Message édité par Emmanuel Delahaye le 14-12-2005 à 23:07:09

---------------
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 15-12-2005 à 09:49:52    

Hum... moi j'ai juste une question sur la ligne

        nb[i] = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);


 
Tous ces cast sont-ils vraiment nécessaires ? Dans une opération mathématique, l'ensemble des opérandes est converti dans la valeur de l'opérande le plus fort. Alors je pense qu'elle peut être avantageusement remplacée par la ligne suivante:

        nb[i] = (int) (rand() / (RAND_MAX + 1.0) * 10);


 
Non ???

Reply

Marsh Posté le 15-12-2005 à 12:12:55    

salut je pouvais pas me connecter alors j'ai plancher la dessus et j'ai trouver exactement ce que je cherchais
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main (void)
  5. {   
  6. int rep;
  7.     do
  8.     {
  9.         int essai = 0;
  10.         srand ((unsigned) time (NULL));
  11.         rand();       
  12.             do
  13.             {
  14.                 int nb1 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  15.                 int nb2 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  16.                 int nb3 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  17.                 int nb4 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  18.                 int nb5 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  19.                 printf ("\n%d %d %d %d %d ", nb1, nb2, nb3, nb4, nb5);
  20.                 if (((nb1)==(nb2))&&((nb2)==(nb3))&&((nb3)==(nb4))&&((nb4)==(nb5)))
  21.                 {
  22.                 printf("              YAmmm !!\n\n" );
  23.                 essai=(essai+1);
  24.                 getch();
  25.                 }
  26.                 else
  27.                 {
  28.                 printf("              reesaye.\n\n" );
  29.                 essai=(essai+1);
  30.                 getch();
  31.                 }
  32.             }while ((essai!=5));
  33. printf("voulez vous recommencer (1=yes)(0=non) ?" );
  34. scanf("%d",&rep);
  35.     }while (rep != 0);
  36.    
  37.     return 0;
  38. }


 
enfaite ton code fais la meme chose que si je suppprime le premier do...while et que j'insere la question dans le 2eme.. seulement je n'ai qu'un essaie (ou 2 de ta facon ..)


Message édité par magiclazy le 15-12-2005 à 12:14:16

---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 12:14:19    

Dans ce cas-là tu ferais mieux d'utiliser une boucle for(;;)


Message édité par Elmoricq le 15-12-2005 à 12:14:34
Reply

Marsh Posté le 15-12-2005 à 12:21:35    

est ce que tu peux detailler pour quoi il faudrait mieux ?
 
ps: apres avoir lu ton code j'ai améliorer le mien
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main (void)
  5. {
  6. int rep;
  7. char s[3];
  8.     do
  9.     {
  10.         int essai = 0;
  11.         srand ((unsigned) time (NULL));
  12.         rand();
  13.             do
  14.             {
  15.                 int nb1 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  16.                 int nb2 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  17.                 int nb3 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  18.                 int nb4 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  19.                 int nb5 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  20.                 printf ("\n%d %d %d %d %d ", nb1, nb2, nb3, nb4, nb5);
  21.                 if (((nb1)==(nb2))&&((nb2)==(nb3))&&((nb3)==(nb4))&&((nb4)==(nb5)))
  22.                 {
  23.                 printf("              YAmmm !!\n\n" );
  24.                 essai=(essai+1);
  25.                 getch();
  26.                 }
  27.                 else
  28.                 {
  29.                 printf("              reesaye.\n\n" );
  30.                 essai=(essai+1);
  31.                 getch();
  32.                 }
  33.             }while ((essai!=5));
  34. printf("voulez vous recommencer (y=yes)(n=non) ?" );
  35. fgets(s, sizeof s, stdin);
  36. rep = *s;
  37.     }while (rep != 'n');
  38.     return 0;
  39. }


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 12:42:31    

comme sa tu veux dire avec for(;;)
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main (void)
  5. {
  6. int rep;
  7. char s[3];
  8.     do
  9.     {
  10.         int essai = 0;
  11.         srand ((unsigned) time (NULL));
  12.         rand();
  13.             for (essai=0;essai!=5;essai+1)
  14.             {
  15.                 int nb1 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  16.                 int nb2 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  17.                 int nb3 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  18.                 int nb4 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  19.                 int nb5 = (int) ((double)rand() / ((double)RAND_MAX + 1) * 10);
  20.                 printf ("\n%d %d %d %d %d ", nb1, nb2, nb3, nb4, nb5);
  21.                 if (((nb1)==(nb2))&&((nb2)==(nb3))&&((nb3)==(nb4))&&((nb4)==(nb5)))
  22.                 {
  23.                 printf("              YAmmm !!\n\n" );
  24.                 essai=(essai+1);
  25.                 getch();
  26.                 }
  27.                 else
  28.                 {
  29.                 printf("              reesaye.\n\n" );
  30.                 essai=(essai+1);
  31.                 getch();
  32.                 }
  33.             }
  34. printf("voulez vous recommencer (y=yes)(n=non) ?" );
  35. fgets(s, sizeof s, stdin);
  36. rep = *s;
  37.     }while (rep != 'n');
  38.     return 0;
  39. }


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 12:48:44    

magiclazy a écrit :

est ce que tu peux detailler pour quoi il faudrait mieux ?


Tu as écris ceci :

int essai = 0;
do
{
   ...
   if ( ...)
   {
      essai = (essai + 1);
   }
   else
   {
      essai = (essai + 1);
   }
} while ((essai != 5));


 
Je te propose de l'écrire comme ceci :

int essai;
for( essai = 0; essai < 5; essai++ )
{
   ...
   if ( ... )
   {
      ...
   }
   else
   {
      ...
   }
}


 
(ceci hors considérations de simple logique, parce qu'avec ce que tu as écris, on est bon pour 5 essais, même si on gagne)
 

magiclazy a écrit :

ps: apres avoir lu ton code j'ai améliorer le mien


 
1. c'était celui d'Emmanuel, pas le mien
2. ça m'étonnerait que tu l'aies lu. Exemple : c'est quoi ton délire avec les parenthèses ? :??:
 
Pourquoi tu écris des trucs aussi laids que : essai = (essai + 1) ?!
"essai = essai + 1" ne te convient pas ? (sans compter les syntaxes facilitantes, comme "essai += 1" ou encore "essai++" )
 
De même, pourquoi répéter les mêmes instructions dans la partie "else" d'un if au final ? Autant n'écrire ces instructions qu'une seule fois, en dehors du if. C'est de la simple logique.


Message édité par Elmoricq le 15-12-2005 à 12:51:35
Reply

Marsh Posté le 15-12-2005 à 12:52:54    

ok merci


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 12:52:54   

Reply

Marsh Posté le 15-12-2005 à 12:53:40    

ps: je cherche des tutos pour utiliser des commandes comme fopen ()parceque j'ai un peu du mal avec les man voila

Message cité 2 fois
Message édité par magiclazy le 15-12-2005 à 13:06:45

---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 12:56:11    

creat() étant une fonction POSIX (comprendre : unixoïdes), je te suggère d'utiliser fopen(), qui est standard.
 
creat() n'est utile que pour créer un fichier vide avec des droits Unix particuliers.

Reply

Marsh Posté le 15-12-2005 à 13:01:49    

oki merci


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 13:03:42    

magiclazy a écrit :

ps: je cherche des tutos pour utiliser des commandes comme creat ()parceque j'ai un peu du mal avec les man voila


 
http://fr.lang.free.fr/cours/Fichiers_Csyst_v1.0.pdf

Reply

Marsh Posté le 15-12-2005 à 13:06:20    

merci c'est exactement sa sauf que moi je suis sous win ..
 
[EDIT] donc c'est pas creat() mais fopen() par exemple ..

Message cité 1 fois
Message édité par magiclazy le 15-12-2005 à 13:07:16

---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 13:20:10    

magiclazy a écrit :

merci c'est exactement sa sauf que moi je suis sous win ..


Ah ? Tu as parlé de "man" donc je t'ai cru sous Unixlike
 
http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf => il y a un gros chapitre sur les fonctions de la bibliothèque standard et un sous-chapitre concernant les fichiers
 
 

Reply

Marsh Posté le 15-12-2005 à 13:28:23    

parfait merci beaucoup
 
[EDIT]P130 est ce que tu peux me donner un exemple pour (par exemple) ouvre aa.txt dans C:\ ?
         merci d'avance


Message édité par magiclazy le 15-12-2005 à 13:36:48

---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 13:37:57    

magiclazy a écrit :

ps: je cherche des tutos pour utiliser des commandes comme fopen ()parceque j'ai un peu du mal avec les man voila


 
 
Sinon tu a aussi les pages du sieur Delahaye qui sont pas mal faites je trouve (enfin elles m'ont deja servies [:petrus75]...)
Pour fopen() c'est dans le 2e lien  


 
 

Reply

Marsh Posté le 15-12-2005 à 13:41:07    

effectivement c assez pratique les exemples ..merci


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 14:02:55    

un petit truc quelqun aurait un tuto ou autre pour exiplequer comment lire et utiliser ceci (en autre)
 
int printf (const char *format, ...);  
int fprintf (FILE *stream, const char *format, ...);  
int sprintf (char *str, const char *format, ...);  
int snprintf (char *str, size_t size, const char *format, ...);
 
parceque je ne sais j'amais pas quoi remplacer ..
 
merci


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 14:15:53    

http://www.linux-france.org/articl [...] ntf-3.html
 
Pour avoir ce genre d'infos, dans google tu tapes "man nomdelafonction" et ca va te donner les man correspondants.Meme si t'es pas copain avec l'anglais ya 99% de chances qu'il y en ait une en francais  ;)

Reply

Marsh Posté le 15-12-2005 à 14:30:19    

magiclazy a écrit :

un petit truc quelqun aurait un tuto ou autre pour expliquer comment lire et utiliser ceci (en autre)
 
int printf (const char *format, ...);  
int fprintf (FILE *stream, const char *format, ...);  
int sprintf (char *str, const char *format, ...);  
int snprintf (char *str, size_t size, const char *format, ...);
 
parceque je ne sais j'amais pas quoi remplacer ..
 
merci


 
Non. Il y a des limites au tuto. Si tu sais pas ce qu'est un "const char *format" ou un "FILE *stream", alors le seul tuto valable c'est de recommencer au tout début de l'apprentissage du C et essayer de retrouver l'info que t'as sautée ce jour là...

Reply

Marsh Posté le 15-12-2005 à 14:54:50    

magiclazy a écrit :

un petit truc quelqun aurait un tuto ou autre pour exiplequer comment lire et utiliser ceci (en autre)


Il est temps de suivre un vrai cours de C...
 
http://www-clips.imag.fr/commun/be [...] NSI_C.html


---------------
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 15-12-2005 à 16:39:29    

super merci c'est exactement ce qu'il me fallait


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 22:28:51    

juste un ptit truc parceque je vais pas ouvrir un topic pour sa  
comment lancer par exemple netstats -a depuis mon prog en c et enregistrer le resultat dans un txt ?


---------------
signature du message
Reply

Marsh Posté le 15-12-2005 à 23:28:59    

magiclazy a écrit :

juste un ptit truc parceque je vais pas ouvrir un topic pour sa  
comment lancer par exemple netstats -a depuis mon prog en c et enregistrer le resultat dans un txt ?


 

system("netstats -a >fic.txt" )


ou bien

FILE *fin;
FILE *fout;
int c;
fin=popen("netstats -a", "r" );
fout=fopen("fic.txt", "w" );
while ((c=fgetc(fin)) != EOF)
    fputc(c, fout);
fclose(fout);
pclose(fin);


Message édité par Sve@r le 17-12-2005 à 19:39:17
Reply

Marsh Posté le 16-12-2005 à 06:48:13    

Si tu veux faire ça à la mano (ce qui est à la fois instructif et plus efficace que les deux solutions ci-dessus), ça se passe comme ça :

Code :
  1. #include <sys/types.h>
  2. #include <sys/wait.h>
  3. #include <fcntl.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. int
  8. main()
  9. {
  10.         pid_t p;
  11.         int rc, fd;
  12.         p = fork();
  13.         if (p == -1) {
  14.                 perror("fork" );
  15.                 exit(1);
  16.         }
  17.         if (p) { /*** Parent process ***/
  18.                 wait(&rc);
  19.         } else { /*** Child process ***/
  20.                 /* Open/create output file */
  21.                 fd = open("netstat.out", O_WRONLY | O_CREAT, 00644);
  22.                 if (fd == -1) {
  23.                         perror("open" );
  24.                         exit(1);
  25.                 }
  26.                 /* Redirect stdout to output file */
  27.                 rc = dup2(fd, 1);
  28.                 if (rc == -1) {
  29.                         perror("dup2" );
  30.                         exit(1);
  31.                 }
  32.                 /* Exec netstat -a --inet */
  33.                 execl("/bin/netstat", "netstat", "-a", "--inet", NULL);
  34.                 perror("execl" );
  35.                 exit(1);
  36.         }
  37.         /*** Parent process ***/
  38.         return 0;
  39. }


Message édité par matafan le 16-12-2005 à 06:48:39
Reply

Marsh Posté le 16-12-2005 à 06:51:36    

Il parle de netstat sous Windows.

Reply

Marsh Posté le 16-12-2005 à 15:28:08    

Fallait le dire... Y'a popen() sous windows ?

Reply

Marsh Posté le 16-12-2005 à 15:33:39    

sv@er PARFAIT merci bcp


---------------
signature du message
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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