2015-03-18 1 views
0

Je rencontre des problèmes avec mon mode et l'obtenir pour me permettre d'entrer plus de 10 numéros!problèmes sur l'utilisation du mode en C#

Ce sont les deux problèmes que j'ai avec mon code.

 public static void Main(string[] args) 
     { 

      int[] myNums = new int[10]; 
      int number = 0; 
      int count = 0; 
      Console.WriteLine("--Nmber Modifier--\n"); 
      Console.WriteLine("Entering a number that is no between 1 and 10 will end your process"); 
      do// limited to 10 HELP 
      { 
       number = Util.PromptForInt("Enter a number between 1 and 10 : "); 
       if ((number <= 10) && (number >= 1)) 
       { 
        myNums[count] = number; 
       } 
       count++; 
      } 
      while ((number <= 10) && (number >= 1)); 
      Array.Sort(myNums); 


      Console.WriteLine("Average number is : " + MeantAverage(myNums)); 
      Console.WriteLine("Largest Number is : " + LargestNum(myNums)); 
      Console.WriteLine("Smallest Number is : " + SmallestNum(myNums)); 
      Console.WriteLine("Most common number is : " + Mode(myNums)); 
      Console.ReadLine(); 
     } 

     static double MeantAverage(int[] nums) 
     { 

      double dMeanAverage; 
      double dSum = 0; 
      var groups = nums.GroupBy(item => item); 

      foreach (var group in groups) 
      { 
       dSum = group.Key + dSum; 
      } 

      dMeanAverage = dSum/nums[nums.Length - 1]; 
      return Math.Round(dMeanAverage, 2); 
     } 
     static int LargestNum(int[] nums) 
     { 
      int highestNum; 
      highestNum = nums[nums.Length - 1]; 
      return highestNum; 
     } 
     static int SmallestNum(int[] nums) 
     { 

      int lowest = 0; 

      for (int b = 0; b < nums.Length; b++) 
      { 
       if (nums[b] > lowest) 
       { 
        lowest += nums[b]; 

        return lowest; 
       } 
      } return lowest; 
     } 
     static int Mode(int[] nums) 
     { 
      // issues with mode 
      int modes = 0; 

      var modeGroup = nums.GroupBy(v => v); 
      int max = modeGroup.Max(g => g.Count()); 
      modes = modeGroup.First(g => g.Count() == max).Key; 
      return modes; 
     } 
    } 
} 

Répondre

1

Vous avez créé un tableau de dix chiffres:

int[] myNums = new int[10]; 

Ainsi, alors que votre boucle ne vous limite pas à 10 chiffres parce que vous ne cochez pas contre count, le système ne parce que dès que vous essayez d'accéder au 10ème élément (myNums[10]) vous obtiendrez un IndexOutOfRangeException.

Puisque vous ne l'attrapez nulle part, il va juste terminer votre programme.

Pour résoudre votre problème:

  • contre count Vérifiez si vous ne saisissez pas trop de chiffres!
  • Si vous avez besoin d'une collection de longueur variable, utilisez une collection construite pour cela comme List<T> au lieu d'un tableau. Les tableaux sont longueur fixe (la plupart du temps), et la façon autour de qui est une mauvaise utilisation horrible de la sémantique de tableau.
0

Code légèrement modifié, l'intention est la même.

  • Vous avez oublié de vérifier contre count dans le tout cas
  • Vous s'écraser sur les entrées « 0 » (pas de garde en toute sécurité contre un tableau vide)
  • mode modifié pour fusionner des éléments, puis trier par ordre décroissant

    var myNums = new List<int>(10); 
    for(int i=0; i < 10; ++i) 
    { 
        int number = Utils.PromptForInt("Enter a number between 1 and 10 : "); 
        if(number > 10 || number < 1) 
         break; 
        myNums.Add(number); 
    } 
    if(myNums.Count < 1) 
        return; //no item input, do something 
    
    myNums.Sort(); 
    Console.WriteLine("Average: {0}", myNums.Sum()/(double)myNums.Count); 
    Console.WriteLine("Largest: {0}", myNums[myNums.Count - 1]); 
    Console.WriteLine("Smallest: {0}", myNums[0]); 
    
    var result = myNums.GroupBy(n => n) 
          .Select(c => new { Key = c.Key, total = c.Count() }) 
          .OrderByDescending(a => a.total); 
    Console.WriteLine("Most common: {0}, used {1} times", result.First().Key, result.First().total);