Trädvy Permalänk
Medlem
Registrerad
Jan 2019

Hjälp med programmering!

Hej!

Sitter just nu fast med en skoluppgift.
Beskrivningen är som följer;

Uppgift
För att öva på arv i förberedelser för den större uppgiften ovan så ska du här lämna in följande uppgift.
Skapa en klass som heter fordon och som har följande fält:
hästkrafter
färg
Denna klass ska ha en lämplig konstruktor och en metod som beräknar maxhastigheten för fordonet.
Vidare kan du lägga till en valfri metod som exempelvis att fordonet "tutar".
Maxhastigheten baseras på hästkrafter med en lämplig formel.
Metoden för att beräkna tophastigheten är kursiv i UML:et vilket innebär att den är virtuell.
Skapa ytterigare en klass som heter lastbil och som ärver av fordon. I denna klass finns ytterligare ett fält som heter last.
Maxhastigheten för lastbil beräknas utifrån hästkrafter och last på ett lämpligt sätt.
Observera att formeln inte på något sätt behöver vara realistisk. Det är principen med kodningen som är det viktiga.

Finns även ett UML diagram som jag inte riktigt lyckades infoga här.

Koden på vad jag har änsålänge kommer här

namespace Fordon { public class Fordon { public int antal_fordon = 0; static void Main(string[] args) { { Console.WriteLine("Var god ange antalet hästkrafter; "); Fordon H = new Fordon(); H.horsepower(); Console.WriteLine("Ange fordonets vridmoment(Standard är mellan 1000-6000); "); Fordon T = new Fordon(); T.torque(); Console.WriteLine("Sist men inte minst, ange bilens färg(Stil är också viktigt!); "); Fordon C = new Fordon(); C.color(); Fordon Ca = new Fordon(); Ca.Calcspeed(); } } public int horsepower() { int horsepower = int.Parse(Console.ReadLine()); int[] _horsepower = new int[antal_fordon]; antal_fordon++; return horsepower; } public int torque() { int torque = int.Parse(Console.ReadLine()); int[] _torque = new int[antal_fordon]; antal_fordon++; return torque; } public string color() { string color = Console.ReadLine(); string[] _color = new string[antal_fordon]; antal_fordon++; return color; } protected virtual int Calcspeed() { int speed = 5252 * horsepower() / torque(); return speed; } } public class Truck : Fordon { int weight = int.Parse(Console.ReadLine()); protected virtual int Calctruckspeed() { int speed = 5252 * horsepower() / torque(); return speed; } } }

Det jag sitter fast på just nu är att jag inte löser hur jag skall kunna länka indatan till en specifik array eller list. Som det ser ut just nu så är det antagligen många andra fel i koden också, förväntar mig absolut inte att någon gör uppgiften åt mig. Finns ingen mening med det. Men uppskattar alla tips och trick som jag kan få. Är lite utav en flaskhals just nu med detta, då jag inte kan bygga mycket mer utan att ha någonstans att lagra datan.

Uppskattar all hjälp jag kan få!

Trädvy Permalänk
Medlem
Registrerad
Jul 2015

Några saker du kan fundera på för att komma vidare. Uppgiften beskriver att klassen ska ha ett antal fält; hästkrafter samt färg. Har du implementerat detta korrekt i den kod du presenterar för oss? Klassen skall även ha en lämplig konstruktor samt en metod för att beräkna maxhastighet. Kan vara värt att kolla upp vad detta innebär.

Kommer inte ge dig mer hjälp nu men för att lösa liknande uppgifter bör du fundera på hur du vill att programmet ska fungera och vad som står i uppgiftsbeskrivningen. Det känns som att du behöver läsa igenom beskrivningen ordentligt och kolla upp vad termer som "fält". "konstruktor" och "metod" innebär i en klass. Lycka till!

Skoj: i5 8600k @4,8GHz, Z370-P ATX, 1070 ROG Strix 8 GB, 16 GB DDR4 @3200MHz, Kraken X62
Jobb: Dell XPS 13 9370 4K
Privat: Macbook Pro 13" late 2016

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2011

Enig till ovanstående svar, du behöver gå igenom grunderna igen. Sök på object oriented programming på youtube till exempelvis.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@widell_1992: Din Fordon-klass är just nu mer din huvudklass för hela programmet snarare än en klass som representerar fordon, vilket nog är en stor orsak till problemen du har. Separera koden så att du har en klass för main och eventuellt en lista med Fordon-instanser om du vill lagra flera fordon, och en klass Fordon som enbart representerar ett fordon.

Och när jag säger att Fordon enbart representerar ett fordon så menar jag t.ex. att den klassen inte ska hantera inmatning från användaren, utan bör vara så enkel som möjligt. Inmatade värden bör istället skickas till instanser av Fordon via t.ex. en konstruktor när instanserna skapas.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jan 2014

Som tidigare nämnt är i princip allting fel.

Du ska skapa ett objekt av typ Fordon, inmatning osv ska du hantera i mainklassen.

Bör även läsa på gällande uppgiften. Du har inte använt någonting som uppgiften vill att du ska använda.

Mocka upp lite kod om hur du kan börja, vet ej ifall det kompilerar men bör ge dig ett hum om hur du ska börja

class Program { static void Main(string[] args) { int a = 111; string b = "HEj!"; Fordon f = new Fordon(a, b); //skapa nytt objekt med parametrar som konstruktorn tar emot. f.PrintData(); } } public class Fordon { public Fordon(int a, string b) { hp = a; color = b; } //Detta är konstruktorn, den anropas när objektet skapas public void PrintData() { Console.WriteLine("hp: {0}, color: {1}", hp, color); } private int hp; private string color; }

Trädvy Permalänk
Medlem
Registrerad
Jan 2019

Tack för all hjälp, skrotade koden och började om från ruta ett. Blir lite tunnelseende ibland märker jag.

Trädvy Permalänk
Medlem
Registrerad
Jan 2019

Har nu fått fram något som skulle kunna liknas vid en funktionell kod, problemet är att jag inte lyckas få tillgång till fälten i klassen som jag ärver från. Är i lite samma sits nu att jag suttit lite för länge med det och har svårt att se problemen. Skulle uppskatta om jag fick lite vägledning igen!

Här är koden jag har för tillfället

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Fordonen { class Program { static void Main(string[] args) { Console.WriteLine("Var god ange antalet hästkrafter; "); int horsepower = int.Parse(Console.ReadLine()); Console.WriteLine("Ange färgen på ditt fordon; "); string color = Console.ReadLine(); Fordon f = new Fordon(horsepower, color); //skapa nytt objekt med parametrar som konstruktorn tar emot. f.PrintData(); Console.ReadKey(); Console.WriteLine("Nu är det dags att testa en lastbil! "); Console.WriteLine("Var god ange hästkrafterna; "); int _horsepower = int.Parse(Console.ReadLine()); Console.WriteLine("Ange färgen på din lastbil;" ); string _color = Console.ReadLine(); Console.WriteLine("Och sist men tyngst, ange lastbilens vikt; "); int weight = int.Parse(Console.ReadLine()); Lastbil l = new Lastbil(horsepower, color, weight); l.printData(); Console.WriteLine("Kalkulation avklarad, tryck på valfri knapp för att avsluta programmet"); Console.ReadKey(); } } public class Fordon { public Fordon(int a, string b, int c) { horsepower = a; color = b; weight = c; } //Detta är konstruktorn, den anropas när objektet skapas public void PrintData() { int topspeed = horsepower * 2 - 200; Console.WriteLine("Maxhastigheten är; " + topspeed); } private int horsepower; private string color; private int weight; } public class Lastbil : Fordon { public void printData() { int topspeed = horsepower + weight * 2 - 200; Console.WriteLine("Maxhastigheten på lastbilen är; "); } } }

Trädvy Permalänk
Medlem
Registrerad
Jul 2015
Skrivet av widell_1992:

Har nu fått fram något som skulle kunna liknas vid en funktionell kod, problemet är att jag inte lyckas få tillgång till fälten i klassen som jag ärver från. Är i lite samma sits nu att jag suttit lite för länge med det och har svårt att se problemen. Skulle uppskatta om jag fick lite vägledning igen!

Här är koden jag har för tillfället

Konstruktorn i din Fordonklass, vad förväntar den sig kontra vad ger du den? Hur skapas en instans av Lastbilklassen? Hur fungerar privata variabler när det kommer till arv?

Där har du några saker att fundera på för att förhoppningsvis ta dig vidare

Skoj: i5 8600k @4,8GHz, Z370-P ATX, 1070 ROG Strix 8 GB, 16 GB DDR4 @3200MHz, Kraken X62
Jobb: Dell XPS 13 9370 4K
Privat: Macbook Pro 13" late 2016

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

@widell_1992: Jag antar att du menar att du inte kommer åt t.ex. horsepower i Lastbil? Det beror på att du deklarerat instansvariablerna i Fordon som private, vilket betyder att endast Fordon kommer åt dem. Om du istället deklarerar dem som protected så kan även klasser som ärver från Fordon komma åt dem.

Sen har du inte definierat någon konstruktor för Lastbil. Konstruktorer ärvs inte, så Lastbil kommer inte ärva konstruktorn för Fordon utan du måste definiera en ny.

Och istället för att namnge dina argument till konstruktorn med otydliga namn som a eller b så kan du t.ex. använda this för att särskilja på argument och medlemsvariabler:

public Fordon(int horsepower, ...) { // this.horsepower är horsepower i Fordon-klassen, // horsepower är argumentet till denna konstruktor. this.horsepower = horsepower; }

Ett annat sätt att hantera det på är att använda olika prefix eller suffix för medlemsvariabler, t.ex. m_horsepower. Du kan välja vilken stil du vill, det viktiga är att undvika obeskrivande argumentnamn eftersom det bara gör det svårare för dig att hålla reda på vad som är vad i koden.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Aug 2013
Skrivet av widell_1992:

Har nu fått fram något som skulle kunna liknas vid en funktionell kod, problemet är att jag inte lyckas få tillgång till fälten i klassen som jag ärver från. Är i lite samma sits nu att jag suttit lite för länge med det och har svårt att se problemen. Skulle uppskatta om jag fick lite vägledning igen!

Här är koden jag har för tillfället

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Fordonen { class Program { static void Main(string[] args) { Console.WriteLine("Var god ange antalet hästkrafter; "); int horsepower = int.Parse(Console.ReadLine()); Console.WriteLine("Ange färgen på ditt fordon; "); string color = Console.ReadLine(); Fordon f = new Fordon(horsepower, color); //skapa nytt objekt med parametrar som konstruktorn tar emot. f.PrintData(); Console.ReadKey(); Console.WriteLine("Nu är det dags att testa en lastbil! "); Console.WriteLine("Var god ange hästkrafterna; "); int _horsepower = int.Parse(Console.ReadLine()); Console.WriteLine("Ange färgen på din lastbil;" ); string _color = Console.ReadLine(); Console.WriteLine("Och sist men tyngst, ange lastbilens vikt; "); int weight = int.Parse(Console.ReadLine()); Lastbil l = new Lastbil(horsepower, color, weight); l.printData(); Console.WriteLine("Kalkulation avklarad, tryck på valfri knapp för att avsluta programmet"); Console.ReadKey(); } } public class Fordon { public Fordon(int a, string b, int c) { horsepower = a; color = b; weight = c; } //Detta är konstruktorn, den anropas när objektet skapas public void PrintData() { int topspeed = horsepower * 2 - 200; Console.WriteLine("Maxhastigheten är; " + topspeed); } private int horsepower; private string color; private int weight; } public class Lastbil : Fordon { public void printData() { int topspeed = horsepower + weight * 2 - 200; Console.WriteLine("Maxhastigheten på lastbilen är; "); } } }

Läs på om protected or virtual. Istället för att skriva samma metod två gånger bör du använda override, t.ex. för din PrintData. Speciellt då du nu bytt namn på den med en liten bokstav, detta är sjukt förvirrande för den som ska använda din kod senare, tänk om du hade 30 fordon med olika namn för alla att skriva ut datan.

Du måste skapa upp constructorn i din Lastbil också för att anropa base constructorn (som håller i fieldsen).

Skickades från m.sweclockers.com