Autor |
Beitrag |
RoXoR
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 06.01.11 10:48
Hallo, ich bin im 1. Semester und habe Programmieren mit C#. Habe von meinem Prof. folgende Aufgabe bekommen:
Zitat: | Schreiben Sie ein Programm, mit dem Klasuren verwaltet werden können.
Eine Klausur hat folgende Eigenschaften:
* Titel
* Dozent
* Termin
* Räume (davon kann es viele geben)
* Teilnehmerzahl
Das Programm soll es erlauben,
* neue Klausuren anzulegen,
* die erfassten Klausuren in einer Datei zu speichern,
* diese Datei wieder einzulesen,
* alle Klausuren nach dem Datum sortiert auszugeben und
* nach den Klausuren eines Dozenten zu suchen
Die Benutzung soll menügesteuert erfolgen. Wenn Sie eine zweite Version Ihres Programms schreiben, die eine echte Windowsoberlfäche hat, die Aktionen also über ein Windows-Menü gesteuert werden, bekommen Sie 2 Zusatzpunkte. Dabei können Sie durch geschickte Wahl der Klassen die Arbeit erheblich reduzieren. |
Mein Hauptproblem ist nun, in welcher Form soll ich die Informationen in eine Datei speichern, damit sie auch wieder leicht zum einlesen sind?
Da ich noch wenig Erfahrung habe, möchte ich euch bitten, dies bei eueren Tipps zu beachten 
|
|
huuuuuh
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Do 06.01.11 10:59
speicher die Informationen nicht in einer Form, sondern in einer eigenen Klasse, welche auch das Speichern in eine Datei übernimmt  die Oberfläche(n) sollten damit erstmal wenig zu tun haben. Oberflächen sollten nur zum anzeigen/eingeben von Informationen dienen, nicht zur Speicherung...
Für diesen Beitrag haben gedankt: RoXoR
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 06.01.11 11:04
Hm, danke huuuuuh, aber irgendwie ist mir das noch nicht so ganz klar :/
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Do 06.01.11 11:04
Hallo,
für die Speicherung der Daten in eine Datei würde ich das XML-Format vorschlagen. Da hast Du eine ordentliche Struktur. Um die Daten darin zu speichern bzw. wieder zu lesen würde sich hier Serialisierung/ Deserialisierung anbieten.
Und @ huuuuuh:
Ich glaube eher, dass er nicht meinte, in welcher (Windows)-Form er die Daten speichern soll, sondern in welcher Form in der Datei (CSV, Text, XML, ...)
Marko
Für diesen Beitrag haben gedankt: RoXoR
|
|
huuuuuh
      
Beiträge: 665
Erhaltene Danke: 19
win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
|
Verfasst: Do 06.01.11 11:09
ach, das Dateiformat? natürlich... dachte jetz eher an das interne Speichern der Informationen
zum Thema XML-Serialisierung: www.c-sharp-library....und+laden_64947.html
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 06.01.11 11:13
Danke ihr zwei. Ich denke ihr wart mir schonma ne große und schnelle Hilfe  Aber vielleich muss ich mich nochma melden 
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: Do 06.01.11 11:27
Dieses .xml Format ist ja nun nicht ganz so einfach umzusetzten, wenn man gar keine Vorkenntnisse darüber hat. Gibt es denn vielleicht eine einfachere (dafür nicht so schöne) Lösung?
|
|
Necaremus
      
Beiträge: 203
Erhaltene Danke: 18
Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
|
Verfasst: Do 06.01.11 11:54
RoXoR hat folgendes geschrieben : | Dieses .xml Format ist ja nun nicht ganz so einfach umzusetzten, wenn man gar keine Vorkenntnisse darüber hat. Gibt es denn vielleicht eine einfachere (dafür nicht so schöne) Lösung? |
bin bei meinem studium zwar noch nicht mit dem proggen angefangen, aber die aufgabe ist eigentlich relativ simpel zu lösen...
1. xml ist denke ich das "einfachste" - xml ist zudem sehr simpel und schnell zu verstehen.
guck dir nen kleines tut an, bzw. schnupper nur rein, und du hast alles nötige wissen, welches du für dein kleines prog brauchst.
du könntest die dateien auch anders speichern, zb sogar mit einem eigenen datei-format, welches du einzig für den zweck dieses programmes kreierst (hört sich komplex an, ist aber auch sau simpel^^), würde ich allerdings weniger empfehlen, da es mehr-arbeit bedeutet.
des weiteren könntest du nachfragen, ob es zwingend notwändig ist die nötigen daten in einer einzelnen Datei zu speichern, oder ob du eine Datenbank nehmen dürftest. Letzteres wäre sogar sinnvoller, da für eine "wirkliche" realisierung eine datenbank eher in frage kommen würde.
2. "Die Benutzung soll Menügesteuert erfolgen." was heißt das? O.o
Möchte er, dass ihr eine DLL zusammenbastelt und die funktionen dieser einfach nur über eine GUI steuert(2ter teil)?
das würde ich zumindest empfehlen, da man so die DLL universeller benutzen könnte und eine einbindung in bereits vorhande projekte wesentlich einfacher wäre.
Versuch möglichst alle threads nicht im GUI thread auszuführen - gibt sicherlich extra punkte, sollte allerdings bei der umsetzung von einer seperaten DLL eh kein prob sein
blablabla^^
_________________ [Master of dangerous sciolism]. "Never assume malice when stupidity will suffice." Hanlon's Razor
-= Some people see the glass half full. Others see it half empty. I see a glass that's twice as big as it needs to be. =-
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Do 06.01.11 23:22
Hallo, also:
Du hast eine Klasse "Klausur", die die Properties
- Titel (string)
- Dozent (entweder ein string, aber das könnte auch eine eigene Klasse sein)
- Termin (DateTime)
- Räume (nunja, könnte eine List<int> sein, aber auch eine List<Raum> [Raum ist dann eine Klasse] sein)
- Teilnehmerzahl (int)
Und diese Klasse könntest Du nun ganz einfach mit .NET-Mitteln serialisieren/ deserialisieren. Um in Deiner Applikation die Klausuren zu halten, hättest Du also eine List<Klausur>.
Soviel erstmal, Marko
Für diesen Beitrag haben gedankt: RoXoR
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: So 09.01.11 21:05
Dank dir. Hab jetzt den link noch dazu gefunden
www.tsql.de/csharp/x...eren_lesen_speichern
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 12.01.11 20:13
Also ich hab jetzt mal den Großteil geschrieben
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| using System; using System.IO; using System.Xml.Serialization; using System.Collections.Generic;
public class Klausur { public string Titel; public string Dozent; public string Termin; public int Teilnehmerzahl; public List<int> Raeume; string sRäume; public Klausur() { } public Klausur(string nTitel, string nDozent, string nTermin, int nTeilnehmerzahl) { this.Titel = nTitel; this.Dozent = nDozent; this.Termin = nTermin; this.Teilnehmerzahl = nTeilnehmerzahl; } public Klausur(string nTitel, string nDozent, string nTermin, int nTeilnehmerzahl, List<int> nRaeume) { this.Titel = nTitel; this.Dozent = nDozent; this.Termin = nTermin; this.Teilnehmerzahl = nTeilnehmerzahl; this.Raeume = nRaeume; foreach(int R in Raeume) sRäume=sRäume+" " + Convert.ToString(R); }
public override string ToString() { return "Die Klausur " + this.Dozent+", " + this.Titel +", " + this.Termin +", " + this.Teilnehmerzahl +", " + this.sRäume; }
private string sPfad = @"c:\klausuren-datenbank.xml";
public void Speichern() { Klausur myKlausur = new Klausur(this.Titel, this.Dozent, this.Termin, this.Teilnehmerzahl); XmlSerializer ser = new XmlSerializer(typeof(Klausur)); if (File.Exists(@"c:\klausuren-datenbank.xml")) { FileStream str = new FileStream(sPfad, FileMode.Append); ser.Serialize(str, myKlausur); str.Close(); } else { FileStream str = new FileStream(sPfad, FileMode.Create); ser.Serialize(str, myKlausur); str.Close(); } } private Klausur Lesen() { XmlSerializer ser = new XmlSerializer(typeof(Klausur)); StreamReader sr = new StreamReader(sPfad); Klausur myKlausur = (Klausur)ser.Deserialize(sr); sr.Close(); return myKlausur; } }
class MeinProgramm { public static void Main() { List<Klausur> Klausuren = new List<Klausur>(); Console.Write("Wie viele Klausuren sollen angelegt werden? "); string Anzahl = Console.ReadLine(); int anz = Convert.ToInt32(Anzahl); for (int zl = 0; zl<anz; ++zl) { Console.Write("Titel: "); string Titel = Console.ReadLine(); Console.Write("Dozent: "); string Dozent=Console.ReadLine(); Console.Write("Termin: "); string Termin=Console.ReadLine(); Console.Write("Teilnehmerzahl: "); int Teilnehmerzahl=Convert.ToInt32(Console.ReadLine()); Console.Write("Raum: "); List<int> Räume = new List <int>(); string Raum = Console.ReadLine(); while(Raum!="q") { int iRaum=Convert.ToInt32(Raum); Räume.Add(iRaum); Console.Write("Raum: "); Raum = Console.ReadLine(); } Klausur K1 = new Klausur(Titel,Dozent,Termin,Teilnehmerzahl,Räume); Klausuren.Add(K1); } foreach (Klausur K in Klausuren) { Console.WriteLine(K); K.Speichern(); } Console.Write("\n\nBeliebige Taste drücken um zu beenden ..."); Console.ReadKey(true); } } |
Speichern funktioniert eigentlich schon recht gut
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| <?xml version="1.0"?> <Klausur xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Titel>Mathe</Titel> <Dozent>Einstein</Dozent> <Termin>1.1.2011</Termin> <Teilnehmerzahl>120</Teilnehmerzahl> </Klausur><?xml version="1.0"?> <Klausur xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Titel>Bwl</Titel> <Dozent>Albert</Dozent> <Termin>2.2.2011</Termin> <Teilnehmerzahl>120</Teilnehmerzahl> </Klausur> |
Bekomm nun aber leider nicht hin, dass die Klausuren wieder komplett eingelesen werden 
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 12.01.11 20:33
Auf diese Art solltest du nicht die einzelnen Klausur-Instanzen serialisieren - du erzeugst damit keine korrekte XML-Datei (da diese nur einmalig den Header "<?xml version="1.0"?>" besitzen darf).
Lege dir eine List<Klausur> an und serialisiere und deserialisiere diese dann am Stück:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| List<Klausur> klausuren = new List<Klausur>();
void Schreiben() { XmlSerializer ser = new XmlSerializer(typeof(List<Klausur>));
using(FileStream str = new FileStream(sPfad, FileMode.Create)) ser.Serialize(str, klausuren); }
void Lesen() { XmlSerializer ser = new XmlSerializer(typeof(List<Klausur>)); using(StreamReader sr = new StreamReader(sPfad)) klausuren = (List<Klausur>)ser.Deserialize(sr); } |
(das "using(...)" erspart dir das manuelle "Close()" bzw. "Dispose()")
Diese Methoden solltest du dann in einer eigenen Verwaltungsklasse z.B. "KlausurenListe" o.ä. anlegen.
Diese Klasse (bzw. die interne List<Klausur>) erleichtert dir dann auch die Punkte:
Zitat: |
* alle Klausuren nach dem Datum sortiert auszugeben und
* nach den Klausuren eines Dozenten zu suchen
|
Viel Erfolg noch...
Für diesen Beitrag haben gedankt: RoXoR
|
|
RoXoR 
Hält's aus hier
Beiträge: 7
|
Verfasst: Mi 12.01.11 20:49
Hallo Th69,
danke erstmal
Könntest du vielleicht kurz meinen kompletten Code mit deinem Vorschlag anpassen? Bekomme es leider nicht zum laufen 
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: Mi 12.01.11 20:58
Hallo RoXor,
nee, nee, nee, so nicht -)
Was genau kriegst du nicht hin?
Hast du denn schon die Verwaltungsklasse implementiert?
(Du kannst auch mal in den Nachbarthread www.c-sharp-forum.de...ewtopic.php?t=103504 schauen. Die dortige SchuelerListe wäre dann das passende für dich, nur eben, daß intern eine List<Schueler> bzw. bei dir eine List<Klausur> verwendet werden sollte).
|
|
Trashkid2000
      
Beiträge: 561
Erhaltene Danke: 137
|
Verfasst: Mi 12.01.11 21:22
Naja, ich würde die Funktionalität zum Serialisieren/ Deserialisieren von einer List<Klausur> und wieder zurück nicht in der Klasse Klausur lassen, sondern auslagern.
Was beim deserialsieren ja auch total unlogisch ist. Denn ich muss erst eine Klausur anlegen, um eine andere zu deserialisieren. Und wenn Du beim deserialisieren eine List<Klausur> erhältst, und daran dann Änderungen vornimmst, ist es ja auch eigentlich egal, wenn Du die XML beim serialisieren immer wieder überschreibst.
Marko
|
|
|