2017-02-17 1 views
-3

Ich muss den Prozentsatz jedes Wertes in einem Array in Bezug auf die Summe des Arrays finden.Wie kann ich den Prozentsatz jedes Elements für die Summe des Arrays finden? C#

Ich habe die Benutzereingabe Daten in einem Array 24 mal, enthält die Anzahl der Autos gesehen, einmal eingegeben, dann listet jedes Array-Element und einen Versuch und finden Sie seinen Prozentsatz der Summe des Arrays.

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); 
    } 

Antwort

0

Berechnung des Prozentsatzes von #cars in einer gegebenen Stunde pro Tag wird durch den Ausdruck dargestellt ist: (double)trafficCount[hour]/vehicleTotal unten in der Schleife. Damit es funktioniert, müssen Sie die vehicleTotal, die Sie bereits über das gesamte Array trafficCount[] berechnet haben, bevor Sie die Ausgabe ausführen.

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); 
     } 
    } 
} 

die Ausgabe basierend auf Dummy-Daten:

enter image description here

+0

Vielen Dank! – JSTAN

0

Hier ist eine andere Lösung:

Das Programm

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

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

TrafficScanner den Überblick über alle Fahrzeuge hält Reisen pro Stunde. Es dauert für eine bestimmte Anzahl von 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 druckt die Statistik der Verkehrsfahrzeuge. Es bereitet die im Bericht verwendeten Daten vor.

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]); 
     } 
    } 
} 

Ausgang:

enter image description here

+0

Vielen Dank – JSTAN

0

Eine verbesserte Version

Hauptprogramm

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 (wie zuvor)

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 wurde aus TrafficReport extrahiert. Die Idee ist, unabhängigen Code zu haben, der sich nur auf eine Sache konzentriert. Der Zweck von ist die Berechnung des Fahrzeugprozentsatzes für jede Stunde.

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; 
     } 
    } 
} 

Jetzt tut TrafficReport nur eine Sache. Es druckt die Verkehrsdaten mit dem erforderlichen Format. Es muss nicht mehr belästigt werden, wie die benötigten Daten zu bekommen sind.

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]); 
     } 
    } 
} 
Verwandte Themen