Contactmoment
8 maart

slides.com/jod/pt_maa_08

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

Contactmoment 8 maart

Programmeertechnieken [B-KUL-YI0855]

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

Onderwerpen:

  • 9a. Lineaire datastructuren
  • 9b. Gelinkte lijsten
  • 9c. Stacks
  • 9d. Queues

Uitsmijter om 9:50 : Vraagstukken

Programmeertechnieken [B-KUL-YI0855]

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

(1) Na testen van je programma blijkt dat de methode verwijderTiende zeer vaak opgeroepen wordt, en die methode wil je versnellen.

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

double verwijderTiende(Vector* v){
  if(v->lengte<10) return 0;
  double result = v->waardes[9];
  v->lengte-=1;
  // schuif alle volgende waardes eentje naar voor
  for(int i=9; i<v->lengte; ++i){
    v->waardes[i]=v->waardes[i+1];
  }
  return result;
}

verwijderTiende verwijdert het tiende getal uit een sequentie, en behoudt de volgorde van alle andere getallen. Je besluit een andere lineaire datastructuur te gebruiken. Welke kies je? Als de sequentie n getallen bevat, geef een ruwe schatting van het aantal operaties voor elke oproep van verwijderTiende met de andere lineaire datastructuur.

Programmeertechnieken [B-KUL-YI0855]

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

(2) Stel dat de methode niet verwijderTiende was, maar verwijderMiddelste, en de volgorde niet behouden hoeft te worden?

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

double verwijderMiddelste(Vector* v){
  if(v->lengte==0) return 0;
  int midden = v->lengte/2;
  double result = v->waardes[midden];
  v->lengte-=1;
  // schuif alle volgende waardes eentje naar voor
  for(int i=midden; i<v->lengte; ++i){
    v->waardes[i]=v->waardes[i+1];
  }
  return result;
}

Programmeertechnieken [B-KUL-YI0855]

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

typedef struct node {
  double d;
  struct node *volgende;
} Node;

void verwijderVolgende(Node* n){
  if(n==NULL || n->volgende==NULL){
    return; // geen volgende
  }else{
    Node* teVerwijderen = n->volgende;
    n->volgende = teVerwijderen->volgende;
    free(teVerwijderen);
  }
}

double verwijderTiende(Node* n){
  for(int i=0; i<9 && n!=NULL; ++i){
    n = n->volgende;
  }
  if(n==NULL || n->volgende==NULL) return 0;
  double result = n->volgende->d;
  verwijderVolgende(n);
  return result;
}

Programmeertechnieken [B-KUL-YI0855]

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

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

double verwijderMiddelste(Vector* v){
  if(v->lengte==0) return 0;
  int midden = v->lengte/2;
  double result = v->waardes[midden];
  v->lengte-=1;
  v->waardes[midden]=v->waardes[v->lengte];
  return result;
}

Contactmoment 8 maart

By Jo Devriendt

Contactmoment 8 maart

  • 541