Tri tableau en ligne

Résolu
cs_TWITTI Messages postés 2 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 9 décembre 2004 - 8 déc. 2004 à 19:54
cs_TWITTI Messages postés 2 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 9 décembre 2004 - 9 déc. 2004 à 13:40
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

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 déc. 2004 à 09:07
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;
}
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
8 déc. 2004 à 21:19
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
9 déc. 2004 à 09:06
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;
}
0
cs_TWITTI Messages postés 2 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 9 décembre 2004
9 déc. 2004 à 13:40
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
0
Rejoignez-nous