Pb d'algo langage C
Résolu/Fermé
Fabrice
-
29 nov. 2009 à 13:32
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 - 29 nov. 2009 à 23:33
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 - 29 nov. 2009 à 23:33
A voir également:
- Pb d'algo langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Dev-Pascal - Télécharger - Édition & Programmation
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
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
Emmanuel Delahaye
Messages postés
107
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7
29 nov. 2009 à 14:55
29 nov. 2009 à 14:55
Déjà, les commentaires, c'est /* */ et non \* *\ !
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 :
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 :
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 :
mais celà est OK :
'tableau()' est un nom peu clair pour une fonction. Ici, je dirais plutôt 'remplir_tableau()'.
Je propose donc de repartir sur ce code :
Qui présente ces défauts :
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/
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/
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;
}
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;
}
Emmanuel Delahaye
Messages postés
107
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7
29 nov. 2009 à 18:15
29 nov. 2009 à 18:15
Je me demande pourquoi je perds mon temps à expliquer les choses ...
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 :
pose des questions si tu ne comprends pas.
-------------- 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.
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
Je ne vais donc pas te prendre du temps plus longtemps.
Encore merci.
Cordialement,
Fabrice HY
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.
Je cherche toujours une solution, ne décourage pas.
J'espère que ton travail n'st pas pour tout de suite...
Au revoir.
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;
}
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;
}
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
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 =)
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 =)
Emmanuel Delahaye
Messages postés
107
Date d'inscription
jeudi 18 juin 2009
Statut
Membre
Dernière intervention
17 juillet 2019
7
29 nov. 2009 à 23:33
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...)
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...)