Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • orestis.malaspin/rust-101
  • tom.andrivet/rust-101
2 results
Show changes
Commits on Source (26)
Showing
with 232 additions and 58 deletions
......@@ -6,13 +6,13 @@ before_script:
- apt update && apt upgrade -y
- apt install curl unzip xz-utils -y
- mkdir -p $HOME/.cargo/bin
- curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.31/mdbook-v0.4.31-x86_64-unknown-linux-musl.tar.gz | tar -xz --directory=$HOME/.cargo/bin
- curl -sSL https://github.com/rust-lang/mdBook/releases/download/v0.4.40/mdbook-v0.4.40-x86_64-unknown-linux-gnu.tar.gz | tar -xz --directory=$HOME/.cargo/bin
- curl -L https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v0.7.7/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip -o mdbook-linkcheck.zip
- unzip mdbook-linkcheck.zip -d $HOME/.cargo/bin && chmod +x $HOME/.cargo/bin/mdbook-linkcheck
- curl -sSL https://github.com/ferrous-systems/mdslides/releases/download/v0.3.0/mdslides-v0.3.0-x86_64-unknown-linux-gnu.tar.xz | tar -xJ "mdslides-v0.3.0-x86_64-unknown-linux-gnu/mdslides" && mv mdslides-v0.3.0-x86_64-unknown-linux-gnu/mdslides $HOME/.cargo/bin/ && rm -r mdslides-v0.3.0-x86_64-unknown-linux-gnu
- curl -sSL https://github.com/ferrous-systems/mdslides/releases/download/v0.4.0/mdslides-x86_64-unknown-linux-gnu.tar.xz | tar -xJ --directory=$HOME/.cargo/bin/ --strip-components 1
- rustup component add rustfmt
- rustup component add clippy
- curl -L https://github.com/HollowMan6/mdbook-pdf/releases/download/v0.1.8/mdbook-pdf-v0.1.8-x86_64-unknown-linux-gnu -o $HOME/.cargo/bin/mdbook-pdf
- curl -L https://github.com/HollowMan6/mdbook-pdf/releases/download/v0.1.10/mdbook-pdf-v0.1.10-x86_64-unknown-linux-gnu -o $HOME/.cargo/bin/mdbook-pdf
- chmod +x $HOME/.cargo/bin/mdbook-pdf
- mkdir -p $HOME/bin
- curl -L https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb -o $HOME/bin/chrome.deb
......@@ -71,6 +71,13 @@ build:book:
- mdbook test
- mdbook build
build:exercises:
stage: build
script:
- cd exercises
- mdbook test
- mdbook build
build:slides:
stage: build
script:
......@@ -87,6 +94,16 @@ deploy:book:
- mdbook build
- rsync -avz book/html/* ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/rust-101/book/
deploy:exercises:
stage: deploy
only:
- main
- merge_request
script:
- cd exercises
- mdbook build
- rsync -avz book/html/* ur1bg_malas@ur1bg.ftp.infomaniak.com:web/malaspinas/rust-101/exercises/
deploy:slides:
stage: deploy
only:
......
......@@ -3,7 +3,7 @@ authors = ["Orestis Malaspinas, Michaël El Kharroubi"]
language = "fr"
multilingual = false
src = "src"
title = "Rust-101: Université d'été"
title = "Rust-101: Université d'automne"
[output.html]
mathjax-support = true
......
......@@ -258,4 +258,13 @@ on crée un tableau de `CustomInt` qui sont créés à partir de références
sur les tableau `v1`, `v2`, etc. qui vivrons ainsi jusqu'à la fin de notre
programme et qui seront promenées sans qu'on ait besoin de les copier à aucun moment.
Les liens entre les durées de vie des références que nous nous sommes efforcés d'annoter dan tout au long ce code sont vérifiées par le compilateur qui
vérifie qu'elles sont toutes valides à la compilation.
\ No newline at end of file
vérifie qu'elles sont toutes valides à la compilation.
## Rustlings
```bash
$ rustlings run lifetimes1
$ rustlings run lifetimes2
$ rustlings run lifetimes3
```
......@@ -59,7 +59,7 @@ fn write_to_file(output: &str, numbers: &[i32]) -> Result<(), String> {
/// these numbers. Returns errors when the parsing fails.
pub fn read_command_line_builder() -> Result<(), String> {
// ANCHOR: matches
let matches =
let matches =
// ANCHOR: new_command
Command::new(COMMAND)
.author(AUTHOR)
......@@ -97,29 +97,28 @@ pub fn read_command_line_builder() -> Result<(), String> {
// ANCHOR_END: matches
// ANCHOR: numbers_matches
let numbers =
if let Some(count) =
let numbers = if let Some(count) =
// ANCHOR: get_one_matches
matches.get_one::<usize>("count")
// ANCHOR_END: get_one_matches
{
read_from_urandom(*count)?
} else if let Some(numbers) =
matches.get_one::<usize>("count")
// ANCHOR_END: get_one_matches
{
read_from_urandom(*count)?
} else if let Some(numbers) =
// ANCHOR: get_many_matches
matches.get_many::<i32>("numbers")
// ANCHOR_END: get_many_matches
{
numbers.copied().collect()
} else {
Vec::new()
};
matches.get_many::<i32>("numbers")
// ANCHOR_END: get_many_matches
{
numbers.copied().collect()
} else {
Vec::new()
};
// ANCHOR_END: numbers_matches
// ANCHOR: output_matches
if let Some(output) =
if let Some(output) =
// ANCHOR: get_one_string_matches
matches.get_one::<String>("output")
// ANCHOR_END: get_one_string_matches
matches.get_one::<String>("output")
// ANCHOR_END: get_one_string_matches
{
write_to_file(output, &numbers)?;
} else {
......
......@@ -38,7 +38,7 @@ fn main() {
safe_list.print();
unsafe_list.print();
for j in 1..1000 {
for _j in 1..1000 {
let mut ul = UnsafeList::new();
for i in 1..1_000_000 {
ul.push(i);
......
[book]
authors = ["Orestis Malaspinas, Michaël El Kharroubi"]
language = "fr"
multilingual = false
src = "src"
title = "Rust-101: Université d'automne"
[output.html]
mathjax-support = true
[output.html.playground]
editable = true
[output.html.print]
enable = true
[output.pdf]
[output.linkcheck]
# Should we check links on the internet? Enabling this option adds a
# non-negligible performance impact
follow-web-links = false
# How should warnings be treated?
#
# - "warn" will emit warning messages
# - "error" treats all warnings as errors, failing the linkcheck
# - "ignore" will ignore warnings, suppressing diagnostic messages and allowing
# the linkcheck to continuing
warning-policy = "warn"
# Résumé des exercices
- [Exercices introductuifs](exercices_intro.md)
- [Exercices avancés](exercices_avances.md)
<!-- - [Les bases du Rust 1](./bases1.md) -->
<!-- - [Les bases du Rust 2](./bases2.md) -->
<!-- - [Les types avancés](./types_avances.md) -->
<!-- - [La généricité et des types composés](./gen_types_composes.md) -->
<!-- - [La propriété](./propriete.md) -->
<!-- - [Modules et visibilité](./modules_visibilite.md) -->
<!-- - [Les petits trucs sympas qui aident au développement](./tooling.md) -->
<!-- - [La gestion des erreurs en Rust](./gestion_erreurs.md) -->
<!-- - [Les closures](./closures.md) -->
<!-- - [Les itérateurs](./iterateurs.md) -->
<!-- - [Les collections](./collections.md) -->
<!-- - [Lifetimes](./lifetimes.md) -->
<!-- - [CLI](./cli.md) -->
<!-- - [Unsafe](./unsafe.md) -->
# Exercices
# Exercices avancés
Les exercices que nous proposons ici sont très vagues. L'objectif est de vous donner des thèmes,
de choses que vous connaissez du cours de programmation et d'algorithmique de l'année passée
......@@ -27,4 +27,4 @@ au fur et à mesure de votre périple.
## Aller plus haut
- Ascii art: écrire un convertisseur d'image en ASCII art.
- Simulation du système solaire: écrire un simulateur de système solaire.
\ No newline at end of file
- Simulation du système solaire: écrire un simulateur de système solaire.
# Exercices introductifs
Le but de ces petits exercices est d'écrire des programmes simples avec une connaissance minimale du Rust.
Faites les dans l'ordre qui vous amuse. N'hésitez pas à refaire plusieurs fois le même exercice en variant
le type de structures de contrôle que vous utilisez par exemple.
## Année bissextile
Écrire un programme déterminant si une année est bissextile. Pour savoir si une année est bissextile, il faut que:
* l'année soit divisible par 4,
* sauf si elle est divisible par 100,
* sauf si elle est aussi divisible par 400!
Ainsi, l' année 2001 n'est pas bissextile. En revanche l'année 2000 l'est. Contrairement à l'année 1900 qui ne l'est pas.
## Nombre d'Armstrong
Un nombre Armstrong est un nombre qui est la somme de ses propres chiffres, chacun élevé à la puissance du nombre de chiffres.
Par exemple, un nombre d'Armstrong est un nombre qui est la somme de ses propres chiffres :
* \\(9\\) est un nombre d'Armstrong, car \\(9 = 9^1 = 9\\),
* \\(10\\) n'est pas un nombre Armstrong, car \\(10 \neq 1^2 + 0^2 = 1\\),
* \\(153\\) est un nombre Armstrong, car : \\(153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153\\),
* \\(154\\) n'est pas un nombre d'Armstrong, car : \\(154 \neq 1^3 + 5^3 + 4^3 = 1 + 125 + 64 = 190\\)
Écrivez un programme qui détermine si un nombre est un nombre d'Armstrong.
## Nombres heureux
Un nombre heureux est un entier naturel non nul, qui lorsqu'on calcule la somme des carrés de ses chiffres
puis la somme des carrés des chiffres du nombre obtenu et ainsi de suite, on aboutit au nombre 1.
Un nombre est malheureux lorsque ce n'est pas le cas.
Ainsi, le nombre 7 est heureux, car:
$$
7^2=49,
$$
$$
4^2+9^2=97,
$$
$$
9^2+7^2=130,
$$
$$
1^2+3^2+0^2=10,
$$
$$
1^2+0^2=1.
$$
D'autres nombres heureux sont 1, 10, 13, 19 par exemple. Il faut faire attention car certains nombres
rencontrés dans la suite mènent à une suite périodique: 4, 16, 20, 37, 42, 58, 89, 145 et on ne s'arrête jamais.
Écrivez un programme qui détermine si un nombre est heureux ou malheureux.
## Différence de nombres
Écrivez un programme qui calcule la différence entre le carré de la somme et la somme des carrés des $N$ premiers nombres naturels.
Le carré de la somme des dix premiers entiers naturels est
$$
(1 + 2 + ... + 10)^2 = 55^2 = 3025.
$$
La somme des carrés des dix premiers nombres naturels est
$$
1^2 + 2^2 + ... + 10^2 = 385.
$$
Donc, la différence entre le carré de la somme des dix premiers nombres naturels et la somme des carrés des dix premiers nombres naturels est
$$
3025 - 385 = 2640.
$$
## Nombre premier
Écrire un programme qui détermine si un nombre est premier. Un nombre est premier s'il n'a que deux diviseurs distincts.
## Décomposition en nombres premiers
Écrire un programme qui calcule les facteurs premiers d'un nombre naturel donné.
Exemple d'algorithme
Quels sont les facteurs premiers de 60 ?
* Notre premier diviseur est 2:
* 60 est divisible par 2 et il reste 30,
* 30 est divisible par 2 et il reste 15,
* 15 n'est pas divisible par 2,
* 15 est divisible par 3 et il reste 5,
* 5 n'est pas divisible par 2,
* 5 n'est pas divisible par 3,
* 5 n'est pas divisible par 4,
* 5 est divisible par 5 et il reste 1 et nous avons fini.
Nos diviseurs réussis dans ce calcul représentent la liste des facteurs premiers de 60 : 2, 2, 3 et 5.
Si cela vous amuse vous pouvez vérifier qu'ils sont bien premiers en utilisant l'exercice précédent.
......@@ -3,4 +3,4 @@ authors = ["Orestis"]
language = "en"
multilingual = false
src = "src"
title = "Université d'été 2023: Rust 101"
title = "Université d'automne 2024: Rust 101"
......@@ -2,25 +2,23 @@
- [Introduction](introduction.md)
- [Installation](installation.md).
- [Itérateurs](iterators.md).
- [Variables](variables.md).
- [Types](types.md).
- [Structures de contrôle](control.md).
- [Types avancés](types_avances.md).
- [Organisation du code](modules.md).
- [Fonctions](fonctions.md).
- [Organisation du code](modules.md).
- [Ownership](ownership.md).
- [Méthodes](methods.md).
- [Commentaires](commentaires.md).
- [Gestion d'erreurs](errors.md).
- [Les closures](closures.md)
- [Méthodes](methods.md).
- [Pointeurs intelligents](smart_pointers.md).
- [Génériques](generics.md).
- [Traits](traits.md).
- [Itérateurs](iterators.md).
- [Tests](tests.md).
- [Vecteurs](vec.md).
- [Les Strings](string.md).
<!-- - [Itérateurs](iterators.md).
- [Unsafe Rust](collections.md). -->
- [Lifetimes](lifetimes.md).
- [Unsafe](unsafe.md).
......@@ -36,7 +36,7 @@ fn main() {
## La boucle infinie: `loop`
```rust [] ignore
```rust ignore []
fn main() {
loop {
println!("En boucle!");
......
......@@ -9,7 +9,7 @@
## `panic!()`
```rust [2-4|] should_panic
```rust should_panic [2-4|]
fn elem(v: &[i32], i: usize) -> i32 {
if i >= v.len() {
panic!("Erreur fatale!");
......@@ -67,7 +67,7 @@ stack backtrace:
## Asserts
```rust [4,6,7|] should_panic
```rust should_panic [4,6,7|]
fn main() {
let num = 1;
let denum = 0;
......@@ -131,7 +131,7 @@ fn main() {
## Options: `unwrap()`
```rust [11|] should_panic
```rust should_panic [11|]
fn div(num: i32, denum: i32) -> Option<i32> {
if denum == 0 {
None
......@@ -179,7 +179,7 @@ fn main() {
## `unwrap()`
```rust [10|] should_panic
```rust should_panic [10|]
fn elem(v: &[i32], i: usize) -> Result<i32, &str> {
if i >= v.len() {
return Err("L'index est trop grand!")
......@@ -192,4 +192,4 @@ fn main() {
let res = elem(&v, 100).unwrap();
println!("L'élément est {}", res);
}
```
\ No newline at end of file
```
......@@ -27,7 +27,7 @@ fn main() {
## Exemple avec générique (concept)
```rust [1|2|] compile_fail
```rust compile_fail [1|2|]
fn max<T>(a: T, b: T) -> T {
if a > b { a } else { b }
}
......@@ -36,7 +36,7 @@ fn max<T>(a: T, b: T) -> T {
## Vrai exemple avec générique
```rust
// On doit dire au compilateur que T implémente "</>"
// On doit dire au compilateur que T implémente "< , >"
fn max<T: PartialOrd>(a: T, b: T) -> T {
if a > b { a } else { b }
}
......@@ -54,7 +54,7 @@ fn main() {
## Un seul type générique
```rust [6-7|8|] compile_fail
```rust compile_fail [6-7|8|]
struct Point<T> {
x: T,
y: T,
......
......@@ -44,9 +44,9 @@
- Financé par Mozilla dès 2010.
- Rendu public la première fois en 2012 (version 0.4).
- Orientation vers la programmation système.
- Première version stable (1.0) en 2015 (3 ans cette année).
- Première version stable (1.0) en 2015 (9 ans cette année).
- Stabilisation de fonctionnalités tous les 6 semaines.
- Version stable actuelle 1.71. <!-- TODO UPDATE -->
- Version stable actuelle 1.81.0 <!-- TODO UPDATE -->
## Concept de base
......
......@@ -7,7 +7,7 @@
## Problématique
```rust [2|3-6|7|] compile_fail
```rust compile_fail [2|3-6|7|]
fn main() {
let r;
{
......@@ -20,7 +20,7 @@ fn main() {
## Durée de vie: annotation
```rust [] compile_fail
```rust compile_fail []
fn main() {
let r: &'a i32; // --------+-- 'a
{ // |
......@@ -42,7 +42,7 @@ fn main() {
## Exemple
```rust [8-13|1,7|] compile_fail
```rust compile_fail [8-13|1,7|]
fn longest(x: &str, y: &str) -> &str {
if x.len() > y.len() {
x
......@@ -82,7 +82,7 @@ fn main() {
* Ne permet pas d'augmenter une durée de vie,
* Le compilateur vérifie que la durée de vie est **compatible** avec la durée de vie.
```rust [] ignore
```rust ignore []
&T // référence
&'a T // référence avec durée de vie a
&'a mut T // référence mutable avec durée de vie a
......
......@@ -45,7 +45,7 @@ fn main() {
## Le mot-clé `self`
```rust [6-9|10-12|16-18|] compile_fail
```rust compile_fail [6-9|10-12|16-18|]
struct Rectangle {
width: u32,
height: u32,
......@@ -61,6 +61,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
}
fn main() {
let rect = Rectangle { width: 10, height: 5 };
// Problème ?
println!("La surface de ce rectangle
est donnée par {} et son périmètre par {}.",
rect.area(), rect.perimeter());
......@@ -108,7 +109,7 @@ impl Rectangle { // les méthodes de Rectangle se trouvent dans un bloc impl
fn main() {
let mut rect = Rectangle {width: 10, height: 5}; // rect doit être mutable
rect.set_width(1_000_000); // pour que cette ligne compile
println!("On a modifié width. L'instance de rectanle est {:?}.", rect);
println!("On a modifié width. L'instance de rectangle est {:?}.", rect);
}
```
......
......@@ -55,7 +55,7 @@ fn main() {
## Le contenu d'un module est privé
```rust [2-3,6|] compile_fail
```rust compile_fail [2-3,6|]
mod hepia {
fn uni_automne() {
}
......@@ -114,7 +114,7 @@ ecole
## Les fichiers et visibilité
```rust [1-3|4-6|7-8|9-10|11-12|13-17|] ignore
```rust ignore [1-3|4-6|7-8|9-10|11-12|13-17|]
// dans lib.rs
pub mod hepia;
pub mod heg;
......@@ -153,4 +153,4 @@ pub
| pub ( self ) // public dans le module courant
| pub ( super ) // public dans le module parent
| pub ( in path ) // public dans le path explicite
```
\ No newline at end of file
```
......@@ -117,7 +117,7 @@ fn main() {
## Changement de propriétaire: invalide
```rust [7-8|9|] compile_fail
```rust compile_fail [7-8|9|]
fn main() {
let mut y = Vec::new();
for i in 0..5 {
......@@ -167,7 +167,7 @@ fn main() {
## Lors du passage en paramètre à une fonction
```rust [1-3,8|] compile_fail
```rust compile_fail [1-3,8|]
fn take_own(_v: Vec<i32>) {
// on fait des choses
}
......@@ -242,7 +242,7 @@ fn main() {
## Exemple 2
```rust [1-4,10|] compile_fail
```rust compile_fail [1-4,10|]
fn get_len(v: &Vec<i32>) -> usize {
v.push(2); // on ajoute 2 à v
v.len()
......@@ -281,7 +281,7 @@ fn main() {
## Sans la règle sur la référence mutable
```rust [2|3|4|5-6|] compile_fail
```rust compile_fail [2|3|4|5-6|]
fn main() {
let mut y = Vec::new();
let z = &y;
......@@ -326,7 +326,7 @@ fn main() {
fn main() {
let mut y = Vec::new();
y.push(1); y.push(2); y.push(3); y.push(4);
{
{ // optionnel, le compilo est smart
let mut y1 = &mut y;
y1.push(7);
}
......
......@@ -68,7 +68,7 @@ fn main() {
## Cas pratique: la liste chaînée
```rust [1,4|2-3|1-4|] compile_fail
```rust compile_fail [1,4|2-3|1-4|]
enum List {
Elem(i32, List),
Nil,
......