![]() | 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 |