15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  methods/iterate.c
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  Calculate the sum of a given range of integer numbers.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This particular method of implementation works by way of brute force,
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  i.e. it iterates over the entire range while adding the numbers to finally
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  get the total sum. As a positive side effect, we're able to easily detect
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  overflows, i.e. situations in which the sum would exceed the capacity
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  of an integer variable.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdio.h>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <stdlib.h>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "iterate.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int iterate_get_sum (int min, int max)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	int i, total;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	total = 0;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	/* This is where we loop over each number in the range, including
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	   both the minimum and the maximum number. */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	for (i = min; i <= max; i++)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	{
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* We can detect an overflow by checking whether the new
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		   sum would become negative. */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		if (total + i < total)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		{
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			printf ("Error: sum too large!\n");
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			exit (1);
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		/* Everything seems to fit into an int, so continue adding. */
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		total += i;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	return total;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
46