ds3 tp/td + e1
This commit is contained in:
parent
82c9c23c05
commit
bea8d35fab
@ -21,4 +21,15 @@
|
|||||||
"request": "launch",
|
"request": "launch",
|
||||||
"adapter": "CodeLLDB",
|
"adapter": "CodeLLDB",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Debug tp7 exo7",
|
||||||
|
"build": {
|
||||||
|
"command": "gcc",
|
||||||
|
"args": ["-o", "./exe", "-lm", "-g", "tp7/exo7.c"],
|
||||||
|
"cwd": "$ZED_WORKTREE_ROOT",
|
||||||
|
},
|
||||||
|
"program": "$ZED_WORKTREE_ROOT/exe",
|
||||||
|
"request": "launch",
|
||||||
|
"adapter": "CodeLLDB",
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
|||||||
2462
ds3/ds3.pdf
Normal file
2462
ds3/ds3.pdf
Normal file
File diff suppressed because it is too large
Load Diff
161
ds3/ds3.typ
Normal file
161
ds3/ds3.typ
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
#show enum.item: it => {
|
||||||
|
let (number, body, ..fields) = it.fields()
|
||||||
|
if body.func() == block { return it }
|
||||||
|
|
||||||
|
body = block(breakable: false, body)
|
||||||
|
enum.item(number, body, ..fields)
|
||||||
|
}
|
||||||
|
|
||||||
|
= DS n°3
|
||||||
|
|
||||||
|
== TD et TP
|
||||||
|
|
||||||
|
#set enum(numbering: "T1.")
|
||||||
|
\
|
||||||
|
+ ```ocaml
|
||||||
|
let points main = Array.fold_left
|
||||||
|
(fun acc carte -> acc + (points_carte carte))
|
||||||
|
0
|
||||||
|
main
|
||||||
|
;;
|
||||||
|
```
|
||||||
|
|
||||||
|
+ ```ocaml
|
||||||
|
let creer_fileb capacite init = {
|
||||||
|
taille = 0;
|
||||||
|
tete = 0;
|
||||||
|
queue = 0;
|
||||||
|
donnees = Array.make capacite init
|
||||||
|
};;
|
||||||
|
|
||||||
|
let enfiler_fileb f x =
|
||||||
|
let capacite = Array.length f.donnees in
|
||||||
|
if f.taille = capacite then
|
||||||
|
failwith "File pleine"
|
||||||
|
else
|
||||||
|
f.donnees.(f.queue) <- x;
|
||||||
|
f.queue <- (f.queue + 1) mod capacite;
|
||||||
|
f.taille <- f.taille + 1
|
||||||
|
;;
|
||||||
|
|
||||||
|
let defiler_fileb f =
|
||||||
|
let capacite = Array.length f.donnees in
|
||||||
|
if f.taille = 0 then
|
||||||
|
failwith "File vide"
|
||||||
|
else
|
||||||
|
let x = f.donnees.(f.tete) in
|
||||||
|
f.tete <- (f.tete + 1) mod capacite;
|
||||||
|
f.taille <- f.taille - 1;
|
||||||
|
x
|
||||||
|
;;
|
||||||
|
|
||||||
|
let est_vide_fileb f = f.taille = 0;;
|
||||||
|
```
|
||||||
|
|
||||||
|
+ ```ocaml
|
||||||
|
let rec map func l = match l with
|
||||||
|
| [] -> []
|
||||||
|
| x::q -> (func x)::map func q
|
||||||
|
;;
|
||||||
|
```
|
||||||
|
|
||||||
|
+ ```c
|
||||||
|
void tri_denombrement(int t[], int taille, int k) {
|
||||||
|
int *counts = malloc((k+1)*sizeof(int));
|
||||||
|
for (int i=0; i<k+1; i+=1) {
|
||||||
|
counts[i] = 0;
|
||||||
|
}
|
||||||
|
for (int i=0; i<taille; i+=1) {
|
||||||
|
counts[t[i]] += 1;
|
||||||
|
}
|
||||||
|
int i = 0;
|
||||||
|
for (int j=0; j<k+1 && i < taille; j+=1) {
|
||||||
|
while (counts[j] > 0) {
|
||||||
|
t[i] = j;
|
||||||
|
i += 1;
|
||||||
|
counts[j] -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
== Exercices
|
||||||
|
|
||||||
|
=== Exercice 1
|
||||||
|
\
|
||||||
|
Première fonction :
|
||||||
|
```ocaml
|
||||||
|
let rec somme l = match l with
|
||||||
|
| [] | _::[] -> l
|
||||||
|
| (x,a)::(y,b)::q ->
|
||||||
|
if x = y then
|
||||||
|
(x,a+.b)::somme q
|
||||||
|
else
|
||||||
|
(x,a)::somme ((y,b)::q)
|
||||||
|
;;
|
||||||
|
let func1 l = somme (List.fast_sort compare l);;
|
||||||
|
```
|
||||||
|
\
|
||||||
|
Deuxième fonction :
|
||||||
|
```ocaml
|
||||||
|
(* On suppose que l est une liste de Hashtbl *)
|
||||||
|
let rec func2 l = match l with
|
||||||
|
| [] -> Hashtbl.create 0
|
||||||
|
| ht::q ->
|
||||||
|
let ht2 = func2 q in
|
||||||
|
Hashtbl.iter
|
||||||
|
(fun cle x ->
|
||||||
|
Hashtbl.replace ht2 cle (
|
||||||
|
match Hashtbl.find_opt ht2 cle with
|
||||||
|
| None -> x
|
||||||
|
| Some x2 -> x+.x2
|
||||||
|
)
|
||||||
|
)
|
||||||
|
ht;
|
||||||
|
ht2
|
||||||
|
;;
|
||||||
|
```
|
||||||
|
#pagebreak()
|
||||||
|
Troisième fonction :
|
||||||
|
```c
|
||||||
|
struct couple {
|
||||||
|
int cle;
|
||||||
|
double val;
|
||||||
|
};
|
||||||
|
typedef struct couple cpl;
|
||||||
|
void sort(cpl t[], int taille) {
|
||||||
|
if (taille <= 1) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
int pivot = t[taille-1].cle;
|
||||||
|
int i = 0;
|
||||||
|
int j = taille-2;
|
||||||
|
while (i<j) {
|
||||||
|
while (t[i].cle<=pivot && i<j) i+=1;
|
||||||
|
while (t[j].cle>=pivot && i<j) j-=1;
|
||||||
|
cpl temp = t[i];
|
||||||
|
t[i] = t[j];
|
||||||
|
t[j] = temp;
|
||||||
|
}
|
||||||
|
cpl temp = t[taille-1];
|
||||||
|
t[taille-1] = t[i];
|
||||||
|
t[i] = temp;
|
||||||
|
sort(t, i);
|
||||||
|
sort(t+i+1, taille-i-1);
|
||||||
|
}
|
||||||
|
// Renvoie la nouvelle taille du tableau
|
||||||
|
int func3(cpl t[], int taille) {
|
||||||
|
sort(t, taille);
|
||||||
|
int i=0;
|
||||||
|
for (int j=1; j<taille; j+=1) {
|
||||||
|
if (t[j-1].cle == t[j].cle) {
|
||||||
|
t[i].val += t[j].val;
|
||||||
|
} else {
|
||||||
|
i+=1;
|
||||||
|
t[i] = t[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i += 1;
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
```
|
||||||
Loading…
Reference in New Issue
Block a user