Benutzer mit den meisten Antworten
Übungsprogramm C#

Frage
-
Hallo,
ich bin dabei mir anhand einer Videoreihe C# beizubringen, um das erkärte besser zu verstehen, habe mir bisher immer selber ein Übungsprogramm überlegt.
Bin jetzt bei der Objektorientierung(Vererbung), hier fällt mir aber kein konkretes Programm ein.
Hätte jemand eine Idee für ein Übungsprogramm?
Ich meine ein "nützliches" Programm, da es mir wesentlich mehr Spaß macht, außerdem verstehe ich alles viel besser.
LG
Antworten
-
Hallo,
ein klassisches Beispiel wäre ein kleiner Terminplaner. Dort hast du einmal Klassen die Kalender, Einträge und vielleicht sogar Accounts etc. verwalten. Wenn du mehr in die Vererbung rein gehen willst, so kannst du dort verschiedene Arten von Terminen einbauen, welche unterschiedlich arbeiten. (Termin nach Zeit/Ort, ...)
Was ich mal geschrieben habe ist ein Programm zum Vergleichen von Vierecken. Man kann beispielsweise Quadrate, Rechtecke, Parallelogramme usw. erstellen und dann mit einander vergleichen.
Implementieren könntest du das so, dass die Figuren von einander erben, so ist beispielsweise jedes Quadrat auch ein Rechteck. D Mehrfachvererbung in C# nicht geht (also mehrere Basisklassen), kannst du dir da vielleicht mit Schnittstellen behelfen wenn du die schon kennst.
Der Vergleich der Figuren erfolgt dann über is oder as Operator.Was ich mir auch noch gut vorstellen kann ist ein Spiel wie Pong - das lässt sich auch in einer Konsole erstellen. Hier könntest du dann auch wieder verschiedene Spielfelder, Schläger und Bälle erstellen - die aufgrund ihrer Implementierung anders funktionieren. Beispielsweise schräge statt Senkrechte Schläger oder ein Quadratischer statt runder Ball in der Berechnung.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tobias Scholze Montag, 3. August 2015 09:00
- Als Antwort markiert Aleksander Chalabashiev Dienstag, 11. August 2015 10:38
Alle Antworten
-
Hallo,
ein klassisches Beispiel wäre ein kleiner Terminplaner. Dort hast du einmal Klassen die Kalender, Einträge und vielleicht sogar Accounts etc. verwalten. Wenn du mehr in die Vererbung rein gehen willst, so kannst du dort verschiedene Arten von Terminen einbauen, welche unterschiedlich arbeiten. (Termin nach Zeit/Ort, ...)
Was ich mal geschrieben habe ist ein Programm zum Vergleichen von Vierecken. Man kann beispielsweise Quadrate, Rechtecke, Parallelogramme usw. erstellen und dann mit einander vergleichen.
Implementieren könntest du das so, dass die Figuren von einander erben, so ist beispielsweise jedes Quadrat auch ein Rechteck. D Mehrfachvererbung in C# nicht geht (also mehrere Basisklassen), kannst du dir da vielleicht mit Schnittstellen behelfen wenn du die schon kennst.
Der Vergleich der Figuren erfolgt dann über is oder as Operator.Was ich mir auch noch gut vorstellen kann ist ein Spiel wie Pong - das lässt sich auch in einer Konsole erstellen. Hier könntest du dann auch wieder verschiedene Spielfelder, Schläger und Bälle erstellen - die aufgrund ihrer Implementierung anders funktionieren. Beispielsweise schräge statt Senkrechte Schläger oder ein Quadratischer statt runder Ball in der Berechnung.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets- Als Antwort vorgeschlagen Tobias Scholze Montag, 3. August 2015 09:00
- Als Antwort markiert Aleksander Chalabashiev Dienstag, 11. August 2015 10:38
-
Danke für die Antwort!
Ich mache mich direkt an den Terminplaner, Schnittstellen sind das nächste Thema, den is und as Operator müsste ich noch nachlesen. Wie ich Pong realisieren könnte ist mir nicht klar, einfach die Konsole einen Punkt schreiben lassen?
LG
-
Zum Pong: Genau.
Ich dachte da u.U. auch an etwas komplizierteres. Das heißt dass die Ball-Klasse entweder einen Punkt oder eine andere Ball-Klasse mehr ein Rechteck in die Konsole setzt. So hättest du etwas mehr Variation wo du weitere Klassen einbauen kannst.Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Habe mich an den Kalender gesetzt, bin aber schon auf einige Probleme gestoßen:
Hier der Code:
namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Plan plan1 = new Plan(); plan1.start(); Console.ReadKey(); } } }
namespace ConsoleApplication1 { class Plan { public void start() { Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen?"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; newevent(); } else if (input == "verändern") { worked = true; } else if (input == "abrufen") { worked = true; } else { Console.WriteLine("Vertippt?"); } } } public void newevent() { int day, month, hour, minute; string name, description; Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); description = Console.ReadLine(); Event event1 = new Event(day, month, hour, minute, name, description); } public void changeevent() { } public void requestevent() { } } }
namespace ConsoleApplication1 { class Event { public Event (int day, int month, int hour, int minute, string name, string description) { this.day = day; this.month = month; this.hour = hour; this.minute = minute; this.name = name; this.description = description; } public void Changeday(int day) { this.day = day; } public void Changemonth(int month) { this.month = month; } public void Changehour(int hour) { this.hour = hour; } public void Changeminute(int minute) { this.minute = minute; } public void Changename(string name) { this.name = name; } public void Changedescription(string description) { this.description = description; } int day, month, hour, minute; string name, description; public int Day { set { } get { return day; } } public int Month { set { } get { return month; } } public int Hour { set { } get { return hour; } } public int Minute { set { } get { return minute; } } public string Name { get { return name; } set { } } public string Description { get { return description; } set { } } } }
Meine Probleme sind:
-Beim erstellen eines Objekts der Klasse Event, kann ich keine Variable als Name angeben, so ist das Objekt beim zweiten Aufrufen des Codes schon vorhanden.
-Beim Verändern eines Events müsste ich nach dem Event fragen und in einer Variable speichern, mit dieser kann ich aber keine Methoden ausführen, die entsprechend handeln würden.-Mehr Funktionen sind mir nicht eingefallen, da ich nicht wüsste wie ich an die Systemzeit komme, oder die Termine dauerhaft speichern kann. Beides könnte ich aus dem Internt Copy Pasten, dabei hätte ich es aber nicht verstanden.
Danke im voraus!
-
Hallo,
zunächst ein Hinweis zu deinem Code. Die Klasse Event implementiert mehrere Eigenschaften ohne Setter, dass heißt das ein Zuweisen der Eigenschaft zu nichts führt. Implementiere die Setter korrekt und entferne dafür die ganzen Change-Methoden - diese werden durch die Setter unnötig.
Da du nur ganz einfache Eigenschaften mit dem Standardcode für Getter- und Setter brauchst kannst du übrigens auch Auto-Implementierte Eigenschaften nutzen. Beispielsweise:
public string Name{ get; set; }
Dein erstes Problem verstehe ich leider nicht wirklich. Bis auf die Fehler mit den Eigenschaften sollte dein Code eigentlich soweit laufen.
Um die Daten mindestens wärend der Laufzeit zu erhalten kannst du die Kalsse List<T> nutzen. Hier kommt wieder Generics ins Spiel. Sonst kannst du auch erstmal ein Array mit 10 Events anlegen die man dann befüllen kann. Das Programm kann dann zwar nur 10 Elemente aufnehmen, das sollte aber zum Üben reichen.
An die aktuelle Uhrzeit kommst du mit der statischen DateTime.Now-Eigenschaft. Um Dateien zu erstellen musst du dich entweder mit Streams beschäftigen oder dich mit den statischen Methoden der File-Klasse begnügen.
Als Erweiterung:
Du kannst noch eine Basisklasse Event erstellen und davon zwei Klassen ableiten: TimeDependEvent und PlaceDependEventTom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hallo,
habe die Setter bisher aus logischen Gründen nicht implementiert, das ergibt im nachhinein aber keinen Sinn mehr, werde es ändern.
Event event1//Hier kann ich keine Variable angeben // = new Event (.....) Event variable //funktioniert nicht//
Beim nächsten Aufruf des Codes (Um ein neues Event zuerstellen) würde immer noch "event1" dort stehen.
Dieses Objekt wäre ja aber schon vorhanden....
-
Guten Morgen,
Jetzt verstehe ich dein Problem mit dem zweiten Event. Wie oben schon mal beschrieben brauchst du dafür eine Liste. Da du Generics noch nicht kennst (soweit ich das weiß), wird es erstmal schwierig das zu implementieren. Daher die Idee mit dem Array. Das ist dann zwar nicht schön programmiert aber es funktioniert zunächst, du übst OOP du kannst es später noch immer anpassen.
PS: Arrays sind eines der grundlegendsten Elemente einer Programmiersprache, daher gehe ich mal davon aus das du diese bereits kennst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Melde mich nochmal,
mit dem Array bin ich zwar weiter gekommen, aber schon wieder an Grenzen gestoßen:
public void newevent() { int day, month, hour, minute; string name, description; Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); description = Console.ReadLine();
//Das neue Array//
Event[] events = new Event[9]; //Hoffe so funktioniert die Überprüfung auf keinen Inhalt//
foreach(var a in events) { if(a == null) { //Falls das Obekt "null" ist, würde das nächste überprüft werden.//
} else { //Wie soll ich jetzt bei einem leeren Platz das Objekt erstellen, habe rumprobiert,//
//nicht hat aber richtig funktioniert//
} }
-
Hallo,
als Tipp: versuche es mit einer for-Schleife. Da kennst du dann den Index wo du auch einfach eine neue Instanz zuweisen kannst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ich weiß es nervt langsam, ich will es aber unbedingt hinbekommen:
Das erstellen auch von mehreren Terminen klappt jetzt :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Plan { public void start() { bool finish = false; for (; finish == false; ) { Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen? (escape eingeben um zu beenden.)"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; newevent(); } else if (input == "verändern") { worked = true; changeevent(); } else if (input == "abrufen") { worked = true; requestevent(); } else if (input == "escape") { finish = true; } else { Console.WriteLine("Vertippt?"); } } } } public void newevent() { int day, month, hour, minute; string name, description; Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); description = Console.ReadLine(); Event[] events = new Event[9]; int place = 0; for (; place == 0; ) { foreach (var a in events) { if (a == null) { place++; } else { switch (place) { case 0: events[0] = new Event(day, month, hour, minute, name, description); break; case 1: events[1] = new Event(day, month, hour, minute, name, description); break; case 2: events[2] = new Event(day, month, hour, minute, name, description); break; case 3: events[3] = new Event(day, month, hour, minute, name, description); break; case 4: events[4] = new Event(day, month, hour, minute, name, description); break; case 5: events[5] = new Event(day, month, hour, minute, name, description); break; case 6: events[6] = new Event(day, month, hour, minute, name, description); break; case 7: events[7] = new Event(day, month, hour, minute, name, description); break; case 8: events[8] = new Event(day, month, hour, minute, name, description); break; case 9: events[9] = new Event(day, month, hour, minute, name, description); break; } } } } } public void changeevent() { } public void requestevent() { Console.WriteLine("Über welchen Termin wollen sie Informationen abrufen?"); string request = Console.ReadLine(); events[] //Geht nicht//
} } }
Ein Problem ist aber, dass ich aus der anderen Methode nicht die Objekte aufrufen kann..
LG
- Bearbeitet R3turnz Dienstag, 4. August 2015 12:00
-
Hallo,
dein Code sieht schon mal gar nicht so schlecht aus :)
Zunächst mal ein paar Hinweise um dir zu Helfen:
- Öffentliche Methoden sollten am Anfang groß geschrieben werden.
- In newevent hast du ein Switch-Ausdruck in einer Schleife. Vergleiche mal die Zahlen auf die du abprüfst mit den Indices des Arrays auf die zu zugreifst. du kannst auch einfach events[place] verwenden ;)
- Wenn du deinen Code-Stil noch verbessern willst, dann versuche mal Benutzerschnittstelle und Daten zu trennen. Du könntest dann beispielsweise eine Plan- und eine PlanInput-Klasse haben, wobei Plan mit Daten von PlanInput "gefüttert" wird.
Nun zu deinem Problem:
Ich denke mal das du meinst dass du nicht auf das events-Array usw. zugreifen kannst. Dafür musst du dieses erst innerhalb der Klasse deklarieren. Variablen sind immer nur dort verwendbar, wo man sie deklariert hat oder in untergeordneten Elementen.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Vielen Dank für die Hilfe ;)
HAbe jetzt einiges gebessert: (Vieles ging nicht, ineinander verzweigte Schleifen sind komplizierter als ich gedacht hätte :) )
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { class Plan { public void Start() { bool finish = false; for (; finish == false; ) { Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; Newevent(); } else if (input == "verändern") { worked = true; Changeevent(); } else if (input == "abrufen") { worked = true; Requestevent(); } else if (input == "escape") { worked = true; finish = true; } else { Console.WriteLine("Vertippt?"); Console.WriteLine("Weiterhin kannst du einen neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); input = Console.ReadLine(); } } } } public void Newevent() { try { int day, month, hour, minute; string name, description; Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); description = Console.ReadLine(); Event[] events = new Event[9]; int place = 0; for (; place == 0; ) { foreach (var a in events) { if (a == null) { place++; } else { events[place] = new Event(day, month, hour, minute, name, description); } } } } catch { Console.WriteLine("Error, Programm läuft weiter, wird aber wahrscheinlich nicht mehr richtig funktionieren. Neustarte bitte."); } Console.WriteLine("Erstelle Termin..."); Console.Clear(); Console.WriteLine("Termin erfolgreich erstellt..."); } public void Changeevent() { } public void Requestevent() { } } }
Ich meinte von der Changeevent Methode kann ich nicht auf das Array zugreifen, ein public konnte ich auch an keiner Stelle hinzufügen. (Diese Methode ist ja in der gleichen Klasse)
Werde die Klassengliederung oben erneuer, hoffe ich bekomme es hin.
LG !
-
Hallo,
ich habe mich jetzt daran gesetzt die KlassenInput Klasse einzufügen, weiterhin kann ich aus der Methode ChangeEvent() nicht die Event-Array zugreifen.
Nach ein bisschen rumprobieren habe ich die Input Klasse einfügen können indem ich beide statisch definiert habe.
Alles hat geklappt bis darauf das ich aus der Input Klasse nicht die Variablen in der Plan Klasse nicht abrufen kann.
static class PlanInput { public static void Input() { bool finish = false; for (; finish == false; ) { Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; PlanInput.Inputnewevent(); } else if (input == "verändern") { worked = true; Plan.Changeevent(); } else if (input == "abrufen") { worked = true; Plan.Requestevent(); } else if (input == "escape") { worked = true; finish = true; } else { Console.WriteLine("Vertippt?"); Console.WriteLine("Weiterhin kannst du einen neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); input = Console.ReadLine(); } } } } public static void Inputnewevent() { Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); } }
static class Plan { int day, month, hour, minute; string name, description; public int Day { get { return day; } set { day = value; } } public int Month { get { return month; } set { month = value; } } public int Hour { get { return hour; } set { hour = value; } } public int Minute { get { return minute; } set { minute = value; } } public string Name { get { return name; } set { name = value; } } public string Description { get { return description; } set { description = value; } } public static void Newevent() { Event[] events = new Event[9]; int place = 0; for (; place == 0; ) { foreach (var a in events) { if (a == null) { place++; } else { events[place] = new Event(); } } } Console.WriteLine("Erstelle Termin..."); Console.Clear(); Console.WriteLine("Termin erfolgreich erstellt..."); } public static void Changeevent() { } public static void Requestevent() { } }
Hoffe ich habe es mit dem "static" nicht verhauen.
LG
-
Hallo,
die Klassen statisch zu machen funktioniert zwar, ist aber praktisch so als hättest du gar keine Klassen und keine OOP. Versuche es daher doch nochmal ohne static, sodass du immer Instanzen der Klassen brauchst.
Das ist di Kunst am OP, di Instanzen so weiter zu reichen das di Klassen immer Zugriff auf das nötigste haben, aber dabei nicht alles zu kompliziert zusammen bauen.
Auch sollte man sich dabei an den Grundsatz halten das zwar A B kennt aber B nicht A. Also keine sich die Klasse immer nur einseitig in die selbe Richtung. Sonst kann es bei großen Projekten schnell verwirrend werden.Das du nach wie vor nicht auf die Events zugreifen kannst liegt daran dass diese nicht im Bereich de Klasse sondern im Bereich der Newevent Methode liegen. Das Array musst du vor oder hinter der Methode platzieren.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Ich hoffe das das hier endlich der letzte Post wird, danke für deine ganzen Mühen ;) (Ich will es einfach nicht hinbekommen...)
Ich habe eigentlich den Code jetzt fertig, die Lösung war eine Methode die das Array verwaltet. :
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class Plan { Event[] events = new Event[9]; public static int day, month, hour, minute; public static string name, description; public static void Newevent() { PlanInput.Inputnewevent(); Plan.ManageEvent("change"); Console.WriteLine("Erstelle Termin..."); Console.Clear(); Console.WriteLine("Termin erfolgreich erstellt..."); } public static void Changeevent() { Console.WriteLine("Bitte geben sie die veränderten Daten an!"); PlanInput.Inputnewevent(); Plan.ManageEvent("change"); Console.Clear(); Console.WriteLine("Termin erfolgreich verändert1"); } public static void Requestevent() { Plan.ManageEvent("request"); } public static void ManageEvent(string mode) { Plan planmanage = new Plan(); if (mode == "change") { if (planmanage.events[8] == null) { for (int place = 0; place == 0; ) { foreach (var i in planmanage.events) { if (i == null) { planmanage.events[place] = new Event(day, month, hour, minute, name, description); } else { place++; } } } } else { Console.WriteLine("Alle Terminplätze sind belegt, ändern sie einen nicht mehr Gebrauchten."); } } else { Console.WriteLine("Für welchen Termin sollen Informationen aufgerufen werden?"); string input = Console.ReadLine(); for (int place = 0; place == 0; ) { foreach (var o in planmanage.events) { if (o == null) { place++; Console.WriteLine("."); } else if (o.Name == input) { planmanage.events[place].ToString(); } else { Console.WriteLine("Fehler!"); } } } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class PlanInput { public static void Input() { bool finish = false; for (; finish == false; ) { Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; Plan.Newevent(); } else if (input == "verändern") { Plan.Changeevent(); } else if (input == "abrufen") { Plan.Requestevent(); worked = true; } else if (input == "escape") { worked = true; finish = true; } else { Console.WriteLine("Vertippt?"); Console.WriteLine("Weiterhin kannst du einen neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); input = Console.ReadLine(); } } } } public static void Inputnewevent() { try { Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); Plan.day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); Plan.month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); Plan.hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); Plan.minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); Plan.name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); Plan.description = Console.ReadLine(); } catch { Console.WriteLine("Fehler!"); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class Event { public Event (int day, int month, int hour, int minute, string name, string description) { this.day = day; this.month = month; this.hour = hour; this.minute = minute; this.name = name; this.description = description; } public override string ToString() { return "Das Event findet an diesem Zeitpunkt statt (" + Hour + ":" + Minute + " " + Month + ".2015)"; } int day, month, hour, minute; string name, description; public int Day { set { day = value; } get { return day; } } public int Month { set { month = value; } get { return month; } } public int Hour { set { hour = value; } get { return hour; } } public int Minute { set { minute = value; } get { return minute; } } public string Name { get { return name; } set { name = value; } } public string Description { get { return description; } set { description = value; } } } }
Jetzt ist das Problem: Es funktioniert nicht : Ausirgendeinem Grund wird kein Objekt im Array erstellt, die Ausgabe bei der ABfrage sind 9 Punkte, also 9 leere Plätze. Ich habe schon viel ausprobiert, finde den Fehler aber nicht...
LG
-
Hallo,
1) Klasse PlanInput
public static void Inputnewevent() { try { Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); Plan.day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); Plan.month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); Plan.hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); Plan.minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); Plan.name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); Plan.description = Console.ReadLine(); } catch { Console.WriteLine("Fehler!"); } }
Hier werden die Daten zu statischen Klassen-Variablen zugewiesen.Also Die daten werden stängig in der statischen Variablen überschrieben. Es wird kein Event Objekt, das mit der Daten initialisiert werden soll, erzeugt.
2)Klasse Plan
public static void ManageEvent(string mode) { Plan planmanage = new Plan();
Wenn die Mathode aufgerufen wird, wird immer ein neues Objekt von Plan erzeugt. Stattdessen solltest Du mit einem Objekt von Plan (als Klassen-Variable) arbeiten oder direkt mit events array von der Klasse Plan .
Grüße
-
Wie ich oben schon einmal andeutete, entferne erstmal alle "static" außer von der Main Methode. Denn sonst hast du kein OOP in deinem Code. Leider fehlt mir gerade die Zeit um nochmal näher auf den Code zu gucken, werde allerdings versuchen es trotzdem möglichst schnell zu tun, wenn du dann nochmal deinen gesamten Code ohne static zeigst.
Tom Lambert - .NET (C#) MVP
Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets -
Hi,
bin jetzt schon mit der Version ohne "static" fertig, war leichter als ich dachte :)
Obwohl ich den Erstellungsprozess geändert habe, einiges hat keinen Sinn ergeben will es trotzdem nicht funktionieren:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class Program { static void Main(string[] args) { PlanInput planstart = new PlanInput(); planstart.Input(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class Plan { Event[] events = new Event[9]; public void Newevent() { PlanInput Planinputnewevent = new PlanInput(); Planinputnewevent.Inputnewevent(); Console.WriteLine("Erstelle Termin..."); Console.WriteLine("Termin erfolgreich erstellt..."); } public void Changeevent() { Console.WriteLine("Bitte geben sie die veränderten Daten an!"); PlanInput Planchange = new PlanInput(); Planchange.Inputnewevent(); Console.Clear(); Console.WriteLine("Termin erfolgreich verändert1"); } public void Requestevent() { Plan planrequest = new Plan(); planrequest.ManageEvent("change", 0, 0, 0, 0, "test", "test"); //Hier hätte man über "params" wesentlich eleganter lösen können, ehrlichgesagt habe ich aber keine Lust...// } public void ManageEvent(string mode,int day, int month, int hour, int minute, string name, string description) { Plan planmanage = new Plan(); if (mode == "new") { if (planmanage.events[8] == null) { bool worked = false; int place = 0; foreach (var i in planmanage.events) { if(worked == false) { if (i == null) { planmanage.events[place] = new Event(day, month, hour, minute, name, description); worked = true; } else { place++; } } } } else { Console.WriteLine("Alle Terminplätze sind belegt, ändern sie einen nicht mehr Gebrauchten."); } } else { Console.WriteLine("Für welchen Termin sollen Informationen aufgerufen werden?"); string input = Console.ReadLine(); int place = 0; foreach (var o in planmanage.events) { if (o == null) { place++; } else if (o.Name == input) { planmanage.events[place].ToString(); } else { Console.WriteLine("Fehler!"); } } } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Terminplaner { class PlanInput { public void Input() { bool finish = false; for (; finish == false; ) { Plan planstart = new Plan(); Console.WriteLine("Willkommen, ein neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); string input = Console.ReadLine(); for (bool worked = false; worked == false; ) { if (input == "anlegen") { worked = true; planstart.Newevent(); } else if (input == "verändern") { worked = true; planstart.Changeevent(); } else if (input == "abrufen") { worked = true; planstart.Requestevent(); } else if (input == "escape") { worked = true; finish = true; } else { Console.WriteLine("Vertippt?"); Console.WriteLine("Weiterhin kannst du einen neuen Termin anlegen,verändern oder einen abrufen? \n(escape eingeben um zu beenden.)"); Console.Clear(); input = Console.ReadLine(); } } } } public void Inputnewevent() { try { int day, month, hour, minute; string name, description; Console.WriteLine("Bitte geben sie den Tag ihres Termines an."); day = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Monat ihres Termines an."); month = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Stunde ihres Termines an"); hour = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie die Minute ihres Termines an."); minute = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("Bitte geben sie den Namen ihres Termines an."); name = Console.ReadLine(); Console.WriteLine("Bitte geben sie die Beschreibung ihres Termines an."); description = Console.ReadLine(); Plan newevent = new Plan(); newevent.ManageEvent("new", day, month, hour, minute, name, description); } catch { Console.WriteLine("Fehler!"); } } } }
LG!