/* fib-command-line.c -- Fibonacci-Zahlen, Kommandozeilenargumente */

#include <stdio.h>

unsigned int fibonacci (unsigned int n)
{
  if (n == 0) return 0;
  else if (n == 1) return 1;
  else {
    unsigned int a = 0;
    unsigned int b = 1;
    unsigned int i = 2;
    while (i <= n) {
      /* Invariante: a == F(i-2) und b == F(i-1) */
      unsigned int sum = a + b;
      a = b;
      b = sum;
      i = i + 1;
      /* Wieder korrekt */
    }
    /* Hier ist i == n + 1, also b == F(n) */
    return b;
  }
}

void print_usage()
{
  fprintf(stderr, "usage: fib-command-line INDEX\n");
}

int main (int argc, char **argv)
{
  unsigned int n;

  /* Sicherstellen, dass genau ein Kommandozeilenargument uebergeben
     wurde. */
  if (argc != 2) {
    print_usage();
    return 1;
  }

  /* Eine Zahl aus dem Kommandozeilenargument lesen. */
  if (sscanf(*(argv+1), "%u", &n) != 1) {
    print_usage();
    return 1;
  }

  /* Berechnen und ausgeben. */
  printf("F(%u) = %u\n", n, fibonacci(n));
  
  return 0;
}
