-2
votes

Trouver la valeur la plus élevée et la plus basse dans Array et les supprimer pour calculer un C # moyen

J'essaie d'écrire du code qui trouve les valeurs les plus basses et les plus élevées stockées dans un tableau, puis les supprime du tableau pour calculer une moyenne.

Actuellement, j'ai écrit du code pour produire la moyenne de tous les nombres du tableau, mais je dois changer cela une fois que j'ai compris comment supprimer la valeur la plus élevée et la plus basse.

Code que j'ai:

private void HighAndLow()
{
    try
    {
        int[] HighAndLowGrade;
        int[] highest = HighAndLowGrade.Max();
        int lowest = HighAndLowGrade.Min();
    }
    catch
    {
        MessageBox.Show("HighAndLow Method failed");
    }
}
        
//find average without highest and lowest values
private void ComputeMean()
{
    double total = 0;
    for (int index = 2; index < 9; index ++)
    {
        total += double.Parse(lineContent[index]);
    }
    averageTestScore = total / 7;
 }


2 commentaires

1. Une valeur peut-elle se répéter plus d'une fois? 2. Souhaitez-vous supprimer des enregistrements de valeur max / min ou max / min?


Et s'il y avait des doublons comme [1,1,3,5]? Est-ce que cette moyenne serait de 2 (1 + 3) / 2 ou simplement de 3 parce que vous supprimez les deux 1?


5 Réponses :


0
votes

Cela ne nécessite qu'une seule itération dans la collection:

public double ComputeAdjustedMean(IEnumerable<int> items)
{
    int total = 0;
    int count = 0;
    int min = int.MaxValue;
    int max = int.MinValue;

    foreach(int item in items)
    {
        count++;
        total += item;
        if (item < min) min = item;
        if (item > max) max = item;
    }

    if (count <= 2) // not enough items
    {
       // do something here
    }
    return (total - (min + max)) / (double)(count - 2);
}

    


4 commentaires

qu'est-ce qui est censé être calculé dans l'instruction if?


Vraiment devrait faire int max = int.MinValue au cas où il y aurait des nombres négatifs.


Étant donné qu'il renvoie le double , envisagez d'avoir le total aussi long au lieu de int pour réduire le risque de débordement.


@Kenzie, que pensez-vous qu'il faudrait y aller? Comment voulez-vous qu'il se comporte si quelqu'un l'appelle avec un tableau contenant 2 éléments ou moins.



-1
votes

Si vous avez un tableau de values vous pouvez effectuer cette requête LINQ soignée:

var average_skip_min_and_max =
    values
        .OrderBy(x => x)
        .Skip(1)
        .Take(values.Length - 2)
        .Average();


2 commentaires

Il convient de noter que cela lèvera une exception si les values ont moins de 3 éléments.


Oui, j'imagine qu'il y aurait un garde à vérifier la longueur du tableau. L'OP avait une longueur de 7. Et j'imagine qu'il y aurait un peu de tests avant que cela ne soit publié sur une application critique.



0
votes

Cela devrait fonctionner à partir de ce que j'ai testé jusqu'à présent.

int[] numberArray = new int[] {1,2,5,9,5,2};
double answer = 0;

var ignoreList = new List<decimal>() {
    numberArray.Max(),
    numberArray.Min()
};

var cleanList = numberArray.Where(x => !ignoreList.Contains(x));

answer = cleanList.Any() ? cleanList.Average() : 0;


0 commentaires

-1
votes

Je ne comprends vraiment pas les gens lorsqu'ils rencontrent ce genre de questions, ils sont devenus incroyablement désireux de fournir une réponse directe . Cette question est évidemment un devoir. Je ne dis pas que nous n'aidons pas les PO, mais nous devons les conduire vers des solutions.

Cher OP,

N'utilisez pas encore LINQ. Je pense que votre instructeur veut que vous appreniez les algorithmes de tri et les opérations de mémoire. Faites des recherches à leur sujet, par exemple, Buble Sort , pour trier le tableau que vous avez. Ensuite, ce sera en face de vous comment mettre en œuvre et utiliser. Ensuite, vous devez utiliser les méthodes fournies par le framework telles que les méthodes d'extension Min() / Max() LINQ.

L'approche de votre problème pourrait être comme ceci:

  1. Triez le tableau par ordre croissant.
  2. Obtenez le premier élément qui est maintenant l'élément à valeur minimale.
  3. Réallouer un nouveau tableau mais 1 élément plus court
  4. Copiez l'intégralité de votre tableau avec l'état ordonné actuel dans le tableau nouvellement alloué, mais ignorez le premier élément lors de la copie, commencez par l'élément suivant.
  5. Obtenez à nouveau le minimum, mais cette fois, recherchez dans le tableau nouvellement alloué et vérifiez avec le minimum précédent
    • S'ils sont égaux, passez à la 3e opération, si vous devez éliminer les minimums répétitifs ( [1, 1, 2, 3 ...] ), ce dont je pense que vous devez.
    • S'ils ne sont pas égaux, cela signifie que vous avez trouvé l'élément minimum de votre tableau et supprimé toutes les occurrences

Maintenant, si vous répétez l'approche pour trouver l'élément à valeur maximale, vous avez terminé le processus d'élimination.


0 commentaires

0
votes

Essayez ceci en utilisant l'algorithme de tri des bulles-

 static void Main(string[] args)
    {
        int[] array = { 12, 6, 34, 23, 89 };
        int temp;


            for (int i = 0; i <= array.Length - 2; i++)
            {
                if (array[i] > array[i + 1])
                {
                    temp = array[i];
                    array[i] = array[i + 1];
                    array[i + 1] = temp;
                }
            }
        array = array.Skip(1).SkipLast(1).ToArray();
        Console.WriteLine((array.Sum()) / (array.Length));
        Console.Read();
    }


0 commentaires