Datalogilaboration 1 - Stjärnor

Den här labben måste göras på Nadas Unixdatorer. I fortsättningen får du gärna göra labbarna på din hemdator, men problem som då kan uppstå har lärarna inte möjlighet att lösa åt dej.

Läs kurssidan!

Vi kommer att använda webben för att sprida kursinformation. Kör igång webbläsaren Mozilla från programmenyn och surfa till kurssidan http://www.nada.kth.se/kurser/kth/2D1343/04-05/E/. Spara ett bokmärke så att du lättare hittar hit - här kommer nämligen all kursinformation att dyka upp.

Kösystemet Simamanager!

Den här delen av labben ska du endast göra när du befinner dig på Nadas datorsalar under en schemalagd laboration.
För en rättvis handledning och redovisning använder vi på den här kursen ett kösystem som heter SimaManager. Starta kösystemet genom att ange följande två kommandon:
datorn:~>module add sima
datorn:~>sm
Efter några sekunder öppnas ett litet fönster med en lista av kursnamn, välj datae från listan och tryck på loginknappen. Sedan kan du använda Queue/Remove för att köa och avköa.

Registrera dej!

Den här delen kommer du att kunna göra först på torsdag vecka 43.
Dina resultat kommer att bokföras i programmet res. Lärarna kan föra in resultat som behövs om kursen ska kunna godkännas. För att du ska komma med i databasen måste du registrera dig via kurssidan. Fyll i formuläret noggrant. Numret på övningsgruppen är inte så viktigt - man får ju byta under kursens gång. Registrera även labbkamraten.

Skapa kataloger för datalogi-labbar!

För ett strukturerad arbetssätt rekommenderar vi att du skapar en katalog för datalogi-filer och sedan ser du till att dina datalogi-filer hamnar där:
  1. Skapa en katalog med namnet datalogi i din hemkatalog.
  2. Skapa en katalog med namnet labbar i katalogen datalogi som du skapade nyss.
  3. Skapa en katalog med namnet labb1 i katalogen labbar.
  4. Du ska ge din labbkompis de rättigheter hon/han behöver för att kunna arbeta själv t.ex. när du har fått förhinder och inte kan närvara ett labbtillfälle. Du behöver bara ge rättigheter till katalogen labbar, de nya kataloger som skapas i katalogen labbar för att rättigheter från katalogen labbar kommer att kopieras till de nya kataloger.
(instruktioner om hur man gör ovanstående finns i introlabben)

Kör Pythonprogram

kontrollera att du kan köra senatse python versionen:
skriv python -V i ett terminal fönster
om du får annat meddelande än Python 2.3.3 då ska du göra följande:
Öppna filen .modules med emacs och lägg till texten module add python/latest i slutet av den och sedan logga ut och logga in igen då borde du ha rätt version av python. Detta behöver du göra en gång under hela datalogi kursen men vi rekommenderar att alla gruppmedlemmar ska göra det
Kopiera filen kulpython.py från kurskatalogen till katalogen labb1.

se till att aktuella katalogen är labb1.

ge kommandot

      python kulpython.py

Programmet går att köra och fungerar fast ger konstiga utskrifter när man matar in små tal.
Öppna filen med emacs och modifera koden så att det ger ett naturligt utskrift både vid små och stora tal som indata.
Vad är felet? Vad betyder indentering för python?

Sjutton stjärnor!

Skapa i emacs filen stars1.py med följande innehåll.
for i in range(17): 
    print"*",
print
Kör programmet med python stars1.py och kolla att sjutton stjärnor skrivs ut. Din uppgift är att lägga till en sats så att fyra sådana stjärnrader skrivs!

Hur långa stjärnrader du vill!

Skapa en kopia av filen stars1.py och döp kopian till stars2.py. Nu ska du modifiera koden i stars2.py på följande sätt: Talet 17 ersätts av en variabel t.ex. n och n initieras under körningen genom en inmatning från tangentbordet, använd n=input() för att läsa in heltal. Vi vet att saker som inte har definierats får inte användas, frågan är nu i vilken rad skulle koden n=input() skrivas?

Vid körningen händer ingenting förrän man matar in ett tal och trycker retur. Om inläsningssatsen placerats före fyravarvsslingan får man då fyra likadana stjärnrader. Med inläsningen inne i slingan blir det intressantare. Man kan då skriva in fyra olika tal och får fyra olika stjärnrader. Pröva båda.

(Om det inte vill fungera: kontrollera att fyravarvsslingan innehåller både inläsning och utskrift. Indentering är viktigt!)

Hur många stjärnrader du vill!

Skapa en kopia av filen stars2.py och döp kopian till stars3.py där fyravarvsslingan bytts mot en som går oändligt många varv. Här ska du använda dig av while, men vad ska villkoret vara? Provkör med flera tal på samma rad. Pröva tal som 0 och -17. Vad händer om man skriver bokstäver?


En användarvänlig version!

Nu ska vi skriva ett mer användarvänlig program. Vi ska ändra programmet så att programmet börjar med att informera användaren med texten mata in ett heltal följd av enter, för att avsluta tryck Ctrl-D(Ctrl-Z+Enter om du sitter vid en windowsmaskin): .
Alltså om användaren vill avsluta programmet så ska hon/han hålla ner kontrollknappen på tangentbordet och trycka på knappen D (Ctrl-D).
Du funderar säkert "varför just Ctrl-D?" ju för att Ctrl-D i unix generar filsluttecknet som egentligen signalerar till programmet om att sluta vänta på indata och fortsätt med resten av programmet.
Då kan man fråga sig vad har filslut med tangentbord att göra, de är ju två olika saker? Svaret är nej, för oss kanske känns de som två olika saker men för datorn är varje indatakälla (t.ex. cd-läsaren, diskettläsaren, tangentbordet osv) en fil och just därför är ett filslut-tecken en signal på att inga fler tecken kommer att komma från indatakällan, oavsett om källan är tangentbordet eller någon annan enhet.
Motsvarande tecken genereras i ett windows-system genom att hålla ned kontrollknappen och trycka på knappen Z på tangetbordet och där efter trycka på enter alltså (Ctrl-Z) + Enter.
Nu när vi vet om detta så kan vi fortsätta implementera.
Skapa en kopia av filen stars3.py och döp kopian till stars4.py. Försök att köra programmet och ange Ctrl-D (Ctrl-Z+Enter om du stter vid ett windows system) vid inmatningen, vad är det som händer? Den säger något om EOFerror (end-of-file error) och input(). Felet beror på funktionen input() som endast kan läsa in tal och EOF är ju inte ett tal.
För att lösa problemet byter vi ut input() mot sys.stdin.readline() som klarar av att läsa icke tal. För att kunna använda sys.stdin.readline() måste vi importera sys i början av filen så låt import sys stå i första raden på filen.
Med tanke på att funktionen sys.stdin.readline() kommer att returnera en sträng kommer variabeln n få en sträng som värde och därmed kommer vi att få ett problem längre ner i koden där det står range(n) i for-slingan, funktionen range() accepterar endast tal som parameter och inte strängar, alltså värdet på variabeln n måste omvandlas till ett tal.
Då måste vi omvandla strängen till ett tal och detta gör man med funktionen int(), alltså ersätt range(n) med range(int(n)).
Är vi klara, tror vi? har vi tänkt på allting nu? vi ska se.
Kör programmet en gång och mata in Ctrl-D (Ctrl-Z+Enter om du sitter vid en windows system). Det verkar inte fungera än, felmeddelandet säger att det är felaktig värde på parametern för int(). Låt se, den inparameter som används i int() är ju variabeln n. Vilka värde kan n få från inläsningen från tangetbordet?
n kan få ett värde som är:
  1. En sträng som går att omvandla till ett tal, då man matar in 1 ,2 eller 4711 osv.
  2. En sträng som inte går att omvandla till ett tal, då man matar in t.ex. två, five, nada, E1 osv.
  3. En tom sträng "" (alltså två citat tecken), då man trycker på Ctrl-D.

Fall 2 är helt ointressant för oss nu, då vi vet att användaren inte är dum och inte matar in strängar som inte går omvandla till tal.
Vid fall 1 genereras inga fel, då fokuserar vi på fall 3 alltså vid filslut som inmatning, Vi måste på något sätt hindra programmet att exekvera raden som innehåller range(n) för att det är då det blir fel.
Här nedan följer en algoritm för programmet, din uppgift är att översätta beskrivningen till Python kod som ska kunna köras. De delar av algoritmen som ska översättas är fet och kursiv stil och resten har du redan i stars4.py:
1.  Gör följande för alltid
   1.1.  läs in en rad från tangentbordet och lagra resultatet i variabeln n
   1.2.  om n är en tom sträng avbryt slingan, annars gå till punkt 1.3 istället
   1.3   skriv lika många stjärnor som värdet på variabeln n på skärmen.


Skriv FEL så får du rätt!

Med lämpligt valda tal kan man få stars4.py att skriva FEL med stjärnor.
*****
*
***
*
*

*****
*
***
*
*****

*
*
*
*
*****
Skriv i emacs en datafil feldata med dessa sjutton tal på var sin rad alltså med radbyte direkt efter varje tal. En finess är att man kan få programmet att läsa från en datafil i stället för från tangenterna på följande enkla sätt.
   python stars4.py < feldata

När man använder funktionen print så får man ett mellanslag efter varje sjtärna, för att undvika mellanslaget för ett fin utskrift kan man skriva sys.stdout.softspace=False efter varje funktion print
Om FEL skrivs på skärmen är det rätt. Försök till sist få underskrift av en lärare.

Väl labbat av ......................................... medger.............................. den .................


^ Upp till kurssidan.


Sidansvarig: <vahid@nada.kth.se>
Senast ändrad 20 oktober 2004
Tekniskt stöd: <webmaster@nada.kth.se>