Programmation - Corrections des TPs


Une colonnes par TP

Remarque : il peut y avoir plusieurs solutions possibles pour chaque TP. Celle proposée est la meilleure.

Corrections TP1

TP1-1 - algo


Début
  Entier carre

  carre <- 17 x 17
  afficher carre
Fin
		

TP1-1 - C

TP1-1 - Remarque

Le carré de 100 000 est incohérent. Il dépasse la valeur maximale qui peut être stockée dans une variable de type int.

TP1-2 - algo


Début
  Réel Pi, D, d, volume

  Pi <- 3,1516
  D <- 2 x 3,3
  d <- 2 x 2
  volume <- Pi / 4 x 4,3
  volume <- volume x ((D x D) - (d x d))
  afficher volume
Fin
		

TP1-2 - C

TP1-3 - algo


Début
  Entier adultes, enfants, naissances, total

  adultes <- 28
  enfants <- 53
 
  naissances <- adultes / 2
  adultes <- adultes + enfants
  enfants <- naissances

  naissances <- adultes / 2
  total <- adultes + enfants + naissances
  afficher total
Fin
		

TP1-3 - C

Corrections TP2

TP2-1 - algo


Début
  Réel euros, francs

  obtenir euros
  francs <- euros x 6,55956
  afficher francs
Fin
		

TP2-1 - C

TP2-2 - Version 1 - algo


Début
  Réel a, b, abs

  obtenir a
  obtenir b
  si (a > b)
    abs <- a - b
  sinon
    abs <- b - a
  finsi
  afficher abs
Fin
		

TP2-2 - Version 1 - C

TP2-2 - Version 2 - algo


Début
  Réel a, b, abs

  obtenir a
  obtenir b
  abs <- a - b
  si (abs < 0)
    abs <- (- abs)
  finsi
  afficher abs
Fin
		

TP2-2 - Version 2 - C

TP2-3 - Version 1 - algo


Début
  Entier jour, mois

  obtenir jour
  obtenir mois
  si (mois = 9 et jour > 22)
    afficher "vous etes balance"
  sinon
    si (mois = 10 et jour < 23)
      afficher "vous etes balance"
    sinon
      afficher "vous n'etes pas balance"
    finsi
  finsi
Fin
		

TP2-3 - Version 1 - C

TP2-3 - Version 2 - algo


Début
  Entier jour, mois

  obtenir jour
  obtenir mois
  si ( (mois = 9 et jour > 22) ou (mois = 10 et jour < 23) )
    afficher "vous etes balance"
  sinon
    afficher "vous n'etes pas balance"
  finsi
Fin
		

TP2-3 - Version 2 - C

TP2-4 - Version 1 - C

TP2-4 - Version 2 - C

TP2-6 - Version 1 - C

TP2-6 - Version 2 - C

TP2-7 - Version 1 - C

TP2-7 - Version 2 - C

TP2-8 - algo


Début
  Réel base, hauteur, aire
  Entier i

  pour i de 1 à 5
    obtenir base
    obtenir hauteur
    aire <- base x hauteur / 2
    afficher aire
  finpour
Fin
		

TP2-8 - C

TP2-9 - algo


Début
  Réel base, hauteur, aire
  Entier i, nb

  obtenir nb
  pour i de 1 à nb
    obtenir base
    obtenir hauteur
    aire <- base x hauteur / 2
    afficher aire
  finpour
Fin
		

TP2-9 - C

TP2-10 - algo


Début
  Réel somme, moyenne
  Entier i, nb, note

  obtenir nb
  somme <- 0
  pour i de 1 à nb
    obtenir note
    somme <- somme + note
  finpour
  moyenne <-somme / nb
  afficher moyenne
Fin
		

TP2-10 - C

TP2-14 - C

Corrections TP3

TP3-1 - algo


Début
  Entier nombre

  obtenir nombre
  tant que ( nombre < 101 ou (nombre % 17) ≠ 0)
    obtenir nombre
  fintantque
Fin
		

TP3-1 - C

TP3-2 - algo


Début
  Réel base, hauteur, aire

  obtenir base
  obtenir hauteur
  tant que (base > 0 et hauteur > 0)
    aire <- base x hauteur / 2
    afficher aire
    obtenir base
    obtenir hauteur
  fintantque
Fin
		

TP3-2 - C

TP3-3 - algo


Début
  Entier i, n, nb, max

  obtenir n
  obtenir nb
  max <- nb
  pour i de 2 à n
    otenir nb
    si (nb > max)
      max <- nb
    finsi
  finpour
  afficher max
Fin
		

TP3-3 - Remarque

Cet algorithme ne fonctionne pas s'il n'y a aucun nombre à saisir. Si on voulait prendre en compte ce cas particulier, il faudrait modifier l'algorithme.

TP3-3 - C

Corrections TP4

TP4-1 - algo

Il faut utiliser une boucle "pour" car il y a un nombre déterminé d'itérations à effectuer. On peut savoir le nombre d'années sur lesquelles effectuer la simulation avant de commencer les calculs (il est donné par l'utilisateur).


Début
   Entier i, nombre_annees
   Entier adultes, enfants, naissances, total

   adultes <- 28
   lapereaux <- 53
   obtenir nombre_annees
   pour i de 1 à nombre_annees
      naissances <- adultes / 2
      adultes <- adultes + enfants
      enfants <- naissances
   finpour
   total <- adultes + enfants
   afficher total
Fin
		

TP4-2 - algo

Il faut utiliser une boucle "tant que" car il y a un nombre indéterminé d'itérations à effectuer. Il est impossible de connaitre le nombre d'années sur lesquelles faire la simulation au début (c'est justement le but du problème).


Début
   Entier cible, nombre_annees
   Entier adultes, enfants, naissances, total

   adultes <- 28
   lapereaux <- 53
   total <- adultes + lapereaux
   nombre_annees <- 0
   tant que (total ≤ cible)
      naissances <- adultes / 2
      adultes <- adultes + enfants
      enfants <- naissances
      total <- adultes + enfants
      nombre_annees <- nombre_annees + 1
   fintantque
   afficher nombre_annees
Fin
		

TP4-3 - algo


Début
   Entier i, nombre, somme

   somme <-0
   obtenir nombre
   pour i de nombre à 1000 par pas de nombre
      somme <- somme + i
   finpour
   afficher somme
Fin
		

TP4-3 - algo (Suite)

3)En utilisant le modulo (reste de la division entière) "%".
"x finit par 8" <==> "(x % 10) = 8"


Début
   Entier i, nombre, somme

   somme <-0
   obtenir nombre
   pour i de nombre à 1000 par pas de nombre
      si ( (i % 10) ≠ 8)
         somme <- somme + i
      finsi
   finpour
   afficher somme
Fin
		

TP4-4 - algo

Il faut utiliser une boucle "tant que" car le nombre d'itérations est indéterminé, il dépend de ce que l'utilisateur saisit à chaque itération.


Début
   Entier nombre_precedant, nombre_courant

   obtenir nombre_precedent
   obtenir nombre_courant
   tant que (nombre_precedent ≠ nombre_courant)
      nombre_precedent <- nombre_courant
      obtenir nombre_courant
   fintantque
Fin
		

TP4-5 - algo


Début
   Entier i, puissance

   puissance <- 1
   pour i de 1 à 12
      puissance <- puissance x 3
   finpour
   afficher puissance
Fin
		

TP4-5 - algo (Suite)


Début
   Entier i, j, choix, puissance

   pour i de 2 à 18 par pas de 2
      afficher "Entrez 1 pour afficher 3^" i 
      obtenir choix
      si (choix = 1)
         puissance <- 1
         pour j de 1 à i
            puissance <- puissance x 3
         finpour
         afficher puissance
      finsi
   finpour
Fin
		

TP2-11 - algo


Début
   Réel note, somme, moyenne
   Entier i, nb_notes_saisies, nb_notes

   obtenir nb_notes_saisies
   nb_notes <- nb_notes_saisies
   somme <- 0
   pour i de 1 à nb_notes_saisies
      obtenir note
      somme <- somme + note
      si (note < 10)
         somme <- somme + 2 x note
         nb_notes <- nb_notes + 2
      finsi
   finpour
   moyenne <- somme / nb_notes
   afficher moyenne
Fin
		

TP2-12 - algo


Début
   Entier nombre, a, b
   Entier nb_multiples
  
   nb_multiple <- 0
   obtenir nombre
   pour a de 2 à 101
      pour b de 1 à nombre
         si ( (a x b) = nombre)
            nb_multiple <- nb_multiple + 1
         finsi
      finpour
   finpour
   si (nb_multiple > 0)
      afficher "il y a" nb_multiple "multiples"
   sinon
      afficher "il n'y a pas de multiples"
   finsi
Fin
		

TP3-4 - algo


Début
   Entier saisie, max, nb_saisies

   obtenir saisie
   max <- saisie
   nb_saisies <- 0
   tant que (saisie > 0)
      obtenir saisie
      si (saisie > max)
         max <- saisie
      finsi
      nb_saisies <- nb_saisies + 1
   fintantque
   afficher "nombre de saisies :" nb_saisies
   si (max > 0)
      afficher "maximum :" max
   finsi
Fin
		

Corrections TP5

TP5-1 - algo

Il y a au maximum 13 nombres a stocker, un tableau de taille 13 permet ainsi de tous les stocker.


Début
  Entier nombres[13]
  Entier i,n

  obtenir n
  pour i de 0 à (n-1)
    obtenir nombres[i]
  finpour
  pour i de 0 à (n-1)
    si (nombre[i] % 3 = 0)
      afficher nombres[i]
    finsi
  finpour
Fin
		

TP5-2 - algo

1)


Début
  Entier n

  faire
    obtenir n
  tantque (n<1 ou n>17)
Fin
		

TP5-2 - algo

2)


Début
  Réel nombres[17]
  Réel m
  Entier i,n,res

  faire
    obtenir n
  tantque (n<1 ou n>17)
  pour i de 0 à (n-1)
    obtenir nombres[i]
  finpour
  obtenir m
  res <- 0
  pour i de 0 à (n-1)
    si (nombres[i] > m)
      res <- res + 1
    finsi
  finpour
  afficher res
Fin
		

Corrections préparation Algo

Algo-1


Début
  Entier cents
  Entier nb_pieces
  
  obtenir cents
  nb_pieces <- cents / 50
  si (nb_pieces > 0)
    afficher nb_pieces "pieces de 50 cents"
  finsi
  cents <- cents % 50
  nb_pieces <- cents / 10
  si (nb_pieces > 0)
    afficher nb_pieces "pieces de 10 cents"
  finsi
  cents <- cents % 10
  si (cents > 0)
    afficher cents "pieces de 1 cents"
  finsi
Fin
		

Algo-2


Début
  Entier heures
  Réel salaire, paie

  obtenir salaire
  obtenir heures
  si (heures < 36)
    paie <- heures x salaire
  sinon
    paie <- (heures - 35) x salaire
    paie <- paie x 1,3 + 35 x salaire
  finsi
  afficher paie
Fin
		

Algo-3

Affichage :

  • 5 et 5
  • 5 et 7
  • 7 et 7
  • 7 et 10
  • 10 et 10

Algo-4

Une boucle Pour est nécessaire car on sait combien de valeurs il y aura dans le produit (n).


Début
  Entier n, i, fact
  
  obtenir n
  fact <- 1
  pour i de 2 à n
    fact <- fact x i
  finpour
  afficher fact
Fin
		

Algo-5

  • ligne 2 : les variables doivent etre de type Entier
  • ligne 4 : la variable i n'est pas déclarée
  • ligne 4 : la boucle fait 5 itérations (0,1,2,3,4) au lieu de 4. Il faut "pour i de 1 à 4"
  • ligne 6 : il faut utiliser une fleche pour changer la valeur d'une variable
  • ligne 6 : le reste s'obtient avec le modulo "%"
  • ligne 10 : il faut afficher "n'est PAS un multiple de 5"
  • ligne 11 : il manque le finsi

Algo-5

Programme sans erreur :


Début
  Entier i, nombre_saisi, reste_division

  pour i de 1 à 4
    reste_division <- nombre_saisi % 5
    si ( reste_division = 0)
      afficher nombre_saisi "est un multiple de 5"
    sinon 
      afficher nombre_saisi "n'est pas un multiple de 5"
    finsi
  finpour
Fin
		

Algo-6

Une boucle "tant que" est nécessaire car on ne sait pas combien d'iterations il va y avoir, c'est le but du probleme de calculer ce nombre. La fin de la boucle est liée à une condition et il faut continuer TANT QU'elle n'est pas réalisée.


Début
  Entier annee, alpha, beta

  annee <- 0
  alpha <- 5000
  beta <- 10000
  tant que (beta > alpha)
    alpha <- alpha x 1.03
    si (annee % 2 = 0)
      beta <- beta + 750
    finsi
    annee <- annee + 1
  fintantque  
  afficher annee
Fin
		

Algo-7

Une boucle "tant que" est nécessaire car on ne sait pas combien d'iterations il va y avoir. La fin de la boucle est liée à une condition (le reste de la division euclidienne doit etre nulle) et il faut continuer TANT QU'elle n'est pas réalisée.


Début
  Entier a, b, reste

  obtenir a
  obtenir b
  reste <- a % b
  tant que (reste > 0)
    a <- b
    b <- reste
    reste <- a % b
  fintantque
  afficher b
Fin
		

Algo-8


Début
  Entier note, coeff
  Entier somme_notes, somme_coeffs
  Reel moyenne
  Entier i

  somme_notes <- 0
  somme_coeffs <- 0
  pour i de 1 à 5
    faire
      obtenir note
    tant que (note < 0 ou note > 20)
    faire
      obtenir coeff
    tant que (coeff < 1)
    somme_notes <- somme_notes + note x coeff
    somme_coeffs <- somme_coeffs + coeff
  finpour
  moyenne <- (somme_notes x 1,0) / somme_coeffs
  afficher moyenne
Fin
		

Corrections Examen Algo

Exercice 1


Début
  Entier heures, minutes, secondes
  
  obtenir heures
  obtenir minutes
  
  secondes <- ( heures x 60  + minutes ) x 60
  afficher secondes
Fin
		

Exercice 2

Il y avait 9 erreurs

  • Ligne 4 : "essais" doit etre initialisé à 0 : "essais <- 0"
  • Ligne 5 : Il faut "obtenir b" avant de commencer la boucle
  • Ligne 5 : b doit etre le carré de a, donc "b ≠ a x a"
  • Ligne 5 : b doit etre un diviseur de a, donc "a % b ≠ 0"
  • Ligne 5 : Manque une parenthèse juste après le "ou"
  • Ligne 5 : Ce doit etre un "et", pas un "ou"
  • Ligne 7 : "essais" n'est pas bien incrémenté "essais <- essais +1"
  • Ligne 8 : L'affichage doit etre fait après la fin de boucle
  • Ligne 9 : il faut un "fintantque", pas de "finpour"

Exercice 2

Programme sans erreur


Début
  Entier a, b, essais
  
  obtenir a
  obtenir b
  essais <- 0
  tant que ( (b != a x a) et ((a % b) != 0) )
    obtenir b
    essais <- essais + 1
  fintantque
  afficher essais
Fin
		

Exercice 3

Une boucle "pour" est nécessaire car il y a un nombre déterminé et fixe de valeurs à obtenir (6).


Début
  Réel nombre, somme
  Entier i

  somme <- 0
  pour i de 1 à 6
    obtenir nombre
    si (nombre < 0)
      nombre <- 0 - nombre
    finsi
    somme <- somme + nombre
  finpour
  afficher somme 
Fin
		

Exercice 4

Une boucle "while" est nécessaire car on ne sait pas combien d'itération seront nécessaire. Cela dépend de ce que l'utilisateur saisit


Début
  Réal prec, cour
  Réel ecart, max
  Entier nb

  
  nb <- 0
  max <- 0
  faire
    si (nb >= 2) 
       ecart <- cour - prec
       si (ecart < 0)
         ecart <- 0 - ecart
       finsi
       si (ecart > max)
         max <- ecart
       finsi
    finsi
    si (nb >= 1) 
      prec <- cour
    finsi
    obtenir cour
    nb <- nb + 1
  tant que (cour > 0)
  si (nb<2)
    afficher "erreur"
  sinon
    afficher ecart
  finsi    
Fin
		

Exercice 5

q1) Une boucle "while" car on ne sait pas combien l'utilisateur fera d'essais pour la saisie

q2) Une boucle "pour" car le nombre de valeurs à tester est déterminé (de 2 au nombre saisi)


Début
  Entier n, i, nb_divs

  faire 
    obtenir n
  tant que (n < 0)
  si (n = 0)
    afficher n " n'est pas premier"
  sinon
    nb_divs <- 0
    pour i de 1 à n
      si (n % i = 0)
        nb_divs <- nb_divs + 1
      finsi
    finpour
    si (nb_divs = 2)
      afficher n "est premier"
    sinon
      affiche n "n'est pas premier"
  finsi
Fin
		

Exercice 6

Affichage :

  • 3 et 2
  • 2 et 4
  • 1 et 5
  • 0 et 9
  • 3 et 8

Exercice Bonus


Début 
  Entier i, tab[10]
  Entier min, c
  
  pour i de 0 à 9
    obtenir tab[i]
    si (i = 0 ou tab[i] < min)
      min <- tab[i]
    finsi
  finpour
  min <- min-1
  faire 
    min <- min+1
    c <- 0
    pour i de 0 à 9
      si (tab[i] <= min)
        c <- c+1
      finsi
    finpour
  tant que (c < 5)
  afficher min
Fin
		

Corrections TP6

TP6-1 / Q1)

TP6-1 / Q2)

TP6-1 / Q3)

TP6-1 / Q4)

TP6-1 / Q5)

TP6-2

Corrections TP7

TP7-1

TP7-2

TP7-3

TP7-4

TP7-5

TP7-6

TP7-7

TP7-8