Autor Beitrag
RoXoR
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Do 06.01.11 11:04 
Hm, danke huuuuuh, aber irgendwie ist mir das noch nicht so ganz klar :/
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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 @user profile iconhuuuuuh:
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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 :P
RoXoR Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Do 06.01.11 11:54 
user profile iconRoXoR hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: So 09.01.11 21:05 
Dank dir. Hab jetzt den link noch dazu gefunden
www.tsql.de/csharp/x...eren_lesen_speichern
RoXoR Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Mi 12.01.11 20:13 
Also ich hab jetzt mal den Großteil geschrieben

ausblenden volle Höhe C#-Quelltext
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() {
    
    /* vereinfacht erstmal ohne Räume. Mit Räume:
     * Klausur myKlausur = new Klausur(this.Titel, this.Dozent, this.Termin, this.Teilnehmerzahl, this.Raeume);
     */

    
      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();
      }
  }
  // Sobald GUI vorhanden, hier noch ne Methode zum Leeren der Datenbank
  
  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"// Abbruch mit '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();
    }
    
        
    // TODO: Implement Functionality Here
    Console.Write("\n\nBeliebige Taste drücken um zu beenden ...");
    Console.ReadKey(true);
  }
}


Speichern funktioniert eigentlich schon recht gut
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: 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