OnlineGDB

Na stronie https://www.onlinegdb.com/online_c_compiler znajduje się darmowy kompilator języka C. Podobnych stron jest więcej, mogą one być przydatne do uruchomienia i przetestowania prostych programów, a w przypadku akurat tej strony, także do debugowania.

Debugowanie

Debugowanie to szukanie błędów w programie. Większość języków programowania oferuje możliwość uruchomienia programów w specjalnym trybie, który może być pomocny w szukaniu błędów - tzn tryb Debug. W przypadku języka C służy do tego program GDB, który sam w sobie ma tylko interfejs tekstowy, ale np CLion oraz OnlineGDB mają na niego swoje nakładki graficzne.

Kod z zajęć

#include <stdio.h>

#define MAX_ARRAY_SIZE 5

int scan_number() {
    int x;
    scanf("%d", &x);
    return x;
}

void print(int x) {
    printf("%d\n", x);
}

void add_two_numbers() {
    int a = scan_number();
    int b = scan_number();
    print(a + b);
}

void swap(int array[], int x, int y) {
    int tmp = array[x];
    array[x] = array[y];
    array[y] = tmp;
}

void sort(int array[], int size) {
    for (int i = 0; i < size; i++) {
        int current_candidate = i;
        for (int j = i + 1; j < size; j++) {
            if (array[current_candidate] > array[j]) {
                current_candidate = j;
            }
        }
        if (current_candidate != i) {
            swap(array, i, current_candidate);
        }
    }
}

void sorting() {
    int array[MAX_ARRAY_SIZE];
    for (int i = 0; i < MAX_ARRAY_SIZE; i++) {
        array[i] = scan_number();
    }
    sort(array, MAX_ARRAY_SIZE);
    printf("\n\n");
    for (int i = 0; i < MAX_ARRAY_SIZE; i++) {
        print(array[i]);
    }
}

int main() {
    add_two_numbers();
    sorting();
    return 0;
}

Zadania do wykonania na zajęciach

  1. Przeczytaj obsługę debuggera w OnlineGDB - https://www.onlinegdb.com/blog/brief-guide-on-how-to-use-onlinegdb-debugger/ (debugowanie w CLionie będzie działało identycznie, chociaż layout jest oczywiście ciut inny).
  2. Wklej kod podany niżej do OnlineGDB i uruchom w zwykłym trybie (zielony guzik Run na górze strony).
  3. Upewnij się, że kod się uruchamia.
  4. Używając debuggera (niebiezki guzik Debug na górze strony) prześledź wykonanie funkcji fib_zmienne.
  5. Z pomocą debuggera napraw wszystkie błędy w kodzie tej funkcji.
  6. Porównaj złożoność czasową i pamięciową wszystkich 3 funkcji liczących wyrazy ciągu fibonacciego.
  7. Przeczytaj treść zadania 3 ze strony http://smurf.mimuw.edu.pl/node/187.
  8. Rozwiązanie tego zadania jest spisane w funkcji tree, ale do kodu wkradły się błądy. Znajdź je i napraw.

Kod do zadania na zajęciach

#include <stdio.h>

int silnia(int x) {
    int result = 1;
    for (int i = 1; i <= x; i++)
        result *= i;
    return result;
}

int silnia_rekurencja(int x) {
    if (x < 2)
        return 1;
    int y = silnia_rekurencja(x - 1);
    int result = x * y;
    return result;
}

int fib_rekurencja(int n) {
    if (n == 1)
        return 0;
    if (n == 2)
        return 1;
    int x = fib_rekurencja(n - 2);
    int y = fib_rekurencja(n - 1);
    int result = x + y;
    return result;
}

int fib(int n, int tab[]) {
    if (n == 1)
        return 0;
    if (n == 2)
        return 1;
    tab[0] = 0;
    tab[1] = 1;
    for (int i = 2; i < n; i++)
        tab[i] = tab[i - 2] + tab[i - 1];
    return tab[n - 1];
}

int fib_zmienne(int n) {
    if (n == 1)
        return 0;
    if (n == 2)
        return 1;
    int first = 0, second = 1;
    for (int i = 3; i < n; i++) {
        second += first;
        first = second;
    }
    return second;
}

void tree(int n) {
    if (n < 3)
        return;
    int width = n * 2 - 1;
    for (int i = 0; i <= n; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            printf(" ");
        }
        for (int j = 0; j < 2 * i + 1; j++) {
            printf("*");
        }
        printf("\n");
    }
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < width / 2 + 1; j++) {
            printf(" ");
        }
        printf("***");
    }
}

int main() {
    int tablica_pomocnicza[9];
    printf("%d! = %d\n", 8, silnia(8));
    printf("%d! = %d\n", 8, silnia_rekurencja(8));
    printf("fib(%d) = %d\n", 9, fib_rekurencja(9));
    printf("fib(%d) = %d\n", 9, fib(9, tablica_pomocnicza));
    printf("fib(%d) = %d\n", 9, fib_zmienne(9));
    return 0;
}