8d. Simpele vector

2021-02-28
slides.com/jod/pt_8d

Docent: Jo Devriendt

Assistent: Ann Philips

Coördinator: Joost Vennekens

voornaam.achternaam@kuleuven.be

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Vector datastructuur

Vector == array van veranderlijke grootte

// aanmaken
Vector create();
// vrijgeven
void destroy(Vector* v);
// waarde toekennen op index i
void set(Vector* v, int i, double x);
// waarde opvragen van index i
double get(Vector* v, int i);
  • Simpel geval: vector van double
  • 4 procedures:

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Vector struct

typedef struct {
  int lengte;
  double* waardes;
} Vector;

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Vector create & destroy

Vector create() {
  Vector v = {0, NULL};
  return v;
}
void destroy(Vector* v){
  if(v->waardes!=NULL){
    free(v->waardes);
    v->waardes = NULL;
    v->lengte = 0;
  }
}

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Vector set

void set(Vector* v, int i, double x){
  if(i>=v->lengte){
    v->waardes = realloc(v->waardes, 
      sizeof(double)*(i+1));
    for(int j=v->lengte; j<i; ++j){
      v->waardes[j]=0; // default
    }
    v->lengte=i+1;
  }
  v->waardes[i]=x;
}

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Vector get

double get(Vector* v, int i){
  if(i>=v->lengte){
    return 0; // default
  }else{
    return v->waardes[i];
  }
}

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

main

void main() {
  Vector v = create();
  set(&v,7,3.14);
  set(&v,0,1.62);
  printf("lengte: %d\n", v.lengte);
  for(int i=0; i<10; ++i){
    printf("element %2d: %lf\n", i, 
      get(&v,i));
  }
  destroy(&v);
  printf("lengte: %d\n", v.lengte);
}
$ ./a.out
lengte: 8
element  0: 1.620000
element  1: 0.000000
element  2: 0.000000
element  3: 0.000000
element  4: 0.000000
element  5: 0.000000
element  6: 0.000000
element  7: 3.140000
element  8: 0.000000
element  9: 0.000000
lengte: 0

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Oefening

  • Voeg een resize procedure toe die de vector verkleint/vergroot tot grootte k
  • Refactor de set-procedure om resize te gebruiken
// grootte aanpassen
void resize(Vector* v, int k);

Uitdaging: maak een tweedimensionele versie

Programmeertechnieken [B-KUL-YI0855]

De Nayer, IIW, E-ICT, 2Ba + schakel, 2020-2021

Samenvatting

  • Een vector is een dynamische array
  • Makkelijk om mee te werken
  • Minder efficient, want gebruikt heap-geheugen ipv stack-geheugen

8d. Simpele vector

By Jo Devriendt

8d. Simpele vector

  • 561