Companion code · Chapter 3

Control Flow, Functions, Recursion, and Counting Operations

3 files. About this chapter.

Download ch03.zip

ch03/fact_agent.c17 lines
#include <stdio.h>

long factorial(int n) {
    if (n == 0) {
        return 1;
    }
    return n * factorial(n - 1);
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1) {
        return 1;
    }
    printf("%d! = %ld\n", n, factorial(n));
    return 0;
}
ch03/lab3_counts.c49 lines
#include <stdio.h>
#include <stdlib.h>

long loop_a(int n) {                 /* every other value */
    long count = 0;
    for (int i = 0; i < n; i += 2) {
        count++;
    }
    return count;
}

long loop_b(int n) {                 /* inner starts at i */
    long count = 0;
    for (int i = 0; i <= n; i++) {
        for (int j = i; j < n; j++) {
            count++;
        }
    }
    return count;
}

long loop_c(int n) {                 /* skip the diagonal */
    long count = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (i != j) {
                count++;
            }
        }
    }
    return count;
}

int main(int argc, char *argv[]) {
    printf("%5s %8s %8s %8s\n", "n", "A", "B", "C");
    if (argc > 1) {                  /* ./lab3_counts 3 */
        int n = atoi(argv[1]);
        printf("%5d %8ld %8ld %8ld\n",
               n, loop_a(n), loop_b(n), loop_c(n));
        return 0;
    }
    for (int n = 1; n <= 1000; n *= 10) {
        printf("%5d %8ld %8ld %8ld\n",
               n, loop_a(n), loop_b(n), loop_c(n));
    }
    printf("%5d %8ld %8ld %8ld\n",
           7, loop_a(7), loop_b(7), loop_c(7));
    return 0;
}
ch03/running.c27 lines
#include <stdio.h>

static long sample_calls = 0;

/* Stand-in for reading one minute from the logger. */
double sample(int minute) {
    sample_calls++;
    return 20.0 + (minute % 7) * 0.25;
}

void running_means(int minutes) {
    for (int i = 1; i <= minutes; i++) {
        double sum = 0.0;
        for (int j = 1; j <= i; j++) {
            sum += sample(j);
        }
        if (i % 480 == 0) {
            printf("minute %4d: mean %.3f\n", i, sum / i);
        }
    }
}

int main(void) {
    running_means(1440);
    printf("sample() called %ld times\n", sample_calls);
    return 0;
}