Kleines Programm bedarf Durchsicht
-
Guten Abend,
Hab da ein Problem mit einer Aufgabe. Bin noch ein absoluter Newby.Wäre echt nett wenn Ihr es mal ein bisschen umschreibt.FInde es nämlich echt schwer compilerfehler zu verstehen.
Schreiben Sie folgendes C#-Programm.
Implementieren Sie als erstes ein Interface mit dem Namen DreiDkoerper. Dieses
soll die beiden Methoden:
- volumen - berechnet das Volumen des Körpers
- mantelflaeche - berechnet die Oberfläche des Körpers enthalten.
Beide Methoden bekommen keine Parameter übergeben. Der jeweils in den
Methoden berechnete Wert ist vom Typ double und wird per return zurückgegeben.
Schreiben Sie weiterhin zwei Klassen Zylinder und Wuerfel, welche das Interface
DreiDkoerper nutzen. Die Klassen sollen folgende Methoden enthalten:
- Init - Initialisieren der Attribute; - kein Rückgabewert
- Set-Methoden - Setzen der Attribute; - kein Rückgabewert
(jeweils eine Methode pro Attribut;)
- Print - Ausgabe der in volumen und mantelflaeche berechneten Werte
in der Form:
Das Volumen des Zylinders/Würfels betragt: XX
Die Mantelflache des Zylinders/Würfels betragt: XX
Für XX muss der berechnete Betrag eingesetzt und je nach Körper entweder
Zylinders oder Würfels ausgegeben werden.
Die Klasse Zylinder besitzt die beiden Attribute Hoehe und Radius vom Typ
double.
Die Klasse Wuerfel besitzt nur das Attribut Seitenlaenge, ebenfalls vom Typ
double.
Implementieren Sie weiterhin ein Hauptprogramm, welches uber eine Instanz
der Klasse Zylinder und eine Instanz der Klasse Wuerfel verfugt.
Das Hauptprogramm soll folgendende Schritte, in der gegeben Reihenfolge ausf
uhren:
- Einlesen der Hohe eines Zylindes und Ablegen des Wertes im passenden
Objekt
- Einlesen des Radius des Zylindes und Ablegen des Wertes im gleichen
Objekt
- Ausgabe des Volumens und der Mantelfläache uber die print-Methode des
Objektes
- Einlesen der Seitenlänge des Wurfels und Ablegen des Wertes im passenden
Objekt
- Ausgabe des Volumens und der Mantelfläche uber die print-Methode des
ObjektesMein Versuch:
using System; namespace testprog { interface DreiDKoerper { void volumen(); void mantelflaeche(); } class Zylinder : DreiDKoerper { double Hoehe; double Radius; public void init () { Hoehe= 0; Radius=0; } public void setattr1() { Console.Write ("Hoehe des Zylinders: "); Zylinder.Hoehe = Console.ReadLine(); } public void setattr2() { Console.Write ("Radius des Zylinders: "); Zylinder.Radius = Console.ReadLine(); } public double volumen() {//Zylinder= Pi*Radius*Radius*Hoehe double erg; const double PI = 3.141592; erg= PI*Zylinder.Radius*Zylinder.Radius*Zylinder.Hoehe; return erg; } public double mantelflaeche() {//Zylinder= 2*Pi* Radius*Höhe double erg2; const double PI = 3.141592; erg2= 2*PI*Zylinder.Radius*Zylinder.Hoehe; return erg2; } public void print() { Console.WriteLine ("Das Volumen des Zylinders betraegt: {0}",Zylinder.volumen); Console.WriteLine ("Die Mantelflaeche des Zylinders betraegt: {0}",Zylinder.mantelflaeche); } } class Wuerfel : DreiDKoerper { double Seitenlaenge; public void init () { Seitenlaenge=0; } public void setattr1() { Console.Write ("Seitenlaenge des Wuerfels: "); Wuerfel.Seitenlaenge = Console.ReadLine(); } public double volumen() {//Wuerfel= Seitenlaenge*Seitenlaenge*Seitenlaenge double erg; erg= Wuerfel.Seitenlaenge*Wuerfel.Seitenlaenge*Wuerfel.Seitenlaenge; return erg; } public double mantelflaeche() {//Wuerfel= 4*Seitenlaenge*Seitenlaenge double erg2; erg2= 4*Wuerfel.Seitenlaenge*Wuerfel.Seitenlaenge; return erg2; } public void print() { Console.WriteLine ("Das Volumen des Wuerfels betraegt: {0}",Wuerfel.volumen); Console.WriteLine ("Die Mantelflaeche des Wuerfels betraegt: {0}",Wuerfel.mantelflaeche); } } class Beispielstatic { public static void Main () { Zylinder.setattr1(); Zylinder.setattr2(); Zylinder.print(); Wuerfel.setattr1(); Wuerfel.print(); } } }
-
Die Fehlermeldungen anzugeben wär jetzt gut gewesen.
Was aber auf jeden Fall schon mal doof ist, sind deine Berechnungsmethoden, die als void deklariert sind, aber double returnen sollen.
-
test.cs(21,10): error CS0120: `testprog.Zylinder.Hoehe': An object reference is required for the nonstatic field, method or property test.cs(21,10): error CS0029: Cannot implicitly convert type `string' to `double' test.cs(26,10): error CS0120: `testprog.Zylinder.Radius': An object reference is required for the nonstatic field, method or property test.cs(26,10): error CS0029: Cannot implicitly convert type `string' to `double' test.cs(32,18): error CS0120: `testprog.Zylinder.Radius': An object reference is required for the nonstatic field, method or property test.cs(32,34): error CS0120: `testprog.Zylinder.Radius': An object reference is required for the nonstatic field, method or property test.cs(32,50): error CS0120: `testprog.Zylinder.Hoehe': An object reference is required for the nonstatic field, method or property test.cs(39,21): error CS0120: `testprog.Zylinder.Radius': An object reference is required for the nonstatic field, method or property test.cs(39,37): error CS0120: `testprog.Zylinder.Hoehe': An object reference is required for the nonstatic field, method or property test.cs(43,73): error CS0120: `testprog.Zylinder.volumen()': An object reference is required for the nonstatic field, method or property test.cs(43,11): error CS1502: The best overloaded method match for `System.Console.WriteLine(string, object)' has some invalid arguments /usr/lib/mono/2.0/mscorlib.dll (Location of the symbol related to previous error) test.cs(43,11): error CS1503: Argument 2: Cannot convert type `testprog.Zylinder' to `object' test.cs(44,77): error CS0120: `testprog.Zylinder.mantelflaeche()': An object reference is required for the nonstatic field, method or property test.cs(44,9): error CS1502: The best overloaded method match for `System.Console.WriteLine(string, object)' has some invalid arguments /usr/lib/mono/2.0/mscorlib.dll (Location of the symbol related to previous error) test.cs(44,9): error CS1503: Argument 2: Cannot convert type `testprog.Zylinder' to `object' test.cs(9,7): error CS0535: `testprog.Zylinder' does not implement interface member `testprog.DreiDKoerper.volumen()' test.cs(6,6): (Location of the symbol related to previous error) test.cs(9,7): error CS0535: `testprog.Zylinder' does not implement interface member `testprog.DreiDKoerper.mantelflaeche()' test.cs(7,6): (Location of the symbol related to previous error)
-
Zylinder.Hoehe = Console.ReadLine();
Zylinder. nur verwenden wenn du eine Statische Klasse hast du hier aber nicht. also mit this auf das Objekt zugreifen.
Somit ändern in.this.Hoehe = Console.ReadLine();
Console.WriteLine ("Das Volumen des Zylinders betraegt: {0}",Zylinder.volumen);
volumen ist eine Methode, also verwende sie bitte auch so
Console.WriteLine ("Das Volumen des Zylinders betraegt: {0}",Zylinder.volumen());//hier die () wichtig.
Das selbe gilt für manteflaeche.
So dann in der main, ein Objekt der Klasse Zylinder erstellen, und über dieses Objekt auf die Methoden zugreifen.
Lies dir lieber nochmal ein Anfängertutorial über Objekte und Klasse durch. Damit du den Unterschied verstehst.
-
Hey danke,echt super dass du mir hilfst.
STimmt ja mit den Methoden am Ende () hast du recht.
Das mit this kannte ich noch nicht, aber super dass das dann funktioniert.Bekomme jetzt nur noch die Fehler:
uebung11aufgabe2.cs(25,6): error CS0029: Cannot implicitly convert type `string' to `double' uebung11aufgabe2.cs(30,6): error CS0029: Cannot implicitly convert type `string' to `double' uebung11aufgabe2.cs(12,7): error CS0535: `aufgabe2.Zylinder' does not implement interface member `aufgabe2.DreiDKoerper.volumen()' uebung11aufgabe2.cs(8,6): (Location of the symbol related to previous error) uebung11aufgabe2.cs(12,7): error CS0535: `aufgabe2.Zylinder' does not implement interface member `aufgabe2.DreiDKoerper.mantelflaeche()' uebung11aufgabe2.cs(9,6): (Location of the symbol related to previous error)
-
Zylinder.Hoehe = Console.ReadLine();
Hier ist immernoch der Fehler, zumindest wird das in der Fehlermeldung angezeigt.
Weiterhin musst du hier von String in double Konvertieren. Problem ist nämlich, über Readline wird ein String von der Konsole gelesen du willst aber diesen String in einen Double packen, was natürlich nicht geht.
Abhilfe schafft das hier:this.Hoehe = Convert.ToDouble(Console.ReadLine());
An deiner stelle würde ich die Zylinderklasse so hier aufbauen.
class Zylinder : DreiDKoerper { public double Hoehe{get;private set;} public double Radius {get;private set;} //hier dein rest. }
-
uebung11aufgabe2.cs(12,7): error CS0535: `aufgabe2.Zylinder' does not implement interface member `aufgabe2.DreiDKoerper.volumen()' uebung11aufgabe2.cs(8,6): (Location of the symbol related to previous error) uebung11aufgabe2.cs(12,7): error CS0535: `aufgabe2.Zylinder' does not implement interface member `aufgabe2.DreiDKoerper.mantelflaeche()' uebung11aufgabe2.cs(9,6): (Location of the symbol related to previous error)
Hab dann nur noch diese Fehler.Heißt irgendwie können meine klassen nicht auf das interface zugreifen oder? ne lösung?
-
-.- Du Witzbold. Schau dir mal die Rückgabewerte der Methoden in deinem Interface an und die in deiner Klasse, die müssen schon überein stimmen.
-
Omg*schäm* ja ich sehs...
Weil das das erste war was ich geändert habe in den Klassen von void auf double umzusteigen hab ich es im interface vergessen.
Nungut, jetzt wo ich beides im Interface auf double geändert habe, kriege ich nun doch noch diese Fehler:uebung11aufgabe2.cs(89,10): error CS0120: `aufgabe2.Zylinder.setattr1()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(89,10): error CS0120: `aufgabe2.Zylinder.setattr1()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(90,10): error CS0120: `aufgabe2.Zylinder.setattr2()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(90,10): error CS0120: `aufgabe2.Zylinder.setattr2()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(91,10): error CS0120: `aufgabe2.Zylinder.print()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(91,10): error CS0120: `aufgabe2.Zylinder.print()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(92,9): error CS0120: `aufgabe2.Wuerfel.setattr1()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(92,9): error CS0120: `aufgabe2.Wuerfel.setattr1()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(93,9): error CS0120: `aufgabe2.Wuerfel.print()': An object reference is required for the nonstatic field, method or property uebung11aufgabe2.cs(93,9): error CS0120: `aufgabe2.Wuerfel.print()': An object reference is required for the nonstatic field, method or property
-
Lies doch bitte meinen ersten Beitrag nochmal genau, ich hatte was zu dem "Zylinder.settAttr"-Gedöns gesagt. Du sollst dort ein Objekt erzeugen.
-
aja habs jetzt umgeändert und versucht sowie du es gesagt hast:
public static void Main () { Zylinder vartest; Wuerfel vartest2; vartest.setattr1(); vartest.setattr2(); vartest.print(); vartest2.setattr1(); vartest2.print(); }
ABer nun krieg ich das als Fehler:
aufgabe2.cs(91,1): error CS0165: Use of unassigned local variable `vartest' aufgabe2.cs(94,1): error CS0165: Use of unassigned local variable `vartest2'
ALso hab ich die Objekte irgendwie falsch erstellt???
-
Ja hast du, und nun liest du dir nochmal ien tutorial durch wie man ein Objekt richtig erzeugt.
Google-> "C# Objekt erzeugen"
-
ok vielen dank
stimmt dass ich dann = new...setzen muss, jetzt funktionierts
-
Na siehste