Пишу программку, которая должна генерировать километражи поездок и высчитывать для них расход топлива. Пользователь вводит число поездок, для которых необходимо сгенерировать километражи, средний расход топлива для всех поездок, сколько всего литров было потрачено на все поездки. На основе этих данных все и расчитывается.
Проблема заключается в том, что не совпадают сгенерированные километражи и общий реальный (высчитанный: всего километров = (Литров всего потрачено * 100 км) / Расход топлива машины). Хотя нюансы были учтены. Всего скорее проблема с типами в функции CalcLiters(), но я в упор не вижу что там не так >_<
Скриншот программы: http://gyazo.com/634bbecd03541507c46fdff7478901f2
Код ниже (приложение WPF).
Код | using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Navigation; using System.Windows.Shapes;
using System.Data;
namespace wpf_Calc { /// <summary> /// Логика взаимодействия для MainWindow.xaml /// </summary> public partial class MainWindow : Window { double full_km = 0; // Километраж всех поездок DataTable dt_Rows;
// Конструктор класса public MainWindow() { InitializeComponent();
/* Инициализация элементов управления формы */
// Button this.button_Generate.Click += new RoutedEventHandler(button_Generate_Click);
// TextBox textBox_Fuel.Text = "9,6"; textBox_Count.Text = "7"; textBox_Liters.Text = "80"; // DataTable dt_Rows = new DataTable(); dt_Rows.TableName = "table";
DataColumn number = new DataColumn(); number.ColumnName = "№"; number.DataType = typeof(int); number.AllowDBNull = false; dt_Rows.Columns.Add(number);
DataColumn kilometers = new DataColumn(); kilometers.ColumnName = "Километраж"; kilometers.DataType = typeof(int); kilometers.AllowDBNull = false; dt_Rows.Columns.Add(kilometers);
DataColumn liters = new DataColumn(); liters.ColumnName = "Расход"; liters.DataType = typeof(double); liters.AllowDBNull = true; dt_Rows.Columns.Add(liters); // DataGrid DataGridTextColumn col1 = new DataGridTextColumn(); col1.Header = "№ выезда"; col1.Width = 70; col1.Binding = new Binding("[0]"); this.dataGrid.Columns.Add(col1);
DataGridTextColumn col2 = new DataGridTextColumn(); col2.Header = "Километров пройдено"; col2.Width = 140; col2.Binding = new Binding("[1]"); this.dataGrid.Columns.Add(col2);
DataGridTextColumn col3 = new DataGridTextColumn(); col3.Header = "Расход литров"; col3.Width = 100; col3.Binding = new Binding("[2]"); this.dataGrid.Columns.Add(col3); this.dataGrid.Width = 320; this.dataGrid.ItemsSource = dt_Rows.DefaultView; }
// Реакция на нажатие кнопки "Сгенерировать" private void button_Generate_Click(object sender, EventArgs e) { // Вычисляем сколько км было пройдено за все поездки // х = (Литров всего потрачено * 100 км) / Расход топлива машины full_km = double.Parse(textBox_Liters.Text) * 100 / double.Parse(textBox_Fuel.Text); label4.Content = "Километраж на " + textBox_Liters.Text + " литров составляет " + Math.Round(full_km) + " км.";
// Вычисляем средний километраж 1 поездки // x = Общий километраж / Количество выездов double middle_km = full_km / (double.Parse(textBox_Count.Text)); label5.Content = "Средний километраж 1 поездки: " + middle_km + " км.";
// Для правдивости данных поездки (километраж) - делаем их разными // Вычисляем разброс по километражу за 1 поездку (километраж поездок отличается друг от друга не более чем на 10%) // x = 10% Cреднего значения километража 1 поездки double dispersion = middle_km * (double)0.1; Random rnd = new Random((int)DateTime.Now.Ticks);
// Генерация километража для всех поездок for (int i = 0; i < Int32.Parse(textBox_Count.Text); i++) { // Генерируем новое значение километража для следующей поездки FillKilometers(i, rnd.Next(Convert.ToInt32(Math.Round(middle_km - dispersion)), Convert.ToInt32(Math.Round(middle_km + dispersion)))); }
// После того как значения километража сгенерированы - проверяем их сумму и высчитываем для них расход топлива CalcLiters(); // Контроль километража int end_km = 0; for (int i = 0; i < dt_Rows.Rows.Count; i++) { DataRow row = dt_Rows.Rows[i]; end_km = end_km + Convert.ToInt32(row["Километраж"]); } MessageBox.Show("Проверка. В сумме километров сгенерировано: " + end_km.ToString()); // Контроль литров double end_liters = 0; for (int i = 0; i < dt_Rows.Rows.Count; i++) { DataRow row = dt_Rows.Rows[i]; end_liters = end_liters + Convert.ToDouble(row["Расход"]); } MessageBox.Show("Проверка. В сумме литров сгенерировано: " + end_liters.ToString()); }
// Заполнение DataTable сгенерированными значениями километража private void FillKilometers(int num, int kilometers) { DataRow row = dt_Rows.NewRow(); row["№"] = num; row["Километраж"] = kilometers; dt_Rows.Rows.Add(row); }
// Расчет расхода топлива по каждой поездке private void CalcLiters() { int full_gen_km = 0; // Общий сгенерированный километраж // Вычисление общего километража сгенерированного программой for (int i = 0; i < dt_Rows.Rows.Count; i++) { full_gen_km = full_gen_km + Convert.ToInt32(dt_Rows.Rows[i]["Километраж"]); } MessageBox.Show("Сгенерировано км.: " + full_gen_km + " Разница: " + (full_km - full_gen_km));
// Если реальный километраж больше сгенерированного if (full_km > full_gen_km) { // Вычисляем среднее значение недостающих километров // х = (Реальный километраж - Сгенерированный километраж) / Количество выездов double add = Math.Round(full_km - full_gen_km) / int.Parse(textBox_Count.Text); MessageBox.Show("Всего прибавить: " + (full_km - full_gen_km) + " В среднем прибавка составляет: " + add.ToString());
// К каждому сгенерированному километражу прибавляем недостающие километры for (int i = 0; i < dt_Rows.Rows.Count; i++) { DataRow row = dt_Rows.Rows[i]; row["Километраж"] = Convert.ToInt32(row["Километраж"]) + Math.Round(add); row["Расход"] = Math.Round(Convert.ToDouble(row["Километраж"]) / double.Parse(textBox_Fuel.Text), 2); } } else // Отнимаем { double subtract = Math.Round(full_km - full_gen_km) / double.Parse(textBox_Count.Text); MessageBox.Show("Отбавка составляет: " + subtract.ToString()); // от каждого эменета отнимает приб for (int i = 0; i < dt_Rows.Rows.Count; i++) { DataRow row = dt_Rows.Rows[i]; row["Километраж"] = Convert.ToInt32(row["Километраж"]) + Math.Round(subtract); row["Расход"] = Math.Round(Convert.ToDouble(row["Километраж"]) / double.Parse(textBox_Fuel.Text), 2); } } dataGrid.Items.Refresh(); } } }
|
Код | <Window x:Class="wpf_Calc.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Генератор расхода топлива" Height="564" Width="385"> <Grid Height="515"> <Label Content="Расход топлива:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" /> <Label Content="Количество выездов:" Height="28" HorizontalAlignment="Left" Margin="12,46,0,0" Name="label2" VerticalAlignment="Top" /> <Label Content="Литров потрачено:" Height="28" HorizontalAlignment="Left" Margin="12,77,0,0" Name="label3" VerticalAlignment="Top" /> <Label Content="Километров пройдено:" Height="28" HorizontalAlignment="Left" Margin="12,111,0,0" Name="label4" VerticalAlignment="Top" /> <Label Content="Средний километраж 1 поездки:" Height="28" HorizontalAlignment="Left" Margin="20,143,0,0" Name="label5" VerticalAlignment="Top" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="156,12,0,0" Name="textBox_Fuel" VerticalAlignment="Top" Width="120" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="156,51,0,0" Name="textBox_Count" VerticalAlignment="Top" Width="120" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="156,79,0,0" Name="textBox_Liters" VerticalAlignment="Top" Width="120" /> <Button Content="Расчитать" Height="23" HorizontalAlignment="Left" Margin="20,177,0,0" Name="button_Generate" VerticalAlignment="Top" Width="75" Foreground="Red" FontSize="11pt"/> <DataGrid AutoGenerateColumns="False" Height="307" HorizontalAlignment="Left" Margin="20,206,0,0" Name="dataGrid" VerticalAlignment="Top" Width="327"></DataGrid> </Grid> </Window>
|
Также принимается критика по коду, предложения по улучшению и прочее.
|