Loading...
Yovor37 avatar Yovor37 1 Точки

Objects and Classes - Exercise 06. Vehicle Catalogue

You have to create a vehicle catalogue. You will store only two types of vehicles – a car and a truck. Until you receive the “End” command you will be receiving lines of input in the following format:

{typeOfVehicle} {model} {color} {horsepower}

After the “End” command, you will start receiving models of vehicles. Print the data for every received vehicle in the following format:

Type: {typeOfVehicle}

Model: {modelOfVehicle}

Color: {colorOfVehicle}

Horsepower: {horsepowerOfVehicle}
 

When you receive the command “Close the Catalogue”, print the average horsepower for the cars and for the trucks in the following format:

{typeOfVehicles} have average horsepower of {averageHorsepower}.

The average horsepower is calculated by dividing the sum of the horsepower of all vehicles from the certain type by the total count of vehicles from the same type. Round the answer to the 2nd digit after the decimal separator.

Constraints

  • The type of vehicle will always be either a car or a truck.
  • You will not receive the same model twice.
  • The received horsepower will be an integer in the range [1…1000]
  • You will receive at most 50 vehicles.
  • The separator will always be a single whitespace.

Examples

Input

Output

truck Man red 200

truck Mercedes blue 300

car Ford green 120

car Ferrari red 550

car Lamborghini orange 570

End

Ferrari

Ford

Man

Close the Catalogue

Type: Car

Model: Ferrari

Color: red

Horsepower: 550

Type: Car

Model: Ford

Color: green

Horsepower: 120

Type: Truck

Model: Man

Color: red

Horsepower: 200

Cars have average horsepower of: 413.33.

Trucks have average horsepower of: 250.00.

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace _06._Vehicle_Catalogue
{
    class Program
    {
        static void Main(string[] args)
        {
            var catalog = new Catalog();
            while (true)
            {
                string command = Console.ReadLine();
                if (command == "End")
                {
                    break;
                }

                string[] tokens = command.Split();

                string type = tokens[0];
                string model = tokens[1];
                string color = tokens[2];
                int horsePower = int.Parse(tokens[3]);

                if (type == "car")
                {
                    var car = new Car(model, color, horsePower);
                    catalog.Cars.Add(car);

                }
                else if (type == "truck")
                {
                    var truck = new Truck(model, color, horsePower);
                    catalog.Trucks.Add(truck);

                }


            }
            while (true)
            {
                string command = Console.ReadLine();

                if (command == "Close the Catalogue")
                {
                    break;
                }

                var car = catalog.Cars.Find(x => x.Model == command);
                var truck = catalog.Trucks.Find(x => x.Model == command);

                Console.WriteLine(car);
                Console.WriteLine(truck);

            }
            var carsHp = catalog.Cars.Average(x => x.HorsePower);
            var trucksHp = catalog.Trucks.Average(x => x.HorsePower);

            Console.WriteLine($"Cars have average horsepower of: {carsHp:f2}.");
            Console.WriteLine($"Trucks have average horsepower of: {trucksHp:f2}.");

        }
    }
    class Catalog
    {
        public Catalog()
        {
            Cars = new List<Car>();
            Trucks = new List<Truck>();
        }
        public List<Car> Cars { get; set; }
        public List<Truck> Trucks { get; set; }
    }
    class Car
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public int HorsePower { get; set; }

        public Car(string model, string color, int horsePower)
        {
            this.Model = model;
            this.Color = color;
            this.HorsePower = horsePower;
        }
        public override string ToString()
        {
            return $"Type: Car\nModel: {this.Model}\nColor: {this.Color}\nHorsepower: {this.HorsePower}";
        }
    }
    class Truck
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public int HorsePower { get; set; }

        public Truck(string model, string color, int horsePower)
        {
            this.Model = model;
            this.Color = color;
            this.HorsePower = horsePower;

        }
        public override string ToString()
        {
            return $"Type: Truck\nModel: {this.Model}\nColor: {this.Color}\nHorsepower: {this.HorsePower}";
        }
    }

 

 

 

линк към judge  https://judge.softuni.bg/Contests/Practice/Index/1215#5


}
 

 

Тагове:
0
Module: C# Advanced
kkaraivanov avatar kkaraivanov 486 Точки

Въпросът е......???

0
Yovor37 avatar Yovor37 1 Точки

judge ми дава 16/100, гледах решения с два калса- car и truck, иска ми се да я реша по моя начин, който е с три класа, но не мога.

0
kkaraivanov avatar kkaraivanov 486 Точки

Бегло прегледах кода и забелязах, че решението ти е концентрирано в Main метода което според мен е грешно. Утре ще прегледам и условието на задачата, ще кодна и ще тествам след което ще ти отговоря по-адекватно, като се надявам да ти бъда от помощ.

0
kkaraivanov avatar kkaraivanov 486 Точки

Привет. Направих едно решение с 3 класа за каталога и 1 клас за изпълнение на логиката. Като го пусна в Judge, получавам 16/100 и следната грешка

The process executing your submission for this test may not have received the output successfully. Please try to submit again the same solution. If the result does not change, then search the error in the submission itself.

Входа е коректен, изходът също, дебъгвах го с различни данни на входа и ексепшъни не ми връща, а Judge не го харесва и не разбирам защо. Ето и моето решение

using System;
using System.Linq;
using System.Collections.Generic;

namespace CatalogVehicle
{
    class Catalog
    {
        public string Type { get; set; }
        public string Model { get; set; }
    }

    class Car : Catalog
    {
        public string Color { get; set; }
        public string Horsepower { get; set; }
    }

    class Truck : Catalog
    {
        public string Color { get; set; }
        public string Horsepower { get; set; }
    }
    class Program
    {
        private static List<decimal> AverageCarHorsepower = new List<decimal>();
        private static List<decimal> AverageTruckHorsepower = new List<decimal>();
        static void Main(string[] args)
        {
            string lineOfCommands = string.Empty;
            List<Catalog> catalogVehicles = new List<Catalog>();

            AddVehicles(catalogVehicles, lineOfCommands);
            while ((lineOfCommands = Console.ReadLine()) != "Close the Catalogue")
            {
                GetModelInformation(catalogVehicles, lineOfCommands);
            }

            decimal averageCarHorsepower = AverageCarHorsepower.Count > 0 ? AverageCarHorsepower.Sum() / AverageCarHorsepower.Count : 0;
            decimal averageTruckHorsepower = AverageTruckHorsepower.Count > 0 ? AverageTruckHorsepower.Sum() / AverageTruckHorsepower.Count : 0;

            DisplayAverageHorsepower(averageCarHorsepower, averageTruckHorsepower);
        }

        private static void DisplayAverageHorsepower(decimal carHorsepower, decimal truckHorsepower)
        {
            if (carHorsepower > 0 && truckHorsepower > 0)
            {
                Console.WriteLine($"Cars have average horsepower of: {carHorsepower:f2}.");
                Console.WriteLine($"Trucks have average horsepower of: {truckHorsepower:f2}.");
            }
            else if (carHorsepower > 0 && truckHorsepower <= 0)
                Console.WriteLine($"Cars have average horsepower of: {carHorsepower:f2}.");
            else if (carHorsepower <= 0 && truckHorsepower > 0)
                Console.WriteLine($"Trucks have average horsepower of: {truckHorsepower:f2}.");
        }

        private static void GetModelInformation(List<Catalog> catalogVehicles, string model)
        {
            List<Car> catalogCar = new List<Car>();
            List<Truck> catalogTruck = new List<Truck>();
            string type = string.Empty;

            foreach (Car item in catalogVehicles.Where(t => t.Type == "Car").ToList())
            {
                if (item.Model == model)
                    type = item.Type;
                catalogCar.Add(item);
                AverageCarHorsepower.Add(decimal.Parse(item.Horsepower));
            }
            foreach (Truck item in catalogVehicles.Where(t => t.Type == "Truck").ToList())
            {
                if (item.Model == model)
                    type = item.Type;
                catalogTruck.Add(item);
                AverageTruckHorsepower.Add(decimal.Parse(item.Horsepower));
            }
            switch (type)
            {
                case "Truck":
                    foreach (var truck in catalogTruck)
                    {
                        if (truck.Model.Equals(model))
                        {
                            Console.WriteLine($"Type: {truck.Type}");
                            Console.WriteLine($"Model: {truck.Model}");
                            Console.WriteLine($"Color: {truck.Color}");
                            Console.WriteLine($"Horsepower: {truck.Horsepower}");
                        }
                    }
                    break;
                case "Car":
                    foreach (var car in catalogCar)
                    {
                        if (car.Model.Equals(model))
                        {
                            Console.WriteLine($"Type: {car.Type}");
                            Console.WriteLine($"Model: {car.Model}");
                            Console.WriteLine($"Color: {car.Color}");
                            Console.WriteLine($"Horsepower: {car.Horsepower}");
                        }
                    }
                    break;
            }
        }

        private static void AddVehicles(List<Catalog> catalogVehicles, string lineOfCommands)
        {
            while ((lineOfCommands = Console.ReadLine()) != "End")
            {
                string[] command = lineOfCommands.Split();
                string type = command[0];
                string model = command[1];
                string color = command[2];
                string horsepower = command[3];

                switch (type)
                {
                    case "truck":
                        var newTruck = new Truck();
                        newTruck.Type = "Truck";
                        newTruck.Model = model;
                        newTruck.Color = color;
                        newTruck.Horsepower = horsepower;
                        catalogVehicles.Add(newTruck);
                        break;
                    case "car":
                        var newCar = new Car();
                        newCar.Type = "Car";
                        newCar.Model = model;
                        newCar.Color = color;
                        newCar.Horsepower = horsepower;
                        catalogVehicles.Add(newCar);
                        break;
                }
            }
        }
    }
}

 

0
Yovor37 avatar Yovor37 1 Точки

Благодаря за усилието, ще ти  прегледам кода ,за да видя твоят начич с по малко писане в main метода.

0
kkaraivanov avatar kkaraivanov 486 Точки

на теб каква грешка ти изписва Judge?

0
Yovor37 avatar Yovor37 1 Точки

Като товоята грешка.

0
kkaraivanov avatar kkaraivanov 486 Точки

Прочетох условието няколко пъти и съм някак объркан. По принцип каталога като клас е абстрактен тип и е нормално коли, камиони и т.н. да го наследяват, т.е. логиката ти е правилна. Предполагам че новия обект - кола или камион би трябвало да се създава в обекта каталог, от което следва пропарти цвят, модел и мощтност да принадлежат на класовете кола и камион, а пропарти тип да остане само в класа каталог. Може би така ще се получи и утре ще го пробвам. Ще ти пиша какъв е резултата.

0
nickwork avatar nickwork 657 Точки

Кода на Yovor37 преправен, дава 100/100

1.The average horsepower is calculated by dividing the sum of the horsepower of all vehicles from the certain type by the total count of vehicles from the same type. => ти просто изчисляваш *var carsHp = catalog.Cars.Average(x => x.HorsePower);* общо за всички, което не е правилно.

2. Не си помислил за вариант ако колекцията от авто или камиони е == 0 => тогава какви данни ще отпечатаме...

 

using System;
using System.Collections.Generic;
using System.Linq;

namespace _06._Vehicle_Catalogue
{
    class Program
    {
        static void Main(string[] args)
        {
            var catalog = new Catalog();

            while (true)
            {
                string command = Console.ReadLine();
                if (command == "End")
                {
                    break;
                }

                string[] tokens = command.Split();

                string type = tokens[0];
                string model = tokens[1];
                string color = tokens[2];
                int horsePower = int.Parse(tokens[3]);

                if (type == "car")
                {
                    var car = new Car(model, color, horsePower);
                    catalog.Cars.Add(car);

                }
                else if (type == "truck")
                {
                    var truck = new Truck(model, color, horsePower);
                    catalog.Trucks.Add(truck);

                }


            }
            while (true)
            {
                string command = Console.ReadLine();

                if (command.Equals("Close the Catalogue"))
                {
                    break;
                }

                foreach (var car in catalog.Cars.Where(x => x.Model == command))
                {
                    Console.WriteLine($"Type: Car");
                    Console.WriteLine($"Model: {car.Model}");
                    Console.WriteLine($"Color: {car.Color}");
                    Console.WriteLine($"Horsepower: {car.HorsePower}");
                }

                foreach (var car in catalog.Trucks.Where(x => x.Model == command))
                {
                    Console.WriteLine($"Type: Truck");
                    Console.WriteLine($"Model: {car.Model}");
                    Console.WriteLine($"Color: {car.Color}");
                    Console.WriteLine($"Horsepower: {car.HorsePower}");
                }

            }

            int totalCars = catalog.Cars.Count;
            int totalTrucks = catalog.Trucks.Count;
            double sumCarkHorsePower = catalog.Cars.Sum(x => x.HorsePower);
            double sumTruckHorsePower = catalog.Trucks.Sum(x => x.HorsePower);

            if (catalog.Cars.Count > 0)
            {
                Console.WriteLine($"Cars have average horsepower of: {sumCarkHorsePower / totalCars:f2}.");
            }

            else
            {
                Console.WriteLine($"Cars have average horsepower of: {0:F2}.");
            }

            if (catalog.Trucks.Count > 0)
            {
                Console.WriteLine($"Trucks have average horsepower of: {sumTruckHorsePower / totalTrucks:f2}.");
            }

            else
            {
                Console.WriteLine($"Trucks have average horsepower of: {0:F2}.");
            }

        }
    }
    class Catalog
    {
        public Catalog()
        {
            Cars = new List<Car>();
            Trucks = new List<Truck>();
        }
        public List<Car> Cars { get; set; }
        public List<Truck> Trucks { get; set; }
    }
    class Car
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public int HorsePower { get; set; }

        public Car(string model, string color, int horsePower)
        {
            this.Model = model;
            this.Color = color;
            this.HorsePower = horsePower;
        }
        //public override string ToString()
        //{
        //    return $"Type: Car\nModel: {this.Model}\nColor: {this.Color}\nHorsepower: {this.HorsePower}";
        //}
    }
    class Truck
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public int HorsePower { get; set; }

        public Truck(string model, string color, int horsePower)
        {
            this.Model = model;
            this.Color = color;
            this.HorsePower = horsePower;

        }
        //public override string ToString()
        //{
        //    return $"Type: Truck\nModel: {this.Model}\nColor: {this.Color}\nHorsepower: {this.HorsePower}";
        //}
    }
}

//truck Man red 200
//truck Mercedes blue 300
//car Ford green 120
//car Ferrari red 550
//car Lamborghini orange 570
//End
//Ferrari
//Ford
//Man
//Close the Catalogue

0
nickwork avatar nickwork 657 Точки

kkaraivanov => Привет, при теб забелязах, че не инициализираш колекции от коли и камиони, в  unit тестовете на  judge най вероятно се търсят тези параметри...доста често при правилно решение пак не получаваме макс точки именно заради тези тестове, а и винаги Ви съветвам да тествате всяка задача с гранични стойности (макс , мин), в условията на задачите винаги имаме примерни отговори, но не винаги те са с гранични стойности (а и не би трябвало според мен), трябва ние сами да мислим за тях и да предвижаме поведението на програмата ни при такива случаи (-1 ; 0 ; или 99999999999999999999999).. 

0
06/02/2020 22:07:28
kkaraivanov avatar kkaraivanov 486 Точки

nickwork  => обърни внимание на този код

var newCar = new Car();
newCar.Type = "Car";
newCar.Model = model;
newCar.Color = color;
newCar.Horsepower = horsepower;
catalogVehicles.Add(newCar);

Понеже човека иска да си направи задачата с няколко класа, опитах с наследяване на "каталог" в който вкарвам новите обекти. Логиката си е правилна, но явно в случая се търси друго изпълнение на задачата. Предполагам кода на колегата не е публикуван заради неразбиране на решението, а за да се намери друго решение. Сигурно Judge ще ми върне 100/100 ако му подам един клас с матрица за каталога защото реално решението си е като 3 метода изкарани в класове. Просто човека търси друг вариант, което ме кефи и хелпвам.....Аз не търся решение за Judge защото още съм на масиви :)

0
kkaraivanov avatar kkaraivanov 486 Точки

Привет! Оптимизирах кода от вчера и това решение минава в Judge с оценка 100/100, като целта за класовете мисля че е постигната. Ето и новото ми решение

using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace CatalogVehicle
{
    class Program
    {
        static void Main()
        {
            string lineOfCommands = string.Empty;
            Catalog catalogVehicles = new Catalog();

            while ((lineOfCommands = Console.ReadLine()) != "End")
            {
                string[] command = lineOfCommands.Split();
                string type = command[0];
                string model = command[1];
                string color = command[2];
                long horsepower = long.Parse(command[3]);
                catalogVehicles.Add(type, model, color, horsepower);
            }

            while ((lineOfCommands = Console.ReadLine()) != "Close the Catalogue")
            {
                Console.WriteLine(catalogVehicles.GetModelInformation(lineOfCommands));
            }

            catalogVehicles.DisplayAverage();
        }
    }
    class Catalog
    {
        private List<Car> NewCar { get; set; }
        private List<Truck> NewTruck { get; set; }
        public Catalog() { this.NewTruck = new List<Truck>(); this.NewCar = new List<Car>(); }
        public void Add(string type, string model, string color, long horsepower)
        {
            switch (type)
            {
                case "car":
                    var car = new Car();
                    car.Model = model;
                    car.Color = color;
                    car.Horsepower = horsepower;
                    NewCar.Add(car);
                    break;
                case "truck":
                    var truck = new Truck();
                    truck.Model = model;
                    truck.Color = color;
                    truck.Horsepower = horsepower;
                    NewTruck.Add(truck);
                    break;
            }
        }
        public void DisplayAverage()
        {
            if (NewCar.Count > 0)
                Console.WriteLine($"Cars have average horsepower of: {(NewCar.Sum(nc => nc.Horsepower) / (NewCar.Count * 1.0)):f2}.");
            else
                Console.WriteLine($"Cars have average horsepower of: {0:f2}.");

            if (NewTruck.Count > 0)
                Console.WriteLine($"Trucks have average horsepower of: {(NewTruck.Sum(nt => nt.Horsepower) / (NewTruck.Count * 1.0)):f2}.");
            else
                Console.WriteLine($"Trucks have average horsepower of: {0:f2}.");
        }
        public string GetModelInformation(string model)
        {
            StringBuilder sb = new StringBuilder();
            if (NewCar.Count != 0)
            {
                foreach (var car in NewCar.Where(nc => nc.Model == model))
                {
                    sb.Append("Type: Car\n");
                    sb.Append($"Model: {car.Model}\n");
                    sb.Append($"Color: {car.Color}\n");
                    sb.Append($"Horsepower: {car.Horsepower}");
                }
            }
            if (NewTruck.Count != 0)
            {
                foreach (var truck in NewTruck.Where(nt => nt.Model == model))
                {
                    sb.Append("Type: Truck\n");
                    sb.Append($"Model: {truck.Model}\n");
                    sb.Append($"Color: {truck.Color}\n");
                    sb.Append($"Horsepower: {truck.Horsepower}");
                }
            }

            return sb.ToString();
        }
    }

    class Car
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public long Horsepower { get; set; }
    }

    class Truck
    {
        public string Model { get; set; }
        public string Color { get; set; }
        public long Horsepower { get; set; }
    }
}

 

0
Yovor37 avatar Yovor37 1 Точки

Благодаря ви много и на двамата, в карайна сметка измъдрих това https://pastebin.com/W080R9pv , което дава 100/100 , знам пак съм писам много в main метода, но не ми се поправяше кода, за следващия път ще знам.

0
kkaraivanov avatar kkaraivanov 486 Точки

Решението си го бива. В моето Judge ми върна 33/100 и след добавяне на

else
Console.WriteLine($"Cars have average horsepower of: {0:f2}.");
else
Console.WriteLine($"Trucks have average horsepower of: {0:f2}.");

в if проверката, върна 100/100. Това с дългия Main() метод не го приемай за упрек, просто мисля, че трябва да свикваме да следваме концепциите т.е. класа да си има методи които да решават проблемите, след което да ги извикваме в Main() и изпълним условието на търсения проблем. Когато правиш Application с форми и потребителски обекти в тях е много трудно ако не отделиш кода си в отделни файлове, класове, методи, пропартита, събития и т.н.

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.