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;
}
5 Réponses :
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);
}
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.
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();
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.
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;
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, 1, 2, 3 ...] ), ce dont je pense que vous devez.Maintenant, si vous répétez l'approche pour trouver l'élément à valeur maximale, vous avez terminé le processus d'élimination.
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();
}
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?