This is an old revision of the document!


Loop invariants

1. Pentru următorii algoritmi, demonstrați corectitudinea, alegând corect precondiția, postcondiția și invariantul și demonstrând cele patru proprietăți (initialization, maintenance, postcondition, termination).

// găsește indexul celui mai mic element din arr
int find_min(int *arr, int n)
{
        int min_idx = 0;
        int i = 1;
        while (i < n) {
                if (arr[i] < arr[min_idx])
                        min_idx = i;
 
                i++;
        }
 
        return min_idx;
}
// calculate the sum of all positive integers up to and including n
int integer_sum(int n)
{
        int i = 0;
        int sum = 0;
        while (i < n) {
                i++;
                sum += i;
        }
 
        return sum;
}
// calculează b la puterea e
int pow(int b, int e)
{
        int x = b;
        int y = e;
        int r = 1;
        while (y > 0) {
                if (y % 2 == 1)
                        r = r * x;
 
                y = y / 2;
                x = x * x;
        }
 
        return r;
}
// inserează valoarea x în array-ul sortat arr (arr are un extra "slot" alocat la final)
void insert(int *arr, int n, int x)
{
        int i = n;
        while (i > 0 && arr[i - 1] > x) {
                arr[i] = arr[i - 1];
                i--;
        }
        arr[i] = x;
}