Løbeseddel 2: Programmering med Tcl

for Databasestøttet Webpublicering

af Martin Elsman og Niels Hallenberg sidst rettet 15. februar, 2002


I denne øvelse introduceres du til programmeringssproget Tcl med det formål at benytte sproget til web-programmering. Til brug ved øvelsen skal du have installeret en Tcl fortolker. Hvis du sidder på IT-C kan du starte Cygwin, dvs vælge "start" "Programs" "Cygnus Solutions" "Cygwin B20" - så får du en shell op. For at starte en Tcl session skal du skrive "itcl_sh" - så¨kommer % tegnet frem og man kan begynde at indtaste Tcl kommandoer, inklusive source.

Inden du starter på øvelsen er det hensigtsmæssigt at du læser noten A Smooth Introduction to Tcl for Web Nerds og prøver at køre eksemplerne i noten. Øvelsen består af fem opgaver.

Ved gradueringen lægges der bl.a. vægt på:

Hvis du mangler træning i løkker og procedurer, så kan du kigge på ekstra opgaverne til denne uge. Opgaverne øver procedurer og løkker.

Opgave A (20 procent) - Tcl Programmering

  1. Konstruer et program i filen while.tcl, som når det udføres med source udskriver
    % source while.tcl
    3
    6
    9
    12
    15
    18
    21
    24
    27
    Efter løkken er i 30
    
    på skærmen. Programmet skal konstrueres ved hjælp af en while løkke, hvor variablen i anvendes som tæller; du kan f.eks. anvende følgende skabelon:
    set i ...
    while { ........ } {
      puts "$i"
      ...
    }
    puts "Efter løkken er i $i"
    
    Kopier besvarelsen til hug.it.edu som /web/login/www/oevelse2/while.tcl - herved bliver filen tilgængelig for de kursusansvarlige til retning. Bemærk at biblioteket /web/login/www/oevelse2/ allerede er blevet oprettet; det er meget vigtigt at besvarelserne på opgavene i øvelse 2 bliver kopieret til dette bibliotek!

  2. Lav et program i filen ugedag.tcl, som indeholder en procedure ugedag, som tager et heltal dg som argument og returnerer den ugedag som svarer til dg. Tabellen
    dgreturværdi
    1Mandag
    2Tirsdag
    3Onsdag
    4Torsdag
    5Fredag
    6Lørdag
    7Søndag
    alle andre talUkendt dag
    angiver hvilke ugedage dg svarer til. Hvis dg er mindre end 1 eller større end 7, så returneres "Ukendt dag". Du kan anvende følgende skabelon:
    proc ugedag { dg } {
      if {$dg == 1} {
        return "Mandag"
      } elseif {$dg == 2} {
        return "Tirsdag"
      } ...
    
      } else {
        return "Ukendt dag"
      }
    }
    
    # Test af ugedag
    set i 0
    while {$i < 9} {
      puts [ugedag $i]
      incr i
    }
    
    Her er uddata ved kørsel af den vejlende løsning:
    % source ugedag.tcl
    Ukendt dag
    Mandag
    Tirsdag
    Onsdag
    Torsdag
    Fredag
    Lørdag
    Søndag
    Ukendt dag
    % 
    
    Kopier besvarelsen til hug.it.edu som /web/login/www/oevelse2/ugedag.tcl.

Opgave B (10 procent) - Multiplikationstabel

Skriv en procedure multabel som givet et tal udskriver en multiplikationstabel for dette tal. Skriv din procedure i en fil multabel.tcl, således at du kan bruge Tcl-kommandoen source til at hente proceduren ind i Tcl-fortolkeren, når denne startes. Det skal altså være muligt at skrive følgende, når Tcl-fortolkeren startes:
% source multabel.tcl
% multabel 3
0 times 3 is 0
1 times 3 is 3
2 times 3 is 6
3 times 3 is 9
4 times 3 is 12
5 times 3 is 15
6 times 3 is 18
7 times 3 is 21
8 times 3 is 24
9 times 3 is 27
Kopier besvarelsen til hug.it.edu som /web/login/www/oevelse2/multabel.tcl.

Opgave C (10 procent) - Omvendt multiplikationstabel

Tilret løsningen til Opgave B således at multipliktionstabellen udskrives i omvendt rækkefølge:
% source multabel2.tcl
% multabel2 3
9 times 3 is 27
8 times 3 is 24
7 times 3 is 21
6 times 3 is 18
5 times 3 is 15
4 times 3 is 12
3 times 3 is 9
2 times 3 is 6
1 times 3 is 3
0 times 3 is 0
Kopier besvarelsen til hug.it.edu som /web/login/www/oevelse2/multabel2.tcl.

Opgave D (20 procent) - Hjemmeside-generering

I denne opgave skal du skrive en procedure homepage, som kan generere en standard HTML-hjemmeside. Proceduren skal tage to argumenter, et navn og en email adresse. Argumenterne skal indgå i den genererede hjemmeside (du bestemmer selv det præcise layout af siden):
  % source homepage.tcl
  % homepage "Niels Hallenberg" "nh@itu.dk"
  <html>
  ...
  </html>
I ovenstående brug af proceduren homepage er strengene "Niels Hallenberg" og "nh@it.edu" aktuelle argumenter til proceduren.

Kopier din besvarelse til hug.it.edu som /web/login/www/oevelse2/homepage.tcl.

Hint: Du kan f.eks. overveje at benytte <address> til at "underskrive" siden, således at man kan se hvem man skal kontakte, hvis der er noget som ikke virker. Derudover bør du sikre, at hvis man bogmærker siden, så vil man få et sigende navn som bogmærke. Du bør også sikre, at man kan linke tilbage til din indeks-side.

Opgave E (20 procent) - Multiplikationstabel i HTML

I denne opgave skal du tilrette løsningen til Opgave B således at multipliktionstabellen udskrives som en HTML-tabel med 10 rækker og tre kolonner. Proceduren skal altså nu generere HTML-kode. Hvis uddata fra proceduren indsættes i en HTML-side skal siden se således ud i en browser:

ABA times B
030
133
236
339
4312
5315
6318
7321
8324
9327

Besvarelsen kopieres til hug.it.edu som /web/login/www/oevelse2/multabel3.tcl.

Du skal nu tilrette besvarelsen således at proceduren ikke udskriver tabellen med puts kommandoen, men istedet returnerer tabellen som en lang streng. Kald den nye procedure multabel4. For at løse opgaven er det nødvendigt at bruge append kommandoen til at opsamle resultatet, som tilslut i proceduren skal returneres med kommandoen return. Endelig skal du kopiere denne besvarelse til hug.it.edu som /web/login/www/oevelse2/multabel4.tcl.

Opgave F (20 procent) - Temperaturberegning

I USA måles temperatur typisk i grader Fahrenheit. Givet en temperatur i grader Fahrenheit (tempf) beregnes temperaturen i grader Celcius (tempc) som følger:

tempc = 5.0/9.0 * (tempf - 32.0)

Hvis temperaturen i Fahrenheit er 68 grader er temperatuen i grader Celcius altså 5.0/9.0 * (68.0 - 32.0) = 0.555556 * 36.0 = 20.0.

Skriv en procedure tempf_to_tempc, som tager som argument en temperatur i grader Fahrenheit og returnerer temperaturen i grader Celcius. Skriv proceduren i en fil temperatur.tcl:

  %source temperatur.tcl
  %tempf_to_tempc 68
  20.0
Kopier besvarelsen til hug.it.edu som /web/login/www/oevelse2/temperatur.tcl.

Hint:Du skal anvende kommandoen expr for at beregne temperaturen.


mael@it.edu, nh@it.edu