SKRIFTLIGE HJEMMEOPGAVER KOMMUNIKATION OG IT



Relaterede dokumenter
SKRIFTLIGE HJEMMEOPGAVER KOMMUNIKATION OG IT

SKRIFTLIGE HJEMMEOPGAVER KOMMUNIKATION OG IT

ASB signatur. ASB signatur. Vejledning til opsætning af signatur IKT - Februar 2008

Grafisk workflow. Se siden her:

Quick guide til e-learn.sdu.dk (Blackboard) for studerende

Tillykke Med Fødselsdagen

Udbud.dk Brugervejledning til leverandører

Google Chrome side 1 af13

Vejledningtiladministratorbrugerfladen

Sådan opretter du en elektronisk aflevering

Brugermanual til Wordpress 3.2.x Content Management System

FSFI s guide til DFR s elektronisk bevissystem

Netværk & elektronik

Studerendes video- optagelser til prøver

Brugervejledning til udfyldelse og udstedelse af Europass Mobilitetsbevis i Europass Mobilitetsdatabasen

Om styles / typografier / typografiark / stylesheets

Leif Smidt GODT IGANG MED IPAD - IOS 9

OPBYGNING AF INSTRUMENTER. Online Designeren Record ID Felttyper Validering og variabelnavne

Nyhedsmodul brugermanual

DK - Quick Text Translation. HEYYER Net Promoter System Magento extension

VægtAgenten Betjeningsvejledning Version 3.0

QUICKGUIDE TIL XMEDIA

Digitale uddannelsesaftaler. Vejledning til virksomhed

Quick guide - WISEflow

Der findes mange ting på nettet, som du kan hente ned på din computer bl.a. billeder, tekstdokumenter og installationsfiler til programmer.

StarWars-videointro. Start din video på den nørdede måde! Version: August 2012

Help / Hjælp

Pralemappen.dk Din online portfolio Brugerhåndbog til undervisere Brugerhåndbog til undervisere

Opgavestyring i Elevplan Vejledning. Pædagogisk IT kørekort Mentorforløb

Søren Christiansen

Velkommen til IT for let øvede

KUNDEVEJLEDNING APRIL 2014

Betjeningsvejledning. for. UniRace

KEMIguiden Vejledning. Rev. udgave april 2010

MANUAL AF FILIP WALLBERG & RUNE MICHELSEN

RUTruteplanlægningsvejledning. Folkekirkens Nødhjælp Sogneindsamling 2015

Denne rapport er skrevet af:

Vejledning til CVRselvbetjeningsløsning

Instagrammanual til frivillige i Mødrehjælpen

Introduktion til billedbehandling med IrfanView

Servicebrev BørneIntra 2.14 (Web og App)

VELKOMMEN TIL PHOTO STORY FOR WINDOWS

Bruger Manual For WT-215W WIFI relæ

AROS Å R H U S K U N S T M U S E U M

Opstart og adgange til Ejersiden

Brugervejledning til DHF's onlinesystem

Lav en hjemme side der kan sælge fly billetter til en stor i Europa.

Indholdsfortegnelse. Indholdsfortegnelse.. side 2. Adgang til webgraf 3. Opslag adresse Styring af layout.. 5. Zoom funktioner..

Vejledning til det digitale eksamenssystem. Heilesen, Simon. Publication date: Document Version Peer-review version

Opsætning af Backup. Hvis programmet registreres korrekt vises nedenstående skærmbillede. Genstart herefter programmet.

Opret og godkend betalinger i mapper

Kom godt i gang med OneDrive

Administration - Wordpress Administration - Wordpress

Afhold team-webinars og styrk dit team.

Tabulex Daginstitution Børn

BRUGERMANUAL. Ruteplanlægning i RUT. Røde Korsindsamlingen 8. MARTS RødeKors.dk

Manual til Vandværksløsninger

Portal Registration. Check Junk Mail for activation . 1 Click the hyperlink to take you back to the portal to confirm your registration

Udskrivning og sletning af tilbageholdte job Genkendelse af formateringsfejl Kontrol af udskriftsjob Reservation af udskriftsjob

Netprøver.dk. Brugervejledning til Eksamensansvarlige

Sitecore - basisvejledning Version 2. September 2010

Weblayout til Pisiffik 2011

Lectio. Overgang til Lectio Eksamensmodul. MaCom A/S Vesterbrogade 48, København V Telefon:

Brug Photo Story 3 en let introduktion

Bruger (kursist/deltager) Kom godt i gang med plan2learn. Version 0.01 Versionslog: 0.01

Brugervejledning til InfoLand.dk skabelonen

Nyhedsbreve - brugerdokumentation

Indholdsfortegnelse. Indhold

Modul 1 Skolens netværk, skema og kommunikation i Lectio Efter gennemgangen af dette modul skal du:

Linket viser jer frem til billedet nedenfor, her skal du blot skrive jeres brugernavn og adgangskode. Indtast din adgangskode her:

Tastevejledning Windows XP

SPSS introduktion Om at komme igang 1

Sådan opsætter du produkter i med henblik på online salg via Websuite eller Compubook. Manual version 3.0

WORKFLOW & PRODUKTION

Guide til din private side på Netstambogen

Løsning af skyline-problemet

BRUGER KURSUS RAMBØLL HJEMMESIDE

Webside score templatedownload.org

Indledning. MIO er optimeret til Internet Explorer. Læs endvidere under Ofte stillede spørgsmål.

PSYKIATRIENS VIKARCENTER. MinTid. Quickguide. Version 7.0

Introduktion. Unifaun Online

I denne manual kan du finde en hurtig introduktion til hvordan du:

DPSD undervisning. Vejledning til rapport og plan opsætning

PSYKIATRIENS VIKARCENTER. MinTid. Quickguide. Version 6.0

Bolig OMK budget Tips og tricks til ny OMK-skabelon

Manual og Hjælp Skoletasken 2

I NV4000 Som broderimaskine.

Interaktionsudvikling

Manual Serif Web & Tableau Public

JAR nyhedsbrev fra Region Nordjylland

Aalborg Universitet. Økonomisk ulighed og selvværd Hansen, Claus Dalsgaard. Publication date: 2011

GIS. Guide til indlæsning af data i ArcGIS herunder KMS-data fra internettet

Manual for installation og brug af Ad-aware version 2007

Projekt-studieweb. Om kommunikationsteorierne. Morten, Jacob, Kristian og Cihat

IT vejledning i MUS for ledere

Brugermanual PoP3 og Outlook Office 2003 Webmail Udarbejdet af IT-afdelingen 2005

Opsætning af Backup. Dette er en guide til opsætning af backup med Octopus File Synchronizer.

RefWorks Workshop Medicinsk Bibliotek Aalborg Universitetshospital. Oprettelse af konto/log in RefWorks-databasen... 2

Transkript:

SKRIFTLIGE HJEMMEOPGAVER KOMMUNIKATION OG IT Afleveringsdato Torsdag d 10/1 2013 Eksamen Grundlæggende datalogi, vinter 2012/2013 Fagelementkode 47810002-01 Eksaminandens fulde navn XXX KU- mail XXX Eksaminator XXX Eksamensform (kryds af) Individuel prøve Gruppeprøve X Deltagere i gruppen (navne og KU- mails) XXX

Indholdsfortegnelse FORORD OG INDLEDNING BAGGRUND OG PROBLEMFORMULERING PROBLEMANALYSE BRUGERVEJLEDNING TEKNISK BESKRIVELSE AF PROGRAMMET AFPRØVNING KONKLUSION BAGGRUND OG PROBLEMFORMULERING PROBLEMANALYSE BRUGERVEJLEDNING TEKNISK BESKRIVELSE AFPRØVNING KONKLUSION BAGGRUND OG PROBLEMSTILLING: PROBLEMANALYSE: KONKLUSION: KILDEHENVISNINGER BILAG: AFPRØVNINGSDATA, PROGRAMTEKST, SKÆRMBILLEDER OG LIGNENDE 3 3 5 6 7 9 10 11 12 13 14 16 18 18 19 20 20 21

Forord og indledning Følgende opgave er udarbejdet i januar 2013, af følgende personer: XXX, under en ugens eksamen i grundlæggende datalogi på Københavns Universitet. Opgave 2: Under eksamen udviklede vi et Jython program, som havde til formål at generere et 219px x 207px billede ud fra 27 tilfældige ansigtsdele. Programmet skulle ved at anvende 9 ansigtsdele fra tre selvvalgte personer, skabe et ansigt hvoraf de forskellige ansigtsdele indgik. Endvidere skulle programmet tilfældigt vælge mindst et billede fra en kvindelig Turing Awardprisvinder, så af den grund valgte vi at inddrage en kvinde og to mænd. Hver gang vores program kørte skulle det skabe et nyt tilfældigt billede, samt en tekststreng som fortalte hvilke prisvindere der var blevet brugt til at skabe billedet. () Opgave 4: Vi har ydermere skrevet en HTML-kode i Python for den fiktive virksomhed Olives R Us. Hjemmesiden vi har lavet, havde til mål at være et online community omkring olivenolie. Meningen var, at man skulle kunne læse om og anmelde forskellige olivenolier, samt en administratorside, hvor gamle olivenolierne kunne fjernes, mens nye kunne tilføjes. () Opgave 1: Til sidst har vi med opgave 1 haft enormt svært ved at komme med en løsning på hvordan opgaven skal udarbejdes, opgaven skulle være et input til et program som var en tekst-fil (.txt). Her skulle vi lave program over et socialt netværk hvor en person kunne have et forhold til en anden person, i mens at han hadede en anden person. Baggrund og Problemformulering Opgave 2:

Vores program er blevet udarbejdet ud fra en problemformulering med følgende baggrund: 1 Den mest prestigefulde pris udelt af Association for Computing Machinery (ACM) er A.M. Turing Award (sommetider kaldet Nobelprisen for Datalogi ). Den bliver givet for store og langtidsholdbare bidrag til Datalogien. Listen over alle prisvindere kan findes på følgende URL: http://amturing.acm.org/byyear.cfm. Ved at klikke på hvert navn kan I finde et foto (219px 207px) af hver prisvinder. Følgende er problemstilling til opgaven, og her: 2 Skriv et program der skaber og returnerer et billede af et ansigt under følgende krav: Hver af følgende ni ansigtsdele skal vælges tilfældigt fra forskellige billeder af Turing Award-prisvindere. Det vil sige, at der skal bruges mindst ni forskellige billeder til at skabe et enkelt ansigt. 1. venstre øje 2. højre øje 3. venstre øjebryn 4. højre øjebryn 5. næse 6. mund (og evt. tænder) 7. venstre øre 8. højre øre 9. hår (eller mangel på samme) 1 exam- e2012.pdf. side 6 af 11 2 exam- e2012.pdf. side 6 af 11

Til de ni ovenstående ansigtsdele må I kun bruge billeder fra http://amturing.acm.org/byyear.cfm. Det billede der bliver skabt af jeres program skal have størrelsen 219px 207px. Mindst ét billede, der bliver tilfældigt valgt, skal komme fra en kvindelig Turing Award-prisvinder. Alle førnævnte ansigtsdele skal være synlige. Alle førnævnte ansigtsdele skal skaleres, så de ser proportionalle ud. Til resten af ansigtet kan I frit vælge et eller flere billede. Dog skal I huske at angive kilde og copyright for disse billeder. Hver gang jeres program kører skal det skabe et nyt tilfældigt billede (statistisk set), samt en tekststreng som fortæller hvilke prisvindere, der er blevet brugt til at skabe billedet. Endvidere var der også nogle særlige krav til opgaven: 3 Særlige krav til afleveringen Udover jeres rapport og kildetekst, så skal I også aflevere: Alle billeder I har downloaded, og evt præ-behandlet, som jeres program bruger. Mindst 5 eksempler på output fra jeres program (billeder og tekst). Problemanalyse Af hvad vi har forstået af den stillede problemformuleringen kræver opgaven en nøje planlægning, idet at flere af de elementer der skal indgå i opgaven skal præbehandles og skal skaleres. Af den grund vil vi starte med at sætte os ned og udarbejde en plan, og en skabelon for hvordan det sammensatte billede skal dannes. Af problemformuleringen står der at der skal indgå ni ansigtsdele fra forskellige billeder af Turing Award-prisvindere, for 3 exam- e2012.pdf. side 7 af 11

at opfylde dette krav har vi tænkt os at bruge 3 prisvindere, en kvinde og to mænd. Med disse tre personer skal vi så i alt have 27 billeder af ansigtsdelene, hvoraf disse billeder skal skabe et 219px x 207px billede. Når de tre personer skal udvælges har vi tænkt os at anvende nogle billeder der viser et tæt frontbillede, så alle ansigtsdele kan ses. Med hensyn til at skabe et billede med størrelsen 219px x 207px vil vi bruge en helt anden Turing Award-prisvinder som canvas, da denne dette billede vil udfylde kravet og på samme tid udfylde de manglede ansigtsdele der bliver til når programmet laver billedet. Derved får vi på samme tid udarbejdet kravet om at alle fornævnte ansigtsdele skal være synlige, da vores sammensatte billede vil blive til ovenpå den tidligere nævnte canvas. Endvidere fremgår det af problemformuleringen at det dannede sammensatte billede skal vælge tilfældige billeder fra vores prisvindere, her har vi tænkt os at bruge betegnelsen random.choice(), for at bruge denne sætning, kræves det at der op over vores definition af programmet skrives import random. Med hensyn til at mindst et af de ni billeder der bliver vist skal være fra kvinden, har vi diskuteret dette flittigt, da vi har ment at dette er et af de vanskelige krav. Derfor har vi planlagt dette præcist, og derfor tænkt os at udarbejde en effektiv while løkke, der gør at den kvindelige prisvinder optræder hver eneste gang når det sammensatte billede bliver vist frem. For at undgå at bruge for meget tid på at skalere billederne ned så de ser proportionelle ud, har vi tænkt os at udvælge nogle billeder (af Turing Awards-prisvindere), hvori personernes ansigtsstørrelse ser identiske ud. Og dernæst har vi tænkt os også at få baggrundsbilledet til at passe med vores ansigtsdele. Brugervejledning Vi har valgt at anvende JES til at programmere i, og vores program fungere ved at der op over JES kommandovindue trykkes på Load Program, dette kan kun forekomme når programmet er blevet gemt, dernæst vises der i kommandovinduet ======= Loading Progam =======, dernæst skal 4 brugeren sætte mediapath (setmediapath) og dette gøres ved at man i kommandovinduet skriver setmediapath() og derefter sætter man media stien til den mappe hvor alle billeder ligger inde. Herefter skriver man opgave2() i 4 billede 3 i bilag.

kommandovinduet, og 5 det sammensatte billede bliver vist på et vindue der åbnes op. Endvidere kommer der 6 tre rækker af tekststrenge (to rækker i de tilfælde hvor det kun er to personer der optræder i billedet), hvori det fremgår af hvilke personer der indgår i billedet. Teknisk Beskrivelse af programmet Formålet med denne klasse, er at alle billeder er gemt inde i en mappe hvor betegnelsen getmediapath blot skal bruges for at komme ind og hente billederne, udover dette defineres billederne så man senere hen kan bruge dem. (1) LiskovNose = getmediapath("liskov Nose.png") LiskovLeftEye = getmediapath("liskov Left Eye.png") LiskovRightEye = getmediapath("liskov Right Eye.png") LiskovHair = getmediapath("liskov Hair.png") LiskovMouth = getmediapath("liskov Mouth.png") LiskovLeftEyebrow = getmediapath("liskov Left Eyebrow.png") LiskovRightEyebrow = getmediapath("liskov Right Eyebrow.png") LiskovLeftEar = getmediapath("liskov Left Ear.png") LiskovRightEar = getmediapath("liskov Right Ear.png") Her er et eksempel på hvordan vi anvender vores random funktion, vi starter med at definere de parametre den skal vælge imellem og dernæst vælger funktionen helt tilfældigt et af de tre billeder. (2) nose = [LiskovNose, DennisNose, MarvinNose] nose = random.choice(nose) 5 billede 1 i bilag. 6 Billede 2 i bilag

Nedenstående er vores while løkke, den bliver ved med at løbe indtil at det udsagn vi har skrevet passer, vores løkke fungere ved at der bruges følgende tegn:!=, dette tegn betyder at de forskellige ansigtsdele ikke er lig Liskov s ansigtsdele, i tilfælde af at nedenstående er en realitet så kører programmet betegnelsen random.choice med alle ni ansigtsdele. Funktionen gør at et af Barbara Liskov ansigtsdele (vores kvindelige Touring Awards-prisvinder), er en del af alle sammensatte billeder. (3) while nose!= LiskovNose and lefteye!= LiskovLeftEye and righteye!= LiskovRightEye and hair!= LiskovHair and lefteyebrow!= LiskovLeftEyebrow and righteyebrow!= LiskovRightEyebrow and leftear!= LiskovLeftEar and rightear!= LiskovRightEar: random.choice(nose) random.choice(lefteye) random.choice(righteye) random.choice(hair) random.choice(mouth) random.choice(lefteyebrow) random.choice(righteyebrow) random.choice(leftear) random.choice(rightear) Følgende funktion gør at en tekststreng kommer til syne i kommandovinduet, og dette sker hvis en ansigtsdel af Liskov er en del af det sammensatte billede. (4) if nose == LiskovNose or lefteye == LiskovLeftEye or righteye == LiskovRightEye or hair == LiskovHair or lefteyebrow == LiskovLeftEyebrow or righteyebrow == LiskovRightEyebrow or leftear == LiskovLeftEar or rightear == LiskovRightEar: print ("Barbara Liskov is part of the picture")

Denne del af kildekoden gør så vores tekst oppe i (2) bliver lavet om til et billede, der er synligt når det sammensatte billede bliver vist frem. (5) nose = makepicture(nose) lefteye = makepicture(lefteye) righteye = makepicture(righteye) hair = makepicture(hair) mouth = makepicture(mouth) lefteyebrow = makepicture(lefteyebrow) righteyebrow = makepicture(righteyebrow) leftear = makepicture(leftear) rightear = makepicture(rightear) Denne del af koden viser de enkelte billeders placering på vores canvas, koordinater og billedstørrelse fremgår her: (6) #Nose sourcex = 0 for targetx in range(95, 125): sourcey = 0 for targety in range(70, 121): color = getcolor( getpixel(nose, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey +1 sourcex = sourcex +1 Afprøvning Af problemformuleringen fremgår det at et af kravene til udarbejdelsen af opgaven, er at mindst et af de repræsentative personer man vælger skal være en kvinde. Dette krav er opfyldt, og da vi i gruppen finder det irrelevant og tidskrævende at have et bredt udvalg af

personer der indgår i programmet, har vi af den grund valgt tre personer til at indgå i vores program. De personer der optræder i vores program er følgende: Barbara Liskov, Dennis MacAllstair Ritchie og Marvin Minsky. Som vores Canvas, bruger Andrew Chi Chih Yao. De tre personer der anvendes i programmet er nøje udvalgte, da vi ønsker at vores sammensatte billede bliver et godt resultat. Af den grund optræder ingen af vores tre personer med briller, der er desuden blevet lagt vægt på at udvælge billeder hvor alle dele af ansigtet er tydelige, og hvor det kræves at der bliver skaleret mindst muligt. Baggrunden spiller også en væsentlig rolle, idet at vi søgte en baggrund som var identisk med hinanden, disse baggrunde skulle endvidere passe til vores Canvas, der har en mørk baggrund. Så de tre personer, er blevet valgt omhyggeligt. For at udfylde kravet om billedets størrelse på 219px x 207px, har vi valgt at bruge en Canvas billede af et af vinderne af datalogi prisen. For at skabe de ni ansigtsdele, bruger vi en enkel måde hvor vi selv klipper billederne ud. For at tydeliggøre ansigtsdelene har vi lavet en kontrast mellem baggrunden, og billederne af ansigtsdelene så der ikke har været noget problem med synligheden. Derved har programmeringen af opgaven krævet en nøje planlægning, da man ellers får en del vanskeligheder med at få det hele til at fungere. Konklusion Af ovenstående kan vi konkludere at problemstillingen er besvaret fyldestgørende, og at programmet intet problemer har med at kører, derudover mener vi at programmet er brugervenligt og lettilgængeligt. Et af kravene til opgaven var at der skulle være ni ansigtsdele, for at skabe disse ansigtsdele har vi valgt selv at klippe billederne ud, og derefter brugt dem i vores program. Grunden til at vi har valgt at præ-behandle vores billeder på den måde, er netop fordi at vi har fundet denne måde mest praktisk. Det kan endvidere konkluderes at der kun er blevet brugt billeder fra den angivne hjemmeside og vi har brugt en af Turing Awards-prisvindernes billede som canvas for at opfylde kravet om et billedstørrelse på 219px x 207px. Som det fremgår i problemstillingen, der skal vores kvinde optræde på det sammensatte billede hver eneste gang programmet kører, og her

har vi lavet en while løkke der bliver ved med at kører lige indtil at de kriterier vi har sat den til bliver opfyldt. Baggrund og problemformulering Opgave 4: Web-applikation for Olives R Us Vores HTML-kode blevet udarbejdet ud fra en problemformulering med følgende baggrund: 7 Den nys ansatte direktør for Olives R Us vil gerne starte et online community omkring olivenolie. Han har derfor bedt jer om at lave en web-applikation for Olives R Us, hvor kunderne kan dele oplevelser og bedømmelser af Olives R Us olivenolier. Opgaven Der er følgende krav til web-applikationen: Web-applikationen skal have følgende sider: En hovedside med en oversigt over de forskellige olivenolier. En side for hver olivenolie. Siden skal indeholde navnet på olivenolien, en beskrivelse af olivenolien, en formular hvor kunden kan give en anmeldelse, samt en liste af alle de anmeldelser andre kunder har givet af olien. En administrativ side, hvor man kan tilføje nye olivenolier til systemet, samt slette olivenolier der ikke længere bliver solgt. En olivenolie har et navn og en beskrivelse. En bedømmelse er tilknyttet en olivenolie, og består af et antal stjerner (en til fem) samt en mere uddybende tekst. Påhovedsidenskalmanforhverolivenolie:seantalanmeldelser;sedetgennemsnitlige antal stjerner; samt kunne klikke på navnet, hvorefter man kommer til siden for den valgte olivenolie. 7 exam- e2012.pdf. side 11 af 11

Der skal ikke være et link fra hovedsiden til den administrative side, den er hemmelig og kun til intern brug. Den administrative side skal være på den hemmelige URL "/admin". Når man sletter en olivenolie skal alle tilknyttede anmeldelser også slettes. Antal stjerner skal vises som billeder ikke som tekst. Problemanalyse Denne opgave ligner i store træk en tidligere afleveringsopgave (Coffee R Us) vi har lavet under kurset, og derfor har vi tænkt os at bruge denne opgave som inspirationskilde. Dog er kravet til Olives R Us en del større og af den grund har vi tænkt os at takle opgaven på en anden måde end med afleveringsopgaven. Ud fra problemstillingen kan vi læse os frem til at Olives R Us hjemmesiden skal have en startside, en side for den første olivenolie, en for den anden olivenolie, en for den tredje olivenolie, og en administratorside. Så derfor har vi udarbejdet en plan omkring at starte med at definere startsiden, som indeholder et link der kan fører brugeren videre til hvert af de enkelte sider der derefter skal defineres. Til de enkelte sider startsiden henviser til, der har vi tænkt os at indsætte et billede af olivenolien, endvidere har vi planlagt at lave et tekststykke hvor vi fortæller om olien. Derudover skal der ud fra kravene laves en bedømmelse af hvor god brugeren mener olien er, og her vil vi finde nogle billeder på internettet af stjerner, og endvidere vil vi bruge radio knapper til at gøre så at man kan bedømme den valgte olie. Når man har bedømt den valgte olie, skal dette gemmes i databasen, her skal man kunne se hvad der er blevet valgt, hvordan man har bedømt, og hvilken kommentar man har givet til den valgte olivenolie. På administratorsiden skal der gennemarbejdes en side hvorpå man skal kunne slette og tilføje olivenolier efter behov, denne side skal have to link der skal kunne fører administratoren videre til en anden side hvori det er muligt at tilføje og slette de olivenolier man ønsker. Desuden skal administratorsiden være hemmelig og derfor har vi tænkt os at lave en side helt for sig selv, der kører i en anden port, altså en port der kun er tilgængelig for administratoren. Med hensyn til kravet om at man skal kunne se anmeldelser og gennemsnittet af antal

stjerner, der har vi overvejet at lave en til definition hvori vi har lavet en beregning der kan tage gennemsnittet af stjerner der er blevet bedømt. Heri skal databasen på en måde også fremstå, da man inde i databasen kan se tidspunktet på hvornår en anmeldelse er løbet ind. I opgaven vil der ikke blive lagt vægt på at få arbejdet med CSS, da vi hellere ville lægge vægt på at få programmet til at virke. Til sidst har vi tænkt os at indsætte de billeder skal bruges, og især de billeder af anmeldelsesstjernerne vil blive lagt ind i hver af afstemningsfelterne (radio knap). Brugervejledning Programmet er lavet i HTML kode, derfor kræver det at man har en app launcher, eller har angivet tekstfilen i som.html, før det kan kører. Vi anvender GoogleAppEngineLauncher, der kan generere vores html kode og få det vist i en browser. Programmet virker ved at man først og fremmest skal have lavet en app.yaml fil, hvori de specifikke ting om version og programmeringstype står. Derefter kan man ved at tilføje sin fil til GoogleApp- EngineLauncher trykke på run ikonet, hvis programmet kører uden problemer ses et lille grøn play ikon ved den fil man kører, og dernæst taster man på Browse ikonet, så programmet åbnes op i en internetbrowser. Her kan man taste på ens favorit olivenolie, og herefter bliver man vist ind i en anden side hvor man kan læse lidt om den valgte olie, give sin anmeldelse, skrive sit navn og til sidst gemme sin anmeldelse. Dernæst bliver man henvist til en anden side hvor der står at ens data er gemt og at det er muligt at se dette i databasen, man kan dernæst gå tilbage til startsiden. Ved at gå tilbage til GoogleAppEngineLauncher, kan man ved SDK console ikonet, trykke sig ind på databasen, hvor der i List Entities er en liste over de anmeldelser der tidligere har været, og hvor det er muligt at se sin egen anmeldelse. Tilbage på internetsiden hvor man nu igen befinder sig på startsiden, der kan man som administrator taste følgende: http://localhost:8080/admins oppe i browserfeltet, og man bliver henvist til administrationssiden. På denne side der kan man se de tre olivenolier der er på startsiden, og nedenunder deres navne der er der et link så man slette dem. Nederst på siden kan man tilføje en ny olie hvis man ønsker dette. Hvis man taster på create new

oil, bliver man henvist til en anden side, hvori man kan tilføje en ny olie og få den til at blive en del af de andre olier. Teknisk beskrivelse For at vores html kode kan virke kræver det at vi importere de relevante databaser, og dette bliver gjort her: (1) import datetime from google.appengine.ext import db Formålet med følgende klasse er at den definere vores variabler så de kan indsættes i vores database: (2) #Database class Orders(db.Model): stamp = db.datetimeproperty() oil = db.stringproperty() name = db.stringproperty() stars = db.stringproperty() comments = db.stringproperty() Vores startside indgår nedenfor, og den bliver returneret til vores webapplikation, startsiden indeholder de billeder vi har og udover dette indeholder den også vores link der fører brugeren videre til de enkelte hjemmesider: (3) # Startpage def mainpage(request): return webapp2.response("""<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>olives'r'us</title> </head> <body> <h1>olives'r'us</h1> <form action="orders" method="post">

src="http://healthnbeauty.myworldmysite.com/sites/healthnbeauty.myworldmysite.com/files /Olive%20Oil_0.jpg" </div> <table> <tr> <td> src="http://www.independent.co.uk/migration_catalog/article5144047.ece/alternates/w 620/Untitled-2.jpeg" style="max-width:15%" alt="puglian Single Estate" src="http://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cac50c68c994cf4000066/u ntitled-3_176420a.jpg" style="max-width:15%" alt="fattoria Montecchio" src="http://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cabfbc68c994dc4000010/u ntitled-4_176419a.jpg" style="max-width:15%" alt="corte dei Signori" <br <br> </br> <a href="pugliansingleestate" >----Puglian Single Estate----</a><n> </n> <a href="fattoriamontecchio" >----Fattoria Montecchio----</a><n></n> <a href="cortedeisignori" >----Corte dei Signori----</a><br <br </td> </tr> <a href="listall"> </form> </body> </html> """ ) Her har vi klassen datasave, den indeholder de vigtigste parameter der så at databasen virker, alle de ting vi som bruger taster bliver gemt her: (4) # The database for the olive oils def datasave(request): name = request.params.get('name') oil = request.params.get('oil') stars = request.params.get('stars') comments = request.params.get('comments') date = datetime.datetime.now() record = Orders(stamp = date, oil = oil, name = name, comments = comments, stars = stars) record.put() reply = webapp2.response("""<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>olives'r'us</title>

</head> <body> <h1>olives'r'us</h1> """) Følgende funktion gør så at vores database bliver sorteret efter tidspunkt, dette fremgår af ("SELECT * FROM Orders order by stamp DESC"), endvidere så bliver alle de elementer der optræder i ovenstående funktioner vist i nedenstående funktion. (5) # The database list def listall(request): allentries = db.gqlquery("select * FROM Orders order by stamp DESC") reply = "<ul>\n" for entry in allentries: reply += """</ul> <p><a href="/">back to main page</a></p> """ return webapp2.response("all Entries", reply) Følgende dele gør så at vores funktion kører i vores webapplikation. (6) # The web application app = webapp2.wsgiapplication([('/', mainpage), ('/PuglianSingleEstate, PuglianSingleEstate), FattoriaMontecchio), ('/CortedeiSignori', CortedeiSignori), ('/admins', admins), ('/newoil', newoil), ('/shownewoil', shownewoil), ('/listall', listall), ('/Orders', datasave)], debug=true) ('/FattoriaMontecchio, Afprøvning Ud fra problemformuleringen er der blevet stillet nogle krav, en af dem var at få en startside frem, hvori man kunne blive henvist videre til fire andre sider, nemlig de tre

olivenoliers sider og en administratorside. Samtlige af disse sidder er blevet lavet og vi har ved at bruge en sætning som denne kunne komme ind på hver enkel af de sider vi har defineret senere hen, <a href="pugliansingleestate" >----Puglian Single Estate----</a>. Desuden har vi på de pågældende sider beskrevet hver enkel af olierne og vi har givet dem bedømmelsesmuligheder (en til fem stjerner), udover dette har vi gjort så man kan skrive sit navn og give en kommentar, der senere hen kan bruges til databasen. Et andet krav til opgaven var at man skulle vise antal stjerner som billeder og ikke som tekst. Og ved at søge lidt på internettet har vi fundet et billede af en stjerne, denne stjerne er blevet brugt to gange ved 2 stjerner osv. altså er billedet af denne enkelte stjerne gået igen 5 gange ved 2 stjerner, dette ville vi gerne have gjort anderledes så vi kun skulle bruge et billede, men da vi har haft enormt svært ved at finde de rette billeder har vi fundet denne alternative måde. Derudover har vi udarbejdet en administratorside, hvori vi har billeder af de olier der er tilgængelige, disse olier har alle links så man skal kunne slette dem. Udover dette kan man komme ind på en ny side ved nederst at trykke på create new oil. Her bliver man henvist en anden side hvori der er mulighed for at skrive et navn til en ny olie og skrive en tekst til ned nye olie. Heri forefindes også et link der får administrator videre til en ny side hvor den nye olie er sat til at være. Fejl: Gennem programmeringen af denne opgave er vi stødt på nogle fejl. For det første så har vi ikke været i stand til at få antal af anmeldelser og gennemsnittet af anmeldelser frem på startsiden. Derudover har vi på administratorsiden haft vanskeligheder med at få knapperne der skal slette olierne til at virke, her har vi forsøgt at lave en funktion der gemmer den valgte olie men uden held. Til sidst har der været problemer med at tilføje en ny olie, da vi igen har haft svært ved at få navnet og teksten på den valgte olie til at vise sig på den nye side.

Konklusion Af ovenstående kan vi konkludere at opgaven er blevet løst fyldestgørende, dog har der været nogle enkelte vanskeligheder. Vi har fået startsiden til at kører, og her kan man se de tre olier og trykke på et link der fører brugeren videre til den valgte olies hovedside. Vi har desuden fået databasen op og kører, så man kan se de bedømmelser som brugeren har givet. Desuden har vi fået administratorsiden til at virke, dog med de angivet mangler. Baggrund og problemstilling: 8 Skriv et program der udvælger, hvem der skal inviteres til det sociale netværk, således at det maksimale antal personer tilmelder sig. Der er følgende krav til programmet: Input til programmet er en tekst- fil (.txt), hvor Det første ord på hver linje er navnet på et potentiel medlem Det andet ord og alle følgende ord på linjen er navne på andre personer, og hvert navn har enten præfiks + (betydning kan lide ), præfiks - (betydning hader ) eller intet præfiks (betydning neutral ). For eksempel betyder: Ole +Anne - Troels +Louise +Thomas Casper Sanne at Ole kan lide Anne, Louise og Thomas, men Ole hader Troels, og Ole er neutral overfor Casper og Sanne. Navne indeholder ikke mellemrum. Mellemrum adskilder navne. Navne indeholder kun bogstaverne a til z (dvs, ikke æ, ø og å ) og tal. Det første bogstav i hver navn skal være stort (og ikke et tal) alle andre bogstaver i navnet skal være små. Hvert navn er unikt (der er kun én person med hvert navn). Der er ingen begrænsninger med hensyn til hvor lange linjer kan være og der er heller ikke nogen begrænsninger på hvor mange navne der kan være (med eller uden præfiks). Kun de personer hvis navn optræder som første ord på en linje kan blive inviteret. For eksempel, Ole kan lide Thomas, men hvis der ikke er en linje hvor Thomas står som det første ord, så kan Thomas ikke inviteres. Definer funktionerne: absoluteconstr(filename) som læser input fra filen angivet af filename, og finder en 8 exam- e2012.pdf. side 4 af 11

god løsning under hensyn til de absolutte begrænsninger (I), og returnere en liste af navne på personer der skal inviteres. relativeconstr(filename) som læser input fra filen angivet af filename, og finder en god løsning under hensyn til den relative begrænsning (II), og returnere en liste af navne på personer der skal inviteres. Ingen af funktionerne skal hverken læse eller skrive til terminalen. Givet information om cirka 50 personer, så bør begge funktioner returnere et svar inden for rimelig tid (dvs. under en time). Givet information om cirka 15 personer, så bør begge funktioner returnere en (af de) bedst mulige løsninger. Det er vigtigt at jeres program virker præcist med det specificeret format af input (.txt) filen, da vi vil teste jeres program med vores eget data i det format. Valg af datastrukturer (fx lister, mængder, dictionaries, osv.) er op til jer. Hint: Jeres opgave er at finde en rimelig god løsning inden for rimelig tid (ikke år). Hvis I, fx, har 100 personer, så er det ikke muligt at teste alle 2100 delmængder af dem inden for rimelig tid. Prøv i stedet at lave forskellige mulige lovlige delmængder af dem (delmængder der overholder de begrænsninger I arbejder under). Det vil sige, find på måder at forme tilfældige lovlige delmængder, og måder til at holde styr på den største lovlige delmængde. Særlige krav til afleveringen Udover jeres rapport og kildetekst, så skal I også aflevere: To lovlige input.txt- filer som I har brugt til afprøvning. En med 50 potentielle personer, og en med 15 potentielle personer. I jeres rapport skal I vise de resultater jeres program finder for de to input filer for henholdsvis absolutte og relative begrænsninger (dvs, fire lister i alt). Problemanalyse: Programmet skal kunne læse.txt filen og regne ud, hvornår der er linjeskift, hvad mellemrum betyder og hvad henholdsvis + og betyder. For at gøre dette forestiller vi os at programmet skal læse filen som en streng for at håndtere dataene. Dette er desværre ikke lykkedes for os, så vores program virker derfor ikke.

Hvis vi havde lykkedes med det, havde vi tænkt os at fortsætte ved at gøre brug af if sætninger. Fx: if + > - : Ved at søge på internettet har vi fundet frem til funktionen Regular Expression også kaldet re, kan bruges til at få blandt andet ord og tegn i en.txt fil. Da ingen af os kendte funktionen på forhånd, nåede vi desværre ikke at blive fortrolige nok med den, til at få den til at virke i vores program. Hvis vi var blevet bedt om at lave opgaven med de absolutte begrænsninger i hovedet, uden elektroniske hjælpemidler havde vi gjort det på følgende måde: Vi ville tage udgangspunkt i først navn og på første linje og invitere denne person, kaldet A. Dernæst ville vi finde dem, som ikke kunne lide A, og slette dem fra listen. Efterfølgende ville vi tage dem som godt kunne lide A og invitere dem. Fremgangsmåden med først at slette dem, som ikke kan lide en given person, og derefter invitere dem som kan, fortsætter så, indtil hele listen er gået igennem. Konklusion: Konklusionen er at opgaven på ingen måde er løst. Dette er yderst beklageligt. Hvis vi blev sat til at lave opgaven igen ville vi læse op på Regular Expression og løse opgaven med udgangspunkt i denne funktion. Kildehenvisninger http://healthnbeauty.myworldmysite.com/sites/healthnbeauty.myworldmysite.com/files/ol ive%20oil_0.jpg http://www.independent.co.uk/migration_catalog/article5144047.ece/alternates/w620/ Untitled- 2.jpeg https://rately- product- images.s3.amazonaws.com/production/product/cdn_image/4e1cac50c68c994cf4000066/un titled- 3_176420a.jpg

http://rately- product- images.s3.amazonaws.com/production/product/cdn_image/4e1cabfbc68c994dc4000010/un titled- 4_176419a.jpg http://upload.wikimedia.org/wikipedia/commons/b/b7/rating- Christgau- one- star- honorable- mention.png http://amturing.acm.org/award_winners/liskov_1108679.cfm http://amturing.acm.org/award_winners/minsky_7440781.cfm http://amturing.acm.org/award_winners/yao_1611524.cfm http://amturing.acm.org/award_winners/ritchie_1506389.cfm Bilag: afprøvningsdata, programtekst, skærmbilleder og lignende Billede 1

Billede 2 Billede 3

Programtekst (opgave4) import webapp2 import cgi import datetime from google.appengine.ext import db #Database class Orders(db.Model): stamp = db.datetimeproperty() oil = db.stringproperty() name = db.stringproperty() stars = db.stringproperty() comments = db.stringproperty() # Startpage def mainpage(request): return webapp2.response("""<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>olives'r'us</title> </head> <body> <h1>olives'r'us</h1> <form action="orders" method="post"> src="http://healthnbeauty.myworldmysite.com/sites/healthnbeau ty.myworldmysite.com/files/olive%20oil_0.jpg" </div>

<table> <tr> <td> src="http://www.independent.co.uk/migration_catalog/article51 44047.ece/ALTERNATES/w620/Untitled-2.jpeg" style="maxwidth:15%" alt="puglian Single Estate" src="http://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cac50 c68c994cf4000066/untitled-3_176420a.jpg" style="maxwidth:15%" alt="fattoria Montecchio" src="http://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cabfb c68c994dc4000010/untitled-4_176419a.jpg" style="maxwidth:15%" alt="corte dei Signori" <br <br> </br> <a href="pugliansingleestate" >----Puglian Single Estate----</a><n> </n> <a href="fattoriamontecchio" >----Fattoria Montecchio----</a><n></n> <a href="cortedeisignori" >----Corte dei Signori----</a><br <br </td> </tr> <a href="listall"> </form> </body> </html> """ ) #Adminpage def admins(request): return webapp2.response("""<!doctype html <html lang="da"> <head> <meta charset="utf-8"> <title>administration</title> </head> <body> <h1>administration</h1> <form action="/delete" method="post">

<p>olives'r'us</p> </div> <input type="hidden" name="key" value="http://localhost:8081/admins" <table> <tr> <td> src="http://www.independent.co.uk/migration_catalog/article51 44047.ece/ALTERNATES/w620/Untitled-2.jpeg" style="maxwidth:15%" alt="puglian Single Estate" <p>puglian Single Estate</p> <input type="submit" value="delete entry" <br></br> src="https://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cac50 c68c994cf4000066/untitled-3_176420a.jpg" style="maxwidth:15%" alt="fattoria Montecchio" <p>fattoria Montecchio</p> <input type="submit" value="delete entry" <b></br> src="https://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cabfb c68c994dc4000010/untitled-4_176419a.jpg" style="maxwidth:12%" alt="corte dei Signori" <p>corte dei Signori</p> <input type="submit" value="delete entry" <br> <a href="newoil" >----New oil----</a><n> </n> </br> <a href="listall">back to mainpage</a> </td> </tr> </table> </form> </body> </html> """ ) #Page for creating new oil def newoil(request): return webapp2.response("""<!doctype html <html lang="da"> <head> <meta charset="utf-8">

<title>newoil</title> </head> <body> <h1>new oil</h1> <form action="/newoil" method="post"> <p>name for the new oil</p> <td><input type="text" name="newoil" required </td> <p>the text for the new oil</p> <td><input type="text" name="beskrivelse" </td> <table> <br></br> <a href="shownewoil">---create new oil---</a> <br></br> <a href="listall">---back to mainpage---</a> </td> </tr> </table> </form> </body> </html> """) #Page for new oil def shownewoil(request): return webapp2.response("""<!doctype html <html lang="en"> <head><meta charset="utf-8"> <title>new oil</title> </head> <body> <h1></h1> <form action="/orders" method="post"> <br> <input type="hidden" name="oil" value="puglian Single Estate" </br> <tr> <th>your name:</th></br> <td><input type="text" name="name" required </td> <br> </br> <th>your rating:</th></br> <td> <input type="radio" name="stars" value="1 Star"</br>

alt="puglian Single Estate" style="maxwidth:1%"</br> <input type="radio" name="stars" value="2 Stars" <br alt="puglian Single Estate" style="maxwidth:1%"<br <input type="radio" name="stars" value="3 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="4 Stars" <br

alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="5 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br </td> <br> </br> <tr> <th>your comments:</th></br>

<td><input type="text" name="comments" </td><br<br </tr> <input type="submit" value="send your vote"<n> <n> </n><a href="/">back to the mainpage</a> </form> </body> </html> """ ) #Page for first olive oil "Puglian Single Estate" def PuglianSingleEstate(request): return webapp2.response("""<!doctype html <html lang="en"> <head><meta charset="utf-8"> <title>puglian Single Estate</title> </head> <body> <h1>puglian Single Estate</h1> <form action="/orders" method="post"> src="http://www.independent.co.uk/migration_catalog/article51 44047.ece/ALTERNATES/w620/Untitled-2.jpeg" style="maxwidth:15%" alt="puglian Single Estate"</br> <h4>celebrity chefs swear by this oil. Made in </h4> <h4>southern Italy, it has a rich golden colour </h4> <h4>and goes well drizzled on salads and is </h4> <h4>perfect for dipping bread into. It is a </h4> <h4>single estate oil, which means the whole </h4> <h4>process takes place on the same farm.</h4> <br> <input type="hidden" name="oil" value="puglian Single Estate" </br> <tr> <th>your name:</th></br> <td><input type="text" name="name" required </td> <br> </br> <th>your rating:</th></br> <td> <input type="radio" name="stars" value="1

Star"</br> alt="puglian Single Estate" style="maxwidth:1%"</br> <input type="radio" name="stars" value="2 Stars" <br alt="puglian Single Estate" style="maxwidth:1%"<br <input type="radio" name="stars" value="3 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="4 Stars" <br

alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="5 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br </td> <br> </br> <tr>

<th>your comments:</th></br> <td><input type="text" name="comments" </td><br<br </tr> <input type="submit" value="send your vote"<n> <n> </n><a href="/">back to the mainpage</a> </form> </body> </html> """ ) #Page for second olive oil "Fattoria Montecchio" def FattoriaMontecchio(request): return webapp2.response("""<!doctype html> <html lang="en"> <head><meta charset="utf-8"> <title>fattoria Montecchio</title> </head> <body> <h1>fattoria Montecchio</h1> <form action="/orders" method="post"> src="http://www.independent.co.uk/migration_catalog/article51 44047.ece/ALTERNATES/w620/Untitled-2.jpeg" style="maxwidth:15%" alt="fattoriamontecchio"</br> <h4>think of this as an investment in your </h4> <h4>health, skin and soul. The oil is </h4> <h4>produced by Ivo Nuti, a fine Italian </h4> <h4>gentleman who has owned his Tuscan </h4> <h4>olive groves for over 30 years. Just a tiny</h4> <h4>spoonful of the Fattoria will send you into olive oil heaven.</h4> <br> <input type="hidden" name="oil" value="fattoria Montecchio" </br> <tr> <th>your name:</th></br> <td><input type="text" name="name"</td> <br> </br> <th>your rating:</th></br> <td> <input type="radio" name="stars" value="1 Star"</br>

</br> <input type="radio" name="stars" value="2 Stars" <br alt="puglian Single Estate" style="maxwidth:1%"<br <input type="radio" name="stars" value="3 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="4 Stars" <br

alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="5 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br </td> <br> </br> <tr> <th>your comments:</th></br></strong>

<td><input type="text" name="comments" </td><br<br </tr> <input type="submit" value="send your vote"<n> <n> </n><a href="/">back to mainpage</a> </body> </html> """) #Page for the third olive oil "Corte dei Signori" def CortedeiSignori(request): return webapp2.response("""<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>corte dei Signori</title> <form action="/orders" method="post"> </head> <body> <h1>corte dei Signori</h1> src="https://rately-productimages.s3.amazonaws.com/production/product/cdn_image/4e1cabfb c68c994dc4000010/untitled-4_176419a.jpg" style="maxwidth:12%" alt="corte dei Signori" <br <h4>made by an English couple living in </h4> <h4>sicily. After quitting their jobs as a </h4> <h4>builder and nurse, they now have a </h4> <h4>passion for pressing high quality olive </h4> <h4>oil. Their harvest has a strong taste of </h4> <h4>black olives with fruity and nutty notes.</h4> <br> <input type="hidden" name="oil" value="corte dei Signori" </br> <th>your name:</th> <td><input type="text" name="name"</td> <br></br> <th>your vote:</th></br></strong> <td> <input type="radio" name="stars" value="1 Star"</br>

</br> <input type="radio" name="stars" value="2 Stars" <br alt="puglian Single Estate" style="maxwidth:1%"<br <input type="radio" name="stars" value="3 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br <input type="radio" name="stars" value="4 Stars" <br alt="puglian Single Estate" style="maxwidth:1%"

<br <input type="radio" name="stars" value="5 Stars" <br alt="puglian Single Estate" style="maxwidth:1%" <br </td> </td> <br> </br> <tr> <strong> <th>your comments:</th></br></strong>

<td><input type="text" name="comments" </td><br<br </tr> <input type="submit" value="send your vote"<n> </n><a href="/">back to mainpage</a> </body> </html> """) # The database for the olive oils def datasave(request): name = request.params.get('name') oil = request.params.get('oil') stars = request.params.get('stars') comments = request.params.get('comments') date = datetime.datetime.now() record = Orders(stamp = date, oil = oil, name = name, comments = comments, stars = stars) record.put() reply = webapp2.response("""<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>olives'r'us</title> </head> <body> <h1>olives'r'us</h1> """) reply.write("""<p>your review is saved and it is now available in the database<p> <a href="/">back to mainpage</a> </body> </html>""") return reply # The database list def listall(request): allentries = db.gqlquery("select * FROM Orders order by

stamp DESC") reply = "<ul>\n" for entry in allentries: reply += """</ul> <p><a href="/">back to main page</a></p> """ return webapp2.response("all Entries", reply) # The web application app = webapp2.wsgiapplication([('/', mainpage), ('/PuglianSingleEstate', PuglianSingleEstate), ('/FattoriaMontecchio', FattoriaMontecchio), ('/CortedeiSignori', CortedeiSignori), ('/admins', admins), ('/newoil', newoil), ('/shownewoil', shownewoil), ('/listall', listall), ('/Orders', datasave)], debug=true) Programtekst (opgave2) import random def opgave2(): canvas = makepicture(getmediapath("canvas.png")) LiskovNose = getmediapath("liskov Nose.png") LiskovLeftEye = getmediapath("liskov Left Eye.png") LiskovRightEye = getmediapath("liskov Right Eye.png") LiskovHair = getmediapath("liskov Hair.png") LiskovMouth = getmediapath("liskov Mouth.png") LiskovLeftEyebrow = getmediapath("liskov Left Eyebrow.png") LiskovRightEyebrow = getmediapath("liskov Right Eyebrow.png") LiskovLeftEar = getmediapath("liskov Left Ear.png") LiskovRightEar = getmediapath("liskov Right Ear.png") DennisNose = getmediapath("dennis Nose.png")

DennisLeftEye = getmediapath("dennis Left Eye.png") DennisRightEye = getmediapath("dennis Right Eye.png") DennisHair = getmediapath("dennis Hair.png") DennisMouth = getmediapath("dennis Mouth.png") DennisLeftEyebrow = getmediapath("dennis Left Eyebrow.png") DennisRightEyebrow = getmediapath("dennis Right Eyebrow.png") DennisLeftEar = getmediapath("dennis Left Ear.png") DennisRightEar = getmediapath("dennis Right Ear.png") MarvinNose = getmediapath("marvin Nose.png") MarvinLeftEye = getmediapath("marvin Left Eye.png") MarvinRightEye = getmediapath("marvin Right Eye.png") MarvinHair = getmediapath("marvin Hair.png") MarvinMouth = getmediapath("marvin Mouth.png") MarvinLeftEyebrow = getmediapath("marvin Left Eyebrow.png") MarvinRightEyebrow = getmediapath("marvin Right Eyebrow.png") MarvinLeftEar = getmediapath("marvin Left Ear.png") MarvinRightEar = getmediapath("marvin Right Ear.png") nose = [LiskovNose, DennisNose, MarvinNose] nose = random.choice(nose) lefteye = [LiskovLeftEye, DennisLeftEye, MarvinLeftEye] lefteye = random.choice(lefteye) righteye = [LiskovRightEye, DennisRightEye, MarvinRightEye] righteye = random.choice(righteye) hair = [LiskovHair, DennisHair, MarvinHair] hair = random.choice(hair) mouth = [LiskovMouth, DennisMouth, MarvinMouth] mouth = random.choice(mouth) lefteyebrow = [LiskovLeftEyebrow, DennisLeftEyebrow, MarvinLeftEyebrow] lefteyebrow = random.choice(lefteyebrow) righteyebrow = [LiskovRightEyebrow, DennisRightEyebrow, MarvinRightEyebrow] righteyebrow = random.choice(righteyebrow) leftear = [LiskovLeftEar, DennisLeftEar, MarvinLeftEar] leftear = random.choice(leftear) rightear = [LiskovRightEar, DennisRightEar, MarvinRightEar]

rightear = random.choice(rightear) while nose!= LiskovNose and lefteye!= LiskovLeftEye and righteye!= LiskovRightEye and hair!= LiskovHair and lefteyebrow!= LiskovLeftEyebrow and righteyebrow!= LiskovRightEyebrow and leftear!= LiskovLeftEar and rightear!= LiskovRightEar: random.choice(nose) random.choice(lefteye) random.choice(righteye) random.choice(hair) random.choice(mouth) random.choice(lefteyebrow) random.choice(righteyebrow) random.choice(leftear) random.choice(rightear) if nose == LiskovNose or lefteye == LiskovLeftEye or righteye == LiskovRightEye or hair == LiskovHair or lefteyebrow == LiskovLeftEyebrow or righteyebrow == LiskovRightEyebrow or leftear == LiskovLeftEar or rightear == LiskovRightEar: print ("Barbara Liskov is part of the picture") if nose == DennisNose or lefteye == DennisLeftEye or righteye == DennisRightEye or hair == DennisHair or lefteyebrow == DennisLeftEyebrow or righteyebrow == DennisRightEyebrow or leftear == DennisLeftEar or rightear == DennisRightEar: print ("Dennis Ritchie is part of the picture") if nose == MarvinNose or lefteye == MarvinLeftEye or righteye == MarvinRightEye or hair == MarvinHair or lefteyebrow == MarvinLeftEyebrow or righteyebrow == MarvinRightEyebrow or leftear == MarvinLeftEar or rightear == MarvinRightEar: print ("Marvin Minsky is part of the picture") nose = makepicture(nose) lefteye = makepicture(lefteye) righteye = makepicture(righteye) hair = makepicture(hair) mouth = makepicture(mouth) lefteyebrow = makepicture(lefteyebrow) righteyebrow = makepicture(righteyebrow) leftear = makepicture(leftear) rightear = makepicture(rightear) #Nose sourcex = 0 for targetx in range(95, 125): sourcey = 0 for targety in range(70, 121): color = getcolor( getpixel(nose, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color)

sourcey = sourcey +1 sourcex = sourcex +1 #Left eye sourcex = 0 for targetx in range(128, 160): sourcey = 0 for targety in range(74, 92): color = getcolor( getpixel(lefteye, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Right eye sourcex = 0 for targetx in range(60, 97): sourcey = 0 for targety in range(72, 94): color = getcolor( getpixel(righteye, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Hair sourcex = 0 for targetx in range(3, 219): sourcey = 0 for targety in range(2, 23): color = getcolor( getpixel(hair, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Mouth sourcex = 0 for targetx in range(82, 137): sourcey = 0 for targety in range(122, 145): color = getcolor( getpixel(mouth, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Left eyebrow sourcex = 0 for targetx in range(120, 155):

sourcey = 0 for targety in range(55, 65): color = getcolor( getpixel(lefteyebrow, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Right eyebrow sourcex = 0 for targetx in range(65, 100): sourcey = 0 for targety in range(55, 65): color = getcolor( getpixel(righteyebrow, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Left ear sourcex = 0 for targetx in range(160, 183): sourcey = 0 for targety in range(55, 140): color = getcolor( getpixel(leftear, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 #Right ear sourcex = 0 for targetx in range(35, 65): sourcey = 0 for targety in range(55, 140): color = getcolor( getpixel(rightear, sourcex, sourcey)) setcolor( getpixel(canvas, targetx, targety), color) sourcey = sourcey + 1 sourcex = sourcex + 1 print("andrew Chi-Chih Yao is the background of the picture") show(canvas)