Uppgift 1 (Oläsliga krypterade meddelanden) Ofta vill man kryptera text för att inte andra skall se vad man skrivit. I den givna filen KRYPTERAD_TEXT.TXT finns en krypterad text som kan vara av intresse för dig. Detta är inte en filhanteringsuppgift i egentlig mening utan din uppgift är att skriva två program som utför kryptering respektive dekryptering av indata som kommer via tangentbordet i båda fallen. Utskrifterna skall dessutom skrivas på skärmen i båda programmen. Program nummer 1: Dekrypteringsprogrammet som här skall tillverkas skall läsa ett antal rader med text från tangentbordet och sen skriva ut på skärmen det meddelande som dolde sig. Varje rad som matas in motsvarar ett tecken i utskriften. Tecknet som skall skrivas ut beror enbart på hur många blanktecken det finns på den inlästa raden. Om det är 10 blanktecken på raden skall tecknet med ordningsnumret (kallas ibland ASCIIvärdet) 10 skrivas ut (detta råkar vara tecknet NL som motsvarar nyradstecknet i Unix). Om det är 32 blanktecken motsvarar det ett blanktecken (SPACE) och är det 65 blanktecken på raden skall man skriva ut tecknet A. Detta program är lämpligt att starta med. Det finns som sagt en krypterad text i filen KRYPTERAD_TEXT.TXT och du kan använda denna textmängd genom att köra ditt program på följande sätt (antag att ditt program heter from_white_space ): from_white_space < KRYPTERAD_TEXT.TXT Program nummer 2: Krypteringsprogrammet skall göra det omvända mot program nummer 1. Du skall alltså läsa in en text (som avslutas med Ctrl-D på vårt system) och omvandla alla tecken till rader som innehåller rätt antal blanktecken. OBS! Vissa tecken kan man inte läsa med en vanlig Get-sats för Character så det enda specialtecken vi kommer att ta hand om (eller som vi har krav på från er) är radslutstecknet (NL). Detta kan inte läsas av Get och du får behandla detta separat. När du har båda programmen klara skall följande kunna fungera (antar att ditt andra program heter to_white_space ): to_white_space from_white_space Inmatningen sker då till programmet to_white_space och sen vidarebefordras all utdata från detta program till programmet from_white_space så att detta tar det som indata. Utskriften från from_white_space skrivs sen på skärmen. TIPS: Alla kanske inte har gjort detta med omvanling av tecken till ordningsnummer och vice versa. För säkerhets skull ger jag lite tips här: Omvandling mellan ordningsnummer och tecken sker med Character Val(ordningsnummer) och omvandling åt andra hållet sker med Character Pos(tecken).
Uppgift 2 (Balanserade parenteser) Skriv ett program som kontrollerar om en inmatad text innehåller parentespar som är balanserade. De parentespar som kan ingå är ( - ), [ - ] och { - }. Man kan tänka sig att det är enklare att lösa denna uppgift med hjälp av rekursion (till viss del) än med iteration helt och hållet (bara loopar), men din uppgift är att lösa detta iterativt. Ingen rekursion är tillåten. Till din hjälp kan det vara bra att ha ett fält där du lagrar de startparenteser du finner (inget krav, men ett tips). Vi kan anta att det inte finns mer är 1000 nivåer av parenteser i textmassan (man kan tänka sig att det är ett Lisp-program som är indata (där finns det många parenteser (som behöver kontrolleras))). :-) KRAV: Du får inte lagra hela texten i ditt program. Du måste beta av texten tecken för tecken. Tänk på att man inte får läsa "radslutstecknet" med en Get för Character. Om det är så att texten är balanserad (att parenteserna ligger rätt) skall utskriften "ALLT OK" skrivas ut. Om det är något fel (att det saknas parenteser eller att de ligger i fel ordning) skall texten "MINST ETT FEL" skrivas ut. Körexempel 1: Denna text (som innehåller { och } samt [ och ]) är helt ok. Man kan se att man kan ha parenteser på olika rader (som detta exempel (som också har parenteser av samma sort inuti varandra)).* ALLT OK Denna gång finns det parenteser som inte är matchade i antal (som denna.* MINST ETT FEL Körexempel 3: Denna gång är det rätt antal parenteser, men de är inte matchade i rätt ordning. Som här ( ABC [ DEF ) GHI ]* MINST ETT FEL
Uppgift 3 (Rotera med rekursion) Du skall skriva ett program som vrider en figur 180 grader motsols. Figuren innehåller endast blanktecken och snedstreck (både / och \ ). Det är givet att användaren startar programmet och som kommandoradsargument skickar hen storleken på figuren (i antal tecken). Det är givet att figuren alltid är kvadratisk. När programmet är startat skall användaren mata in figuren. KRAV: Du får inte använda dig av loopar (for, while, loop) i denna uppgift. Använd rekursion istället. TIPS: Om man läser den första figuren baklänges får man den andra figuren. Intressant. Körexempel 1 ( > i början av raden markerar bara kommandoraden i Unix): > rotate_180 4 Mata in figuren (OBS! måste vara 4 tecken per rad): / / \ \ Figuren blir efter rotation: \ \ / / > rotate_180 8 Mata in figuren (OBS! måste vara 8 tecken per rad): / \ / / / / \ \ \ \ \ / Figuren blir efter rotation: / \ \ \ \ \ / / / / \ /
Uppgift 4 (Kursmail! Eller spam?) När det gäller mailhantering är det mängder med mail som hanteras av oss som kursledare/ examinatorer. För att belysa detta lite kan man se på 5 års mailskörd gällande en av våra kurser (TDDD11). I kursen går det normalt sett ca 220-240 studenter per år. År 2011 hölls kursen för två årskullar då kursen flyttades ned i årskurs. Vi har normalt sett flera kurser och ävan andra uppdrag så det ger endast en liten bild av verkligheten. Vad innebär detta i antal mail kan man då undra? Om man räknar ALLA mail som har med kursen att göra. Allt ifrån schemaläggningssaker, kursmöten, administrativa saker som bollas mellan institutionen och andra delar av universitet och dessutom de mail som kommer från studenter eller skickas från oss i kursen till er är det en hel del. Om vi begränsar oss till de mail som kommer till eller skickas från den som är kursledare/examinator blir det lite mindre. På filerna MAIL.TDDD11."årtal" som finns givna i mappen "given_files" ligger en sammanställning av de mail som hade med kursen TDDD11 att göra under de årtal som ingår i filnamnen. Det är givetvis borttaget information om vem som skickat saker till examinatorn för att inte dessa personer skall känna att de blir utpekade. Din uppgift är att skriva ett program som läser data från den fil som användaren anger (årtalet matas in från tangentbordet) och sen skriver ut antalet mail som skickades av personer till examinatorn, från LiU-adresser respektive från icke LiU-adresser, uppdelat på månader under året. De mail som skickats av "torjo" skall alltså inte räknas. Programmet skall också skriva ut hur många mail det var totalt detta år. TIPS: Öppna filerna i Emacs för att se hur formatet ser ut på raderna. Varje rad motsvarar ett mail. Körexempel: Mata in årtal: 2008 Det var totalt 793 mail gällande denna kurs detta år. Månad Totalt LiU EJ LiU -- 01 62 38 24 02 27 17 10 03 119 90 29 04 77 54 23 05 70 57 13 06 30 17 13 07 1 0 1 08 37 24 13 09 14 11 3 10 3 3 0 11 8 6 2 12 10 7 3 -- 2008 458 324 134
Uppgift 1 (Specialstjärna) Skriv ett program som ritar ut följande specialstjärna (se körexemplen). Det är givet att vi kommer att testa med många olika storlekar (inte bara dem som syns i uppgiften). Skriv därför ditt program så att det klarar av att skala upp även till större stjärnor. Körexempel 1: Mata in storlek: 1 17 \ / -*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*--*- / \ Mata in storlek: 2 1 \ / \ / --*-- / \ / \ Körexempel 4: Mata in storlek: 4 2 \ / \ / \ / \ / \ / \ / \ / -*--*- / \ / \ / \ / \ / \ / \ / \ Körexempel 5: Mata in storlek: 5 4 \ / \ / \ / \ / \ / --*-*-*-*-- / \ / \ / \ / \ / \