Opgaver i denne lektion   Gå til annoteret slide, hvor denne opgave er tilknyttet -- Tastaturgenvej: 'u'   Alfabetisk indeks   Kursets hjemmeside   

Opgaveløsning:
Brug af assert i 'uger, dage, timer, minutter og sekunder' opgaven


Her er min løsning:

#include <stdio.h>
#include <assert.h>

#define MINUTES_PER_HOUR 60
#define HOURS_PER_DAY 24
#define DAYS_PER_WEEK 7
#define SECONDS_PER_MINUTE 60
#define SECONDS_PER_HOUR (SECONDS_PER_MINUTE * MINUTES_PER_HOUR)
#define SECONDS_PER_DAY (SECONDS_PER_HOUR * HOURS_PER_DAY)
#define SECONDS_PER_WEEK (SECONDS_PER_DAY * DAYS_PER_WEEK)

int main(void){
  int input_seconds,
      weeks, days, seconds, minutes, hours, rest_seconds;

  /* Prompt for input: */
  printf("Read a non-negative number of seconds: ");
  scanf("%d", &input_seconds);

  /* Calculate the weeks */
  weeks = input_seconds / SECONDS_PER_WEEK;
  rest_seconds = input_seconds % SECONDS_PER_WEEK;

  /* Calculate the days (in the interval 0..6) */
  days = rest_seconds / SECONDS_PER_DAY;
  rest_seconds = rest_seconds % SECONDS_PER_DAY;           /* this is a new rest_seconds. The rest_seconds variable is reused */
  assert(days >= 0 && days < DAYS_PER_WEEK);

  /* Calculate the hours (in the interval 0..23) */
  hours = rest_seconds / SECONDS_PER_HOUR;
  rest_seconds =  rest_seconds % SECONDS_PER_HOUR;
  assert(hours >= 0 && hours < HOURS_PER_DAY);

  /* Calculate the minutes (in the interval 0..59) and the remaining seconds (in the interval 0..59) */
  minutes = rest_seconds / SECONDS_PER_MINUTE;
  seconds = rest_seconds % SECONDS_PER_MINUTE;
  assert(minutes >= 0 && minutes < MINUTES_PER_HOUR);
  assert(seconds >= 0 && seconds < SECONDS_PER_MINUTE);

  assert(input_seconds == weeks * SECONDS_PER_WEEK + days * SECONDS_PER_DAY + hours * SECONDS_PER_HOUR + minutes * SECONDS_PER_MINUTE + seconds);

  /* Print the results: */
  printf("%d seconds correspond to %d weeks, %d days, %d hours, %d minutes and %d seconds\n",
         input_seconds, 
         weeks, days, hours, minutes, seconds);

  return 0;
}

Bemærk lige, at det er blevet attraktivt at tilføje endnu flere symbolske konstanter.