Laden...

Brauche Hilfe bei verschiedenen Basis-Hausaufgaben

Erstellt von MM72 vor einem Jahr Letzter Beitrag vor einem Jahr 857 Views
M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr
Brauche Hilfe bei verschiedenen Basis-Hausaufgaben

Hallo,
ich versuche gerade in die C#-Programmierung einzusteigen und soll eine etwas umfangreichere (zumindest für mich jedenfalls) Aufgabe erledigen. Leider bekam ich zu dem Lernheft und der entsprechenden Aufgabe falsche Dateien, fehlende Dateien und feherhafte Code-Dateien, das reinste Wirrwar und ich komme trotz Suche im Netz nicht weiter. Da ich schon Wochenlang auf die richtigen Dateien warte und entweder gar keine Antwort bekomme oder Dateien, die ebenfalls nicht hilfreich sind und ich nicht länger warten möchte, hier mein Hilferuf also:

Ich soll aus dem Code von Lektion5.cs (im Anhang) folgende Aufgaben lösen und habe dazu schon etwas im Netz gefunden, was ich aber anscheinend nicht richtig in den Code implementieren kann:

  1. Aufgabe:
    Erstellen Sie für diese Einsendeaufgabe ein neues Projekt „ESA_Projekt“, in das Sie den letzten Stand des Fliegerprojekts kopieren. Ergänzen Sie das Projekt durch eine Programmierung, mit der die Positionsdaten eines Flugs in einer Datei protokolliert werden können.
    • Die Protokollierungsdatei soll in den Ausführordner des Programms („Release“ oder „Debug“) geschrieben werden
    • Der Name jeder Protokolldatei soll nach dem Muster
    <kennung>_<Tag>-<Stunde>-<Minute>-<Sekunde>.bin
    zusammengesetzt werden. Das lässt sich programmgesteuert erzeugen und unterscheidet mit dieser zeitabhängigen Codierung zuverlässig mehrere Protokolldateien.
    • In die Datei soll zunächst ein String geschrieben werden, der folgende Informationen zusammenfasst:
    Flug "<kennung>" (Typ "<typ>") startet an Position
    "<x>-<y>-<h>" mit Zielposition "<x>-<y>-<h>".
    Das ist der Header der Protokollierungsdatei, auf den sodann die Daten folgen. Auch hier sind wieder alle Ausdrücke mit spitzen Klammern durch konkrete Werte aus der Programmierung zu ersetzen.
    • In die Datei sollen sodann fortlaufend die x-, y- und h-Daten der aktuellen Position als int-Werte geschrieben werden, bis der Flug beendet ist. Das sind sozusagen die Daten der Datei.
    • Die Protokollierung soll vom Wert eines „Schalters“ abhängig gemacht werden, den Sie in der Klasse Program als static-Variable definieren:
    public static bool protokollieren = true;
    Wenn dieser Schalter auf true gesetzt ist, wird protokolliert, wenn er auf false gesetzt ist, wird nicht protokolliert.
    Bei dieser Aufgabe geht es nicht nur um die technische Realisierung vorgenannter Anforderungen, sondern vor allem um grundlegende Überlegungen objektorientierter Programmierung. Sie sollten sich z.B., wenn Sie den nötigen Writer deklarieren, klarmachen, dass ein Writer einem Flugschreiber entspricht und prüfen, welcher Fliegertyp überhaupt einen Flugschreiber nutzen kann. Beispiele für derartige Überlegungen objekt- orientierter Planung gab es in diesem Heft, aber auch schon bei der Planung des Projekts im Studienheft CSH01B – z.B. zur Ansiedlung des Transponders.
    Auf diesen Überlegungen aufbauend sind dann folgende Fragen zu beantworten:
    a) Wo deklarieren Sie das Writer-Objekt, damit es an den Stellen im Programm, an denen es benötigt wird, auch bekannt ist?
    In Klasse Starrflügelflugzeuge

private void Schreiber()
{
    Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
    Schreiben.Write(SchreibeHeader());
}


b) An welcher Stelle im Programm bauen Sie den Dateipfad zusammen, erstellen den Writer und schreiben den Header?
In der Klasse Flugzeug



public static string path;
public static string Pfad
{
    set { path = value; }
    get { return path; }
}
public string Dateipfad()
{
    DateTime timer = DateTime.Now;
    string path;
    string SetTime;
    SetTime = "" + timer.Day + "-" + timer.Hour + " -" + timer.Minute + " -" + timer.Second + "";
    path = Environment.CurrentDirectory + @"\" + kennung + "_" + SetTime + ".bin";
    return path;
}
public string SchreibeHeader()
{
    string header = "Flug " + kennung + "(Typ " + typ + ") startet an Position " + this.pos.x + "-" + this.pos.y + "-" + this.pos.h + " mit Zielposition " + zielPos.x + "-" + zielPos.y + "-" + zielPos.h + "." + Environment.NewLine + "";
    return header;
}
public void Schreiber()
{
    Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
    Schreiben.Write(SchreibeHeader());
}

c) An welcher Stelle im Programm schreiben Sie die Daten der x-, y- und h-Werte?
In die Transpond Methode. Nachdem die Parameter in int[] Byte geschrieben wurden, werden sie an die SchreibSchleife(Byte) übergeben welche den eigentlichen schreibvorgang durchführt.


public void Transpond(string kennung, Position pos)
{
    double abstand = Math.Sqrt(Math.Pow(this.pos.x - pos.x, 2) + Math.Pow(this.pos.y - pos.y, 2));
    //if (kennung.Equals(this.kennung)) 
    //Console.WriteLine("{0} an Position x={1}, y={2}, h={3}", kennung, pos.x, pos.y, pos.h); 
    DateTime timestamp = DateTime.Now;
    int[] Byte = { pos.x, pos.y, pos.h };
    if (kennung.Equals(this.kennung))
    {
        Console.Write("{0}:{1}", timestamp.Minute, timestamp.Second);
        Console.Write("\t{0}-Position: {1}-{2}-{3}", this.kennung, base.pos.x, base.pos.y, base.pos.h);
        Console.Write("Zieldistanz: {0} m\n", Zieldistanz());
        SchreibSchleife(Byte);
    }

d) An welcher Stelle im Programm schließen Sie den Writer?
Der Writer wird geschlossen sobald das Flugzeug gelandet ist und sich abgemeldet hat.


// Flieger Deregistrierung, Transponder abschalten, Abschlussmeldung
Program.fliegerRegister -= this.Steuern;
Program.transponder -= this.Transpond;
Console.WriteLine("\n{0} gelandet (Zieldistanz={1}, Höhendistanz={2}", kennung, Zieldistanz(), pos.h - zielPos.h);
Schreiben.Close();

e) Wie stellen Sie jeweils sicher, dass diese Operationen nur dann erfolgen, wenn der „Schalter“ in der Programmklasse auf true gestellt ist?
Dies erreiche ich indem ich die Aufrufobjekte „Schreiber(Byte)“ und Schreiben.Close() in eine if (protokollieren) Bedingung setze. Ist der wert „false“ so werden die Objekte nicht aufgerufen. Der Flugschreiber wird ebenfalls mit Program.transponder += Transpond; initialisiert
Geben Sie jeweils den Programmcode an und erläutern Sie kurz Ihre Programmierung.
Hinweis:
BinaryWriter kennt eine Methode
public virtual void Write ( string value )
… die nicht nur den als Parameter anzugebenden String in die Datei schreibt, sondern davor eine Information über die Länge des Strings speichert (vergleichen Sie die .NET-Dokumentation).
BinaryReader kennt eine spiegelbildliche Methode
public virtual string ReadString ()
… die zunächst die in der Binärdatei gespeicherte Längeninformation auswertet und sodann präzise die Länge des nachfolgenden String liest, sodass der Lesezeiger für weitere Leseoperationen genau auf das nachfolgende Byte gesetzt wird.

Soweit also die Aufgabe.

Die Probleme fangen schon an, dass das Writer-Objekt so anscheinend gar nicht funktioniert, zumindest Sagt mir mein Visual Studio dann als Fehler: Der Name Schreiben ist im aktuellen Kontext nicht vorhanden. Erst wenn ich


BinaryWriter Schreiben;

davor setze oder zumindest die Zeile abändere in BinaryWriter Schreiben = new..... dann ist es fehlerfrei. Und so zieht sich das irgendwie alles durch und ich schaffe es nicht, aus den Bruchstücken einen funktionsfähigen Code zu erzeugen.
Nunja, vielleicht kann mir hier jemand helfen. Die anderen Aufgaben habe ich bisher immer gelöst bekommen, aber mit den oben beschriebenen Hürden wirds diesmal anscheinend nichts.
Achja, damit der Code von Lektion 5 funktioniert, im Anhang noch die beiden init-Dateien für den Debug-Ordner als zip.

190 Beiträge seit 2012
vor einem Jahr

Hallo MM72,
wie stellst du dir die Hilfe vor? Was möchtest du genau wissen?
Wenn ich mir dein Problem mit dem BinaryWriter ansehe, würde ich sagen, du hast noch nie was von C# gehört. Dir fehlen die absoluten Grundlagen.

Als Hilfe empfehle ich dir folgende Links:
Einführung in C#
Objektorientiertes Programmieren (C#)

  • Wer lesen kann, ist klar im Vorteil
  • Meistens sitzt der Fehler vorm Monitor
  • "Geht nicht" ist keine Fehlermeldung!
  • "Ich kann programmieren" != "Ich habe den Code bei Google gefunden"

GidF

A
764 Beiträge seit 2007
vor einem Jahr

Hallo MM72

Sind der Code und die Antworten unter den Fragen a - e von dir, oder Teil der Aufgabe?

An welchen Problemen hängst du grade konkret? Hast du entsprechende Fehlermeldungen?

Viele Grüße
Alf

16.827 Beiträge seit 2008
vor einem Jahr

Bitte beachte [Hinweis] Wie poste ich richtig?

  • Ein Forentitel wählen, mit dem man was anfangen kann. Stell Dir vor jeder schreibt hier als Titel rein "Bin bezweifelt"... Ich habs mal in etwas editiert, mit dem man wenigstens im entfernten was anfangen kann.
  • Beschreibe, was Deine Probleme sind, und wo Du nicht weiter kommst.

Die Probleme fangen schon an, dass das Writer-Objekt so anscheinend gar nicht funktioniert, zumindest Sagt mir mein Visual Studio dann als Fehler: Der Name Schreiben ist im aktuellen Kontext nicht vorhanden. Erst wenn ich

  
BinaryWriter Schreiben;  
  

davor setze oder zumindest die Zeile abändere in BinaryWriter Schreiben = new..... dann ist es fehlerfrei.

Ja, so funktionieren Objekt-orientierte Programmiersprachen. Fehlen Dir da einfach die Basics?
Die musst selbst erlernen. Das können wir leider nicht für Dich machen.

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Die im Beitrag geposteten Codefragmente sollen angeblich die Lösung sein oder zumindest ein Teil davon, aber wie gesagt, schon allein im ersten Beispiel habe ich ja schon selbst herausgefunden, dass dem nicht so sein kann. Ich wollte nun mal jemand anderen drauf schauen lassen, um zu sehen, ob die Codefragmente richtig und hilfreich sind oder alles einfach "Mist" ist und voller Fehler steckt.
Wie gesagt, ich bin gerade erst dabei, dieses Kapitel durchzuarbeiten und hatte dabei schon einige organisatorische Probleme und habe mich in der Zeit mal im Netz nach Hilfe dazu umgeschaut... Naja werde ich mich weiterhin mit falschen Dateien, fehlerhaften Code von der Fern-Uni, fehlerhaften Code vom Tutor und fehlenden Dateien und dem was im Lehrbuch steht herumschlagen müssen. Bisher habe ich ganz gut mit der Analyse von bestehendem Code, deren Abwandlung und "sehen was wenn" gelernt, aber wenn schon der Ausgangscode nicht hinhaut und das Programm nicht lauffähig ist, ist das schwierig.

A
764 Beiträge seit 2007
vor einem Jahr

Okay. Das heißt du sollst die bestehenden Code-Fragmente nehmen und einbauen.

Das lässt sich ja alles lösen. Die Korrektur für a) hast du ja selbst schon herausgefunden. Was ist mit b), wo hakt es da?

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

bei b) habe ich ebenfalls in der Methode Schreiber das BinaryWriter Schreiben; eingefügt, damit es funktioniert, bekomme dann aber noch die Fehlermeldung CS0103 "Der Name "typ" ist im aktuellen Kontext nicht vorhanden. sowie die Warung CS0108 Düsenflugzeug.Schreiber()" blendet den vererbten Member "Flugzeug.Schreiber()" aus. Verwenden Sie das new-Schlüsselwort, wenn das Ausblenden vorgesehen war.
Der aktuelle Stand des Projektes im Anhang.

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code...

16.827 Beiträge seit 2008
vor einem Jahr

aber wie gesagt, schon allein im ersten Beispiel habe ich ja schon selbst herausgefunden, dass dem nicht so sein kann.

Der Code ist nun nicht unbedingt ein Highlight der Software Entwicklung, aber ich sehe nun kein Code Fragment, das auf den ersten Blick strukturell falsch ist. Da sind sicherlich die ein oder anderen Dinge auch so gemacht, dass Du ohne das nächste Wissenskapitel eine Antwort findest.
Ich glaube Du verstehst einfach nicht, was der Tutor will. Aber das sind gewiss keine falschen Daten oder bewusst falsche Vorlagen.
Da fehlen Dir einfach die Basics.

  1. Du schreibst

a) Wo deklarieren Sie das Writer-Objekt, damit es an den Stellen im Programm, an denen es benötigt wird, auch bekannt ist?

Dazu bekommst Du einen Code.


private void Schreiber()
{
    Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
    Schreiben.Write(SchreibeHeader());
}

Natürlich erzeugt das einen Fehler - gewollt!
Du sollst hier selbst auf die Idee kommen, dass ein Feld deklariert werden muss. Genau das beantwortet diese Frage.


private BinaryWriter Schreiben;

b) gleiches Spiel. Du hast eine Vorlage, die Du nur noch ausfüllen musst.
Da diese in der Basis fehlt - Deine Aufgabe ist genau das Vervollständigen! - knallt es. Das ist doch völlig okay.

Und auch die weiteren Aufgaben verfolgen doch genau dieses Prinzip.
Heisst: einmal Prinzip verstehen, dann weiß man, was man in den Aufgaben tun muss.

Fehlermeldung CS0103 "Der Name "typ" ist im aktuellen Kontext nicht vorhanden.

Basics => [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen)

sowie die Warung CS0108 Düsenflugzeug.Schreiber()" blendet den vererbten Member "Flugzeug.Schreiber()" aus.

Auch hier Basics, wie OOP funktioniert - aber die Lösung steht ja bereits in der Fehlermeldung.

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

wie bereits schon geschrieben: "Mir ist klar, das der Typ erst in der Klasse Düsenflugzeug deklariert wird, aber der Dateipfad soll ja bereits in der Klasse Flugzeug erzeugt werden so wie im Code... "
Die Frage ist also, wenn der Typ erst hier deklariert wird:
class Düsenflugzeug : Starrflügelflugzeug
{
public Airbus typ;
....

wie kann dann auf typ in Flugzeug zugegriffen werden? Muss ich dort auch einen public Airbus typ; einbauen oder geht dies anders? und wenn ich das einbaue, "blendet" dies ja auch den Düsenflugzeug.typ
Also einfach abändern zu: public new Airbus typ; würde das Problem lösen, ich weiss, aber Dies wurde noch nirgends behandelt in den Lehrbüchern! DSaher meine Frage, ob dies anders geht unter den genannten Vorraussetzungen.
Ich kann halt nur das Wissen anwenden, was mir bereits vermittelt wurde. Klar, suche ich nach dem Fehler und versuche ihn zu beheben, aber wie gesagt, ich erwarte eigentlich, dass ich dies mit dem bisherigen Wissensstoff auch erreichen kann....
Und die Codeschnipsel sollten angeblich die Lösung sein und nicht etwas zum Verfollständigen oder ausfüllen.

U
69 Beiträge seit 2019
vor einem Jahr

Die CSH03 Lektion 5 war hier auch schonmal Thema, vielleicht gibt dir das ja ein paar Anregungen.

“Knowledge cannot replace friendship. I'd rather be an idiot than lose you.”

  • Patrick to Spongebob
16.827 Beiträge seit 2008
vor einem Jahr

wie kann dann auf typ in Flugzeug zugegriffen werden?

Vermutlich will der Tutor auf abstrakte Methoden hinaus, dessen Grundstruktur in der Klasse Flugzeug steckt, die Implementierung der Methode jedoch in der ableitenden Klasse.
Damit wäre das zumindest umsetzbar (und gilt auch zu Basics OOP) und liegt aufgrund der Codevorlage nahe.

PS: mittlerweile weiß man, dass das offenbar Schulcode ist, was beim alten Thema nicht der Fall war.
Man kannte den Context nicht und hatte daher natürlich allgemeine Verbesserungsvorschläge.

Ich kann halt nur das Wissen anwenden, was mir bereits vermittelt wurde.

Ich war ja auch mal in der Schule (sogar IT Schule) und kann Dir nur sagen: ohne eigenes Engagement kommt man mit Schulwissen nicht weit.
Da wird Dir nur das aller aller Nötigste beigebracht, aber nicht mal die Basics vollständig.

Daher: Du wirst das Wissen anwenden können, das Du hast.
Woher das kommt, ob Schule oder Eigeninitiative - sekundär.
Das meiste Deines Entwicklerwissens wird kommen, weil Du es selbst erlernst, nicht weil jemand Dir das zuwirft.

A
764 Beiträge seit 2007
vor einem Jahr

Wie du schon richtig erkannt hast, muss der typ schon in Flugzeug, oder Luftfahrzeug deklariert sein. Also mach das mal und dann auf zum nächsten Schritt.
Ich habe bei mir den Typ in Luftfahrzeug deklariert.

Schau dir auch mal die Warnings an, hab ein Bild angehängt. Die Methode Schreiber in Düsenflugzeug kann beispielsweise weg.

16.827 Beiträge seit 2008
vor einem Jahr

Wie du schon richtig erkannt hast, muss der typ schon in Flugzeug, oder Luftfahrzeug deklariert sein.

Ne muss er nicht - und bezogen auf die potentielle Fragestellung soll wahrscheinlich auch nicht.
Kann kaum der Fall sein, dass der Tutor einen Komplettumbau des Codes anstrebt, wenn hier ganz offenbar das Grundverhalten von Klassen beigebracht werden soll (Eigenschaften, Vererbung...).
Sieht ja so aus, dass im Endeffekt jede Aufgabe mit fasz einer Zeiler Code zu lösen ist.



public class Flugzeug
{
   public abstract string Dateipfad();

   private void Schreiber()
   {
       Schreiben = new BinaryWriter(File.Open(Dateipfad(), FileMode.Create, FileAccess.Write));
       Schreiben.Write(SchreibeHeader());
   }
}

public class Düsenflugzeug : Starrflügelflugzeug // erbt von Flugzeug
{
   // CSH03 Lektion 5
   public Airbus typ;
   public abstract string Dateipfad()
   {
      return "Hier den String Zusammenbauen und Typ verwenden";
   }

Simples abstraktes Methodenverhalten.

A
764 Beiträge seit 2007
vor einem Jahr

Stimmt, so wie du das weiter oben ja schon geschrieben hast. Danke für die Korrektur.

M
MM72 Themenstarter:in
8 Beiträge seit 2022
vor einem Jahr

Noch einmal zum Verständnis: Der Ausgangscode ist in Lektion5.cs. Die im Eröffnungsthread geposteten Codezeilen sollen die Lösung sein, die ein Tutor nicht beanstandet hat und die Note 1 vergeben haben soll. Dies erschliesst sich mir jedoch nicht.
Da ich selber nicht die kompletten Dateien zur Verfügung gestellt bekommen hatte, die im Lehrbuch angegeben waren und die in der Aufgabenstellung aufgeführt sind, konnte ich noch nicht alle Lektion praktisch auch nachvollziehen. Ich werde mir also erst einmal noch aus anderen Quellen Wissen aneignen zu dem Themengebiet.
Ich hatte gehofft, ein wenig "reverse engineering" betreiben zu können und damit das Thema zu verstehen und mit dem Code etwas herumzuexperimentieren, aber das scheint mit den Codeschnipseln nicht zu funktionieren.

A
764 Beiträge seit 2007
vor einem Jahr

Da ich selber nicht die kompletten Dateien zur Verfügung gestellt bekommen hatte, die im Lehrbuch angegeben waren und die in der Aufgabenstellung aufgeführt sind, konnte ich noch nicht alle Lektion praktisch auch nachvollziehen.

Also sind die Codeschnipsel unter a) - e) nicht Teil der Aufgabe, sondern du hast die Lösung von jemand anderem bekommen? Code irgendwo her kopieren und zusammenstöpseln ist kein Programmieren.

Nach deinen bisherigen Antworten und Bemühungen die Aufgabe zu lösen, bin ich ehrlich gesagt etwas enttäuscht. Es sind nicht irgendwelche fehlenden Dateien das Problem. Mit dem vorhandenen Material kann man die Aufgabe lösen. Mit dem kopierten Code hast du sogar noch zusätzliche Hilfe. Außerdem gehst du wenig auf die Lösungsansätze der Foristen ein.

Wie heißt es so schön: "Ich kann dir die Lösung erklären, aber ich kann sie nicht für dich verstehen."