Wywołanie metody na rzecz zmiennej/klasy(?)

0

Witam,
mam problem z pewnym zadaniem. Mam napisać program będący symulatorem jazdy samochodem. Wszystko do tej pory było ok, ale mam problem z jednym punktem. Podejrzewam, że rozwiązanie jest dziecinnie proste, ale już zgłupiałem i nie wiem jak się za to zabrać.

Jeden z punktów zadania i zaznaczone polecenie do zrobienia, o które mi chodzi:
user image

Klasa Program

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

namespace Symulator_v2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("* * * * * MENU GLOWNE * * * * *\n\n" + "Zdefiniuj swoje auto: \n");
            Console.WriteLine("1. Marka, model, pojemnosc silnika, ilosc paliwa, pojemnosc baku na paliwo.");
            Console.WriteLine("2. Marka, model, pojemnosc silnika, ilosc paliwa.");
            Console.WriteLine("3. Marka, model, silnik.");      //zrobic konstruktor do tego punktu -> Samochod
            Console.Write("--------------------------------------------------------------------------------");
        
        Wybierz:
            Console.Write("Wybrano: ");
            int wybor = int.Parse(Console.ReadLine());
            switch (wybor)
            {
                case 1:
                    Samochod s1 = new Samochod("marka", "model", 0, 0, 60);
                    goto Jedz;
                case 2:
                    Samochod s2 = new Samochod("marka", "model", 0, 0);
                    goto Jedz;
                case 3:
                    Samochod s3 = new Samochod("marka", "model", 0);
                    goto Jedz;
                default:
                    Console.WriteLine("Wybierz poprawnie!");
                    goto Wybierz;
            }

        Jedz:
            Console.Write("\nWprowadz dlugosc trasy w kilometrach: ");
            Samochod.Jedz(int.Parse(Console.ReadLine()));

            Console.WriteLine("\nCo przeliczyć?");
            Console.WriteLine("1. Spalanie[l/100km] na mile na galon[mpg].");
            Console.WriteLine("2. Mile na galon[mpg] na spalanie[l/100km].");

        Konwerter:
            Console.Write("Wybrano: ");
            int konwerter = int.Parse(Console.ReadLine());
            switch (konwerter)
            {
                case 1:
                    Silnik.Mpg();
                    break;
                case 2:
                    Silnik.SpalanieLitry();
                    break;
                default:
                    Console.WriteLine("Wybierz poprawnie!");
                    goto Konwerter;
            }
        }
    }
}

Klasa Samochod

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

namespace Symulator_v2
{
    class Samochod
    {
        public string Marka;
        public string Model;
        public double Silnik;

        public Samochod(string marka, string model, double pojemnosc, double iloscPaliwa, double pojemnoscBaku)
        {
            this.Marka = marka;
            this.Model = model;
            
            Console.Write("\nMarka samochodu: ");
            marka = Console.ReadLine();
            Console.Write("\nModel: ");
            model = Console.ReadLine();
            
            Silnik s1 = new Silnik(0, 0, 60);

            Console.WriteLine("\n\nTwoj samochod to {0} {1}. Do samochodu zatankowano {2}l paliwa. \nSilnik ma pojemnosc {3}l i spala czterokrotnosc jego pojemnosci na 100km.", marka, model, s1.IloscPaliwa, s1.Pojemnosc);
        }

        public Samochod(string marka, string model, double pojemnosc, double iloscPaliwa)
        {
            this.Marka = marka;
            this.Model = model;

            Console.Write("\nMarka samochodu: ");
            marka = Console.ReadLine();
            Console.Write("\nModel: ");
            model = Console.ReadLine();
            
            Silnik s2 = new Silnik(0, 0);
        }

        public Samochod(string marka, string model, double silnik)
        {
            this.Marka = marka;
            this.Model = model;
            this.Silnik = silnik;

            Console.Write("\nMarka samochodu: ");
            marka = Console.ReadLine();
            Console.Write("\nModel: ");
            model = Console.ReadLine();
            
        }
        
        public static double Jedz(int dystans)        //Si
        {
            int czas = dystans * 100;

            System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
            watch.Start();
            
            for (int i = 0; i < dystans; i++)
            {
                Console.WriteLine("Jadę!\n");
                Console.Write("{0}km...", i);
                Thread.Sleep(czas / dystans);
                Console.Clear();
                
            }
            watch.Stop();
            Console.WriteLine("\nJestem!");
            Console.WriteLine("\nCzas programowy: {0}ms", czas);
            Console.WriteLine("(rzeczywisty czas {0}ms)", watch.ElapsedMilliseconds);

            Console.ReadLine();
            return czas;
        }
    }
}

Klasa Silnik

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

namespace Symulator_v2
{
    class Silnik
    {
        public readonly double Pojemnosc;
        public double IloscPaliwa;
        public readonly double PojemnoscBaku;
        public const double DomyslnaPojemnoscBaku = 60;

        /*
        public Silnik(double pojemnosc, double iloscPaliwa) : this(pojemnosc, iloscPaliwa, DomyslnaPojemnoscBaku)
        {
            Console.WriteLine("\nPojemnosc silnika to {0}l. Ilosc paliwa wynosi {1}l.", Pojemnosc, IloscPaliwa);
        }
         */

        public Silnik(double pojemnosc, double iloscPaliwa, double pojemnoscBaku)
        {
            Console.Write("\nPojemnosc baku na paliwo: ");
            this.PojemnoscBaku = pojemnoscBaku;
            pojemnoscBaku = double.Parse(Console.ReadLine());
            Console.WriteLine("\nUWAGA! Jesli pojemnosc baku będzie < ilosci zatankowanego paliwa to program\n zatankuje automatycznie max. paliwa.");

            Console.Write("\nPodaj ilosc paliwa[l]: ");
            iloscPaliwa = double.Parse(Console.ReadLine());
            if ((iloscPaliwa > pojemnoscBaku) || (iloscPaliwa < 0))
            {
                this.IloscPaliwa = pojemnoscBaku;
                Console.WriteLine("Zatankowano {0}l paliwa!", pojemnoscBaku);
            }
            else
            {
                this.IloscPaliwa = iloscPaliwa;
                Console.WriteLine("Zatankowano {0}l paliwa!", iloscPaliwa);
            }

            Console.Write("\nPojemnosc silnika: ");
            pojemnosc = double.Parse(Console.ReadLine());
            if (pojemnosc < 0)
            {
                this.Pojemnosc = 2.0;
                Console.WriteLine("Wprowadzona pojemnosc jest nieprawidlowa. Domyslna pojemnosc {0}.0l.", Pojemnosc);
            }
            else
            {
                this.Pojemnosc = pojemnosc;
                Console.WriteLine("Pojemnosc {0}l.", Pojemnosc);
            }
        }

        public Silnik(double pojemnosc, double iloscPaliwa)
        {
            
            Console.WriteLine("\nUWAGA! Domyslna pojemnosc baku to 60l.");
        Powrot:
            Console.Write("\nPodaj ilosc paliwa[l]: ");
            iloscPaliwa = double.Parse(Console.ReadLine());
            if ((iloscPaliwa > DomyslnaPojemnoscBaku) || (iloscPaliwa < 0))
            {
                this.IloscPaliwa = DomyslnaPojemnoscBaku;
                Console.WriteLine("Zatankowales za duzo! Max. to {0}l paliwa!", DomyslnaPojemnoscBaku);
                goto Powrot;
            }
            else
            {
                this.IloscPaliwa = iloscPaliwa;
                Console.WriteLine("Zatankowano {0}l paliwa!", iloscPaliwa);
            }

            Console.Write("\nPojemnosc silnika: ");
            pojemnosc = double.Parse(Console.ReadLine());
            if (pojemnosc < 0)
            {
                this.Pojemnosc = 2.0;
                Console.WriteLine("Wprowadzona pojemnosc jest nieprawidlowa. Domyslna pojemnosc {0}.0l.", Pojemnosc);
            }
            else
            {
                this.Pojemnosc = pojemnosc;
                Console.WriteLine("Pojemnosc {0}l.", Pojemnosc);
            }
        }
        
        public static double Dzialaj(double spal)
        {
            //this.IloscPaliwa -= this.Pojemnosc * 4;
            return 0;
        }
        
        
        static double litry;
        static double galon;
        static double kilometry;
        static double mile;
        static double spalanie;
        static double mpg;

        public static double Mpg()
        {
            Console.Write("Ile litrow paliwa zuzyto?: ");
            litry = double.Parse(Console.ReadLine());
            Console.Write("Wprowadz ilosc przejechanych kilometrow: ");
            kilometry = double.Parse(Console.ReadLine());

            spalanie = (litry / kilometry) * 100;

            Console.WriteLine("----------------------------------------------" + "\n" +
                "Spalanie Twojego auta wynosi: {0}[l/100km]" + "\n", spalanie);

            mpg = 282.48 / spalanie;
            Console.WriteLine("----------------------------------------------" + "\n" + "Po przeliczeniu: {0}[mpg]", mpg);

            Console.ReadLine();

            return mpg;
        }

        public static double SpalanieLitry()
        {
            Console.Write("Podaj ilosc przejechanych mil: ");
            mile = double.Parse(Console.ReadLine());
            Console.Write("Ile galonów paliwa zuzyto?: ");
            galon = double.Parse(Console.ReadLine());

            mpg = (mile / galon);
            Console.WriteLine("----------------------------------------------" + "\n" + "Przejedziesz {0} mil na 1 galonie." + "\n", mpg);
            spalanie = 282.48 / mpg;
            Console.WriteLine("----------------------------------------------" + "\n" + "Spalanie Twojego auta wynosi {0}[l/100km]", spalanie);

            Console.ReadLine();

            return spalanie;
         
        }
    }
}

Nie chodzi mi o gotowe rozwiązanie, ale o wskazówki jak to ugryźć. Nie linczujcie mnie, dopiero się uczę;)

4

Do zaorania i napisania od nowa. Takie rzeczy jak goto i Etykieta: sobie koniecznie daruj w swoim kodzie, bo to tylko źródło kłopotów. Poza tym wszystkie te static'i też możesz spokojnie wywalić.

0

Nie strasz mnie.

Z tego co wiem to w przypadku instrukcji switch stosowanie etykiet jest ok(w tym przypadku etykiety Wybierz: i Konwerter:).

Co do etykiety Powrot: to jestem w stanie ją usunąć i ustawić wartość zmiennej na domyślną(ze zmianą komentarza).

if ((iloscPaliwa > DomyslnaPojemnoscBaku) || (iloscPaliwa < 0))
            {
                this.IloscPaliwa = DomyslnaPojemnoscBaku;
                Console.WriteLine("Zatankowales za duzo! Do baku wlano max. ilosc paliwa tj. {0}l.", DomyslnaPojemnoscBaku);
            }

Natomiast etykieta Jedz: pozwala przejść mi do kolejnego bloku kodu. Bez tej etykiety wyskakuje mi komunikat o nieosiągalnym kodzie(po zastąpieniu goto return'em)

2

Zapomnij, że istnieje coś takiego jak etykieta i instrukcja goto. Zapomnij na zawsze. Zamiast tego używaj po prostu pętli. I upieranie się nie ma kompletnie sensu :)

3

@El_Jot zapewne sie bardzo starales napisac to co napisales. Ale to zapewne jest zle. A na pewno nie jest to napisane jak powinno byc
A nawet wydaje mi sie, ze to sie w ogole nie kompiluje

Chcialem poprawic w takim stanie jak to jest. Ale niestety... ciezko panie ciezko

w switchu mozna etykiet uzywac ale to jest jedyne miejsce gdzie sie powinno (oczywiscie sa reguly od tej zasady). Na dobra sprawe, to ze switchy nie trzeba korzystac jezeli ma robic wieksza logike (zamiast case ze switcha robisz klase)
do tego duzo staticow i innych cudow na kiju.

a co do "dlaczego wydaje mi sie, ze to co napisales jest zle". wywolujesz

Silnik.Mpg();

a nie powinno byc cos takiego?

samochod.spalanie();
0

Ok, ok;)
O ile ten problem(switche, etykiety) jestem w stanie jeszcze jakoś rozwiązać, to dalej nie wiem jak zabrać się za główną przyczynę mojego problemu.

@fasadin
Właśnie wszystko działa:) żadnych błędów, etc.

Co do tej części kodu, który wkleiłeś to jestem świadom tego, że jest do poprawy, ale tym chciałem się zająć później.
Mogłem ją w sumie, przed wrzuceniem na forum, dać w komentarz. Tą część kodu pisałem po prostu na samym początku zadania. Ot taki wymysł prowadzącego.
Ogólnie mój zamysł był taki, aby przeliczać spalanie dopiero na samym końcu i uzależnić to od zmiennych które są wcześniej tj. zsumować dł. trasy oraz zużyte paliwo.

0

Klasa Program po lifcie;)

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

namespace Symulator_v2
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("* * * * * MENU GLOWNE * * * * *\n\n" + "Zdefiniuj swoje auto: \n");
            Console.WriteLine("1. Marka, model, pojemnosc silnika, ilosc paliwa, pojemnosc baku na paliwo.");
            Console.WriteLine("2. Marka, model, pojemnosc silnika, ilosc paliwa.");
            Console.WriteLine("3. Marka, model, silnik.");
            Console.Write("--------------------------------------------------------------------------------");

        //Wybierz:
            for (int i = 0; i < 4;)
            {
                Console.Write("Wybrano: ");
                string wybor = Console.ReadLine();
                if (wybor == "1")
                {
                    Samochod s1 = new Samochod("marka", "model", 0, 0, 60);
                    Console.Write("\nWprowadz dlugosc trasy w kilometrach: ");
                    Samochod.Jedz(int.Parse(Console.ReadLine()));
                    return;
                }
                else if (wybor == "2")
                {
                    Samochod s2 = new Samochod("marka", "model", 0, 0);
                    Console.Write("\nWprowadz dlugosc trasy w kilometrach: ");
                    Samochod.Jedz(int.Parse(Console.ReadLine()));
                    return;
                }
                else if (wybor == "3")
                {
                    Samochod s3 = new Samochod("marka", "model", 0);
                    Console.Write("\nWprowadz dlugosc trasy w kilometrach: ");
                    Samochod.Jedz(int.Parse(Console.ReadLine()));
                    return;
                }
                else
                {
                    Console.WriteLine("Wybierz poprawnie!");
                }
            }
            /*
            switch (wybor)
            {
                case "1":
                    Samochod s1 = new Samochod("marka", "model", 0, 0, 60);
                    //return;
                    goto Jedz;
                case "2":
                    Samochod s2 = new Samochod("marka", "model", 0, 0);
                    //return;
                    goto Jedz;
                case "3":
                    Samochod s3 = new Samochod("marka", "model", 0);
                    //return;
                    goto Jedz;
                default:
                    Console.WriteLine("Wybierz poprawnie!");
                    goto Wybierz;
            }
            

        Jedz:
            Console.Write("\nWprowadz dlugosc trasy w kilometrach: ");
            Samochod.Jedz(int.Parse(Console.ReadLine()));

            
            Console.WriteLine("\nCo przeliczyć?");
            Console.WriteLine("1. Spalanie[l/100km] na mile na galon[mpg].");
            Console.WriteLine("2. Mile na galon[mpg] na spalanie[l/100km].");

        Konwerter:
            Console.Write("Wybrano: ");
            string konwerter = Console.ReadLine();
            switch (konwerter)
            {
                case "1":
                    Silnik.Mpg();
                    break;
                case "2":
                    Silnik.SpalanieLitry();
                    break;
                default:
                    Console.WriteLine("Wybierz poprawnie!");
                    goto Konwerter;
            }
             */
        }
    }
}
2

A czemu dajesz użytkownikowi tylko 4 próby na wprowadzenie poprawnego wyboru?
Powinieneś użyć pętli do-while zamiast for.

I po co te return? Nie będziesz chciał już nic później robić w funkcji Main?
I zamiast drabinki if-else lepiej w tym przypadku użyć switch.

0

@somekind
O Do...While pomyślałem dopiero po tym jak wrzuciłem kod. Faktycznie miałoby to większy sens.

0

Czemu zastąpiłeś case ifem ? Po co powtarzasz w każdym if ten sam kod? Utwórz w if/case obiekt klasy a całą resztę poza while( z któej wychodzisz za pomocą break)? Pobrana długość trasy z konsoli powinna być sprawdzona czy w ogóle da się skonwertować(co jesli wpiszesz tam w konsoli "Ala ma kota") np. za pomocą TryParse.

1 użytkowników online, w tym zalogowanych: 0, gości: 1