Programexempel från Progmet-föreläsning 2, onsdag 3 september 2008 ================================================================== Abstrakt datatyp ---------------- "Abstrakt datatyp" = datatyp med tillhörande funktioner Exempel: struct Person, skriv_person, ... Jämför med: int, +, -, ... typedef ------- typedef int foo; // "foo" blir ett alias för "int" char x[17]; // "x" är en variabel, som är en array av 17 char typedef char x[17]; // "x" är ett alias för "array av 17 char" x olle; // Betyder: "olle" är en variabel, som är en array av 17 char // Här skapar vi datatypen "struct Person" struct Person { int nr; char namn[35 + 1]; }; struct Person Person; // "Person" är en variabel av typen "struct Person" typedef struct Person Person; // "Person" är ett alias för "struct Person" // Här skapar vi datatyperna "struct Person" och "Person" typedef struct Person { int nr; char namn[35 + 1]; } Person; // Här skapar vi datatypen "Person" typedef struct { int nr; char namn[35 + 1]; } Person; Generellt bibliotek i C ----------------------- Ny version av Person.h ---------------------- // Person.h struct Person { int nr; int alder; char namn[35 + 1]; }; void skriv_person(struct Person p); int yngre_person(struct Person p1, struct Person p2); Ny version av Person.c ---------------------- // Person.c #include #include "Person.h" void skriv_person(struct Person p) { printf("Nr: %d\n", p.nr); printf("Ålder: %d\n", p.alder); printf("Namn: %s\n", p.namn); } int yngre_person(struct Person p1, struct Person p2) { return p1.alder < p2.alder; } dvek.h ------ // dvek.h #include "Person.h" typedef struct Person dtyp; dtyp dvekmin(dtyp dvek[], int antal, int (*mindre)(dtyp d1, dtyp d2)); dtyp dvekmax(dtyp dvek[], int antal, int (*mindre)(dtyp d1, dtyp d2)); dvek.c ------ // dvek.c #include "dvek.h" dtyp dvekmin(dtyp dvek[], int antal, int (*mindre)(dtyp d1, dtyp d2)) { dtyp min = dvek[0]; for (int i = 1; i < antal; ++i) { if (mindre(dvek[i], min)) min = dvek[i]; } return min; } dtyp dvekmax(dtyp dvek[], int antal, int (*mindre)(dtyp d1, dtyp d2)) { dtyp max = dvek[0]; for (int i = 1; i < antal; ++i) { if (mindre(max, dvek[i])) max = dvek[i]; } return max; } dvekmain.c ---------- // dvekmain.c #include #include "Person.h" #include "dvek.h" int main(void) { struct Person a[17]; struct Person minsta; minsta = dvekmin(a, 17, yngre_person); skriv_person(minsta); struct Person storsta = dvekmax(a, sizeof a / sizeof a[0], yngre_person); skriv_person(storsta); return 0; } Bättre version av Person.h -------------------------- // Person.h #ifndef PERSON_H #define PERSON_H struct Person { int nr; int alder; char namn[35 + 1]; }; void skriv_person(struct Person p); int yngre_person(struct Person p1, struct Person p2); #endif Makefile -------- CC = gcc CFLAGS += -Wall -std=c99 LIBS += -lm OBJECTS = dvekmain.o dvek.o Person.o dvek: $(OBJECTS) $(CC) -o dvek $(OBJECTS) clean: $(RM) dvek $(OBJECTS) *~ Överkurs: Templates ("mallar") i C++ ------------------------------------ templatetest.cpp ---------------- // templatetest.cpp #include struct Person { int nr; int alder; char namn[35 + 1]; bool operator<(struct Person p2) { return this->alder < p2.alder; } bool operator>(struct Person p2) { return this->alder > p2.alder; } }; void skriv_person(struct Person p) { printf("Nr: %d\n", p.nr); printf("Ålder: %d\n", p.alder); printf("Namn: %s\n", p.namn); } template dtyp dvekmin(dtyp dvek[], int antal) { dtyp min = dvek[0]; for (int i = 1; i < antal; ++i) { if (dvek[i] < min) min = dvek[i]; } return min; } template dtyp dvekmax(dtyp dvek[], int antal) { dtyp max = dvek[0]; for (int i = 1; i < antal; ++i) { if (dvek[i] > max) max = dvek[i]; } return max; } int main(void) { struct Person a[17]; struct Person minsta; minsta = dvekmin(a, 17); skriv_person(minsta); struct Person storsta = dvekmax(a, sizeof a / sizeof a[0]); skriv_person(storsta); return 0; }