1
votes

Tri d'un tableau multidimensionnel sans Array.Sort ou DataGrid?

J'ai créé cette boucle for pour que, lorsque je clique sur un bouton, je puisse voir les notes des autres étudiants qui ressemblent à ceci:

Name    Test    Basket  Destructive   Final Grade
Dave    35      40      50            40
Danny   20      20      20            20
Alex    10      10      10            10
Goerge  0       0       0             0
Hannan  0       0       0             0
Ian     0       0       0             0
Muna    0       0       0             0

Voici le code pour cela: p >

private void uiShowMarks100_0Button_Click(object sender, EventArgs e)
{
    uiMarksDisplayTextBox.Text = "";
    uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;

    double temp = 0;

    for (int x = 0; x < FinalGrade.Length; x++)
    {
        for (int j = x + 1; j < FinalGrade.Length; j++)
        {
            if (FinalGrade[x] > FinalGrade[j])
            {
                temp = FinalGrade[j];
                FinalGrade[j] = FinalGrade[x];
                FinalGrade[x] = temp;
            }
            uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[x];
            uiMarksDisplayTextBox.Text += System.Environment.NewLine;
        }
    }
}              

Je veux être en mesure de trier mon tableau, de la note finale la plus élevée à la note finale la plus élevée et la note finale la plus basse en bas. cela ne devrait pas seulement trier la note finale, mais aussi le nom et les notes précédentes.

Je veux pouvoir le faire sans utiliser Array.Sort et Datagrid.

Voici mon tentative:

private void uiShowMarksAZButton_Click(object sender, EventArgs e)
{         
    uiMarksDisplayTextBox.Text = string.Join("\t", Columns);
    uiMarksDisplayTextBox.Text += System.Environment.NewLine;

    for (int i = 0; i < Names.Length; i++)
    {
        uiMarksDisplayTextBox.Text += Names[i];
        for (int x = 0; x < 3; x++)
        {
            uiMarksDisplayTextBox.Text += "\t" + Grade[i, x];
        }
        uiMarksDisplayTextBox.Text += "\t" + "\t" + FinalGrade[i];
        uiMarksDisplayTextBox.Text += System.Environment.NewLine;
    }
}

Un exemple serait:

Name    Test    Basket  Destructive   Final Grade
Alex    10      10      10            10
Danny   20      20      20            20
Dave    35      40      50            40
Goerge  0       0       0             0
Hannan  0       0       0             0
Ian     0       0       0             0
Muna    0       0       0             0


6 commentaires

Le tout serait beaucoup (beaucoup) plus facile en utilisant une classe plutôt que de stocker les données sur plusieurs tableaux


Je sais, mais je suis actuellement limité par ce que veut le professeur, pas de méthodes faciles!


Vous devez parler à votre professeur, accueillez-le dans le 21e siècle


Hah, il veut que nous comprenions les algorithmes de tri à partir de zéro, lui parler ne changera pas les exigences de la tâche


comprendre le tri et ne pas regrouper les choses en classe est totalement différent. Il peut totalement enseigner le tri tout en vous apprenant la bonne façon de coder. Je suis d'accord avec Aldert pour dire que vous devriez aller dire à votre prof qu'il fait cela mal et lui souhaiter la bienvenue dans le siècle de la POO


Ignorer Array.Sort n'est pas un problème, en supposant que vous pouvez toujours utiliser List.Sort ou Enumerable.OrderBy . :-)


3 Réponses :


0
votes

Pour le problème tel quel, voici un algorithme de haut niveau:

Assurez-vous d'abord que tous les tableaux ont la même longueur.

Appliquez ensuite votre algorithme de tri préféré (je recommande le tri à bulles pour les débutants. Le pire algorithme de tri mais le plus facile à apprendre).

Chaque fois que vous permutez l'élément dans le tableau FinalGrade, vous permutiez des éléments dans d'autres tableaux du même index.

Par exemple, si vous permutiez les index 1 et 3 dans FinalGrade, vous échangeriez également les éléments 1 et 3 pour tous les autres tableaux.

Je laisserai le codage proprement dit comme exercice.


0 commentaires

0
votes

Je ne pense pas que vous puissiez le parcourir une seule fois. Vous pouvez essayer une logique récursive comme ci-dessous pour continuer à boucler jusqu'à ce que tout soit trié.

private List<YourObject> Sort(FinalGrade){
   bool finished = true; 
        for (int x = 0; x < FinalGrade.Length; x++)
            {
                for (int j = x + 1; j < FinalGrade.Length; j++)
                {
                    if (FinalGrade[x] > FinalGrade[j])
                    {
                        temp = FinalGrade[j];
                        FinalGrade[j] = FinalGrade[x];
                        FinalGrade[x] = temp;
                        finished = false;
                    }                      
                }
            }

   return finished? FinalGrade : Sort(FinalGrade)
}


0 commentaires

2
votes

Vous pouvez utiliser ceci pour trier vos données:

var sorted = input.OrderByDescending(student => student.FinalGrade).ToArray();

J'ai déclaré chaque élément de vos tableaux imbriqués comme IComparable car string et int implémentent cette interface et c'est pourquoi vous pouvez utiliser la méthode CompareTo


Et c'est ainsi que nous faisons cela au 21ème siècle: créez une classe Student : p>

var input = new Student[]
{
    new Student {Name = "Alex",    Test = 10,  Basket = 10, Destructive = 10,   FinalGrade = 10},
    new Student {Name = "Danny",   Test = 20,  Basket = 20, Destructive = 20,   FinalGrade = 20, },
    new Student {Name = "Dave",    Test = 35,  Basket = 40, Destructive = 50,   FinalGrade = 40, },
    new Student {Name = "Goerge",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Hannan",  Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Ian",     Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
    new Student {Name = "Muna",    Test = 0,   Basket = 0,  Destructive = 0,    FinalGrade = 0,  },
};

définir votre entrée comme

private class Student
{
    public string Name { get; set; }
    public int Test { get; set; }
    public int Basket { get; set; }
    public int Destructive { get; set; }
    public int FinalGrade { get; set; }
}

Et trier avec Linq:

var input = new IComparable[][]
{
    new IComparable[] {"Alex",  10,      10,      10,            10},
    new IComparable[] {"Danny", 20,      20,      20,            20},
    new IComparable[] {"Dave",  35,      40,      50,            40},
    new IComparable[] {"Goerge",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Hannan",0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Ian",   0 ,      0 ,      0 ,            0 },
    new IComparable[] {"Muna",  0 ,      0 ,      0 ,            0 },
};

var indexOfColumnToOrderBy = 4; // "Final Grade" field
for (var i = 0; i < input.Length - 1; ++i)
{
    for (var j = i + 1; j < input.Length; ++j)
    {
        IComparable[] t;
        if (input[i][indexOfColumnToOrderBy].CompareTo(input[j][indexOfColumnToOrderBy]) < 0)
        {
            t = input[i];
            input[i] = input[j];
            input[j] = t;
        }
    }
}

Même si cette approche ne répond pas aux exigences du professeur, vous pouvez l'utiliser pour déboguer votre propre algorithme


2 commentaires

Comment afficher cela? désolé, je le comprends à peine, et encore moins l'implémenter dans mon code.


@UnboundPhantom Si nous parlons de console, vous pouvez afficher un tableau initial ou trié avec une boucle foreach comme foreach (var row in input) {Console.WriteLine (string.Join (", \ t", row.AsEnumerable ()) ); . Si nous parlons de "comment afficher un tableau irrégulier dans WinForms" - c'est une nouvelle question non liée à la commande. Et vous pouvez demander cela dans un fil séparé