Del 1


Oversættelse og afvikling af et program

Vores første program som vi skal compile (oversætte):

1
2
3
4
5
6
#include <stdio.h>

int main() {
    printf("Hello world!\n");
    return 0;
}

Gem som program.c i en mappe af eget valg. Via terminalen, naviger ind i mappen og skriv

$ gcc program.c

Dette laver binary filen a.out, som vi kan køre ved

$ ./a.out
# ↪ Hello world!

Skriver man

$ gcc program.c -o program

Så bliver navnet på binary’en program, hvorefter man kan køre den med

$ ./program
#  ↪ Hello world!

Når man skal compile flere filer sammen til en binary, så er compileringsprocessen en smule mere omfattende og det anbefales at man bruger make. Vi vil ikke dykke ned i make her i kurset, men hvis man har lyst til at bruge det, så kan man hente denne Makefile, som burde opfylde alle behov i dette kursus. Den lægges i mappen man arbejder i, og så kan man blot skrive make i terminalen for at compile sit program.

Strukturen af de første C programmer vi kommer til at se på:

1
2
3
4
5
6
7
8
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>

int main(int argc, char** argv) {
    ...
    return 0;
}

main er en funktion. Den bliver kørt som det første når programmet starter. Vi vil starte med at fokusere på det der kommer til at stå i stedet for ....

Brug ovenstående som skabelon til opgaver.


Forskelle på C og Java

Hello World

1
2
3
4
5
public class Hello {
    public static void main(String args[]) {
        System.out.println("Hello world!");
    }
}
1
2
3
4
5
#include <stdio.h>
int main(int argc, char** argv) {
    printf("Hello world!\n");
    return 0;
}

Fizz Buzz

1
2
3
4
5
6
7
8
9
10
11
public class FizzBuzz {
    public static void main(String args[]) {
        int lower = 1;
        int upper = 100;
        for (int i = lower; i < upper; i++) {
            if (i % 3 == 0 || i % 5 == 0) {
                System.out.println(" " + i);
            }
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
int main(int argc, char** argv) {
    int lower = 1;
    int upper = 100;
    for (int i = lower; i < upper; i++) {
        if (i % 3 == 0 || i % 5 == 0) {
            printf(" %d\n", i);
        }
    }
    return 0;
}

Variable, datatyper og aritmetiske udtryk

Variabler:

1
2
3
4
int n;
n = 5;
// or 
int n = 5;

Hvilken værdi har n i første eksempel inden den sættes til 5?

Typer:

1
int, long, bool, char, float, double, size_t ...

Husk: C er meget low-level. Hver af disse typer angiver bare hvor mange bytes en variable fylder og giver en smule type safety.

Bemærk desuden at bool ikke er standard, men kræver at man inkluderer stdbool.h. Dette er meget anbefalet at gøre.

Aritmetiske udtryk:

1
2
3
4
5
6
7
int a = 18;
int b = 24;
int c = a + b;

bool p = true;
bool q = false;
bool r = p && q;
1
2
3
+, -, *, /, %
&&, ||
==, !=

Operatorerne har samme præcedens som i Java og en liste af operatorer og præcedens kan ses her.


Forgreninger

If-statement:

1
2
3
4
int a = 13;
if (a > 10) {
    printf("Success!\n");
}

If-else-statement:

1
2
3
4
5
6
7
int a = 13;
bool b = true;
if (a < 20 && !b) {
    printf("Success!\n");
} else {
    printf("Fail!\n");
}

Switch-statement:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int n = 99;
switch(n) {
    case 97:
    case 98:
        printf("Almost!\n");
        break;
    case 99:
        printf("We are there!\n");
        break;
    case 100:
        printf("We have gone to far!\n");
        break;
    default:
        printf("Not of interest!\n");
        break;
}

Løkker

While-løkke:

1
2
3
4
5
6
7
8
int a = 5;
int l = 0;
while (a > 1) {
    printf("%d\n", a);
    a = a / 2;
    l++;
}
printf("%d\n", l);

Do-while-løkke:

1
2
3
4
5
6
int a = -5;
do {
    printf("%d\n", a);
    a = a / 2;
} while (a > 1);
printf("%d\n", a);

Hvad er a efter løkken?

For-løkke:

1
2
3
for (int i = 0; i < 20; i++) {
    printf("%d\n", i);
}

Der er ingen fancy foreach-løkke som i Python og Java.

Man kan bruge break til at bryde ud af et løkke og continue til at fortsætte til den næste iteration af en løkke.

En for-løkke kan altid laves om til en while-løkke:

1
2
3
for (int i = 0; i < 20; i++) {
    printf("%d\n", i);
}

bliver til

1
2
3
4
5
int i = 0;
while (i < 20) {
    printf("%d\n", i);
    i++;
}

Arrays

På samme måde som int a betyder “Giv mig en variabel af type int”, så kan man skrive int arr[10], som betyder “Giv mig 10 variabler af type int som ligger efter hinanden i hukommelsen”.

1
2
3
4
int arr[10];
arr[0] = 17;
arr[1] = 25;
arr[9] = arr[0] + arr[1];

Man kan angive standard-værdier til arrays:

1
int b[] = {1, 2, 3}

Bemærk at man kan undlade størrelsen, hvis C selv kan gætte det. b vil have størrelse 3.

Strings er intet andet end arrays af chars som afsluttes med et særligt ‘\0’-tegn. Vi siger at strings er nulterminerede. c og d er helt ens her:

1
2
char c[] = {'a', 'b', 'c', '\0'};
char d[] = "abc";

printf

1
2
3
4
printf("Her er du:\n");
printf("By:       %s\n",    "Odense");
printf("Post nr.: %d\n",    5000);
printf("Grader:   %f °C\n", 17.3);
1
2
printf("Grader:    %.1f °C\n", 17.3);
printf("Procent:   %03d %%\n", 31);

Se mere her.




Opgaver

Matrices

Implementer addition af A og B og gem resultatet i en ny matrice C. Implementer også multiplikation og gem resultatet i en ny matrice D. Løsning