2017-02-17 3 views
-3

Мне нужно найти процент каждого значения в массиве в отношении суммы массива.Как я могу найти Процент каждого элемента для суммы массива? C#

У меня есть входные данные пользователя в массив 24 раза, содержащий количество видимых машин, после ввода, затем список каждого элемента массива и попытку и найти его процент от суммы массива.

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

ответ

0

Расчет процентного содержания #cars в данный час в день показано выражением: (double)trafficCount[hour]/vehicleTotal ниже в петле. Чтобы он работал, вам нужно получить vehicleTotal, который вы уже вычислили по всему массиву trafficCount[], прежде чем запускать вывод.

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

вывод на основе фиктивных данных:

enter image description here

+0

Благодарю вас! – JSTAN

0

Вот еще одно решение:

Программа

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

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

TrafficScanner отслеживает всех транспортных средств, движущихся в час. Он длится определенное количество 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 печатает статистику транспортных средств. Он подготавливает данные, используемые в отчете.

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

Выход:

enter image description here

+0

Спасибо вам большое – JSTAN

0

Улучшенная версия

Основная программа

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 (такой же, как и раньше)

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 был извлечен из TrafficReport. Идея состоит в том, чтобы иметь независимый код, ориентированный только на одну вещь. Целью VehiclePercentages является вычисление процента автомобиля за каждый час.

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

Теперь, TrafficReport делает только одно. Он печатает данные трафика в требуемом формате. Больше не нужно больше беспокоиться о том, как получить требуемые данные.

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]); 
     } 
    } 
} 
Смежные вопросы