Skip to content
Snippets Groups Projects
Verified Commit 04701093 authored by orestis.malaspin's avatar orestis.malaspin
Browse files

updates

parent 0a28287b
No related branches found
No related tags found
No related merge requests found
Pipeline #33906 passed
Showing
with 562 additions and 11 deletions
......@@ -27,7 +27,8 @@ all: puppeteer $(PDF) # La cible par défaut (all) exécute les cibles %.html et
puppeteer:
@echo "Setting chromium to $(CHROMIUM) for puppeteer"
@echo -e "{\n\"executablePath\":" \"$(CHROMIUM)\" ",\n\"args\": [\"--no-sandbox\"]\n}" > .puppeteer.json
@echo "{\n\"executablePath\":" \"$(CHROMIUM)\" ",\n\"args\": [\"--no-sandbox\"]\n}" > .puppeteer.json
# @echo -e "{\n\"executablePath\":" \"$(CHROMIUM)\" ",\n\"args\": [\"--no-sandbox\"]\n}" > .puppeteer.json
markdown: $(MARKDOWN) # La markdown les cibles %.markdown
......
---
title: "Boucles et conditions"
date: "2023-09-28"
date: "2024-09-24"
---
# Quiz
......
---
title: "Introduction à la l'interface en ligne de commande"
date: "2023-09-28"
date: "2024-09-24"
---
# Introduction
......
---
title: "Introduction générale"
date: "2023-09-21"
date: "2024-09-17"
---
# La hotline
......@@ -9,7 +9,7 @@ Nom Mél Bureau
-------------------- ------------------------------ --------------------
Kevin Heirich kevin.heirich@hesge.ch A403
Quentin Leblanc quentin.leblanc@hesge.ch A403
Raphael Bach raphael.bach@hesge.ch B411
Damian Boquete damian.boquete@hesge.ch B403
Michaël El Kharroubi michael.el-kharroubi@hesge.ch A403
Paul Albuquerque paul.albuquerque@hesge.ch B410
Orestis Malaspinas orestis.malaspinas@hesge.ch A401
......@@ -32,15 +32,12 @@ Tout le contenu de ce qu'on raconte se trouve sur cyberlearn:
[Matrix](https://matrix.to/#/!aKYVlcclmPGYXQFxAK:matrix.org?via=matrix.org),
installez [element.io](https://element.io).
![](figs/matrix_qr.png){width=20%}
* Communauté Lemmy: <https://lemmy.hepiapp.ch/c/prog_seq>
# Organisation du cours (1/3)
## But: Illustration des concepts vus au cours d'algorithmique
- Salle A502 pour la "théorie" (présentation langage et TPs).
- Salles A406-A432-A433 pour la "pratique".
- Salle B119 pour la "théorie" (présentation langage et TPs).
- Salles A404-A406-A432-A433 pour la "pratique".
## Le bâton
......@@ -69,7 +66,6 @@ Tout le contenu de ce qu'on raconte se trouve sur cyberlearn:
- Il y a un certain nombre de ressources se trouvant sur <https://malaspinas.academy>.
- Mon bureau est toujours ouvert (tapez *assez fort* sur la porte).
- N'hésitez pas à utiliser le salon *Element*...
- Et/ou lemmy.
# Évaluations
......
File moved
# PDFOPTIONS = -t beamer
# PDFOPTIONS += -F mermaid-filter
# PDFOPTIONS += --highlight-style my_highlight.theme
# PDFOPTIONS += --pdf-engine pdflatex
# PDFOPTIONS += -V theme:metropolis
# PDFOPTIONS += -V themeoptions:numbering=none -V themeoptions:progressbar=foot
# PDFOPTIONS += -V urlcolor=blue
PDFOPTIONS = -t beamer
PDFOPTIONS += --pdf-engine=xelatex
PDFOPTIONS += -F mermaid-filter
PDFOPTIONS += --default-image-extension=pdf
PDFOPTIONS += -V theme:metropolis
PDFOPTIONS += -V themeoptions:numbering=none -V themeoptions:progressbar=foot
PDFOPTIONS += -V fontsize=smaller
PDFOPTIONS += --highlight-style espresso
PDFOPTIONS += -H ./header.tex --listings
MD=$(wildcard *.md) # Tous les fichiers .md
HTML=$(MD:%.md=%.html) # Pour les fichier html on transforme .md -> .html
PDF=$(MD:%.md=%.pdf) # Pour les fichier pdf on transforme .md -> .pdf
MARKDOWN=$(MD:%.md=%.markdown) # Pour les fichier markdown on transforme .md -> .markdown
CHROMIUM:=$(shell which chromium || which chromium-browser)
# all: $(PDF) $(HTML) # La cible par défaut (all) exécute les cibles %.html et %.pdf
all: puppeteer $(PDF) # La cible par défaut (all) exécute les cibles %.html et %.pdf
puppeteer:
@echo "Setting chromium to $(CHROMIUM) for puppeteer"
@echo -e "{\n\"executablePath\":" \"$(CHROMIUM)\" ",\n\"args\": [\"--no-sandbox\"]\n}" > .puppeteer.json
markdown: $(MARKDOWN) # La markdown les cibles %.markdown
%.pdf: %.md metadata.yaml # %.pdf (chaque fichier %.md génère un fichier avec le même nom mais l'extension .pdf et la dépendance metadata.yaml)
pandoc -s $(OPTIONS) $(PDFOPTIONS) -o $@ $^
%.html: %.md metadata.yaml
pandoc -s $(OPTIONS) $(REVEALOPTIONS) -o $@ $^
%.markdown: %.md metadata.yaml yq
sed '1 { /^---/ { :a N; /\n---/! ba; d} }' $< > no_header
grep -v -F -x -f no_header $< > header.yaml
echo "---" > tmp.yaml
./yq_linux_amd64 merge metadata.yaml header.yaml >> tmp.yaml
cat tmp.yaml no_header > $@
rm no_header header.yaml tmp.yaml
yq: # On peut même télécharger un petit programme avec notre makefile
wget -nc https://github.com/mikefarah/yq/releases/download/3.4.1/yq_linux_amd64
chmod "u+x" yq_linux_amd64
index.md: gen_index.sh
$(shell ./gen_index.sh)
index.html: index.md
pandoc -s $(OPTIONS) --css ../css/tufte-css/tufte.css -o $@ $^
deploy: all index.html
mkdir -p prog_seq_c_cours
cp *.pdf prog_seq_c_cours
cp *.html prog_seq_c_cours
clean:
rm -f *.pdf *.html *.markdown yq_linux_amd64* index.md
---
title: "Boucles et conditions"
date: "2023-09-28"
---
# Quiz
\footnotesize
## Que fait le code suivant?
```C
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Enter n: ");
int n = 0;
scanf("%d", &n);
int res = 0;
for (int i = 0; i <= n; ++i) {
res += i;
}
printf("For = %d, the result is %d\n", n, res);
if (res != n * (n+1) / 2) {
printf("Error: the answer is wrong.\n");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
```
# Génération d'un exécutable
- Pour pouvoir être exécuté un code C doit être d'abord compilé (avec `gcc` ou `clang`).
- Pour un code `prog.c` la compilation "minimale" est
```bash
$ clang prog.c
$ ./a.out # exécutable par défaut
```
- Il existe une multitude d'options de compilation:
```bash
$ clang -std=c11 -Wall -Wextra prog.c -o prog
```
1. `-std=c11` utilisation de C11.
2. `-Wall` et `-Wextra` activation des warnings.
3. `-o` défini le fichier exécutable à produire en sortie.
# Structures de contrôle: `if`{.C} .. `else if`{.C} .. `else`{.C} (1/2)
\footnotesize
## Syntaxe
```C
if (expression) {
instructions;
} else if (expression) { // optionnel
// il peut y en avoir plusieurs
instructions;
} else {
instructions; // optionnel
}
```
```C
if (x) { // si x s'évalue à `vrai`
printf("x s'évalue à vrai.\n");
} else if (y == 8) { // si y vaut 8
printf("y vaut 8.\n");
} else {
printf("Ni l'un ni l'autre.\n");
}
```
# Structures de contrôle: `continue`{.C}, `break`{.C}
\footnotesize
- `continue`{.C} saute à la prochaine itération d'une boucle.
```C
int i = 0;
while (i < 10) {
if (i == 3) {
i += 1;
continue;
}
printf("%d\n", i);
i += 1;
}
```
- `break`{.C} quitte le bloc itératif courant d'une boucle.
```C
for (int i = 0; i < 10; i++) {
if (i == 3) {
break;
}
printf("%d\n", i);
}
```
# La fonction `main()` (1/2)
## Généralités
- Point d'entrée du programme.
- Retourne le code d'erreur du programme:
- 0: tout s'est bien passé.
- Pas zéro: problème.
- La valeur de retour peut être lue par le shell qui a exécuté le programme.
- `EXIT_SUCCESS`{.C} et `EXIT_FAILURE`{.C} (de `stdlib.h`) sont des valeurs de retour **portables** de programmes C.
# La fonction `main()` (2/2)
## Exemple
```C
int main() {
// ...
if (error) {
return EXIT_FAILURE;
} else {
return EXIT_SUCCESS;
}
}
```
- Le code d'erreur est lu dans le shell avec `$?`{.bash}
```bash
$ ./prog
$ echo $?
0 # tout s'est bien passé par exemple
$ if [ $? -eq 0 ]; then echo "OK"; else echo "ERROR"; fi
ERROR # si tout s'est mal passé
```
# Entrées/sorties: `printf()`{.C} (1/2)
## Généralités
- La fonction `printf()`{.C} permet d'afficher du texte sur le terminal:
```C
int printf(const char *format, ...);
```
- Nombre d'arguments variables.
- `format`{.C} est le texte, ainsi que le format (type) des variables à afficher.
- Les arguments suivants sont les expressions à afficher.
# Entrées/sorties: `printf()`{.C} (2/2)
## Exemple
```C
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Hello world.\n");
int val = 1;
// %d => int
printf("Hello world %d time.\n", val);
// %f => float
printf("%f squared is equal to %f.\n",
2.5, 2.5*2.5);
// %s => string
printf("Hello world %s.\n", "Hello world");
return EXIT_SUCCESS;
}
```
# Entrées/sorties: `scanf()`{.C} (1/2)
## Généralités
- La fonction `scanf()`{.C} permet de lire du texte formaté entré au clavier:
```C
int scanf(const char *format, ...);
```
- `format`{.C} est le format des variables à lire (comme `printf()`{.C}).
- Les arguments suivants sont les variables où sont stockées les valeurs lues.
# Entrées/sorties: `scanf()`{.C} (2/2)
## Exemple
```C
#include <stdio.h>
#include <stdlib.h>
int main() {
printf("Enter 3 numbers: \n");
int i, j, k;
scanf("%d %d %d", &i, &j, &k); // !!! &
printf("You entered: %d %d %d\n", i, j, k);
return EXIT_SUCCESS;
}
```
# Nombres aléatoires: `rand()`, `srand()`{.C} (2/2)
\footnotesize
```
$ man 3 rand
The rand() function returns a pseudo-random integer
in the range 0 to RAND_MAX inclusive (i.e., the
mathematical range [0, RAND_MAX]).
```
## Exemple
```C
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
srand(0); // every run will be identical
srand(time(NULL)); // every run will be be different
for (int i = 0; i < 50; ++i) {
printf("%d\n", rand() % 50); // à quoi sert % 50?
}
return EXIT_SUCCESS;
}
```
# Le cas du nombre secret
## But du programme
* Faire chercher un nombre aléatoire,
* Le nombre est compris entre 0 et une borne max.
## Quelles sont les étapes?
1. Donner une borne maximale à l'ordinateur, MAX.
. . .
2. Faire tirer un nombre aléatoire à l'ordinateur entre 0 et MAX-1.
. . .
3. Le·la joueur·se joue un nombre.
. . .
4. L'ordinateur vérifie la réponse:
* Si correct le jeu est fini,
* Sinon indiquer si le nombre secret est plus grand ou plus petit et revenir à 3.
# La fin
1. Y a-t-il des questions?
. . .
2. Si oui, répondre et revenir à 1, sinon aller faire l'exercice en A432/433/406.
---
title: "Introduction à la l'interface en ligne de commande"
date: "2023-09-28"
---
# Introduction
## Généralités
* *Command line interface* (CLI) en anglais.
* Interface textuelle vers l'ordinateur.
* Peut s'appeler le *shell*, le *terminal*, la *console*, ...
* Semble obscure, mais est très pratique (automatisation de tâches, copier-coller, ...).
* Vous devrez l'utiliser tout au long de vos études.
* Existe sous Linux, MacOS, et même Windows (les commandes peuvent varier!).
* Ici on ne parlera que de *Linux*.
# A quoi ça sert?
## Équivalent textuel d'un GUI
Toutes les informations obtenues avec une interface graphique, peuvent être obtenues à l'aide de la ligne de commande (liste loin d'être exhaustive):
* Changement d'un répertoire: `cd`{.bash}
* Affichage du contenu d'un répertoire: `ls`{.bash}
* Déplacement de fichier: `mv`{.bash}
* Copie de fichier: `cp`{.bash}
* Création de répertoire: `mkdir`{.bash}
* Recherche de fichier: `find`{.bash}
* Recherche de texte dans un fichier: `grep`{.bash}
* Etc, etc, etc, etc, etc
## Mais aussi
* Télécharger des documents, compiler, éditer des fichiers, ...
# Ouvrir un terminal
\footnotesize
Dépendant de votre distribution de Linux l'ouverture d'un terminal peut varier.
Ce qui marche *presque* tout le temps:
1. Appuyer sur le bouton `Super` (`Windows`) du clavier.
2. Commencer à taper "terminal".
![](figs/terminal_open.png){width=100%}
Raccourcis clavier:
* `Ctrl+Alt+T`{.bash}
* `Super+T`{.bash}
* Vous pouvez customiser les raccourcis.
# Une fois le terminal ouvert
Vous pouvez taper des commandes puis `Entrée`.
```bash
$ pwd
/home/orestis
```
Exemple: `pwd`{.bash} affiche le répertoire courant (**p**rint **w**orking **d**irectory).
**Attention: les commandes sont sensibles à la casse!**
Exemple: `cd`{.bash} change de répertoire (**c**hange **d**irectory).
:::::::::::::: {.columns}
::: {.column width="45%"}
```bash
$ pwd
/home/orestis
$ cd ..
$ pwd
/home
```
:::
::: {.column width="45%"}
```bash
$ cd orestis
$ pwd
/home/orestis
$ cd ../..
$ pwd
/
```
:::
::::::::::::::
# Remarque: chemins relatifs ou absolus
Un *chemin* est relatif à moins que le chemin commence par `/` ou `~`.
```bash
$ pwd
/home/orestis
$ cd Downloads
$ pwd
/home/orestis/Downloads
$ cd /tmp
$ pwd
/tmp
$ cd ~/Downloads
$ pwd
/home/orestis/Downloads
```
# Ouvrir un éditeur de texte et éditer un ficher
* Installer un éditeur de texte: `codium`, `vim`, `nvim`, ...
* Ouvrir l'éditeur de texte (ici codium):
```bash
$ codium
```
* Écrire `Hello World!` dans le fichier et sauver sous `cours.dat`.
* Ou alors utiliser `nano`, `vi`, `nvim`, ...
```bash
$ nano cours.dat
```
* Écrire `Hello World!` puis `Ctrl+X` et `Y`.
# Quelques commandes utiles (1/3)
\footnotesize
## `mkdir`, création de répertoire
```bash
$ mkdir tmp
$ cd tmp
$ pwd
/home/orestis/tmp
```
## `ls`, affiche le contenu d'un répertoire
```bash
$ ls
Desktop Documents git Music Public tmp
Docker Downloads go Pictures Templates Videos
$ ls -ltr
... # des répertoires
drwxr-xr-x 3 orestis orestis 4096 31 aoû 09:54 Documents
drwxr-xr-x 11 orestis orestis 4096 7 sep 15:59 Downloads
drwxr-xr-x 2 orestis orestis 4096 9 sep 11:14 Pictures
drwxr-xr-x 2 orestis orestis 4096 9 sep 12:41 tmp
-rw-r--r-- 1 orestis orestis 6 9 sep 12:52 cours.dat
```
# Quelques commandes utiles (2/3)
## `cp`{.bash}, copie de fichiers/répertoires
```bash
$ cp cours.dat tmp/ # cp cours.dat -> tmp
$ ls tmp # affiche le rép tmp
cours.dat
$ cp -r tmp tmp2 # option -r => recursive
$ ls
cours.dat Docker Downloads go Pictures Templates tmp2
Desktop Documents git Music Public tmp Videos
```
## `mv`{.bash}, déplacement de fichiers/répertoires
```bash
$ ls tmp
$ mv cours.dat tmp # déplace cours.dat -> tmp
$ ls tmp
cours.dat
```
# Quelques commandes utiles (3/3)
## `rm`{.bash}, effacer des fichiers/répertoires
```bash
$ ls tmp
cours.dat
$ rm tmp/cours.dat
$ ls tmp
$ rm -r tmp tmp2
$ ls
Desktop Documents git Music Public Videos
Docker Downloads go Pictures Templates
```
# La touche `tab`{.bash}
Probablement la touche la plus utile du clavier:
* permet la complétion d'une commande.
* permet la complétion d'un nom de fichier.
* permet d'afficher les complétions possibles.
Fait gagner un temps considérable.
# Éditeurs de texte
Il existe différents éditeurs de texte qui pourraient être utiles:
* `vscode`{.bash} ou `codium`{.bash} (la version sans l'espionnage M\$)
* `vim`{.bash}
* `geany`{.bash}
* `gedit`{.bash}
* ...
Ne vous reposez pas trop sur l'éditeur pour tout faire à votre place.
File moved
File moved
File moved
File moved
File moved
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment