CS 330 Lecture 17 – Higher-order functions
Agenda
- program this
- the strategy pattern
- enums in C
- function pointers
- GLUT callbacks
- Expat callbacks
TODO
- http://www.json.org/xml.html
- http://www.codinghorror.com/blog/2008/05/xml-the-angle-bracket-tax.html
- http://c2.com/cgi/wiki?XmlSucks
Program This
With a neighbor, write a short C function that chooses a random number between 0 and 100 and lets a computer player guess until it picks the right answer.
Code
guess_a_number.c
#include <stdio.h>
#include <stdlib.h>
/* ------------------------------------------------------------------------- */
enum feedback_t {
NO_FEEDBACK,
TOO_LOW,
TOO_HIGH,
JUST_RIGHT
};
/* ------------------------------------------------------------------------- */
int get_guess_random(enum feedback_t feedback) {
return (int) (rand() / (float) RAND_MAX * 100.0f);
}
/* ------------------------------------------------------------------------- */
int get_guess_linear(enum feedback_t feedback) {
static int my_last_guess = -1;
++my_last_guess;
return my_last_guess;
}
/* ------------------------------------------------------------------------- */
#if 0
int get_guess(enum feedback_t feedback) {
static int my_last_guess = -1;
if (feedback == NO_FEEDBACK) {
my_last_guess
return 50;
} else if (feedback == TOO_LOW) {
return
}
}
#endif
/* ------------------------------------------------------------------------- */
void play(int (*get_guess)(enum feedback_t feedback)) {
int answer = (int) (rand() / (float) RAND_MAX * 100.0f);
int guess = -1;
int ntries = 0;
enum feedback_t feedback = NO_FEEDBACK;
while (feedback != JUST_RIGHT) {
++ntries;
guess = get_guess(feedback);
if (guess < answer) {
feedback = TOO_LOW;
} else if (guess > answer) {
feedback = TOO_HIGH;
} else {
feedback = JUST_RIGHT;
}
}
printf("ntries: %d\n", ntries);
}
/* ------------------------------------------------------------------------- */
int main(int argc, char **argv) {
srand(time(NULL));
play(get_guess_linear);
play(get_guess_random);
return 0;
}
Haiku
SETI: waste of time.
Random function pointers: sweet!
Garbage can be smart.
Random function pointers: sweet!
Garbage can be smart.