Föreläsning 4: Poster



Relevanta dokument
5 Grundläggande in- och utmatning

Föreläsning 6: Introduktion av listor

Exempel på ett litet Ada-program

Föreläsning 3.1: Datastrukturer, en översikt

Tentamen Grundläggande programmering

Objektorienterad programmering D2

Att använda pekare i. C-kod

Föreläsning 7: Filer

OOP Objekt-orienterad programmering

Sockets: server. with Ada.Command_Line; use Ada.Command_Line; with Ada.Exceptions; use Ada.Exceptions; with Ada.Text_IO; use Ada.

Paket (2) nautisk_mil : constant Float := * foot; ångström : constant Float := 10.0E-10; mile : constant Float := 5280.

Programmeringsteknik med C och Matlab

Övningar Dag 2 En första klass

Chapter 3: Using Classes and Objects

Tentamen OOP

Sätt att skriva ut binärträd

Föreläsning 5: Introduktion av pekare

Uppgift (poäng) 1 (2) 2 (3) 3 (4) 4 (4) 5 (3) 6 (4) 7 (6) 8 (6) 9 (8) Summa

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Föreläsning 0: Introduktion av Ada

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Uppgift 1 ( Betyg 3 uppgift )

1 Funktioner och procedurell abstraktion

Uppgift 1 ( Betyg 3 uppgift )

För att skriva data till skärmen ( konsolen) används objektet System.out tillsammans med metoden println eller print.

Programmeringsuppgifter 1

Kursutvärdering Ämne: SO Lärare: Esa Seppälä/Cecilia Enoksson Läsåret Klass: SPR2

Grunderna i stegkodsprogrammering

Vi hoppas att ni har glädje av berättelsen om Undra och Lollo som ska träna sina krångelhänder så de blir hjälparhänder!

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Programmering för språkteknologer II, HT2014. Rum

Javisst! Uttrycken kan bli komplicerade, och för att få lite överblick över det hela så gör vi det så enkelt som möjligt för oss.

Uppgift 1a (Aktiekurser utan poster)

Uppgift 1 (grundläggande konstruktioner)

Objektorienterad programmering i Java

8-4 Ekvationer. Namn:..

Föreläsning 7. Träd och binära sökträd

SMD 134 Objektorienterad programmering

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Tärna Folkhögskola IT-pedagogutbildningen Individuellt fördjupningsarbete Vt IT I FÖRSKOLAN. Författare:Tove Andersson

Översikt. Installation av EasyPHP 1. Ladda ner från Jag använder Release Installera EasyPHP.

Utvärdering av föräldrakurs hösten 2013

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Tentamen för kursen Objektorienterad programvaruutveckling GU (DIT010)

Sidor i boken , , 3, 5, 7, 11,13,17 19, 23. Ett andragradspolynom Ett tiogradspolynom Ett tredjegradspolynom

Programmering A. Johan Eliasson

Föreläsning 13 och 14: Binära träd

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Tentaupplägg denna gång

4 Sammansatta datatyper

Under min praktik som lärarstuderande

kl Tentaupplägg

8-1 Formler och uttryck. Namn:.

Provivus tips om KONCENTRATION - VAD PEDAGOGEN KAN GÖRA

Introduktion till PHP

Så, med nytt (inget) hår satte jag mig på planet till Irland och Dublin!

Föreläsning 1: Momstabellen i C++

725G61 - Laboration 7 Implementation av ett API. Johan Falkenjack

Föreläsning 1 & 2 INTRODUKTION

LEGO Mindstorm-robot

Föreläsning 2: Avlusning och antilustekniker


Instruktioner för dig som ska söka till Mattekollo 2016

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Parameteröverföring. Exempel. Exempel. Metodkropp

Föreläsning 5 (6) Metoder. Metoder Deklarera. Metoder. Parametrar Returvärden Överlagring Konstruktorer Statiska metoder tostring() metoden javadoc

Översikt 732G11 PROGRAMMERING 1. Personal. Kursens mål. Litteratur. Kursens innehåll

Uppgift 1 (Oläsliga krypterade meddelanden)

Malte är snäll och rolig han är smart, vi brukar leka dinosaurier på fotbollsplan, när gympalärarn kommer så springer vi och gömmer oss i de höga

Helena. Vår vecka! Veckobrev för vecka 37. Barnen har läst läsläxan för någon vuxen och läst i sina bänkböcker.

Introduktion till arv

Tentamen i Programmering grundkurs och Programmering C

Övning: Dilemmafrågor

Chefens sju dödssynder - undvik dem och lyckas som ledare!


SLALOMINGÅNGAR hur svårt kan det vara?

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Våga Visa kultur- och musikskolor

Linköpings Tekniska Högskola Instutitionen för Datavetenskap (IDA) Torbjörn Jonsson, Erik Nilsson Lab 2: Underprogram

4-7 Pythagoras sats. Inledning. Namn:..

Uppgift 1 ( Betyg 3 uppgift )

Tentaupplägg denna gång

GOLFINSPIRATION Inledning. Släpp kontrollen

Grundläggande programmering med C# 7,5 högskolepoäng

Lära känna varandra. För äldre barn kan man ställa sig upp och passa bollen med fötterna.

Objektsamlingar i Java

EnKlass. Instans 3 av EnKlass. Instans 2 av EnKlass

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Fördjupningskurs i byggproduktion, ht 2009.

NATURVETENSKAP FÖR LIVET?

Introduktion till integrering av Schenkers e-tjänster. Version 2.0

75059 Stort sorteringsset

1. Att lyssna 1. Titta på den som talar. 2. Tänk på vad som sagts. 3. Vänta på min tur att prata. 4. Säg det jag vill säga. 1.

kl Tentaupplägg

DSV A Procedurell programmering 5 poäng Tentamen

Förberedelser: Sätt upp konerna i stigande ordningsföljd (första inlärningen) eller i blandad ordningsföljd (för de elever som kommit längre).

Demokratifesten. årsmöte för lokalgruppen

Fråga, lyssna, var intresserad

Transkript:

Föreläsning 4: Poster Följande är genomgånget: type Person_Type is Namn : String(30); Skonr : Float; Kon : Boolean; Diskussion runt detta med olika typer m.m. Har tagit upp vilka operationer man kan göra på en post. Tilldelning, likhet, åtkomst av delar av posten. Utvidgning: type Person_Type2 is Namn : String(30); Skonr : Float; Kon : Boolean; Barn : Person_Typ; Pratat om att man inte kan använda sig av en typ innan den är färdigdeklarerad m.m. Åtkomst av första tecknet i barnets namn m.m. Angående strängar har jag tagit upp: X := Integer'Value(Str(1..2)); D.v.s. Konvertering från sträng till heltal samt delsträngar. Attributet Value till typen Integer. Sagt att det är ovanligt att använda typer mellan "" och "end", men att detta var ett tillfälle. Övning på lektion Uppgift 1: Skapa en datatyp som motsvarar ett komplext tal på formen "A + Bi". Går att lösa med strängar, fält m.m., men vi vill ha en post. Hur gör man? Blir säkert lite frågor kring om man skall lagra "+" och "i", men detta är ju onödigt. Dessa är ju bara till för att visa för oss användare vad det är för typ av tal. Det räcker med talen "A" och "B". Vi kan använda "Float" eller "Integer". Det spelar ingen roll, men jag brukar styra det till "Integer" för att sen få det lättare vid inläsningen. Vi får förhoppningsvis fram: type Complex_Type is Re : Integer; Im : Integer;

Uppgift 2: Skriv ett program som läser in två komplexa tal och summerar dessa och skriver ut summan. Skall lösas med underprogram. De kommer säkert fram till att man skall göra något i stil med följande i huvudprogrammet. Åtminstone efter lite diskussioner fram och tillbaka. with Ada.Text_IO; use Ada.Text_IO; procedure Complex_Summary is type... Enligt ovan. A, B, Sum : Complex_Type; Put("Mata in..."); Get(A); Get(B); Sum := Add(A, B); Put("Summan blev "); Put(Sum); New_Line; end Complex_Summary; Nu måste vi dock skapa en egen "Get", en "Add" och en "Put" för att klara av detta. Vi fixar dessa genom lite diskussion med studenterna. procedure Get(Item : out Complex_Type) is Ch : Character; Get(Item.Re); Get(Ch); Tar bort '+'. (Nödvändigt?) Get(Item.Im); Get(Ch); Tar bort 'i'. end Get; Varför skall 'i' läsas bort? Varför skall detta skrivas? Dessa frågor dyker (nästan) alltid upp. Svar: Man vill givetvis mata in talet som man ser det rent matematiskt och programmet måste då se till att det läser in allt som har med ett komplext tal att göra så att nästa inmatning ("Get") kan ta nästa data utan att det ligger "skrot" kvar. Ovanstående "Get" brukar de komma fram till. Jag visar ofta en annan variant där man sätter lite hårdare begränsingar på inmatningen, men som ger lite övning på "Integer'Value" som ser ut på följande sätt.

procedure Get(Item : out Complex_Type) is Str : String(1..6); Kräver att data matas in på formen: "NN+NNi" Get(Str); Konvertering till post. Item.Re := Integer'Value(Str(1..2)); Item.Im := Integer'Value(Str(4..5)); end Get; De vet om detta och kan själva få ge tips om hur man skriver satserna för att göra de olika delarna. Ibland frågar de varför man gör på detta vis och då kan man säga att det kan finnas tillfällen då man kanske måste ge ett visst format på indata för att det skall bli lättare att lösa problemet för programmeraren, men att det i idealfallet inte borde vara så. Nu skall vi kanske skapa "Put": Det var ju inte så svårt. procedure Put(Item : in Complex_Type) is Ada.Integer_Text_IO.Put(Item.Re, Width => 2); Ada.Text_IO.Put('+'); Ada.Integer_Text_IO.Put(Item.Im, Width => 2); Ada.Text_IO.Put('i'); end Put; Vi går in på "Add". Här får de tänka lite på hur parametrar m.m. skall skickas och vad som skall returneras, men det är inga konstigheter. Behövs dock en lokal variabel. function Add(A, B : in Complex_Type) C.Re := A.Re + B.Re; C.Im := A.Im + B.Im; end Add; Nu kommer man till detta med vilka paket som programmet måste inkludera. Det saknas åtminstone "Ada.Integer_Text_IO". De kan ju få fundera på detta. Efter detta modifierar jag uppgiften och säger att jag vill ha en funktion som multiplicerar istället för adderar. Hur löser de detta? Konstigt nog har de ofta problem med detta. Låt dem hjälpa till och fundera utan att stressa dem.

function Multiply(A, B : in Complex_Type) C.Re := (A.Re * B.Re) (A.Im * B.Im); C.Im := (A.Re * B.Im) + (A.Im * B.Re); end Multiply; Nu kanske man inte vill anropa dessa funktioner ("Add" och "Mult") så som de är gjorda just nu. Man vill väl normalt sett kunna utföra en "normal" addition med "+". Hur gör vi då? Vi bara byter ut "Add" mot ""+"" (ser lite roligt ut i denna text, men...) och på motsvarande sätt för "Mult". function "+"(A, B : in Complex_Type) C.Re := A.Re + B.Re; C.Im := A.Im + B.Im; end "+"; På detta sätt kan vi anropa "funktionen" (eller operatoröver-lagringen som det egentligen heter) på följande sätt.... Sum := A + B;... end...; Mycket trevligt då detta ser ut som i matematiken. Lite magiskt, men trevligt. Uppgift 3: Skapa ett paket av det vi gjort som har med komplexa tal att göra så att vi kan använda det i ett annat program senare.

Börja med att plocka ut det som skall till "ads"-filen, d.v.s. typer och underprogramsdeklarationer (eventuellt konstanter). package Complex_Handling is type Complex_Type is Re : Integer; Im : Integer; procedure Get(Item : out Complex_Type); procedure Put(Item : in Complex_Type); function "+"(A, B : in Complex_Type) return Complex_Type; function "*"(A, B : in Complex_Type) return Complex_Type; Diskussion om att kanske ha med jämförelseoperatorer... function ">"(A, B : in Complex_Type) return Complex_Type; end Complex_Handling;

Fortsätt sen med "adb"-filen. package body Complex_Handling is procedure Get(Item : out Complex_Type) is Ch : Character; Get(Item.Re); Get(Ch); Tar bort '+'. (Nödvändigt?) Get(Item.Im); Get(Ch); Tar bort 'i'. end Get; procedure Put(Item : in Complex_Type) is Ada.Integer_Text_IO.Put(Item.Re, Width => 2); Ada.Text_IO.Put('+'); Ada.Integer_Text_IO.Put(Item.Im, Width => 2); Ada.Text_IO.Put('i'); end Put; function "+"(A, B : in Complex_Type) C.Re := A.Re + B.Re; C.Im := A.Im + B.Im; end "+"; function "*"(A, B : in Complex_Type) C.Re := (A.Re * B.Re) (A.Im * B.Im); C.Im := (A.Re * B.Im) + (A.Im * B.Re); end "*"; end Complex_Handling;

Hur gör man för att använda detta paket från huvudprogrammet är nästa fråga. Skriv ett huvudprogram som klarar biffen. with Ada.Text_IO; use Ada.Text_IO; with Complex_Handling; use Complex_Handling; procedure Complex_Summary is A, B, Sum : Complex_Type; Put("Mata in..."); Get(A); Get(B); Sum := A + B; Put("Summan blev "); Put(Sum); New_Line; end Complex_Summary; Lite illa gjort paket fortfarande: Vi vill nog ha datatypen privat. Hur gör vi då? Vi "rättar" bara i "ads"-filen. Inget händer någon annanstans. package Complex_Handling is type Complex_Type is private; procedure Get(Item : out Complex_Type); procedure Put(Item : in Complex_Type); function "+"(A, B : in Complex_Type) return Complex_Type; function "*"(A, B : in Complex_Type) return Complex_Type; private type Complex_Type is Re : Integer; Im : Integer; end Complex_Handling; Vad innebär detta för oss i paketet? Vad innebär det för den som skriver huvudprogrammet? Bra frågor som ni bör diskutera (även om jag gjort det på FÖ redan). I paketet innebär det att vi slipper göra felkontroller på de data som ligger i vår "datatyp" (eller rättare sagt i de olika variabler som kommer in till våra rutiner). I huvudprogrammet innebär det att det blir otillåtet att t.ex. försöka ändra variabler av vår datatyp på annat sätt än genom att anropa våra rutiner i paketet. Detta leder till att programmeraren som skriver huvudprogrammet inte kan ställa till det för oss (och sig själv i slutänden).

I vissa fall kan det dock vara trevligt att inte göra en typ privat. Det kan ju vara så att man vill att huvudprogrammet skall kunna påverka datat utan att behöva använda sig av de rutiner som finns i paketet. Om det är så får man dock hantera de eventuella situationer som kan uppstå när man skickar in data till rutinerna så att man inte får programmet att "krascha". Man bör dock tänka igenom detta noggrant innan man sätter en typ helt synlig så att man inte skapar sig en massa problem framöver. Finns det tid över kan det vara trevligt att leka med "<". Om man gör denna "korrekt" krävs att man har tillgång till både "**" och "Sqrt". Finns i "Ada.Numerics.Elementary_Functions" (eller i "Ada.Numerics.Generic_Elementary_Functions" om man vill leka med instansiering :-). Jämförelsen "<" bygger på beloppet av det komplexa talet och alla vet ju hur man räknar ut detta (ingår i "grunken" har jag för mig :-). Man kan dock fuska lite och skippa "Sqrt" då det räcker att jämföra de båda kvadraterna, men då blir det inte lika roligt längre. Dock kan det vara på sin plats att vid detta tillfälle ta upp att det är ett sådant läge där man skriver en extra kommentar i koden som anger att man har gjort saker som gör koden mer effektiv och hur man gjort detta.