Différences entre versions de « Php algo td5 »
(18 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 54 : | Ligne 54 : | ||
<div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
− | <big> | + | <big>Solution</big> |
<source lang="text" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | <source lang="text" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
FONCTION init_tab(n) | FONCTION init_tab(n) | ||
Ligne 92 : | Ligne 92 : | ||
<div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
− | <big> | + | <big>Solution</big> |
<source lang="text" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | <source lang="text" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
− | FONCTION barrer(T, | + | FONCTION barrer(T,p) |
VAR | VAR | ||
− | |||
i, valeur : entier | i, valeur : entier | ||
+ | fin : booléen | ||
i <- 2 | i <- 2 | ||
+ | fin <- faux | ||
− | TANT QUE | + | TANT QUE !fin FAIRE |
− | valeur = i* | + | valeur = i*p |
− | T[valeur] <- faux | + | SI valeur < len(T) ALORS |
− | + | T[valeur] <- faux | |
+ | i++ | ||
+ | SINON | ||
+ | fin <- vrai | ||
+ | FIN SI | ||
FIN TANT QUE | FIN TANT QUE | ||
Ligne 112 : | Ligne 117 : | ||
== Exercice 3 == | == Exercice 3 == | ||
+ | Écrire une fonction ''tab_premiers(T)'' qui crée la liste des nombres premiers cherchés et qui renvoie cette liste. | ||
+ | |||
+ | <u>Exemple :</u> | ||
+ | {| | ||
+ | |-align="center" | ||
+ | || | ||
+ | ''tab_premiers(T) '' | ||
+ | || | ||
+ | → | ||
+ | || | ||
+ | {|class="wikitable" width="60%" | ||
+ | |-align="center" | ||
+ | || 2|| 3||5|| 7|| 11|| 13 | ||
+ | |} | ||
+ | |} | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
+ | <big>Solution</big> | ||
+ | <source lang="text" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
+ | FONCTION tab_premiers(T) | ||
+ | VAR | ||
+ | resultat : liste d'entiers | ||
+ | i : entier | ||
+ | POUR i ALLANT DE 2 A len(T) {PAR_PAS_DE 1} | ||
+ | T <- barrer(T, i) | ||
+ | FIN POUR | ||
+ | POUR i ALLANT DE 2 A len(T) {PAR_PAS_DE 1} | ||
+ | SI T[i] = vrai ALORS | ||
+ | resultat.append(i) | ||
+ | FIN SI | ||
+ | FIN POUR | ||
+ | RETOURNER resultat | ||
+ | FIN FONCTION | ||
+ | </source> | ||
+ | </div> | ||
= Partie B = | = Partie B = | ||
== Exercice 1 == | == Exercice 1 == | ||
+ | Coder la fonction init_tab(n) de l’exercice 1 puis la tester. | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
+ | <big>Solution</big> | ||
+ | <source lang="php" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
+ | function init_tab($n){ | ||
+ | $T = array(); | ||
+ | $T[0] = false; | ||
+ | $T[1] = false; | ||
+ | for ($i = 2; $i < $n; $i++) { | ||
+ | $T[$i] = true; | ||
+ | } | ||
+ | return $T; | ||
+ | } | ||
+ | |||
+ | function main(){ | ||
+ | $T = init_tab(15); | ||
+ | var_dump($T); | ||
+ | } | ||
+ | |||
+ | main(); | ||
+ | </source> | ||
+ | </div> | ||
+ | |||
== Exercice 2 == | == Exercice 2 == | ||
+ | Coder la fonction barrer(T,p) de l’exercice 2 puis la tester. | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
+ | <big>Solution</big> | ||
+ | <source lang="php" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
+ | function barrer($T, $p) { | ||
+ | $valeur = 2; | ||
+ | $i = 2; | ||
+ | $fin = false; | ||
+ | while (!$fin) { | ||
+ | $valeur = $i * $p; | ||
+ | if ($valeur < sizeof($T)) { | ||
+ | $T [$valeur] = false; | ||
+ | $i ++; | ||
+ | } else { | ||
+ | $fin = true; | ||
+ | } | ||
+ | } | ||
+ | return $T; | ||
+ | } | ||
+ | function main() { | ||
+ | $T = init_tab(15); | ||
+ | $T = barrer($T,2); | ||
+ | var_dump($T); | ||
+ | } | ||
+ | |||
+ | main (); | ||
+ | </source> | ||
+ | </div> | ||
+ | |||
== Exercice 3 == | == Exercice 3 == | ||
+ | Coder la fonction tab_premiers(T) de l’exercice 3 puis la tester. | ||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
+ | <big>Solution</big> | ||
+ | <source lang="php" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
+ | function tab_premiers($T) { | ||
+ | $resultat = array(); | ||
+ | for($i = 2; $i < sizeof($T); $i++) { | ||
+ | $T = barrer( $T, $i ); | ||
+ | } | ||
+ | for($i = 2; $i < sizeof($T); $i++) { | ||
+ | if ($T[$i] == true) { | ||
+ | $resultat[] = $i; | ||
+ | } | ||
+ | } | ||
+ | return $resultat; | ||
+ | } | ||
+ | |||
+ | function main() { | ||
+ | $T = init_tab(15); | ||
+ | $T = tab_premiers($T); | ||
+ | var_dump($T); | ||
+ | } | ||
+ | |||
+ | main ($argv); | ||
+ | </source> | ||
+ | </div> | ||
+ | |||
+ | == Exercice 4 == | ||
+ | Écrire la fonction principale qui prend en paramètre la taille de la liste et qui affiche les nombres premiers. | ||
+ | |||
+ | <div class="toccolours mw-collapsible mw-collapsed" style="width:700px"> | ||
+ | <big>Solution</big> | ||
+ | <source lang="php" style="border:1px solid black;font-size:130%" class="mw-collapsible-content"> | ||
+ | function main($argv) { | ||
+ | if (sizeof ( $argv ) == 1) { | ||
+ | echo "Spécifier la taille du tableau !"; | ||
+ | exit ( 1 ); | ||
+ | } | ||
+ | /* Lecture de la tailler */ | ||
+ | $taille = $argv [1]; | ||
+ | /* Initialisation du tableau */ | ||
+ | $T = init_tab ($taille); | ||
+ | /* Récupération des nombres premiers */ | ||
+ | $T = tab_premiers ( $T ); | ||
+ | /* Affichage de la réponse */ | ||
+ | echo "Voici la liste des nombres premiers jusqu'à ".$taille." : "; | ||
+ | foreach ($T as $valeur){ | ||
+ | echo $valeur; | ||
+ | if($valeur != $T[sizeof($T)-1]){ | ||
+ | echo ", "; | ||
+ | } | ||
+ | } | ||
+ | echo "\n"; | ||
+ | } | ||
+ | |||
+ | main ($argv); | ||
+ | </source> | ||
+ | </div> | ||
+ | |||
+ | = Exécution = | ||
+ | <pre> | ||
+ | # php -f eratosthene.php 15 | ||
+ | Voici la liste des nombres premiers jusqu'à 15 : 2, 3, 5, 7, 11, 13 | ||
+ | # php -f eratosthene.php 100 | ||
+ | Voici la liste des nombres premiers jusqu'à 100 : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97 | ||
+ | </pre> |
Version actuelle datée du 19 avril 2014 à 19:25
Introduction
On cherche à trouver tous les nombres premiers inférieurs à un entier n fixé. L’algorithme du crible d’Ératosthène consiste à barrer, dans la liste de 0 à n, tous les nombres qui ne sont pas premiers. Si l’on cherche tous les nombres premiers inférieurs à 15, l’algorithme procède de la manière suivante :
1. On barre les entiers 0 et 1 qui ne sont pas premiers ;
2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
2. Puis on barre tous les multiples stricts de 2, (2 non compris) ;
2 | 3 | 5 | 7 | 9 | 11 | 13 | 15 |
3. Puis on barre tous les multiples stricts de 3 ;
2 | 3 | 5 | 7 | 11 | 13 |
4. Etc...
La méthode choisie ici consistera à mettre « false » pour une case barrée et « true » sinon. On utilise un tableau de booléens que l’on initialise ainsi : 1. On barre les entiers 0 et 1 qui ne sont pas premiers ;
false | false | true | true | true | true | true | true | true | true | true | true | true | true | true | true |
TAB[0]=false et TAB[1]=false car 0 et 1 ne sont pas premier, et on suppose au début que tous les autres nombres de 2 à 20 sont premiers. A la fin de l’algorithme, seuls les éléments d’indice premiers sont à « true », tous les autres sont passés à « false » (ce qui revient à les barrer).
Partie A
Exercice 1
Écrire une fonction init_tab(n) dont le paramètre est un entier n. Cette fonction renvoie une liste T de taille n représentant les booléens « false », « false » puis « true ».
Exemple :
init_tab(15) |
→ |
|
Solution
FONCTION init_tab(n)
VAR
T : liste de booléens
i : entier
T[0] <- faux
T[1] <- faux
POUR i ALLANT DE 2 A n {PAR_PAS_DE 1}
T[n] <- vrai
FIN POUR
RETOURNER T
FIN FONCTION
Exercice 2
Écrire une fonction barrer(T,p), dont les paramètres sont une liste T et p un nombre premier. Cette fonction remplace true par false dans la liste T lorsque l’indice de T est un multiple de p puis renvoie T.
Exemple :
barrer(T, 2) |
→ |
|
Solution
FONCTION barrer(T,p)
VAR
i, valeur : entier
fin : booléen
i <- 2
fin <- faux
TANT QUE !fin FAIRE
valeur = i*p
SI valeur < len(T) ALORS
T[valeur] <- faux
i++
SINON
fin <- vrai
FIN SI
FIN TANT QUE
RETOURNER T
FIN FONCTION
Exercice 3
Écrire une fonction tab_premiers(T) qui crée la liste des nombres premiers cherchés et qui renvoie cette liste.
Exemple :
tab_premiers(T) |
→ |
|
Solution
FONCTION tab_premiers(T)
VAR
resultat : liste d'entiers
i : entier
POUR i ALLANT DE 2 A len(T) {PAR_PAS_DE 1}
T <- barrer(T, i)
FIN POUR
POUR i ALLANT DE 2 A len(T) {PAR_PAS_DE 1}
SI T[i] = vrai ALORS
resultat.append(i)
FIN SI
FIN POUR
RETOURNER resultat
FIN FONCTION
Partie B
Exercice 1
Coder la fonction init_tab(n) de l’exercice 1 puis la tester.
Solution
function init_tab($n){
$T = array();
$T[0] = false;
$T[1] = false;
for ($i = 2; $i < $n; $i++) {
$T[$i] = true;
}
return $T;
}
function main(){
$T = init_tab(15);
var_dump($T);
}
main();
Exercice 2
Coder la fonction barrer(T,p) de l’exercice 2 puis la tester.
Solution
function barrer($T, $p) {
$valeur = 2;
$i = 2;
$fin = false;
while (!$fin) {
$valeur = $i * $p;
if ($valeur < sizeof($T)) {
$T [$valeur] = false;
$i ++;
} else {
$fin = true;
}
}
return $T;
}
function main() {
$T = init_tab(15);
$T = barrer($T,2);
var_dump($T);
}
main ();
Exercice 3
Coder la fonction tab_premiers(T) de l’exercice 3 puis la tester.
Solution
function tab_premiers($T) {
$resultat = array();
for($i = 2; $i < sizeof($T); $i++) {
$T = barrer( $T, $i );
}
for($i = 2; $i < sizeof($T); $i++) {
if ($T[$i] == true) {
$resultat[] = $i;
}
}
return $resultat;
}
function main() {
$T = init_tab(15);
$T = tab_premiers($T);
var_dump($T);
}
main ($argv);
Exercice 4
Écrire la fonction principale qui prend en paramètre la taille de la liste et qui affiche les nombres premiers.
Solution
function main($argv) {
if (sizeof ( $argv ) == 1) {
echo "Spécifier la taille du tableau !";
exit ( 1 );
}
/* Lecture de la tailler */
$taille = $argv [1];
/* Initialisation du tableau */
$T = init_tab ($taille);
/* Récupération des nombres premiers */
$T = tab_premiers ( $T );
/* Affichage de la réponse */
echo "Voici la liste des nombres premiers jusqu'à ".$taille." : ";
foreach ($T as $valeur){
echo $valeur;
if($valeur != $T[sizeof($T)-1]){
echo ", ";
}
}
echo "\n";
}
main ($argv);
Exécution
# php -f eratosthene.php 15 Voici la liste des nombres premiers jusqu'à 15 : 2, 3, 5, 7, 11, 13 # php -f eratosthene.php 100 Voici la liste des nombres premiers jusqu'à 100 : 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97