« Php algo td5 » : différence entre les versions
Autres actions
| (17 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 111 : | 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> | |||
Dernière version 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