Blog ENI : Toute la veille numérique !
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
En raison d'une opération de maintenance, le site Editions ENI sera inaccessible le mardi 10 décembre, en début de journée. Nous vous invitons à anticiper vos achats. Nous nous excusons pour la gêne occasionnée
  1. Livres et vidéos
  2. Algorithmique - Techniques fondamentales de programmation
  3. Techniques fondamentales de programmation
Extrait - Algorithmique - Techniques fondamentales de programmation exemples en C# - (nombreux exercices corrigés) [BTS - DUT informatique]
Extraits du livre
Algorithmique - Techniques fondamentales de programmation exemples en C# - (nombreux exercices corrigés) [BTS - DUT informatique]
1 avis
Revenir à la page d'achat du livre

Corrigés des exercices

Introduction à l’algorithmique

Exercice 1

Sans tenir compte du signe, quelle est la valeur maximale d’un nombre codé en 32 bits ? Indiquez comment calculer facilement cette valeur et exprimez le résultat en décimal et en hexadécimal.

Réponse

La taille maximale d’un nombre sur 32 bits est de 232-1. Ce résultat est facilement trouvable comme ceci :

1*231 + 1*230 + 1*229 + … + 1*20

Ce qui donne 4294967295, le nombre maximal pouvant être stocké dans 32 bits, et non 4294967296 (232).

Sa représentation hexadécimale est FFFFFFFF.

Exercice 2

Convertissez le nombre décimal 123456789 en binaire et en hexadécimal.

Réponse

123456789/2 = 61728394, reste 1

61728394/2 = 30864197, reste 0

30864197/2 =15432098, reste 1

15432098/2 = 7716049, reste 0

7716049/2 = 3858024, reste 1

3858024/2 = 1929012, reste 0

1929012/2 = 964506, reste 0

964506/2 = 482253, reste 0

482253/2 = 241126, reste 1

241126/2 =120563, reste 0

120563/2 = 60281, reste 1

60281/2 = 30140, reste 1

30140/2 =15070, reste 0

15070/2 = 7535, reste 0

7535/2 = 3767, reste 1

3767/2 = 1883, reste 1

1883/2 = 941, reste 1

941/2 = 470, reste 1

470/2 = 235, reste 0

235/2 = 117, reste 1

117/2 = 58, reste 1

58/2 = 29, reste 0

29/2 = 14, reste 1

14/2 = 7, reste 0

7/2 = 3, reste 1

3/2 = 1 reste 1

1/2 = 0 reste 1

Le résultat est donc 111 0101 1011 1100 1101 0001 0101 soit 31 bits.

En hexadécimal...

Les variables et opérateurs

Exercice 1

Quelles seront les valeurs des variables A et B après chaque ligne du code suivant ?


VAR 
  A,B :entiers 
DEBUT 
  A←3 
  B←A+3 
  A←4 
FIN
 

Réponse


  A←3
 

A=3, B n’a pas encore de valeur.


  B←A+3
 

A=3, B=6


  A←4
 

A=4, B=6

Exercice 2

Quelles seront les valeurs des variables A, B et C après chaque ligne du code suivant ?


VAR 
  A,B,C :entiers 
DEBUT 
  A←3 
  B←5 
  C←A+B 
  A←2 
  C←B-A 
FIN
 

Réponse


  A←3
 

A=3, B et C n’ont pes encore de valeur.


  B←5
 

A=3, B=5, C n’a pas encore de valeur.


  C←A+B
 

A=3, B=5, C=8


  A←2
 

A=2, B=3, C=8


  C←B-A
 

A=2, B=3, C=1

Exercice 3

Quelles seront les valeurs des variables A et B après chaque ligne du code suivant ?


VAR 
  A,B :entiers 
DEBUT 
  A←3 
  B←A+4 
  A←A+2 
  B←A-4 
FIN
 

Réponse


  A←3
 

A=3, B n’a pas encore de valeur.


  B←A+4
 

A=3, B=7


  A←A+2
 

A=5, B=7


  B←A-4
 

A=5, B=1

Exercice 4

Quelles seront les valeurs des variables A, B et C après chaque ligne du code suivant ?


VAR 
  A,B,C:entiers 
DEBUT 
  A←5 
 ...

Tests et logique booléenne

Exercice 1

Écrire, avec des comparaisons, un algorithme qui affiche l’état de l’eau (glace, liquide, vapeur) en fonction de sa température.

Réponse


PROGRAMME ETAT 
VAR 
  T :numérique 
DEBUT 
  Afficher "Température ?" 
  Saisir T 
  Si T<=0 Alors 
    Afficher "C'est de la glace" 
  SinonSi T<100 Alors 
    Afficher "C'est liquide" 
  Sinon 
    Afficher "C'est de la vapeur" 
  FinSi
 

Exercice 2

Écrire le même algorithme, mais en utilisant deux variables booléennes pour vérifier l’état de l’eau, sans comparaisons dans les SI.

Réponse


PROGRAMME ETAT 
VAR 
  T :numérique 
  A,B :booléens 
DEBUT 
  Afficher "Température ?" 
  Saisir T 
  A←T<=0 
  B←T<100 
  Si A Alors 
    Afficher "C'est de la glace" 
  SinonSi B Alors 
    Afficher "C'est liquide" 
  Sinon 
    Afficher "C'est de la vapeur" 
  FinSi
 

Exercice 3

Écrire un algorithme qui détermine la catégorie sportive d’un utilisateur en fonction de son âge :

  • 6 à 7 ans : poussin

  • 8 à 9 ans : pupille

  • 10 à 11 ans : minime

  • 12 ans et plus : cadet

Écrire le programme C# associé.

Réponse

La meilleure solution est d’utiliser une structure Si - SinonSi.


PROGRAMME CATEGORIE 
VAR 
  age :entier 
DEBUT 
  Afficher "Age ?" 
  Saisir age 
  Si age>=12 Alors 
    Afficher "cadet" 
  SinonSi age>=10 Alors 
    Afficher "minime" 
  SinonSi age>=8 Alors 
    Afficher "pupille" 
  SinonSi age>=6 Alors 
    Afficher "poussin" 
  FinSi 
FIN
 

Ce qui donne en C# :


class chap3_categorie 
{ 
    static void Main(string[] args) 
    { ...

Les boucles

Exercice 1

Quel algorithme permet d’afficher les nombres pairs entre 1 et 10 ? Fournissez le programme C# associé. Que faut-il simplement faire pour afficher ensuite les nombres impairs ?

Réponse


Programme Pair 
VAR 
    a:entier 
            
DEBUT 
    a←1 
    Tant Que a<=10 
      Si a MOD 2 = 0 Alors 
        Afficher a 
      FinSi 
      a←a+1 
    FinTantQue 
FIN
 

Ceci se traduit en C# comme ceci :


class chap4_pair 
{ 
    static void Main(string[] args) 
    { 
        int a = 1; 
 
        while (a <= 10) 
        { 
            if (a % 2 == 0)  
                System.Console.WriteLine(a); 
            a++; 
        } 
    } 
}
 

Ce qui donne :


> chap4_pair.exe 
2 
4 
6 
8 
10
 

Il suffit de modifier le test du Si pour sortir les nombres impairs :


if(a % 2 == 1) 
   System.Console.WriteLine(a);
 

Le même algorithme avec une boucle Pour :


DEBUT 
    a←1 
    Pour a De 1 à 10 Faire 
      Si a MOD 2 = 0 Alors 
        Afficher a 
      FinSi 
    FinPour 
FIN
 

Exercice 2

Écrire un algorithme qui calcule la somme de tous les chiffres de 1 à n. Utilisez tout d’abord Tant Que, puis Pour. Fournissez les deux possibilités dans le même programme C#.

Réponse

On doit calculer 1+2+3+…+n, donc effectuer n passages dans la boucle. Avec un Tant que, on peut décrémenter n et stopper la boucle lorsque sa valeur atteint zéro.


Programme multiplication 
VAR 
    n:entier 
    resultat:entier 
DEBUT 
    n←10 
  
    Tant Que n<>0 
      resultat←resultat+n ...

Les tableaux et structures

Exercice 1

Donnez un algorithme (et le code C# associé) qui permet de trouver le nombre d’occurrences d’une valeur entière dans un tableau de 20 valeurs.

Réponse

On définit un tableau de 20 valeurs, une variable qui contient la valeur recherchée et une dernière qui contient le nombre d’occurrences. On balaie tout le tableau et à chaque fois que la valeur est trouvée on incrémente le compteur.


PROGRAMME OCCUR 
VAR 
  tab:tableau[1..20]←{10,17,14,3,12,2,15,9,7,10,14,13,8,1,9,19,17,
14,2, 5} d'entiers 
  valeur,nb_occurences,i:entiers 
DEBUT 
  valeur←14 
  nb_occurences←0 
  Pour i de 1 à 20 Faire 
    Si tab[i]=valeur Alors 
      nb_occurences←nb_occurences+1 
    FinSi 
  FinPour 
  Afficher nb_occurences 
FIN
 

Le code C# ressemble à ceci :


class chap5_occur 
{ 
    static void Main(string[] args) 
    { 
        int[] tab = { 10, 17, 14, 3, 12, 2, 15, 9, 7, 10, 14, 13, 
            8, 1, 9, 19, 17, 14, 2, 5 }; 
        int valeur, nb_occurences, i; 
 
        valeur = 14; 
        nb_occurences = 0; 
 
        for (i = 0; i < 20; i++) 
        { 
            if (tab[i] == valeur) nb_occurences++; 
        } 
        System.Console.WriteLine(nb_occurences); 
    } 
}
 

Ce qui logiquement donne à l’exécution :


> chap5_occur.exe 
3
 

Exercice 2

Comment déterminer si un tableau d’entiers à une dimension est trié par ordre croissant ? Donnez l’algorithme et le code C#.

Réponse

Pour déterminer si un tableau est trié, il faut balayer l’ensemble du tableau et comparer chaque élément avec le suivant (ou le précédent, selon qu’on démarre au premier ou au second élément). Un drapeau, de type booléen et initialisé à VRAI, prendra la valeur FAUX...

Les sous-programmes

Exercice 1

Créer la fonction « absolu » qui prend une valeur numérique en paramètre et qui retourne sa valeur absolue.

Réponse

La fonction prend et retourne un entier :


Fonction absolu(n :numérique) :entier 
Début 
  Si n<0 Alors 
    n← -n 
  FinSi 
  Retourne n 
FinFonc
 

La fonction va s’utiliser dans un programme comme ceci :


PROGRAMME TESTABS 
DEBUT 
 Afficher absolu(-2) 
FIN
 

Exercice 2

Reprendre l’algorithme de l’exercice 4 du chapitre Les tableaux et structures et le transformer en fonction qui trie le tableau passé en paramètre. Un second paramètre, de type booléen, sera vrai pour croissant, faux pour décroissant. Pour simplifier la tâche, on introduit la fonction prédéfinie taille() qui retourne le nombre d’éléments du tableau.

Le tri par ordre décroissant a-t-il un intérêt ?

Réponse

L’adaptation est relativement simple :


Fonction tri(t[] :tableau d'entiers, croissant :booléen) 
VAR 
  i,mem,pos,Cpt:entiers 
DEBUT 
  Cpt←taille(t) 
  Pour i de 1 à Cpt faire 
    mem←t[i] 
    pos←i-1 
    Tant Que pos>=0 ET ( (croissant ET t[pos]>mem) 
    OU ( NON  croissant ET t[pos]<mem ) ) 
      t[pos+1]←t[pos] ...

Les fichiers

Exercice 1

Écrire l’algorithme COPIE qui copie un fichier dans un autre, octet par octet. Donner le programme C# associé.

Réponse

On ouvre un fichier en lecture, l’autre en écriture, et on utilise la fonction EcrireOctet pour y écrire les octets lus dans le premier.


Programme COPIE 
Var 
  Fic,fic2 :fichiers binaires 
  octet :entier 
Début 
  Ouvrir nom dans fic en lecture 
  Ouvrir nom2 dans fic2 en écriture 
  Tant que NON EOF(fic) Faire 
    octet←LireOctet(fic) 
    EcrireOctet(fic2,octet) 
  FinTantQue 
  Fermer fic 
  Fermer fic2 
Fin
 

On peut se passer de la variable octet :


    EcrireOctet(fic2,LireOctet(fic))
 

Le résultat en C# est le suivant :


using System.IO; 
 
class chap7_copy 
{ 
    static void Main(string[] args) 
    { 
        FileStream FicSRC = null; 
        FileStream FicDST = null; 
 
        int o = 0; 
        try 
        { 
            // Ouvre le fichier  
            FicSRC = new FileStream("SRC.jpg", FileMode.Open, 
               FileAccess.Read); 
            FicDST = new FileStream("DST.jpg", FileMode.Open, 
               FileAccess.Write); 
 
            while ((o = FicSRC.ReadByte()) != -1) 
                FicDST.WriteByte((byte)o); 
 
            FicSRC.Close(); 
            FicDST.Close(); 
 
        } 
        catch (IOException e) 
        { 
            System.Console.WriteLine("IOException:"); 
        } 
    } 
}
 

Exercice 2

Cet exercice représente une synthèse des précédents chapitres et propose de développer un utilitaire complet, pratique...

Notions avancées

Exercice 1

Écrire l’algorithme permettant de parcourir et d’afficher les n éléments d’un tableau d’entiers, partant de son premier élément, avec un pointeur.

Réponse

Il suffit de récupérer l’adresse du premier élément dans un pointeur. En incrémentant ce pointeur, on se déplace dans le tableau.


PROGRAMME TabPointeur 
Var 
  Tab:tableau[1..10] d'entiers 
  n←1:entier 
  pTab: pointeur sur entier 
Début 
  pTab←adresse de Tab[1] 
  Tant Que n<=10 Faire 
    Afficher *pTab  
    pTab←pTab+1 
  FinTanQue 
Fin
 

Exercice 2

Créer une structure de liste chaînée circulaire et y placer trois éléments. Créer la fonction permettant de retourner le premier élément, puis celle permettant de parcourir tous les éléments.

Réponse

Un élément d’une liste circulaire est identique à ceux vus dans le chapitre, sauf qu’on y ajoute un drapeau, un booléen qu’on va appeler premier. Il prend la valeur VRAI si l’élément est le premier, FAUX sinon.


TYPES 
  // Un élément de liste chaînée 
Structure element 
    valeur:entier ...

Une approche de l’objet

Exercice 1

Écrire une classe permettant de décrire un livre et de positionner les valeurs associées. Donner un exemple d’utilisation en C#.

Réponse

Tout d’abord on liste les propriétés, ou attributs, d’un livre :

  • Titre

  • Auteur

  • Éditeur

  • Nombre de pages

  • Année

Ensuite, on liste les méthodes permettant de gérer ces propriétés :

  • Modifier chacun des attributs ci-dessus.

  • Accéder aux attributs.

  • Créer un nouvel objet livre via un ou plusieurs constructeurs.

Un constructeur par défaut va initialiser les variables, un autre prendra toutes les valeurs. On implémente ensuite quelques méthodes.

Une définition peut être :


Classe livre 
  attributs 
    titre : chaine 
    auteur: chaine 
    editeur: chaine 
    nbpages : entier 
    annee : entier 
  methodes: 
    Constructeur livre() 
    Début 
      this.titre←"" 
      this.auteur←"" 
      this.editeur←"" 
      this.nbpages←0 
      this.annee←1900 
    Fin 
    Constructeur livre(titre:chaine,  auteur:chaine, 
    editeur:chaine, nbpages:entier, annee:entier) 
    Début 
      this.titre←titre 
      this.auteur←auteur 
      this.editeur←editeur 
      this.nbpages←nbpages 
      this.annee←annee 
    Fin 
  
    Fonction settittle(titre:chaine) 
    Début 
      this.titre←titre 
    FinFonc 
  
    Fonction setauteur(auteur:chaine) 
    Début 
      this.auteur←auteur 
    FinFonc 
  
    Fonction setediteur(editeur:chaine) 
   ...