![]() ![]() ![]() | Datastrukturer og Dataabstraktion |
Vi så i afsnit 39.8 at structures kan indeholde felter som er andre structures. Temaet i dette kapitel er structures som elementer i arrays. Generelt er der fri datastruktur kombinationsmulighed i C.
|
40.1. Array af bøger
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
Array-begrebet blev introduceret i kapitel 21. Et array kan opfattes som en tabel af elementer, hvor alle elementer er af samme type.
Vi vil nu se på situationen, hvor elementerne i et array er stuctures. Vores første eksempel er et array af bøger, som intuitiv svarer til en bogreol. Vi erindrer om, at en bog repræsenteres som en structure, jf. vores diskussion i afsnit 39.6.
I program 40.1 ser vi på det røde sted erklæringen af 'bogreolen' kaldet shelf. shelf er netop et array af book, hvor book ligesom i program 39.6 er et alias for struct book.
På de brune, blå og lilla steder i main initialiseres shelf[1], shelf[2] og shelf[3] på lidt forskellig vis (med det formål at illustrere forskellige muligheder). shelf[2] er i udgangspunktet en kopi af shelf[1], som dernæst modificeres fra 'Pelle Erobreren' til 'Ditte Menneskebarn'.
Til sidst i main udskrives bøgerne i shelf med prnt_book, som vi allerede mødte i program 39.6.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int main(void) { book shelf[MAX_BOOKS]; int i; shelf[0] = make_book("C by Disssection", "Kelley & Pohl", "Addison Wesley", 2001, 1); shelf[1] = make_book("Pelle Erobreren", "Martin Andersen Nexoe", "Gyldendal", 1910, 0); shelf[2] = shelf[1]; shelf[2].title = "Ditte Menneskebarn"; shelf[2].publishing_year = 1917; for(i = 0; i <=2; i++) prnt_book(shelf[i]); return 0; } | |||
|
Via den tilknyttede slide kan man få adgang til et komplet C program, som dækker program 40.1. Alternativt kan du bruge dette direkte link.
40.2. Arrays af datoer: Kalender
Indhold Op Forrige Næste Slide Aggregerede slides Stikord Programindeks Opgaveindeks
I forlængelse af dato strukturen fra afsnit 39.5 ser vi nu på en tabel af datoer. En sådan tabel kan fortolkes som en kalender.
På det røde sted i program 40.2 erklæres calender variablen som et array med plads til 1000 datoer. Der er ligesom for shelf i program 40.1 tale om statisk allokering (jf. afsnit 26.1) hvilket indebærer at lageret til tabellerne allokeres når funktionen main kaldes.
I while-løkken gennemløbes et helt år, med start i first_date. Hver dato i året puttes i kalenderen. Bemærk at der er god plads. Fremdriften i kalenderen, som er en lidt tricket detalje, bestyres af funktionen tomorrow. Det er en god programmeringsøvelse at lave denne funktion.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | int main(void) { date calendar[1000]; date first_date = {thursday, 14, 4, 2005}, last_date = {thursday, 13, 4, 2006}, current_date; int i = 0, j = 0; current_date = first_date; while (date_before(current_date, last_date)){ calendar[i] = current_date; current_date = tomorrow(current_date); i++; } for (j = 0; j < i; j++) prnt_date(calendar[j]); } | |||
|
Hele programmet (dog uden tomorrow) kan tilgås via den tilknyttede slide. Alternativt kan du bruge dette direkte link. Hele programmet inklusive tomorrow er tilgængelig som en løsning på opgave 9.1.
Opgave 9.1. Funktionen tomorrow Implementer funktionen tomorrow, som er illustreret på den omkringliggende side. Funktionen tager en dato som parameter, og den returnerer datoen på den efterfølgende dag. Hint: Lad i udgangspunktet resultatet være den overførte parameter, og gennemfør (pr. assignment til enkelte felter) de nødvendige ændringer.Løsning |