Pb d'algo langage C

Résolu/Fermé
Fabrice - 29 nov. 2009 à 13:32
Emmanuel Delahaye Messages postés 106 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 - 29 nov. 2009 à 23:33
Bonjour,
Je suis actuellement en école d'ingé d'informatique et l'on me demande de me pencher sur le langage C, mais étant porté sur le réseau, mes connaissance sur la programmation ne sont pas équivalentes à celle d'un cheval:)
On me demande d'écrire un algorithme en langage C qui doit:
- Prendre 10 nombre au hasard compris entre 0 et 99
- Ensuite ces 10 nombres doivent être rangé d'un un tableau dans l'ordre croissant.

Personnellement je m'arrache les cheveux pour que ça marche mais sans résultat, si une âme sensible pouvait venir en aide à mon petit esprit, je serais vraiment reconnaissant.

\* j'utilise Dev C++ *\

Cordialement,

Fabrice

voici mon code :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int tableau();
int min_tableau();
int tri_selectif();
int tab[10];

int main()
{
tableau();
tri_selectif();
return 0;
}

int tableau()
{
int i;
srand((unsigned)time(NULL));
printf("Voici dix nombres tires au hasard compris entre 0 et 99 :\n");

for(i = 0; i < 10; i++)
{
tab[i]= rand() % 100;
printf("%d\t", tab[i]);
}
getchar();

return 0;
}

int min_tableau()
{
int j, g, min;
min = g;
j = g+1;

while (j<10)
{
if (tab[j] <= tab[min])
{
min=tab[j];
}
j++;
}
return(min);
}

int tri_selectif()
{
printf(" Voici maintenant les 10 nombres tries dans l'ordre croissant:\n");
int k, min, g;
do
{
min_tableau();
if (tab[min] != g)
{
k = tab[g];
tab[g] = tab[min];
tab[min] = k;
}
printf("%d\t",tab[g]);
g=g+1;
}
while(g<10);
getchar();
return 0;
}

8 réponses

Bonjour,

Je veux bien t'aider, je croit m'y connaitre pour les nombres en C/C++.

J'ai essayé ton programme, apparemment le problème est pour les classer.

Je vais essayer, si j'y arrive, je te passerai le code ici.

Au revoir peut-être...
Bilow
0
Très bien,
J'attendw avec impatience :)

Cordialement,

Fabrice
0
Emmanuel Delahaye Messages postés 106 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
29 nov. 2009 à 14:55
Déjà, les commentaires, c'est /* */ et non \* *\ !
int tableau();
int min_tableau();
int tri_selectif();

Il n'est pas utile de séparer les prototypes ici. (il suffit de définir les fonctions avant de les utiliser). Mais si tu y tiens, fait le bien. Cette forme n'est pas un prototype. Si il n'y a pas de paramètres, il faut mettre void :
int tableau(void);
int min_tableau(void);
int tri_selectif(void);


ceci dit, tu utilises une variable globale injustifiée (pour faire simple, c'est mal...).

Il suffit de définir le tableau dans main() et de le passer à la fonction. Les prototypes des fonctions doivent être modifiées en conséquence :

http://www.bien-programmer.fr/notes.php#param_tab

Je rappelle qu'une variable locale (définie dans une fonction sans le mot-clé 'static'), n'est pas initialisée par défaut. sa valeur est donc indéterminée.

Ceci :
{
   int j, g, min;
   min = g;

a donc un comportement indéterminé (lecture d'une variable 'g' dont la valeur n'a jamais été affectée).

Je rappelle aussi qu'en C90, on a pas le droit de définir une variable après une instruction, sauf si c'est en début de bloc :
Ceci est incorrect :
{
   printf
      (" Voici maintenant les 10 nombres tries dans l'ordre croissant:\n");
   int k, min, g;

mais celà est OK :
{
   printf
      (" Voici maintenant les 10 nombres tries dans l'ordre croissant:\n");
   {
      int k, min, g;


'tableau()' est un nom peu clair pour une fonction. Ici, je dirais plutôt 'remplir_tableau()'.

Je propose donc de repartir sur ce code :
/* j'utilise Dev C++ */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

static int min_tableau (int tab[])
{
   int j, g, min;
   min = g;
   j = g + 1;

   while (j < 10)
   {
      if (tab[j] <= tab[min])
      {
         min = tab[j];
      }
      j++;
   }
   return (min);
}

static int tri_selectif (int tab[])
{
   printf
      (" Voici maintenant les 10 nombres tries dans l'ordre croissant:\n");
   {
      int k, min, g;

      do
      {
         min_tableau (tab);
         if (tab[min] != g)
         {
            k = tab[g];
            tab[g] = tab[min];
            tab[min] = k;
         }
         printf ("%d\t", tab[g]);
         g = g + 1;
      }
      while (g < 10);
   }
   getchar ();
   return 0;
}

static int remplir_tableau (int tab[])
{
   int i;

   printf ("Voici dix nombres tires au hasard compris entre 0 et 99 :\n");

   for (i = 0; i < 10; i++)
   {
      tab[i] = rand () % 100;
      printf ("%d\t", tab[i]);
   }
   getchar ();

   return 0;
}

int main (void)
{
   int tab[10];

   srand ((unsigned) time (NULL));

   remplir_tableau (tab);
   tri_selectif (tab);
   return 0;
}

Qui présente ces défauts :

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `min_tableau':
C:\dev\hello\main.c:9: warning: 'g' might be used uninitialized in this function
C:\dev\hello\main.c: In function `tri_selectif':
C:\dev\hello\main.c:29: warning: 'min' might be used uninitialized in this function
C:\dev\hello\main.c:29: warning: 'g' might be used uninitialized in this function
Output size is 21.01 KB
Process terminated with status 0 (0 minutes, 0 seconds)
0 errors, 3 warnings

A toi maintenant de les corriger en donnant une valeur initiale correcte aux variables incriminées.

Nota : Dev-C++ est obsolète (développement abandonné). Je recommande l'usage de Code::Blocks.

http://www.codeblocks.org/
0
Merci bien pour ta proposition. J'ai effectivement essayé de me rapprocher de ta proposition mais sans succès. Je voudrais te proposer une solution qui est certes quasiment identique au mien (c'est celui d'un camarade de classe) à la seule différence, c'est que le sien fonctionne à merveille.

Sinon, en ce qui concerne CodeBlocks, je l'ai mais j'ai quelque problème avec.

voici le code :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int init_tab();
int minimum();
int tri_selectif();
int T[10];
int G,min;



int main()
{
init_tab();
tri_selectif();
return 0;
}




int init_tab()
{
int i;
srand((unsigned)time(NULL));
printf("Voici dix nombres tires au hasard compris entre 0 et 99 :\n");

for(i = 0; i < 10; i++)
{
T[i]= rand() % 100;
printf("%d\t", T[i]);
}

return 0;
}





int minimum()
{
int j;
min = G;
for(j=G+1;j<10;j++) if (T[j]<T[min]) min=j;
return 0;
}





int tri_selectif()
{
printf("\nLa liste maintenant rangee en ordre croissant :\n");
int tamp;
do
{
minimum();
if (min!=G)
{
tamp=T[G];
T[G]=T[min];
T[min]=tamp;
}
printf("%d\t",T[G]);
G=G+1;
}
while(G<10);
getchar();
return 0;
}
0
Emmanuel Delahaye Messages postés 106 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
29 nov. 2009 à 18:15
Je me demande pourquoi je perds mon temps à expliquer les choses ...

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c:5: warning: function declaration isn't a prototype
C:\dev\hello\main.c:6: warning: function declaration isn't a prototype
C:\dev\hello\main.c:7: warning: function declaration isn't a prototype
C:\dev\hello\main.c:14: warning: function declaration isn't a prototype
C:\dev\hello\main.c:24: warning: function declaration isn't a prototype
C:\dev\hello\main.c:43: warning: function declaration isn't a prototype
C:\dev\hello\main.c:55: warning: function declaration isn't a prototype
C:\dev\hello\main.c: In function `tri_selectif':
C:\dev\hello\main.c:57: warning: ISO C90 forbids mixed declarations and code
Output size is 21.03 KB
Process terminated with status 0 (0 minutes, 1 seconds)
0 errors, 8 warnings


Sinon, tu utilises des globales qui simplifient en apparence le codage, mais dont l'usage est à proscrire pour de nombreuses raisons. Il faut utiliser les paramètres, la valeur retournée etc.

Ceci est correct :
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int init_tab (int T[])
{
   int i;

   printf ("Voici dix nombres tires au hasard compris entre 0 et 99 :\n");

   for (i = 0; i < 10; i++)
   {
      T[i] = rand () % 100;
      printf ("%d\t", T[i]);
   }

   return 0;
}

int minimum (int T[], int G)
{
   int j;
   int min = G;
   for (j = G + 1; j < 10; j++)
      if (T[j] < T[min])
         min = j;
   return min;
}

int tri_selectif (int T[])
{
   int G = 0;

   printf ("\nLa liste maintenant rangee en ordre croissant :\n");
   do
   {
      int min = minimum (T, G);
      if (min != G)
      {
         /* swap */
         int tmp = T[G];
         T[G] = T[min];
         T[min] = tmp;
      }
      printf ("%d\t", T[G]);
      G = G + 1;
   }
   while (G < 10);
   getchar ();
   return 0;
}

int main (void)
{
   int T[10];
   srand ((unsigned) time (NULL));
   init_tab (T);
   tri_selectif (T);
   return 0;
}

pose des questions si tu ne comprends pas.
0

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

Posez votre question
A vrai dire, je n'ai pas trop compris tes explications, mais cela m'a quand même permis d'avancer.
Je ne vais donc pas te prendre du temps plus longtemps.
Encore merci.

Cordialement,

Fabrice HY
0
Bonjour,

Je cherche toujours une solution, ne décourage pas.
J'espère que ton travail n'st pas pour tout de suite...

Au revoir.
0
Bonsoir Bilow,

Ne te prend plus la tête car j'ai finis par réussir à surpasser ce pb, mon algo marche:)
Bonne soirée,
Fabrice

je te donne le code final:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int remplir_tableau(void);
int min_tableau(void);
int tri_selectif(void);
int tab[10];
int g, min;


int main(void)
{
remplir_tableau();
min_tableau();
tri_selectif();

return 0;
}





int remplir_tableau()
{
int i;
srand((unsigned)time(NULL));
printf("Voici dix nombres tires au hasard compris entre 0 et 99 :\n");

for(i = 0; i < 10; i++)
{
tab[i]= rand() % 100;
printf("%d\t", tab[i]);
}

return 0;
}






int min_tableau()
{
int j;
min = g;
j = g+1;

while (j<10)
{
if (tab[j] < tab[min])
{
min=j;
}
j++;
}
return(min);
}







int tri_selectif()

{
printf("\nVoici maintenant les 10 nombres tries dans l'ordre croissant:\n");
int k;
do
{
min_tableau();
if (tab[min] != g)
{
k = tab[g];
tab[g] = tab[min];
tab[min] = k;
}
printf("%d\t",tab[g]);
g=g+1;
}
while(g<10);
getchar();
return 0;
}
0
nouditaa Messages postés 1 Date d'inscription dimanche 29 novembre 2009 Statut Membre Dernière intervention 29 novembre 2009
29 nov. 2009 à 21:09
bonsoir,
je suis débutante en langage C! et je trouve des difficulté à résoudre les exercices parce que c'est du nouveau pour moi! svp aidez moi a résoudre cet exo: ecrire un programme qui lit 2 entiers a et b , ensuite il les échange de telle sorte qu'on aie toujours a<b!
merci d'avance =)
0
Emmanuel Delahaye Messages postés 106 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
29 nov. 2009 à 23:33
Nouditaa,

Il ne faut pas squatter une discussion existante. Si tu as une question, tu dois créer une nouvelle discussion. Sinon, il est impossible de s'y retrouver (à commencer par toi-même...)
0