Witam,
mam problem odnośnie punktu 10 z załącznika a dokładnie linijka "marka, model, silnik". Czy to oznacza, że konstruktor powinien być w konstruktorze ?
Zadanie z programowania obiektowego - konstruktory
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Tylko jak przypisać do parametru silnik, parametry z klasy silnik ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Wiem jak przekazać parametr do konstruktora, ale nie za bardzo wiem jak stworzyć parametr obiekt klasy silnik.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Zrobiłem jaką część projektu ale mam problem...
Program główny:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("1.Marka\n2.Model\n3.Pojemność Silnika\n4.Ilość Paliwa\n5.Pojemność Baku");
//Samochod S1 = new Samochod(Console.ReadLine(),Console.ReadLine(), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()));
Samochod s2 = new Samochod(Console.ReadLine(), Console.ReadLine(), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()), Convert.ToDouble(Console.ReadLine()));
Console.Clear();
Console.WriteLine("Marka: " + s2.Marka);
Console.WriteLine("Model: " + s2.Model);
Console.WriteLine("Pojemnosc: " + s2.PojemnośćSilnika);
Console.WriteLine("Ilosc paliwa: " + s2.IlośćPaliwa);
Console.WriteLine("Pojemnosc baku: " + s2.PojemnośćBaku);
Console.WriteLine();
s2.Jedz();
}
}
}
Klasa silnik:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication4
{
class Silnik
{
private const double galon = 4.54; // stała wartość jednego galonu 1galon = 4,54 l
private const double mila = 1.609; //stała warotść jednej mili 1mila = 1,609 km
private static double a; // przelicznik z mili na kilometr
private static double mpgLkm;// wynik kowersji z mpg na l/100km
private static double lkmMpg;// wynik konwersji z l/100km na mpg
private double pojemnośćBaku = 60;
public double PojemnośćSilnika { get;private set; }
public double IlośćPaliwa { get;private set; }
public double PojemnośćBaku { get;private set; }
public static void LkmMpg(double lkm) // przelicznik z l/100km na mpg
{
lkmMpg = (282.5 / lkm);
Console.WriteLine(lkmMpg);
}
public static void MpgLkm(double mile) // przelicznik z mpg na l/100km
{
a = (mila * mile);
mpgLkm = (galon / a * 100);
Console.WriteLine(mpgLkm);
}
public Silnik(double newPojemnośćSilnika, double newIlośćPaliwa, double newPojemnośćBaku) // tworzy nowy silnik
{
this.PojemnośćSilnika = newPojemnośćSilnika;
this.IlośćPaliwa = newIlośćPaliwa;
this.PojemnośćBaku = newPojemnośćBaku;
}
}
}
Oraz klasa samochód:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Diagnostics;
namespace ConsoleApplication4
{
class Samochod
{
public double km;
private double spalone;
public double j;
public string decyzja;
public string Marka { get; private set; }
public string Model { get; private set; }
public double Paliwo { get;private set; }
public double Strata { get;private set; }
public double ResztaPaliwa { get; private set; }
Silnik s1 = new Silnik();
public Samochod(string newMarka, string newModel, double newPojemnośćSilnika, double newIlośćPaliwa, double newPojemnośćBaku)
{
this.Marka = newMarka;
this.Model = newModel;
s1.PojemnośćBaku = newPojemnośćBaku;
s1.PojemnośćSilnika = newPojemnośćSilnika;
s1.IlośćPaliwa = newIlośćPaliwa;
}
public void Jedz()
{
Console.WriteLine("Ile będziesz jechał kilometrów?");
km = Convert.ToInt32(Console.ReadLine());
if ((km / 100 * s1.PojemnośćSilnika * 4) > s1.IlośćPaliwa)
{
// Jeżeli nie ma wystarczającej ilości paliwa, użytkownik dostaje taką informację i może zatankować samochód.
Console.WriteLine("Nie masz wystarczającej ilości paliwa...");
ResztaPaliwa = s1.IlośćPaliwa;
Tankuj();
}
else if ((km / 100 * s1.PojemnośćSilnika * 4) <= s1.IlośćPaliwa)
{
Console.WriteLine();
Console.WriteLine("Jedz");
Console.WriteLine();
var watch = new Stopwatch();
watch.Start();
while (watch.Elapsed < TimeSpan.FromMilliseconds(km * 100))
{
// animacja poruszania się pojazdu
j += 1;
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write("_________");
Console.WriteLine();
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write("|_________\\");
Console.WriteLine();
for (int i = 0; i < j; i++)
{
Console.Write(" ");
}
Console.Write(" oo o");
Console.WriteLine();
if (j > 60)
{ j = 0; }
Thread.Sleep(50);
Console.Clear();
}
watch.Stop();
Console.Clear();
Dzialaj();
Console.WriteLine("Jestem\n");
Console.WriteLine("Zostało tyle paliwa:");
Console.WriteLine(s1.IlośćPaliwa);
s1.IlośćPaliwa = ResztaPaliwa;
Console.WriteLine("Czy chcesz jechać dalej ? (y/n)");
decyzja = Console.ReadLine();
if (decyzja == "y")
{
Jedz();
}
else if (decyzja == "n")
{
Console.Clear();
Console.WriteLine("\t\tKoniec jazdy");
Console.ReadKey();
}
}
}
public void Dzialaj()
{
spalone = km / 100 * s1.PojemnośćBaku * 4;
ResztaPaliwa = s1.IlośćPaliwa - spalone;
}
public void Tankuj()
{
Console.WriteLine("Ile paliwa zatankowac ?");
Paliwo = float.Parse(Console.ReadLine());
s1.PojemnośćBaku = ResztaPaliwa + Paliwo;
if (s1.IlośćPaliwa > s1.PojemnośćBaku)
{
Console.Clear();
Strata = s1.IlośćPaliwa - s1.PojemnośćBaku;
s1.IlośćPaliwa = s1.PojemnośćBaku;
Console.WriteLine("Przelałeś bak...\n straciłeś " + Strata + " litrów paliwa...");
Console.WriteLine("Teraz masz tyle paliwa:" + s1.IlośćPaliwa);
Jedz();
}
else if(s1.IlośćPaliwa <= s1.PojemnośćBaku)
{
Console.WriteLine("Teraz masz tyle paliwa:" + s1.IlośćPaliwa);
Jedz();
}
}
}
}
Mój problem polega na tym, że w klasie silnik są właściwości (Ilość paliwa, pojemność baku, oraz silnika), które muszą mieć prywatnego seta. Tylko jak w takim razie w klasie samochód stworzyć konstruktory, które będą charakteryzowały się w taki sposób :
marka,model,pojemnośćsilinka, ilość benzyny,pojemność baku.
marka,model,pojemnośćsilinka, ilość benzyny.
marka,model,silnik.
Samochód charakteryzuje się marką modelem oraz SILNIKIEM(nie rozumiem jak mam do właściwości przypisać silnik)
Coś robię źle tylko nie mam pojęcia co ...
- Rejestracja: dni
- Ostatnio: dni
- Postów: 4883
private Silnik silnik;
public Silnik Silnik {
get { return silnik; }
private set;
}
public Samochod(Silnik silnik)
{
this.silnik = silnik;
}
moglem gdzies sie walnac bo pisane z palca
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Czyli cały kod jest dobry i wystarczy wkleić w klasie samochód ten kod ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 4883
nie patrzylem na caly kod, patrzylem na Twoje pytanie. Staram Ci sie pomoc dajac Ci wskazowki a nie gotowce ;)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Tylko to jest o ile dobrze rozumiem odpowiedź na jak przypisać silnik do właściwości. Ale dalej nie kumam co z pierwszym pytaniem...
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Polska, Kraków
Przykład:
public class Silnik
{
public double PojemnośćBaku { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public double PojemnośćSilnika { get; set; }
public double IlośćPaliwa { get; set; }
public Silnik(double pojemnośćSilnika, double ilośćPaliwa, double pojemnośćBaku)
: this(pojemnośćSilnika, ilośćPaliwa)
{
this.PojemnośćBaku = pojemnośćBaku;
}
public Silnik(double pojemnośćSilnika, double ilośćPaliwa)
{
this.PojemnośćBaku = 15;
this.PojemnośćSilnika = pojemnośćSilnika;
this.IlośćPaliwa = ilośćPaliwa;
}
}
public class Samochod
{
public string Marka { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public string Model { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public Silnik Silnik { get; private set; } // W C# 6.0 wystarczy samo { get; } w tym przypadku
public Samochod(string marka, string model, double pojemnośćSilnika, double ilośćPaliwa, double pojemnośćBaku)
: this(marka, model, new Silnik(pojemnośćSilnika, ilośćPaliwa, pojemnośćBaku))
{
}
public Samochod(string marka, string model, double pojemnośćSilnika, double ilośćPaliwa)
: this(marka, model, new Silnik(pojemnośćSilnika, ilośćPaliwa))
{
}
public Samochod(string marka, string model, Silnik silnik)
{
Marka = marka;
Model = model;
Silnik = silnik;
}
}
- Rejestracja: dni
- Ostatnio: dni
Póki co dalej nie realizujesz punktu 3 w zakresie braku możliwości modyfikacji pojemności baku po utworzeniu.
Prywatny seter dalej umożliwia jego modyfikację.
Musisz użyć modyfikatora readonly.
I jeszcze jedno - nie pisze się "same" tylko "samo" :)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 2512
Readonly można zastosować tylko do pól, więc musiałby tworzyć dodatkowe pole prywatne (backing field), co jest moim zdaniem nadmiarowe. W tym punkcie chodzi bardziej o to, żeby nie możliwa była modyfikacja "z zewnątrz".
EDIT: W zasadzie użycie wyłącznie gettera załatwia sprawę (jak zaznaczył @DibbyDum poniżej)
- Rejestracja: dni
- Ostatnio: dni
@Sarrus Mówisz z pragmatycznego punktu widzenia, ale w szkole nie zawsze jest to preferowanym rozwiązaniem.
Wręcz często wszelkie uproszczenia są niemile widziane.
Ja bym zrobił same propfulle, aby pokazać, że umiem, a dla 1 czy 2 skrótowe propy.
- Rejestracja: dni
- Ostatnio: dni
- Lokalizacja: Polska, Kraków
public string Coś{ get; }
W C# 6.0 wygeneruje pole readonly.
Prywatny seter dalej umożliwia jego modyfikację.
Który kawałek kodu w mojej klasie umożliwia taką modyfikację?
A tak w ogóle moim głównym zamysłem było pokazania jak mogą wyglądać te konstruktory, cała reszta jest mało istotna w tym przykładzie.