IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

tri à bulle - pointeur - tableau [Débutant(e)]


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 31
    Points : 18
    Points
    18
    Par défaut tri à bulle - pointeur - tableau
    Bonjour,
    J'ai des exercices à réaliser afin de mieux comprendre l'utilisation des pointeurs et je n'arrive pas à resoudre celui là.

    Voici son intitulé :
    Ecrire un sous-programme triant un tableau t avec la méthode du tri à bulle. Vous accéderez à l’élément d’indice i de t avec l’expression *(t + i)

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include<stdio.h>
    #define N 5
     
    // tri a bulle 
     
    void echange(int* a, int*b)
    {
    	int z;
    	z=*b;
    	*a=*b;
    	*b=z;
    }
     
     
    void triabulle(int* k, int n)
    {
    int i;
     
    for(i=1;i<n;i++)
    {
    	if (*(k+i)>*(k+i+1))
    		echange(*(k+i),*(k+i+1));
     
    }
    }
    main ()
    {
    int j;
    int t[N]={3,5,47,6,12};
    triabulle(t, N);
     
    for(j=0;j<N;j++)
    	printf("%d\n",t[j]);
    }
    Le compilateur me signal un probléme au niveau des paramétres de la fonction echange. Je ne vois pas qu'elle synthaxe utilisée.
    Merci de votre aide

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par babouoles Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echange (*(k + i), *(k + i + 1));
    Le compilateur me signal un probléme au niveau des paramétres de la fonction echange.
    La fonction echange() attend 2 adresses. Est-ce que tu crois que *(k + i) et *(k + i + 1) sont des adresses ?
    Est-ce que k est une adresse ?
    Est-ce que k + i est une adresse ?

    Une fois ce problème corrigé, il y a un léger problème de débordement de tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    3
    5
    6
    6
    -886913012
     
    Press ENTER to continue.
    D'autre part, si veut vraiment savoir si ça trie, il faut partir d'un tri inverse. Ca déchire...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       int t[N] = { 7, 6, 5, 4, 3 };
    et là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    7
    5
    4
    3
    3
     
    Press ENTER to continue.
    Oups... Pas bon l'algo... (euh, un tri à bulles à une seule boucle, ce serait une révolution !)
    Pas de Wi-Fi à la maison : CPL

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Je me suis aider de ceci :

    Supposons que le tableau t contienne des int, sachant qu’un int occupe 2 octets en mémoire. Est-ce que (t + 1) est l’adresse du deuxième élément de t ?

    Mathématiquement, la réponse est non, l’adresse du deuxième élément est t + (la taille d′un int) = (t + 2). Etant donné un tableau p d’éléments occupant chacun n octets en mémoire, l’adresse du i-ème élément est alors p + i × n.

    Cependant, la pondération systématique de l’indice par la taille occupée en mémoire par chaque élément est d’une part une lourdeur dont on se passerait volontier, et d’autre part une source d’erreurs et de bugs. Pour y remédier, le compilateur prend cette partie du travail en charge,on ne pondérera donc pas les indices ! Cela signifie, plus explicitement, que quel que soit le type des éléments du tableau p, l’adresse mémoire du i-ème élément de p est p + i. On le vérifie expérimentalement en exécutant le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    include<stdio.h> 
    #define N 30 
    void initTab(int* k, int n) 
    {
     int i; 
    *k = 1; 
    for(i = 1 ; i < n ; i++) 
    *(k + i) = *(k + i - 1) + 1; // ICI *(k+i) équivaut bien à l'adresse de t[1]
    }
     void afficheTab(int* k, int n) 
    {
    int i; 
    for(i = 0 ; i < n ; i++) 
    printf("%d ", *(k + i));
    printf("\n"); 
    } 
    main() 
    {
     int t[N]; 
    initTab(t, N); 
    afficheTab(t, N); 
    }
    Pourquoi je ne pourrais pas utiliser *(k+i) et *(k +i +1) comme adresse pour la fonction echange ?

    C'est ce qui me pose le plus de probléme, je pourrais ensuite modifier ma boucle pour eviter un débordemment du tableau et en rajouter vu qu'un tri à bulle ne se fait pas en une boucle.

    L'énoncer de mon exercice précise :
    Vous accéderez à l’élément d’indice i de t avec l’expression *(t + i)

    Je suis un peu perdu là...

  4. #4
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par babouoles
    Pourquoi je ne pourrais pas utiliser *(k+i) et *(k +i +1) comme adresse pour la fonction echange ?
    Parce que *(k+i) et *(k +i +1) ne sont pas des adresses, tu sais faire la différence entre k + i et *(k + i)?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    k+i est une adresse. *(k+i) n'en est pas une.
    De plus, *(k+i) se note généralement k[i], c'est plus lisible.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    k+i est une adresse. *(k+i) n'en est pas une.
    De plus, *(k+i) se note généralement k[i], c'est plus lisible.

  7. #7
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Tu as un exemple d'implémentation d'un tri à bulle dans les pages sources de la rubrique à cette adresse: http://c.developpez.com/sources/?pag...THME_tri_bulle
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  8. #8
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Die,
    Citation Envoyé par babouoles Voir le message
    Cependant, la pondération systématique de l’indice par la taille occupée en mémoire par chaque élément est d’une part une lourdeur dont on se passerait volontier, et d’autre part une source d’erreurs et de bugs. Pour y remédier, le compilateur prend cette partie du travail en charge,on ne pondérera donc pas les indices ! Cela signifie, plus explicitement, que quel que soit le type des éléments du tableau p, l’adresse mémoire du i-ème élément de p est p + i.
    Ce n'est pas que le compilateur, cela fait partie de la définition du langage depuis sa création.
    Si les cons volaient, il ferait nuit à midi.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Sauf que c'est encore faux: p+i est l'adresse du i+1-ième élément...

    (ou en d'autres termes, l'adresse du i-ième élement est p+i-1. Ce qui confirme le fait que l'adresse du premier élément soit p+0, c'est-à-dire p).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 31
    Points : 18
    Points
    18
    Par défaut
    Merci pour vos reponses et le lien,

    On me demande dans mon exercice ==>Vous accéderez à l’élément d’indice i de t avec l’expression *(t + i)
    Certaines écritures peuvent être plus lisible mais je dois impérativement utilisé celle ci.
    Je vais m'y remettre et voir ce que cela donne.
    Encore merci

Discussions similaires

  1. affichage d'un tableau trié par tri à bulle
    Par bucabuca dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 15/07/2012, 15h52
  2. Affichage tableau trier par le tri à bulle
    Par luclapointe dans le forum C++
    Réponses: 2
    Dernier message: 11/07/2012, 20h13
  3. Tri à bulles d'un tableau
    Par Dr walid dans le forum Débuter
    Réponses: 5
    Dernier message: 18/11/2009, 16h06
  4. [DEBUTANT] Tri à bulle d'un tableau
    Par erigoal dans le forum C#
    Réponses: 8
    Dernier message: 08/01/2009, 14h07
  5. [LG]problème de tri de pointeur (bulles non optimisé)
    Par blackmage dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2003, 23h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo