Tri tableau en ligne [Résolu]

Signaler
Messages postés
2
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
9 décembre 2004
-
Messages postés
2
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
9 décembre 2004
-
bonjour , je suis etudiant en mécanique et la programmtion c est embetant pour moi.
J ai un probleme sur mon programme main().
Je n arrive pas a faire au fur et à mesure pouvez vous m aider s il vous plait merci d'avance

Voila l'enonce

On désire construire un tableau d’au plus MAX entiers triés à partir d’un dialogue avec l’utilisateur.
La particularité de ce tri est qu’il va se faire au fur et à mesure de la saisie des valeurs.

Exemple : l’utilisateur rentre 24, le tableau vide devient : 24 puis l’utilisateur rentre 20, le tableau devient : 20 24 puis l’utilisateur rentre 22, le tableau devient : 20 22 24 etc… 1)

Ecrire la fonction recherchePosition() qui retourne la position que doit prendre l’entier dans le tableau (le tableau est trié mais partiellement rempli). Exemple : pour le tableau : 20 22 24 et l’entier 21, la fonction recherchePosition retourne la valeur 1 2)

Ecrire la fonction insereEntier() qui insère un entier dans le tableau à la position spécifiée. Exemple: insérer l’entier 21 à la position 1 dans le tableau : 20 22 24 modifie le tableau de la façon suivante : 20 21 22 24 3)

Ecrire la fonction principale main() qui invite l’utilisateur à saisir les nombres entiers, construit et affiche le tableau trié au fur et à mesure de la lecture des nombres. On veillera a ne pas dépasser la capacité maximale du tableau.

Voila mon programme

#define MAX 10
#include <stdio.h>

int recherchePosition(int tab[],int n ) /* n est le nombre de valeurs entrées dans le tab */

{
int i=0;
while (n<=tab[i] && i<MAX)
i++;

printf("%d", i);
return i;
}

void afficherTableau(int tab[]) /* y est le nombre de valeurs entrées dans le tab u*/

{
int i=0;
for (i = 0; i<MAX; i++) {
printf("tab[%d]=%d\n",i,tab[i]);
}
}

void insereEntier ( int tab[],int n, int p) // p position (i de rech) , n nombre qu'on veut insérer
{
int pos ;
pos=recherchePosition ( tab, n) ;
for(p=pos;p<MAX;p++)
tab[p]=tab[p-1];
tab[pos]=n;
}

void main ()
{

int tab[MAX];/*tableau*/
int n; /*valeur du tableau*/
int p;/*incrementation*/
int i ;/*adresse du tableau*/
char r;
int pos;
int recherchePosition(int tab[],int n );

for(i=0;i<MAX;i++) /*on initialise le tableau*/
tab[i]=0;
afficherTableau(tab);

do {
printf(" entrez une valeur:");
scanf("%d",&n);
pos=recherchePosition (tab, n);

insereEntier (tab, n,pos);
for (p=0;p<n;p++){
printf ("%d\n",tab[p]);}
printf("voulez vous continuer o ou n");
scanf("%c",&r);

}

while (r=='o');
}

4 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Erreur, il faut placer le nombre APREs le dacalage

void insereEntier ( int val, int tab[],int n) 
{
// placement du nombre
int pos ;
pos=recherchePosition(val, tab, n) ;

// décalage du tableau (à partir de la fin)
for(int i = n-1; i >= pos; i--)
tab[i+1] = tab[i];

// placement valeur
tab[pos] = val;
}
Messages postés
12303
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
38
Oulala...

Bon moi je te donnes un QSORT
for (i=0;i<nombre-1;i++){
for j=i+1;j<nombre;j++){
if (tab[i]>tab[j]){
a=tab[i];
tab[i]=tab[j];
tab[j]=a;
}
}
}

In a dream, I saw me, drop dead... U was here, U cried... It was just a deam, if I die, U won't cry, maybe, U'll be happy
C'est vrai que dans ton cas garder un tableau trié c'est plus efficace, masi je suposes que tu ne voudras pas toujours

http://coucou747.hopto.org
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
pour rechercher la position, il te faut :
- le nombre à placer (val).
- le tableau (tab)
- le nombre de valeurs valides dedans (n)

int recherchePosition(int val, int tab[],int n ) 
{
int i=0;
while (val<=tab[i] && i<n)
i++;
printf("%d", i);
return i; 
}



Pour insérer une valeur, il te faut les même params
void insereEntier ( int val, int tab[],int n) 
{
// placement du nombre
int pos ;
pos=recherchePosition(val, tab, n) ;
tab[pos] = val;

// décalage du tableau (à partir de la fin)
for(int i = n-1; i >= pos; i--)
tab[i+1] = tab[i];

// placement valeur
tab[pos] = val;
}
Messages postés
2
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
9 décembre 2004

merci pour c reponse il y avait une petit erreur dans recherce de position si ca marche
val>=tab[i] pour avoir le tableau dans l odre croissant
encore merci à vous deux