C# Fehler

FiiireFox

Cadet 4th Year
Registriert
Okt. 2013
Beiträge
92
Hallo,

benötige dringend Hilfe. Ich habe die Aufgabe mit Visual Studio eine C# Konsolenanwendung zu erstellen. Und zwar geht es um die Mietwagenabrechnung Der Benutzer soll eingeben welche Klasse er genommen hat (Luxus oder Normale Autoklasse) und wie viel Kilometer er gefahren ist. Ein Fahrzeug der Luxusklasse kostet 70 Euro und eins der Normalen klasse kostet 40 Euro. 100 Kilometer sind inklusive und jeder weitere Kilometer kostet 20 Cent extra. Das Programm soll nun die gesamten Kosten berechnen.

Man muss das ja mit einer verschachtelten IF-Anweisung machen da es 5 Wege gibt. 1. Luxus Klasse ohne extra Kilometer, 2. Luxus Klasse mit extra Kilometern, 3. Normale Klasse ohne extra Kilometer, 4. Normale Klasse mit extra Kilometern, 5. Benutzer tätigt eine Falsche Eingabe bei der Auswahl der Fahrzeugkategorie. Habe nun schon viel ausprobiert komme allerdings nicht auf die richtige Lösung vlt gehe ich auch ganz Falsch ran benötige dringend Hilfe.

Meine Lösungsansätze seht ihr unten.

Gruß

FiiireFox


Lösung 1:

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

namespace Mietwagenberechnung2
{
class Program
{
static void Main(string[] args)
{
int kilometer;
string klasse;
int luxus;
int normal;
double x;
double kilometerx;
double preis;

luxus = 70;
normal = 40;



Console.WriteLine("CarRent Mietwagenberechnung");
Console.WriteLine("===========================");
Console.WriteLine();

Console.WriteLine("Bitte geben Sie die gefahrenen Kilometer an: ");
kilometer = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();

Console.Write("Bitte die Kategorie Normal oder Luxus angeben [N/L]: ");
klasse = Console.ReadLine();


if ((klasse == "n") || (klasse == "N") || (klasse == "l") || (klasse == "L"))
{
if ((klasse == "n") || (klasse == "N") && (kilometer > 100))


x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + normal;
Console.WriteLine();
Console.WriteLine((" Der Rechnungspreis beträgt:") + preis + (" Euro"));

}

else
{
Console.WriteLine(("Der Rechnungspreis beträgt:") + normal + (" Euro"));

}

{
else if ((klasse== "l") || (klasse == "L") && (kilometer >100))

x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + normal;
}
Console.WriteLine();
Console.WriteLine((" Der Rechnungspreis beträgt:") + preis + (" Euro"));


else

{

Console.WriteLine(("Der Rechnungspreis beträgt:" + luxus + (" Euro"));

}

Console.ReadLine();





}
}
}





LÖSUNG 2:


if (( klasse == "l") || ( klasse == "L") || (klasse == "n") || (klasse == "N"))


{
if ((klasse == "l") || (klasse == "L") && (kilometer >100))



{
x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + luxus;
Console.WriteLine();
Console.WriteLine(("Der Rechnungspreis beträgt:") + preis + (" Euro"));

}

else

{
Console.WriteLine();
Console.WriteLine((" Der Rechnungspreis beträgt:") + luxus + (" Euro"));

}

{
if ((klasse=="r") || (klasse=="R") && (kilometer >100))


{
x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + normal;
Console.WriteLine();
Console.WriteLine((" Der Rechnungspreis beträgt:") + preis + (" Euro"));

}

else

{
Console.WriteLine();
Console.WriteLine(("Der Rechnungspreis beträgt:") + normal + (" Euro"));

}


Console.ReadLine();





VIELEN DANK!!!!
 
Das hier ist kein Hausaufgabenforum... hier scheints eher an der Logik / Mathe zu scheitern als an der Programmiersprache / C#...
Am Besten schauste dir mal im Technet an wie man If-Anweisungen aufbaut und korrekt verschachtelt, das steht wunderbar im Web.
 
Hallo,

das soll auch nicht als Hausaufgabenforum dienen.
Hab mich auch schon Informiert bevor ich mich hierher gewandt habe allerdings komme ich nicht auf die Lösung. Ich erwarte ja kein komplettes Programm sondern nur den entscheidenden Tipp der mir fehlt wie ich die IF Anweisungen aufbauen muss damit es funktioniert. Mehr möchte ich gar nicht ist aber wirklich sehr dringend und ich komme nicht auf die Lösung deshalb benötige ich Hilfe.
 
else if ((klasse== "l") || (klasse == "L") && (kilometer >100))

x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + normal;
Müsste dort nicht luxus stehen?

Gehe da doch nochmal schrittweise heran, sprich kommentiere erstmal alle Fälle aus ausser einen Fall.
Diesen kann du dann ja mal ausprobieren. Klappt er gehts du zum nächsten Fall über und schaust ob er das richtige Ergebnis ausspuckt.

Ich habe sonst keine Ahnungn von C#, aber das wäre doch die logischste Vorgehensweise. ;)
 
hasugoon schrieb:
Ich würde noch an den richtigen Stellen Klammern setzen.

Die klammern in deinem Zitat sind doch richtig gesetzt oder liege ich falsch?
 
Ich glaube, dein Lehrer/Lehrbuch etc. will von dir, das du die verwendung von Klassen erlernst, in diesem Falle die Abstrakte Klasse. ICh weiß was es für ein Terz sein kann die Dinger zu verstehen, das liegt aber oft an Miserablen erklärungen von den großen Lehrmeistern (Wobei ich jetzt nicht versprechen möchte, dass meine Erklärung besser ist ;) )

Klassen sind -ganz Simpel gesagt, eine Sammlung von Variablen und Methoden, von denen du beliebig viele erstellen kannst. Ein Beispiel:

public class Test
{
public int zahl;
public string text

public string getZahlundNummer()
{
return zahl + text;
}
}
Das ist jetzt eine strohdoofe Klasse im Prinzip, aber sie hat einen Vorteil den Variablen dir nicht bieten, sie speichert eine Zahl und einen stück Text. Und die Klasse selbst kannst du wiederrum jetzt wie eine Variable benutzen:

Test probe = new Test();

probe.Zahl = 20;
probe.text = "Tausend";
string ergebniss = probe.getZahlundNummer();

Das solltest du dir gut einverleiben, denn damit kannst du allein schon dein Autoproblem deutlich erleichtern, denn:


class Auto
{

int kilometer;
...

public int errechnePreis()
{
return luxus * kilometer/100 * 0,20;
}
}

Speichert jetzt schonmal nett sortiert deine Variablen, und du kannst ganz viele von deinen Autos erstellen, nicht nur eins!

Auto[] autos = new Auto[5];
autos[0] = ...;

usw.


Jetzt wird der Preis unterschiedlich berechnet, jenachdem was für Werte du in deinen Variablen pro Klasse gespeichert hast. Damit solltest du die Aufgabe gut gelöst haben.


Was du danach noch lernen kannst ist, dass du auch Pro verschiedenes Auto(Also Luxus oder Normal) eine unterschiedliche Klasse hast, die aber die Variablen und Methoden der Klasse Auto übernimmt. Das geht schon deutlich weiter, solltest du dir aber in Zukunft mal anschauen. ich geb dir dazu mal ein beispiel:

Wir regeln ersteinmal das die Klassen unterschiedlich sind. Dafür gibt es den überbegriff vererbung. Die sorgt dafür, dass wenn du eine Neue Klasse beschreibst, diese direkt die Methoden Und Variablen von der Klasse von der sie erbt mitnimmt. Heißt also:

public class Luxus : Auto//Hier liegt die Vererbung
{
public void Test()
{
//Nurmal eine kleine MEthode um zu zeigen was jetzt hier möglich ist:

this.kilometer = 100;//Du kannst auf die Kilometer zugreifen obwohl sie nirgendwo in dieser KLasse deklariert wurden. Aber oben bei der Klasse Auto hast du sie erstellt. genauso kannst du auch auf Methoden der Klasse Auto zugreifen:

int ergebniss = errechnePreis(20,20)//HIer kommt jetzt deine Problemlösung, du könntest einfach für die verschiedenen Klassen die verschiedenen Variablen übergeben.
}



}

Probiers mal, das ist grundlegend, und wenn du das kapiert hast hast du einen Riesenschritt gemacht, und dir ein großartiges Werkzeug angeeignet. Das da oben ist natürlich noch deutlich verbesserbar. Du könntest Abstrakte Klassen verwenden und damit dafür sorgen das alle Erbenden Klassen die Methode errechnePreis haben MÜSSEN, sodass du jetzt in deinem Array einfach diese Methoden immer aufrufen kannst:

foreach(Auto a in autos)
Console.WriteLine(""+ a.errechnePreis());

aber das geht für dich denke ich jetzt zu weit. Probiers mal, lass dir helfen, und gib nicht schnell auf, es ist leichter als du denkst, ist aber ein unglaublich gutes Werkzeug das dir, wenn du ein guter Programmierer werden willst, mit am meiten helfen wird.

Gruß!
 
FiiireFox schrieb:
Die klammern in deinem Zitat sind doch richtig gesetzt oder liege ich falsch?
Die Klammern, die drin sind, sind korrekt. Damit du aber auch verstehst, warum nur hasugoons Lösung korrekt ist, solltest du dir mal den Operatorvorrang und -orientierung anschauen.

Und wenn du das nächste mal Code postest, verwende bitte
Code:
-Tags.
 
Syntaktisch und semantisch korrekt sind eben zwei Paar Stiefel.
 
Hallo,
erstmal vielen Dank fürr die Tipps. Allerdings funktioniert es immer noch nicht. Wir arbeiten bisher nur mit den IF Anweisungen. Kann mir vlt jemand die verschatelten IF Anweisungen schreiben nur in ganz kurzer Form das ich den Aufbau sehen kann. Benötige dringend Hilfe da wir eine Arbeit schreiben.

Gruß
FiiireFox
 
FiiireFox schrieb:
Hallo,
erstmal vielen Dank fürr die Tipps. Allerdings funktioniert es immer noch nicht. Wir arbeiten bisher nur mit den IF Anweisungen. Kann mir vlt jemand die verschatelten IF Anweisungen schreiben nur in ganz kurzer Form das ich den Aufbau sehen kann. Benötige dringend Hilfe da wir eine Arbeit schreiben.

Gruß
FiiireFox

Eigeninitiative ist nicht so deine Stärke, oder?
Es gibt da so eine Seite im Internet. Leider fällt mir der Name grade nicht ein. Da kann man Dinge in so ein Textfeld eingeben und dann danach suchen. Als Ergebnis kommt dann eine Liste mit Links, wie z.B. dem hier ^^
 
Hallo,

doch bin allerdings nicht draufgekommen habe Google lange durchsucht. Bin Nun allerdings auf eine Lösung gekommen funktioniert auch soweit alles gibt nur ein Problem: man hat ja 100 Freikilometer wenn man also unter 100 Kilometer liegt soll nur der Standartpreis angezeigt werden sowie ich das Programm geschrieben habe wird dann allerdings ein Betrag vom Standartpreis abgezogen also 20 Cent pro Kilometer. Hier komme ich leider auch mit Google nicht auf eine Lösung da ich nirgends ein Minus eingebaut habe an was liegt das?


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

namespace Mietwagenberechnung2
{
class Program
{
static void Main(string[] args)
{
int kilometer;
string klasse;
int luxus;
int normal;
double x;
double kilometerx;
double preis;

luxus = 70;
normal = 40;



Console.WriteLine("CarRent Mietwagenberechnung");
Console.WriteLine("===========================");
Console.WriteLine();

Console.WriteLine("Bitte geben Sie die gefahrenen Kilometer an: ");
kilometer = Convert.ToInt32(Console.ReadLine());
Console.WriteLine();

Console.Write("Bitte die Kategorie Normal oder Luxus angeben [N/L]: ");
klasse = Console.ReadLine();








if (( klasse == "n") || (klasse== "N") && (kilometer >100))

{
x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + normal;
Console.WriteLine();
Console.WriteLine(("Der Rechnungspreis beträgt:") + preis + (" Euro"));
}

else if ((klasse == "n") || (klasse == "N") && (kilometer < 100))

{
Console.WriteLine();
Console.WriteLine(("Der Rechnungspreis beträgt:") + normal + (" Euro"));

}

else if (( klasse == "l") || (klasse== "L") && (kilometer >100))

{
x = kilometer - 100;
kilometerx = x * 0.20;
preis = kilometerx + luxus;
Console.WriteLine();
Console.WriteLine(("Der Rechnungspreis beträgt:") + preis + (" Euro"));

}

else if ((klasse == "l") || (klasse == "L") && (kilometer < 100))
{
Console.WriteLine(("Der Rechnungspreis beträgt:") + luxus + (" Euro"));

}

else if ((klasse != "l") || (klasse != "L") || (klasse != "n") || (klasse != "N"))

{ Console.WriteLine("Bitte tätigen sie eine gültige Eingabe");

}



Console.ReadLine();















}
}
}


PS: Mir ist gerade aufgefallen das der Fehler nur auftritt wenn ich die Klasse mit einem kleinen n auswähle mit einem großen N funktioniert alles richtig.
 
Zuletzt bearbeitet:
Also wenn man als Helfer etwas schreibt und dies vom Hilfesuchenden komplett ignoriert wird, komme ich mir irgendwie verarscht vor.

FiiireFox schrieb:
Hier komme ich leider auch mit Google nicht auf eine Lösung da ich nirgends ein Minus eingebaut habe an was liegt das?
Google kann zwar auch rechnen aber nicht die zwei Minuszeichen in deinem Code zählen, dafür gibt's die Programmeigene Suchfunktion.
 
Ja ich weiß das ich zwei Minuszeichen eingebaut habe diese sind auch an der richtigen Stelle um die überschüssigen Kilometer zu berechnen. Allerdings werden diese dann auf den Preis aufgeschlagen das funktioniert auch soweit. Allerdings wenn die Anzahl Kilometer unter 100 liegt soll der Standartpreis bezahlt werden davon wird aber etwas abgezogen Z.b. Gefahrene Kilometer 80 dann macht er mir allerdings nur wenn ich die Klasse mit einem kleinen Buchstaben eingebe 100-80= 20 20* 0,20 = 4 Euro Standartpreis-4 Euro= Ausgabe obwohl er nur den Standartpreis ausgeben soll diese Rechnung habe ich auch nirgends hinterlegt.
 
Natürlich wird vom Standardpreis etwas abgezogen, weil die Bedingung klasse == "n" immer wahr ist wenn du "n" eingibst, ungeachtet der gefahrenen Kilometer.
 
Darlis schrieb:
Natürlich wird vom Standardpreis etwas abgezogen, weil die Bedingung klasse == "n" immer wahr ist wenn du "n" eingibst, ungeachtet der gefahrenen Kilometer.


Ja aber für das habe ich ja den && Operator das die Kilometer auch mit einbezogen werden.
 
Bitte nochmal Post #9 lesen und verstehen!!!
 
Hallo,
FiiireFox,
Ich möchte dir nur einen Tipp gebe: wenn du Variabeln benennst, dann gib keine Namen wie x oder so, nimm so was wie strName (str=String=> Daten Typ, Name=> für den effektiven bezeichner) außerdem sollten die vatiabelnamen Sprechend sein.
Denn bei dem Variabelchaos verlierst du schnell den überblick (oder jemand außenstehendes), zählervariabeln für schleifen, sind aber nicht so wichtig, nenn sie i und basta.



Wenn du statt dem verschachtelten IF ein Else IF verwendest, wird es schon einfacher:

If(klasse.ToUpper==("N")
{
//hier liest du die extrakilometer ein
If(extrakilometer > ??)
{
//Hier berechnest du den Preis
}
Else if(extrakilometer<??)
{
//Hiet gibst du die kosten ohne extrakilometer aus
}
Else If(klasse.ToUpper=="L")
{
// hier das gleiche If wie oben...
}
Else If(klasse.ToUpper!="N"&klasse.ToUpper!="L")
{
//Hier gibst du die Fehlermeldung aus, wenn beides nicht zutrifft
}
Console.ReadKey();
 
Zuletzt bearbeitet:
@El_Ko: Schön, dass du dem TE die Lösung für seine Hausaufgabe gepostet hast... :freak:

Aber Daumen hoch für den absichtlich eingebauten kleinen Fehler, den der TE hoffentlich selbst beheben kann :D
(Mal abgesehen von der Groß-/Kleinschreibung und dem Fehler, der auch schon im Original-Code drin war)

Den Datentyp mit in den Variablennamen aufzunehmen ist bei typisierten Sprachen imho unnötig.
 
Zurück
Oben