Del 1
- Oversættelse og afvikling af et program
- Variable, datatyper og aritmetiske udtryk
- Forgreninger
- Løkker
- Arrays
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
Dette laver binary filen a.out
, som vi kan køre ved
Skriver man
Så bliver navnet på binary’en program
, hvorefter man kan køre den med
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
- Installer C på din platform.
- Kør Hello World programmet som vist øverst.
- Lav om på Fizz Buzz så den printer alle tallene, men skriver “fizz” i stedet for ting der går op i 3, “buzz” i stedet for ting der går op i 5 og “fizz buzz” i stedet for ting der går op i både 3 og 5. Løsning
- Der er ingen indbygget måde at printe et array i C - det ville jo være for nemt! Lav et program der printer et array af ints ved at printe et tal af gangen vha. printf. Løsning
- Lav et program der printer de
n
første fibonacci tal.n
kan blot hardcodes i starten af programmet. Løsning - Lav et program der tjekker om et tal er et primtal. Dette kan gøres ved at dividere alle tal fra 2 op til tallet selv op i tallet og se om resten er 0. Løsning
-
Lav et program der finder Collatz følgen af et givent
n
. Løsning -
Lav et program der vender en streng (reverse). Gem resultatet over i en ny streng af samme længde. Løsning
- En matrice kan bare ses som en array af arrays af floats eller ints. Lav disse matricer i C:
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
- Implementer insertion sort eller bubble sort i C. Løsning
- Kig på Project Euler og implementer løsninger til problemer.