3

Cette question concerne le code que j'écris pour une mission, donc oui, je dois utiliser le tri des bulles, et oui, je dois utiliser des tableaux. Ok, donc je fais du tri à bulles, mais essayer d'en trier deux me cause du chagrin. Ce que j'essaie de faire est de trier une liste de noms (par exemple Joe, Bob, Betty, Jake) dans l'ordre alphabétique. En utilisant le code suivant, le programme essaie de trier les choses (les noms se déplacent) mais il n'est généralement que partiellement correct.C++ Problèmes Bulles Tri d'un tableau de char 2D

#include <iostream> 
#include <fstream> 
using namespace std; 
void AlphaSort(char [][50]); 
void GetInput(char [][50]); 
void PrintArray(char [][50]); 

int main() 
{ 
    char name[4][50]; 
    cout << "Please enter 4 names:\n"; 
    GetInput(name); 
    cout << endl << "The following names were received:\n"; 
    PrintArray(name); 
    cout << endl << "The names will now be sorted.\n\n" 
     << "Calling Sort Function....\n"; 
    AlphaSort(name); 
    cout << endl << "The sorted name order is now:\n"; 
    PrintArray(name); 

    return 0; 
} 

void GetInput(char name[][50]) 
{ 
    int i; 

    for(i=0; i<4; i++) 
     cin.getline(name[i], 50); 
} 

void PrintArray(char name[][50]) 
{ 
    int i; 

    for(i=0; i<4; i++) 
     cout << name[i] << endl; 
} 

void AlphaSort(char name[][50]) //I'm pretty sure the problem is in here. 
{ 
    int Nnames = 4, pass, column, row, letter, sorted; 
    char temp[50]; 

    cout << "Sorting Function Successfully Called...\n" 
     << endl << "Names recieved by sort function:\n"; 

    PrintArray(name); 

    //Specifically in this attempt at a bubble sort. 
    for(pass=0; pass<(Nnames-1); pass++) 
    { 
     for(row=0; row<(Nnames-pass-1); row++) 
     { 
      for(column=0, sorted=0; sorted==0; column++) 
      { 
       if(name[row][column]>name[row+1][column]) 
       { 
        for(letter=0; letter<50; letter++) 
         temp[letter] = name[row][letter]; 
        for(letter=0; letter<50; letter++) 
         name[row][letter]= name[row+1][letter]; 
        for(letter=0; letter<50; letter++) 
         name[row+1][letter] = temp[letter]; 
        sorted = 1; 
       } 
       else if (name[row][column] == name[row+1][column]); 
      } 
     } 
    }  

    cout << endl << "Name order post sort:\n"; 

    PrintArray(name); 
} 

En cours d'exécution, cela ressemble généralement à ceci.

S'il vous plaît entrez 4 noms: Hammy Harry Ashe Aaron

Les noms suivants ont été reçus: Hammy Harry Ashe Aaron

Les noms seront désormais classés.

Appel Trier Fonction .... Fonction de tri avec succès Appelé ...

noms recus par la fonction de tri: Hammy Harry Ashe Aaron

Nom de l'ordre de tri après: Aaron Ashe Harry Hammy

Les nom Sorted ordre est maintenant: Aaron Ashe Harry Hammy

J'ai regardé autour à des problèmes similaires, mais je ne peux pas comprendre pourquoi il est stupide.

+0

Quelqu'un a demandé ce qui était triée pour ici: pour (colonne = 0, triés = 0; 0 == trié; colonne ++) Je ne savais pas comment le faire trier alphabétiquement passé le premier caractère seulement lorsque cela est nécessaire, de sorte que ce que j'ai essayé. Donc, en théorie, c'était comme ça que ça serait bouclé jusqu'à ce qu'il décide que les noms étaient ordonnés, ou plutôt, il boucle jusqu'à ce qu'il trouve des lettres qui ne sont plus égales. C'était pour des noms comme Harry et Hammy qui ne seraient pas triés à la surface. – OkaMoez

+1

Écrivez deux autres fonctions (en supposant que vous ne pouvez pas utiliser les fonctions standard de la bibliothèque). Celui qui compare deux chaînes, pour déterminer leur ordre relatif, et celui qui permute deux chaînes. Assurez-vous que ceux-ci fonctionnent correctement, et votre fonction de tri à bulles sera beaucoup plus facile à déboguer. –

+0

Je voudrais séparer votre fonction de comparaison de chaînes dans sa propre fonction. Ensuite, dans votre fonction, vous pouvez simplement obtenir le résultat de «est-ce plus grand ou plus petit» et ne pas avoir à vous soucier du problème «plus ou moins grand que» dans votre code de tri, ce qui est probablement déroutant. Je suis sûr que quelqu'un pointera votre erreur exacte dans une seconde, cependant. :RÉ –

Répondre

0

Il semble que mon problème résidait dans le fait que mon instruction if n'abordait pas la possibilité d'être déjà dans le bon ordre, ce qui l'a fait boucler jusqu'à ce qu'elle trouve une lettre plus tard qu'elle voulait changer. Le code fixe ressemble à ceci:

void AlphaSort(char name[][50]) 
{ 
    int Nnames = 4, pass, column, row, letter, sorted; 
    char temp[50]; 

    cout << "Sorting Function Successfully Called...\n" 
      << endl << "Names recieved by sort function:\n"; 

    PrintArray(name); 

    for(pass=0; pass<(Nnames-1); pass++) 
    { 
       for(row=0; row<(Nnames-pass-1); row++) 
       { 
          for(column=0, sorted=0; sorted==0; column++) 
          { 
              if(name[row][column]>name[row+1][column]) 
              { 
                    for(letter=0; letter<50; letter++) 
                       temp[letter] = name[row][letter]; 
                    for(letter=0; letter<50; letter++) 
                       name[row][letter]= name[row+1][letter]; 
                    for(letter=0; letter<50; letter++) 
                       name[row+1][letter] = temp[letter]; 
                    sorted = 1; 
              } 
              else if (name[row][column]<name[row+1][column])//This is the fix. 
               sorted = 1; 
          } 
       } 
    }  

    cout << endl << "Name order post sort:\n"; 

    PrintArray(name); 
}