Göm menyn

Labb 7 - Läsa och skriva till/från fil

Labbens syfte

  • Använda den abstrakta datatyp för grafer som ni skapat
  • Läsa och skriva data till fil
  • Textbaserat gränssnitt

Att skicka in

Filen med er kod för labb 7, samt filen graph.py som ni använder i labb 7 skickas in till er labbhandledare enligt samma procedur som tidigare labbar.

Ett litet textgränssnitt för att mata in grafer

I denna deluppgift ska ni lägga till ett text-gränssnitt för att kunna skapa grafer. Här är ett exempel på hur en körning kan se ut:

Skriv 'ny' för att skapa en ny graf.
Skriv 'lista' för att visa grafer i minnet.
Skriv 'ladda' för att ladda en graf från fil.
Skriv 'spara' för att spara grafer i minnet till fil.
> ny

Välj namn på grafen
> g1

Skriv in namn på hörnen i grafen åtskilda med ett mellanslag
> a1 a2 a3

Lägg till en kant. Skriv namn på kant följt av två hörn. Lämna tomt för att gå vidare
> e1 a1 a2

Lägg till en kant. Skriv namn på kant följt av två hörn. Lämna tomt för att gå vidare
>

Använd de abstrakta datatyper du skapat i labb 6 i denna labb. Kopiera din kodfil från labb 6 till samma katalog som din kodfil för labb 7 ligger i och döp om den till graph.py. Ladda in dem genom att använda import kommandot. Mer info om moduler: föreläsning 7, men även t.ex. Modular Programming and Modules och Modules and Packages).

En interaktionsloop

Definiera en funktion som heter main(). Den funktionen anropar ni sedan på längst ner i er kod. När ni laddar in koden i ipython med %run -i namnpåerfil.py kommer main() att köras automatiskt. Se till att main innehåller dels deklaration av ett dictionary som ni sparar era grafer i, samt interaktionsloopen. Nedan följer pseudokod till funktionen main().

def main():
    sätt varibeln graphs till ett tomt dictionary

    loopa nedanstående till användaren skriver 'avsluta'
        1. skriv ut möjliga kommandon och fråga efter ett kommando
        2. om kommandot är lista, anropa list_graphs(graphs)
        3. om kommandot är ny, anropa new_graph(graphs)
        4. om kommandot är ladda, anropa load_graphs() och sätt graphs till det som load_graph returnerar.
        5. om kommandot är spara, anropa save_graphs(graphs)
        6. om inget kommando känns igen, skriv ut felmeddelande och börja om på 1.

Låt dictionaryt graphs använda namn (strängar) på grafer som nycklar och hela grafstrukturen som värde.

Funktionerna list_graphs(graphs), new_graph(graphs), load_graphs() och save_graphs() skriver ni själva. Se exempelkörningen ovan.

  • list_graphs(graphs), tar in dictionaryt med era grafer och skriva ut dem på ett prydligt sätt
  • new_graph(graphs), tar in dictionaryt med era grafer och ber användaren knappa in information om den nya grafen. den nya grafen läggs sedan in i graphs.
  • load_graphs(), frågar användaren efter ett filnamn och laddar in grafer från den filen. load_graph() skapar ett dictionary som innehåller alla grafer den laddar in och returnerar det. Vänta med att implementera funktionaliteten i denna funktion till efter att text-gränssnittet är klart.
  • save_graphs(graphs), frågar användaren efter ett filnamn och sparar graferna i graphs till den filen. Vänta med att implementera funktionaliteten i denna funktion till efter att text-gränssnittet är klart.

Felhantering

I denna labb behöver ni inte implementera någon felhantering av input från användaren. Det gör vi i nästa labb. Rätt inmatad text från användaren ska inte krascha programmet dock.

Spara data till fil

Nu är det dags att implementera save_graphs(). För att kunna spara en datastruktur till en fil, måste man ha definierat en struktur för hur man ska lagra datastrukturen. För denna labb finns strukturen definierad i förväg.

Filformat

Information om grafer i denna labb sparar vi i en textfil enligt följande format:

  • Varje graf representeras av tre rader i textfilen. Två grafer representeras alltså som 6 rader i textfilen.
  • Vår grafstruktur är en lista med tre element. första elementet finns på första raden, det andra, på andra raden och det tredje på den tredje raden.
  • Hörnen och kanterna har två element vardera. Vi skiljer ett hörn från ett annat med ett semikolontecken. Elementen i varje hörn och kant skiljs åt av ett kommatecken.
  • När det kommer till vårt dictionary, skiljer vi varje nyckel-värdepar åt med ett semikolon.
  • Vi representerar sedan data för varje nyckel-värdepar genom att använda namn på hörnet följt av namn på kanter.

Nedan finner ni innehållet i en fil som innehåller graferna från labb 6.

a1,0;a2,0;a3,0
q1,0;q2,0
a1,q1,q2;a2,q1;a3,q2
a1,0;a2,0;a3,0
q1,0
a1,q1
a1,0;a2,0;a3,0;a4,0
q1,0;q2,0,q3,0;q4,0
a1,q1,q2,q3;a2,q1,q4;a3,q2;a4,q3,q4

Ladda data från fil

Nu är det dags att implementera load_graphs(). Funktionen ska fråga efter användaren efter ett filnamn, och sedan returnera ett komplett dictionary som innehåller alla grafer som skapats. Här kan du använda de hjälpfunktioner du definerat i labb 6 för att skapa datastrukturen.

Ladda in en rad i taget och håll koll på vilken radnummer det är. Kom ihåg att du kan använda modulo-operatorn. 1%3 ger 1, 1%2 ger 2, 3%3 ger 0, 4%3 ger 1 osv.


Sidansvarig: Jody Foo
Senast uppdaterad: 2014-11-27