2017-02-17 1 views
-3

J'ai besoin de trouver le pourcentage de chaque valeur dans un tableau en ce qui concerne la somme du tableau. J'ai les données d'entrée de l'utilisateur dans un tableau 24 fois, contenant le nombre de voitures vues, une fois entré, puis lister chaque élément de tableau et un essai et trouver son pourcentage de la somme du tableau.Comment puis-je trouver le pourcentage de chaque élément pour la somme du tableau? C#

static void Main(string[] args) 
    { 
     int[] trafficCount; 
     const int hours = 24; 
     Traffic traff = new Traffic(); 
     traff.Report(); 
    } 
    public Traffic() 
    { 
     trafficCount = new int[hours + 1]; 
    } 
    public void showData() 
    { 
     Console.Clear(); 
     int maxValue = trafficCount.Max(); 
     int maxIndex = trafficCount.ToList().IndexOf(maxValue); 
     int sum = trafficCount.Sum(); 
     Console.WriteLine("Traffic Report"); 
     Console.WriteLine("-----------------------"); 
     int percent = maxValue/sum*100 ; 


     Console.WriteLine("{0}{1,24}", "Hour", "\tNumber of vehicles Percent"); 
     for (int hour = 0; hour < trafficCount.Length; hour++) 

      Console.WriteLine("{0,5}{1,24}", hour, trafficCount[hour]);    Console.Write("\t"+percent); 
    } 

Répondre

0

calcul du pourcentage de #cars à une heure donnée par jour est représentée par l'expression: (double)trafficCount[hour]/vehicleTotal ci-dessous dans la boucle. Pour que cela fonctionne, vous devez obtenir le vehicleTotal que vous avez déjà calculé sur l'ensemble du tableau trafficCount[] avant d'exécuter la sortie.

public class Traffic 
{ 
    private int[] trafficCount; 

    public static void Main(string[] args) 
    { 
     Traffic traff = new Traffic(24); 
     traff.showData(); 
    } 
    public Traffic(int hours) 
    { 
     trafficCount = new int[hours]; 
     // populate with dummy data 
     for (int i = 0; i < hours; i++) 
     { 
      trafficCount[i] = i*2+1; // replace this with real data 
     } 
    } 

    public void showData() 
    { 
     Console.Clear(); 
     Console.WriteLine("Traffic Report"); 
     Console.WriteLine("-----------------------"); 

     long vehicleTotal = trafficCount.Sum(); 

     Console.WriteLine("{0}{1,24}", "Hour", "\tNumber of vehicles Percent"); 
     for (int hour = 0; hour < trafficCount.Length; hour++) 
     { 
      var percentageInHour = (double)trafficCount[hour]/ vehicleTotal; 
      Console.WriteLine("{0,5}{1,12}{2,17:P}", hour, trafficCount[hour], percentageInHour); 
     } 
    } 
} 

la sortie en fonction des données factices est:

enter image description here

+0

Merci beaucoup! – JSTAN

0

Voici une autre solution:

Le programme

class Program 
{ 
    static void Main(string[] args) 
    { 
     TrafficScanner scanner = new TrafficScanner(5); 
     scanner.Read(); 

     TrafficReport trafficReport = new TrafficReport(scanner.Vehicles); 
     trafficReport.Print(); 
    } 
} 

TrafficScanner garde une trace de tous les véhicules circulant par heure. Il dure pour certain nombre de hours.

public class TrafficScanner 
{ 
    private int[] vehiclesPerHour; 

    public TrafficScanner(int hours) 
    { 
     vehiclesPerHour = new int[hours]; 
    } 

    public void Read() 
    { 
     int hour = 0; 
     while (true) 
     { 
      string input = Console.ReadLine(); 
      if (input == "") break; 

      int carsThisHours = 0; 

      bool isParsedSuccessfully = Int32.TryParse(input, out carsThisHours); 
      if (isParsedSuccessfully) 
      { 
       vehiclesPerHour[hour++] += carsThisHours; 
       hour = hour % vehiclesPerHour.Length; 
      } 
     } 
    } 

    public int[] Vehicles 
    { 
     get 
     { 
      return vehiclesPerHour; 
     } 
    } 
} 

TrafficReport imprime les statistiques des véhicules de la circulation. Il prépare les données utilisées dans le rapport.

public class TrafficReport 
{ 
    private int[] vehiclesPerHour; 
    private double[] trafficPercentage; 

    public TrafficReport(int[] vehicles) 
    { 
     vehiclesPerHour = vehicles; 
    } 

    public void Print() 
    { 
     PrepareData(); 
     ShowData(); 
    } 

    private void PrepareData() 
    { 
     int numberOfVehicles = vehiclesPerHour.Sum(); 

     trafficPercentage = new double[vehiclesPerHour.Length]; 
     for (int i = 0; i < vehiclesPerHour.Length; ++i) 
     { 
      trafficPercentage[i] = ((double) vehiclesPerHour[i])/numberOfVehicles; 
     } 
    } 

    private void ShowData() 
    { 
     Console.Clear(); 
     Console.WriteLine("Traffic Report"); 
     Console.WriteLine("-----------------------"); 


     Console.WriteLine("{0}{1,24}", "Hour", "\tNumber of vehicles Percent"); 
     for (int hour = 0; hour < trafficPercentage.Length; ++hour) 
     { 
      Console.WriteLine("{0,3}{1,14}{2,18:P}", hour, vehiclesPerHour[hour], trafficPercentage[hour]); 
     } 
    } 
} 

sortie:

enter image description here

+0

Merci beaucoup – JSTAN

0

Une version améliorée

programme principal

static void Main(string[] args) 
{ 
    TrafficScanner scanner = new TrafficScanner(5); 
    scanner.Read(); 

    VehiclePercentages percentages = new VehiclePercentages(scanner.Vehicles); 

    TrafficReport trafficReport = new TrafficReport(scanner.Vehicles, percentages.Values); 
    trafficReport.Print(); 
} 

TrafficScanner (comme auparavant)

public class TrafficScanner 
{ 
    private int[] vehiclesPerHour; 

    public TrafficScanner(int hours) 
    { 
     vehiclesPerHour = new int[hours]; 
    } 

    public void Read() 
    { 
     int hour = 0; 
     while (true) 
     { 
      string input = Console.ReadLine(); 
      if (input == "") break; 

      int carsThisHours = 0; 

      bool isParsedSuccessfully = Int32.TryParse(input, out carsThisHours); 
      if (isParsedSuccessfully) 
      { 
       vehiclesPerHour[hour++] += carsThisHours; 
       hour = hour % vehiclesPerHour.Length; 
      } 
     } 
    } 

    public int[] Vehicles 
    { 
     get 
     { 
      return vehiclesPerHour; 
     } 
    } 
} 

VehiclePercentages a été extrait de TrafficReport. L'idée est d'avoir du code indépendant, concentré sur une seule chose. Le but de VehiclePercentages est de calculer le pourcentage de voiture pour chaque heure.

public class VehiclePercentages 
{ 
    private double[] trafficPercentages; 

    public VehiclePercentages(int[] vehiclesPerHour) 
    { 
     int numberOfVehicles = vehiclesPerHour.Sum(); 

     trafficPercentages = new double[vehiclesPerHour.Length]; 
     for (int i = 0; i < vehiclesPerHour.Length; ++i) 
     { 
      trafficPercentages[i] = ((double)vehiclesPerHour[i])/numberOfVehicles; 
     } 
    } 

    public double[] Values 
    { 
     get 
     { 
      return trafficPercentages; 
     } 
    } 
} 

Maintenant, TrafficReport fait une seule chose. Il imprime les données de trafic avec le format requis. Il n'a plus à s'inquiéter de la façon d'obtenir les données requises.

public class TrafficReport 
{ 
    private int[] vehicles; 
    private double[] percentages; 

    public TrafficReport(int[] vehiclesPerHour, double[] trafficPercentages) 
    { 
     vehicles = vehiclesPerHour; 
     percentages = trafficPercentages; 
    } 

    public void Print() 
    { 
     Console.Clear(); 
     Console.WriteLine("Traffic Report"); 
     Console.WriteLine("-----------------------"); 


     Console.WriteLine("{0}{1,24}", "Hour", "\tNumber of vehicles Percent"); 
     for (int hour = 0; hour < percentages.Length; ++hour) 
     { 
      Console.WriteLine("{0,3}{1,14}{2,18:P}", hour, vehicles[hour], percentages[hour]); 
     } 
    } 
}