Värmdö Gymnasium Datainstitutionen Programmering A 040108 Lektion C4 Fält Fält = Lista = Array (engelska) Ofta har man behov av att arbeta med långa listor med tal. Istället för att skapa en variabel för varje tal så är det möjligt att arbeta med en variabel som istället innehåller möjligheten att lagra flera tal. Man kallar sådana här variabler med ”flera fack” för fält, lista eller det engelska uttrycket array. Man kan jämföra dem med en hylla som har flera, numrerade fack, eller rent av med en gatuadress (gatunamn och husnummer). För att få tag i ett av de värden man lagrat i listan anger du namnet på variabeln (hyllan, gatunamnet) och fackets nummer eller index (hyllnummer, husnummer). Ex. Tidigare: int tal1, tal2, tal3, tal4, tal5; Nu: int talserie[5]; // Här i deklarationen anger siffran inom hakparenteserna antal element i fältet. 0 1 2 3 4 talserie Den senare deklarationen skapar fem "fack" direkt. För att komma åt innehållet i ett "fack" skulle du ju ange fackets nummer (index), men observera att numreringen börjar på 0, vilket gör att i ett fält med fem element får du indexnumren 0-4. Säg t.ex. att du vill tilldela det tredje facket värdet 31, vilket du gör med följande kod: talserie[2]=31; OBS! Ingen kontroll sker av ditt värde inom hakparenteserna, så det hänger på dig som programmerare att vara vaksam. När du kompilerar ditt program säger kompilatorn inget om du skrivit ett för stort index, t.ex. talserie[55]=1; men när du kör programmet är det stor risk att det kraschar. Datorn tar det ställe i minnet där "fack" 55 skulle ha legat om det hade funnits, och då finns det stora chanser till att någonting viktigt för systemet skrivs över. Det är inte bara int som kan användas för att skapa fält, utan du kan skapa fält av godtyckliga typer, t.ex. double temperaturer[10]; float medelvärden[3]; int dagar[7]; Du kan också initiera ett fält direkt i deklarationen, t ex tal[4]={4,3,2,1}; Här skulle du kunna utelämna antalet fack i deklarationen och skriva tomma hakparenteser. För här ser den ju hur många element som fältet består av. Sida 1 (3) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Ex 1 : #include <iostream> #include <stdlib.h> using namespace std; int main( ) { int lista[5], i, summa=0; //***** läs in 5 heltal ***** for (i=0; i<5; i++) { cout<<” Ange ett heltal: ”; cin>>lista[ i ]; } //***** summera de 5 talen och skriv ut summan ***** for ( i=0; i<5; i++) summa=summa+lista[ i ]; cout<<” Summan av de 5 talen = ”<<summa<<endl; //***** öka på de 5 talen med värdet 2 och skriv ut de nya talen ***** for ( i=0; i<5; i++) { lista[ i ]+=2; cout<<” Element ”<<i<<” = ”<<lista[ i ]<<endl; } system(“PAUSE”); return 0; } Feltyper Det viktigt att du lär dig både att hitta och rätta fel. Som programmerare kan du råka ut för olika typer av fel: Kompileringsfel Syntax(språkregler)-fel som kompilatorn upptäcker. T ex semikolon, en klammer saknas eller stavfel på en variabel. Exekveringsfel Fel som uppstår först när du kör programmet. T ex när du indexerar utanför ett fält (se ex ovan) och det området är "förbjudet område" i minnet. Logiska fel Fel som hittas genom att kontrollera resultatet vid en körning och genom extra kör tester där man matar in viss indata och kontrollerar utdata. Dessa fel är ofta felaktiga algoritmer, feltankar av programmeraren. Anta t.ex. att du skrivit följande program: float area, x, y; cout<<"Ge sidorna."; cin>>x>>y; area = x+y; cout<<"Arean är: "<<area; När du kör programmet matar du in: 2 2 Programmet skriver: Arean är: 4 vilket du kanske skulle ta som ett bevis på att programmet är ok, men med andra indata, t.ex. 2 3, skulle du få arean 5, vilket inte är helt rätt… Du måste alltid testa olika möjliga indata. Sida 2 (3) Värmdö Gymnasium Datainstitutionen Programmering A 040108 Öva Använd fält när du löser nedanstående övningar. Övning C4.1 Läs in 7 tal och skriv ut dem i omvänd ordning, d.v.s. med det sjunde talet först och det första sist. Övning C4.2 Läs in 10 st tal. Lagra dessa i en array. Läs in ytterligare ett tal, kontrollera och skriv ut hur många av de tidigare talen som är större än detta tal. Övning C4.3 Läs in 10 domarsiffror i backhoppning, alla givna med en decimal. Beräkna och skriv ut slutpoängen, som är lika med medelvärdet av de 8 som är kvar då det största och det minsta värdet tagits bort. Övning C4.4 Ofta har man behov av att ordna stora fält, och att kunna sortera fält är mycket användbart. Det finns olika sorteringsalgoritmer som har olika för- och nackdelar vad det gäller t.ex. läsbarhet, snabbhet etc. T ex finns metoderna sök minsta och byt, en annan är bubbelsortering. Försök lösa denna uppgift genom att fundera själv. Läs in sju heltal. Skriv ut dessa i stigande ordning. Minitest G-nivå: 1. 2. 3. 4. Om man skriver följande deklarationsats. Hur många "lådor" deklarerar man? Om du vill lägga in talet 55 i den första lådan hur skriver du? Om du vill lägga in talet 33 i den sista lådan hur skriver du? Nämn 3 olika feltyper som kan inträffa när du "proggar". int talserie[7]; VG-nivå: 1. 2. Skriv ett program som läser in 10 domarsiffror, alla givna med en decimal. Beräkna medelvärdet och skriv ut hur många domarsiffror som är större än medelvärdet. 3 olika feltyper som kan inträffa när du "proggar". Förklara vad dessa tre feltyper betyder och ge ett exempel på fel som kan inträffa för varje feltyp. MVG-nivå: 1. Skriv ett program som läser in 10 domarsiffror, alla givna med en decimal. Sortera sen listan och skriv ut den. Läxa: Läs detta häfte och gör minitestet. Sida 3 (3)