Fuhrparkverwaltung - benötige Rat bei Vorbereitung der Umsetzung...



  • Hallo,

    ich bin gerade dabei eine Fuhrparkverwaltung für große LKW`s zu schreiben und es hapert noch an den konkreten Vorstellungen wie ich das mit den Möglichkeiten von C umsetzen kann. Ich sags vorneweg, ich will hier keine "Hausaufgabenlösung", sondern brauche Starthilfe beim Softwaredesign. Folgende Informationen sind gegeben und dahinter habe ich jeweils hingeschrieben, wie man es evtl. angehen könnte oder auch ich weiß es nicht... und genau da brauche ich Ratschläge.

    Aufgabe:

    1.) ⚠ Lösungsvorschlag: Das würde ich über einen struct machen doch später ergeben sich da Probleme, da ich einen LKW mit einem/mehreren Anhängern verknüpfen muss, vor allem diese Verknüpfung bereit
    mir Kopfzerbrechen...

    Ein LKW hat folgende Attribute:

    - einen Namen/Bezeichnung
    - eine eindeutiger Nummer
    - max. Anzahl erlaubter Anhänger (1,2, usw...)
    - Startort und Zielort

    Ein LKW hat folgende Funktionen:

    2.) ⚠ Lösungsvorschlag: LKW anlegen/entfernen , kann ich einen struct dynamisch anlegen, löschen? Obige Angaben von "1.)" sollte ich alle dynamisch zuweisen können während der Laufzeit.

    - LKW anlegen/entfernen
    - LKW information ausgeben z.B.:
    + ein bestimmter LKW mit/ohne Anhänger
    + alle LKWs mit/ohne Anhänger

    2.5) Ein Anhänger hat eine eindeutige Nummer

    3.) ⚠ Lösungsvorschlag: Ausgabe geschieht wohl mit einer for-schleife in der alle structs(LKWs) durchlaufen werden und der/die Anhänger und dessen Belegung usw. ausgegeben wird. Wie kann ein struct(LKW) aber
    mehrere Anhänger haben und dann noch eine eindeutige NUmmer rein C-technisch gesehen?

    - Anhänger anhängen/abhängen
    - Lagerplatz im Anhänger reservieren/freigeben
    - Anzahl der freigegebenen Lagerplätze je Anhänger/alle Anhänger ausgeben
    - "grafischer" Belegungsplan ausgeben je Anhänger/alle Anhänger wobei ein Anhänger 128 Lagerplätze hat. 4 in der Breite und 32 in der Länge z.B.

    ⚠ Lösungsvorschlag: 4 integer je 32 Bit benötige ich demnach könnte ich ein

    int array[4]
    

    erstellen und bei Zugriff auf z.B. die ersten 32 Lagerplätze würde ich array[0] ansprechen und Bits setzen(reservieren)/löschen(freigeben) mit den Bitmasken Funktionen

    Anhänger 1: (0) = freigegeben , (1) = reserviert

    001 (0) 005 (1)......... 125 (0)
    002 (1) 006 (1)......... 126 (1)
    003 (0) 007 (0)......... 127 (0)
    004 (1) 008 (1)......... 128 (0)

    Anhänger 2:

    001 (1) 005 (0)......... 125 (1)
    002 (0) 006 (1)......... 126 (1)
    003 (0) 007 (0)......... 127 (1)
    004 (1) 008 (0)......... 128 (1)

    Das finale Programm soll unter Windows XP 32bit als Konsolenanwendung laufen.
    Die Daten auf Festplatte zu serialisieren spielt noch keine Rolle, darum kümmere ich mich später...

    Über Tips wie ich das ganze optimal angehe würde ich mich sehr freuen.

    Sonst guten Rutsch ins neue Jahr 😃



  • Pelle schrieb:

    ...
    Über Tips wie ich das ganze optimal angehe würde ich mich sehr freuen.
    Sonst guten Rutsch ins neue Jahr 😃

    Man nehme Stift und Papier und designe eine Datenbank 😉

    Bist du sicher, das du das in C machen willst ?
    Das ist doch eher Datenbankdesign :xmas2:



  • Ich würde dir da auch eine Datenbank empfehlen.
    Access bietet sich dafür sehr gut an. Dann hast du aufjedenfall auch keine Probleme mehr mit deinen Verknüpfungen.

    Und wenn du das ganzen unbedingt als eine Konsolenanwendung machen möchtest, dann greifst du von C über ODBC auf deine AccessDatenbank zu und das Problem ist gelöst.



  • Die Angaben von dir sind total wirr. Du schreibst irgendeine Lösung ohne Frage und dann gibts danach nur ein paar Stichpunkte??? 😕
    Stell doch mal ne Frage mit der man was anfangen kann und schreib danach deine Idee/Problem.

    PS Ich glaub nicht, dass er ne Datenbank nehmen darf



  • also schrieb:

    Die Angaben von dir sind total wirr. Du schreibst irgendeine Lösung ohne Frage und dann gibts danach nur ein paar Stichpunkte??? 😕
    Stell doch mal ne Frage mit der man was anfangen kann und schreib danach deine Idee/Problem.

    PS Ich glaub nicht, dass er ne Datenbank nehmen darf

    Richtig, eine Datenbank darf ich nicht nehmen!

    Habe mittlerweile wieder etwas in meinem C von a - z buch geschmökert und frage mich nun ob eine einfach verkettete Liste das richtig wäre?



  • Pelle schrieb:

    1.) ⚠ Lösungsvorschlag: Das würde ich über einen struct machen doch später ergeben sich da Probleme, da ich einen LKW mit einem/mehreren Anhängern verknüpfen muss, vor allem diese Verknüpfung bereit
    mir Kopfzerbrechen...

    Du könntest z.B. der LKW-Struktur noch ein Array von Zeigern auf eine Anhänger-Struktur mitgeben.
    Oder anstelle des Arrays nur einen Zeiger auf eine Anhänger-Struktur und der Anhänger-Struktur selbst auch einen solchen. Das wäre dann eine verkettete Liste. Edit: Hehe, bist ja schon selbst drauf gekommen 🙂

    Pelle schrieb:

    2.) ⚠ Lösungsvorschlag: LKW anlegen/entfernen , kann ich einen struct dynamisch anlegen, löschen? Obige Angaben von "1.)" sollte ich alle dynamisch zuweisen können während der Laufzeit.

    Das ist kein Problem. man: malloc ist dein Freund.

    Pelle schrieb:

    Wie kann ein struct(LKW) aber
    mehrere Anhänger haben und dann noch eine eindeutige NUmmer rein C-technisch gesehen?

    Hier sehe ich das Problem nicht. Liegt vielleicht an der etwas nicht vohandenen Spezifikation? 😉



  • ...Oder anstelle des Arrays nur einen Zeiger auf eine Anhänger-Struktur und der Anhänger-Struktur selbst auch einen solchen. Das wäre dann eine verkettete Liste. Edit: Hehe, bist ja schon selbst drauf gekommen 🙂

    Das hört sich auf die Schnelle toll an ist aber ein Schuß nach hinten... Ich kämpfe mich gerade durch die Vorstellung wie ich reale objekte die einen zusammenhang haben: LKW->Anhänger1->Anhänger2 in eine verkettete structliste mit zeiger auf den nächsten struct umsetze, denn ein LKW ist kein Anhänger und ein Anhänger ist kein LKW das heißt beides sind unterschiedliche Elemente, aber alle Elemente in einer Liste sind gleich**!!!!!!!**

    oder denke ich zu kompliziert?

    Nach euch würde ich also mit malloc das 1. struct erstellen welches ein LKW ist alle weiteren struct sind Anhänger. Der LKW zeigt auf den 1.Anhänger und dieser auf den 2. Anhänger usw. Wenn ich aber diese verkettete Liste sortiere, dann wird der LKW mitsortiert obwohl die Anhänger nur sortiert sein sollen nach der Anhängernummer... 😞

    Das ist nicht stimmig. Versteht mich jemand?



  • push 😃



  • Es hindert dich doch niemand daran einfach den LKW als Kopf der Liste der Anhänger zu betrachten. Da sehe ich echt das Problem nicht. Und sortieren solltest du die Anhänger evtl. auch gar nicht, da du beim erstellen der Liste ja schon sortiert einfügen kannst.



  • Pelle schrieb:

    aber alle Elemente in einer Liste sind gleich**!!!!!!!**

    nö, die brauchen nur alle einen *struct listelement next;, ansonsten können die total verschieden sein.
    🙂



  • super danke euch, das ist es gerade was ich brauche etwas Führung... testen und coden muss ich natürlich selber:

    bei diesem code bekomme ich eine warnung:

    Code:

    scanf("%i",derLKW.iLKWnummer);
    

    Fehlercode:

    warning: format arguement is not a pointer

    ok der "ampersend" gehört vor derLKW.iLKWnummer wegen adresse usw. doch warum funktioniert das ganze ohne fehlermeldung bei strings des structs z.B.

    Code:

    scanf("%s",derLKW.sZielbahnhof);
    

    da bekomme ich keine Fehlermeldung? Ja ich bekomme sogar eine extra warnung, wenn ich beim einen ampersend davorsetze 😕



  • Dein "string" ist ja nichts anderes als ein char*, also ein Zeiger zu einer Zeichenkette. Darum brauchst du da kein &



  • MasterCounter schrieb:

    Dein "string" ist ja nichts anderes als ein char*, also ein Zeiger zu einer Zeichenkette. Darum brauchst du da kein &

    das habe ich bisher so noch nicht gelesen in meinem 1300 seiten Kompendium 😉 komisch... dennoch vielen Dank.



  • Alternativ kannst du bei einem array auch folgendes schreiben:

    char str[100];
    
    scanf("%s", &str[0]);
    

    Der Name eines Arrays ist gleichbedeutend mit dem Zeiger auf das erste Element des Arrays.



  • danke Th!



  • MasterCounter schrieb:

    Dein "string" ist ja nichts anderes als ein char*...

    das stimmt nicht.

    Th schrieb:

    Der Name eines Arrays ist gleichbedeutend mit dem Zeiger auf das erste Element des Arrays.

    schon etwas besser, aber auch nicht ganz richtig. der name eines arrays gilt z.b. nicht als sogenannter 'lvalue'
    🙂



  • Hallo,

    EDIT: VERGESST DAS GANZE ich muss ne richtige Liste machen das ist dreck so das geht net.

    Wenn ich eine LKWnummer und LKWname eingebe zum 1. mal ist alles ok z.B. (5,truckster), wenn ich dann nochmals 5 eingebe sprich eine Übereinstimmung mit der Suche hat stattgefunden, dann springt plötzlich ein VS 2005 Fenster auf und möchte, dass ich diesen oder auch nicht als Debugger auswähle, egal was ich wähle danach wird meine windows konsolenanwendung beendet?

    TEIL - Code:

    struct LKW
      {
        int  iLKWnummer;   
        char sLKWname[256];
    
      };
    
      struct LKW *derLKW;
    
    int LKWZaehler = 0; // Glober Zähler, jedesmal wenn ein LKW angelegt wird wird dieser hochgezählt
    
    void legeanLKW()
      {
    
            if(LKWZaehler == 0)  // Annahme der LKWZaehler ist bei 0 sprich es wurde noch kein LKW angelegt
            {
              struct LKW *derLKW = malloc(sizeof(struct LKW));
    
              printf("Geben Sie eine LKWnummer ein: ");
              scanf("%i",&derLKW->iLKWnummer);
              fflush(stdin);
    
              printf("Geben Sie einen LKWnamen ein: ");
              scanf("%s",derLKW->sLKWname);
              fflush(stdin);
    
              LKWZaehler++;
    
              return;
            }
            else
            {
                int tempVorhanden;
                do
                {
                    int tempLKWnummer;
                    printf("Geben Sie eine nicht existierende LKWnummer ein: ");
                    scanf("%i",&tempLKWnummer);
                    fflush(stdin);
    
                    tempVorhanden = sucheLKW(tempLKWnummer);
    
                }while(tempVorhanden==0);
    
              printf("Die LKWnummer existierte bereits, daher muessen Sie nur noch den LKWnamen eingeben: \n");
    
              printf("Geben Sie einen LKWnamen ein: ");
              scanf("%s",derLKW->sLKWname);
              fflush(stdin);
    
              LKWZaehler++;
            }
      }
    
      int sucheLKW(int tempLKWnummer)
      {
          int i;
          int LKWVorhanden;
    
          for(i= 0; i <= LKWZaehler; i++)
          {
              if(derLKW[i].iLKWnummer == tempLKWnummer)
              {
                  LKWVorhanden = 1;
              }
              else
              {
                  LKWVorhanden = 0;
              }
          }
    
          return LKWVorhanden;
      }
    

    da ich net weiß wie mit dem debugger umgehen etc. habe ich mal vor die for-schleife und danach dies gesetzt:

    printf("Ich bin vor der for schleife");
    printf("Ich bin nach der for schleife");

    das vor wird ausgegeben, das danach nicht sprich mit dem Vergleich stimmt was nicht... 😕



  • Pelle schrieb:

    ...
    for(i= 0; i <= LKWZaehler; i++)
    {
       ...
    

    mach mal aus dem <= ein <
    so wie du's machst (ohne linklist) sollte es auch gehen.
    ansonsten: der vs-debugger ist einsame spitze! fummel mal damit rum. wenn du ihn kennst, dann wirst du ihn nicht mehr missen wollen.
    🙂



  • online-debugger schrieb:

    Pelle schrieb:

    ...
    for(i= 0; i <= LKWZaehler; i++)
    {
       ...
    

    mach mal aus dem <= ein <
    so wie du's machst (ohne linklist) sollte es auch gehen.
    ansonsten: der vs-debugger ist einsame spitze! fummel mal damit rum. wenn du ihn kennst, dann wirst du ihn nicht mehr missen wollen.
    🙂

    sorry hätte ich sagen sollen aber das "<" habe ich schon probiert macht kein unterschied. Ich mach mich jetzt an die linked list und habe da ne generelle FRage:

    Wenn das 1. Element in der linked list vom struct LKW ist z.B. und alle weitere elemente vom struct anhaenger/wagen benötige ich dann globale variable die z.B. zählt wieviele structs bzw. elemente es bereits gibt, was ich dann für die laufbedingung der for schleife nehmen um alle structs zu durchlaufen, um z.B. die Zugnummer zu finden damit LKW beim anlegen doppelt vergeben wird?

    Also ich krieg das große kotzen bei diesem Buch c von a bis c, hört euch mal das an:

    seite 675: "/ Wir reservieren Speicherplatz für unsere STruktur für das erste Element der Liste/"

    if((anfang = malloc(struct angestellt))) == NULL
    {
    printf("kein speicher vorhanden");
    return;
    }

    und dann folgt das kopieren der vorher eingegebenen werte in die Variablen des structs. Wo zum teufel wird hier speicher reserviert??? Das ist eine dumme abfrage sonst nichts 😡



  • Pelle schrieb:

    Wenn das 1. Element in der linked list vom struct LKW ist z.B. und alle weitere elemente vom struct anhaenger/wagen benötige ich dann globale variable die z.B. zählt wieviele structs bzw. elemente es bereits gibt, was ich dann für die laufbedingung der for schleife nehmen um alle structs zu durchlaufen, um z.B. die Zugnummer zu finden damit LKW beim anlegen doppelt vergeben wird?

    eigentlich nicht. bei listen hangelt man sich normalerweise durch bzw. man hat pointer auf den anfang und/oder das ende der liste. du kannst natürlich mitzählen, wenn du's unbedingt brauchst. übrigens, wenn du einen bewährten, universell einsetzbaren listencode suchst, dann such' mal hier im forum nach 'CONTAINING_RECORD'.
    🙂


Anmelden zum Antworten