Friday, February 14, 2014

Exercices corrigés en langage c : les méthodes de tri

Exercice 1 : Tri de Shell

Traduire la fonction TRI_SHELL définie ci-dessous en C.

Ecrire un programme pour tester la fonction TRI_SHELL.

   procédure TRI_SHELL(T,N)
   |  (* Trie un tableau T d'ordre N par la méthode
   |     de Shell en ordre croissant. *)
   |  résultat: entier tableau T[100]
   |  donnée: entier N
   |  entier SAUT, M, K
   |  booléen TERMINE
   |  en SAUT ranger N
   |  tant que (SAUT>1) faire
   |  |  en SAUT ranger SAUT divent 2
   |  |  répéter
   |  |  |  en TERMINE ranger vrai
   |  |  |  pour M variant de 1 à N-SAUT faire
   |  |  |  |  en K ranger M+SAUT
   |  |  |  |  si (T[M]>T[K]) alors
   |  |  |  |  |   PERMUTER(T[M],T[K])
   |  |  |  |  |   en TERMINE ranger faux
   |  |  |  |  fsi
   |  |  |  fpour
   |  |  jusqu'à TERMINE
   |  ftant (* SAUT <= 1 *)
   fprocédure (* fin TRI_SHELL *)
Remarque: L'algorithme a été développé par D.L.Shell en 1959. En comparant d'abord des éléments très éloignés, l'algorithme a tendance à éliminer rapidement les grandes perturbations dans l'ordre des éléments. La distance entre les éléments qui sont comparés est peu à peu réduite jusqu'à 1. A la fin du tri, les éléments voisins sont arrangés.

Correction exercice 1: Tri de Shell



#include <stdio.h>

main()
{
/* Prototypes des fonctions appelées */
void TRI_SHELL(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */

/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_SHELL(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}

void TRI_SHELL(int *T, int N)
{
/* Trie un tableau T d'ordre N par la méthode de Shell */
/* Prototypes des fonctions appelées */
void PERMUTER(int *A, int *B);
/* Variables locales */
int SAUT, M, K;
int TERMINE;
/* Traitements */
SAUT = N;
while (SAUT>1)
{
SAUT /= 2;
do
{
TERMINE=1;
for (M=0; M<N-SAUT; M++) /* Attention aux indices! */
{
K=M+SAUT;
if (*(T+M) > *(T+K))
{
PERMUTER(T+M,T+K);
TERMINE=0;
}
}
}
while(!TERMINE); /* Attention: utiliser la négation de */
} /* la condition employée en lang algorithmique */
}

void PERMUTER(int *A, int *B)
{
int AIDE;
AIDE = *A;
*A = *B;
*B = AIDE;
}

void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}

void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 2:

Déterminer le maximum de N éléments d'un tableau TAB d'entiers de trois façons différentes:

a) la fonction MAX1 retourne la valeur maximale

b) la fonction MAX2 retourne l'indice de l'élément maximal

c) la fonction MAX3 retourne l'adresse de l'élément maximal

Ecrire un programme pour tester les trois fonctions.

Correction exercice 2:

Déterminer le maximum de N éléments d'un tableau TAB d'entiers de trois façons différentes:
a) la fonction MAX1 retourne la valeur maximale
int MAX1(int *TAB, int N)
{
int MAX,I; /* variables d'aide */
MAX=*TAB;
for (I=1; I<N; I++)
if (MAX < *(TAB+I))
MAX = *(TAB+I);
return MAX;
}
b) la fonction MAX2 retourne l'indice de l'élément maximal
int MAX2(int *TAB, int N)
{
int I,MAX; /* variables d'aide */
MAX=0;
for (I=1; I<N; I++)
if (*(TAB+MAX) < *(TAB+I))
MAX = I;
return MAX;
}
c) la fonction MAX3 retourne l'adresse de l'élément maximal
int *MAX3(int *TAB, int N)
{
int *MAX, *P; /* pointeurs d'aide */
MAX=TAB;
for (P=TAB; P<TAB+N; P++)
if (*MAX < *P)
MAX=P;
return MAX;
}
Ecrire un programme pour tester les trois fonctions:
#include <stdio.h>

main()
{
/* Prototypes des fonctions appelées */
int MAX1 (int *TAB, int N);
int MAX2 (int *TAB, int N);
int *MAX3(int *TAB, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */

/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
printf("MAX1 : %d \n", MAX1(T,DIM) );
printf("MAX2 : %d \n", T[MAX2(T,DIM)] );
printf("MAX3 : %d \n", *MAX3(T,DIM) );
return 0;
}

int MAX1(int *TAB, int N)
{
. . .
}

int MAX2(int *TAB, int N)
{
. . .
}

int *MAX3(int *TAB, int N)
{
. . .
}

void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}

void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 3 : Tri par sélection

Ecrire la fonction TRI_SELECTION qui trie un tableau de N entiers par la méthode de sélection directe du maximum (voir exercice 7.14). La fonction fera appel à la fonction PERMUTER (définie dans le cours) et à la fonction MAX3 (définie dans l'exercice précédent).

Ecrire un programme pour tester la fonction TRI_SELECTION.

Correction exercice 3 : Tri par sélection



#include <stdio.h>

main()
{
/* Prototypes des fonctions appelées */
void TRI_SELECTION(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */


/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_SELECTION(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}

void TRI_SELECTION(int *T, int N)
{
/* Prototypes des fonctions appelées */
void PERMUTER(int *A, int *B);
int *MAX3(int *TAB, int N);
/* Variables locales */
int I; /* rang à partir duquel T n'est pas trié */

/* Tri par sélection directe du maximum */
for (I=0 ; I<N-1 ; I++)
PERMUTER(T+I, MAX3(T+I,N-I) );
}

int *MAX3(int *TAB, int N)
{
. . .
}

void PERMUTER(int *A, int *B)
{
. . .
}

void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}

void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 4 :

Ecrire la fonction INSERER qui place un élément X à l'intérieur d'un tableau qui contient N éléments triés par ordre croissant, de façon à obtenir un tableau à N+1 éléments triés par ordre croissant. La dimension du tableau est incrémentée dans la fonction INSERER.

Ecrire un programme profitant des fonctions définies plus haut pour tester la fonction INSERER.

Correction exercice 4 : 

#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void INSERER(int X, int *T, int *N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
int A; /* Nombre à insérer */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
printf("Introduire le nombre à insérer : ");
scanf("%d", &A);
INSERER(A, T, &DIM);
printf("Tableau résultat : \n");
ECRIRE_TAB (T, DIM);
return 0;
}

void INSERER(int X, int *T, int *N)
{
/* Variables locales */
int I;
/* Insertion de X dans le tableau T supposé trié: */
/* Déplacer les éléments plus grands que X d'une */
/* position vers l'arrière. */
for (I=*N ; I>0 && *(T+I-1)>X ; I--)
*(T+I) = *(T+I-1);
/* X est copié à la position du dernier élément déplacé */
*(T+I)=X;
/* Nouvelle dimension du tableau: */
(*N)++; /* Attention aux parenthèses ! */
}

void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}

void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 5: Tri par insertion

Ecrire la fonction TRI_INSERTION qui utilise la fonction INSERER pour trier par ordre croissant les éléments d'un tableau à N éléments.

Ecrire un programme pour tester la fonction TRI_INSERTION.

Méthode: Trier le tableau de gauche à droite en insérant à chaque fois l'élément I+1 dans le tableau (déjà trié) des I premiers éléments.



Correction exercice 5: Tri par insertion

#include <stdio.h>

main()
{
/* Prototypes des fonctions appelées */
void TRI_INSERTION(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_INSERTION(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}


void TRI_INSERTION(int *T, int N)
{
void INSERER(int X, int *T, int *N);
/* Variables locales */
int I; /* indice courant */
/* Tri de T par insertion */
I=1;
while (I<N)
INSERER(*(T+I), T, &I);
}

void INSERER(int X, int *T, int *N)
{
. . .
}

void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}

void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 6 :

Ecrire la fonction RANGER qui arrange le contenu de ses deux paramètres X et Y de façon à ce que le contenu de X soit plus petit que celui de Y. RANGER retourne la valeur logique 1 si un échange a eu lieu, sinon 0.

Correction exercice 6 :

int RANGER(int *X, int *Y)
{
int AIDE;
if (*X>*Y)
{
AIDE = *X;
*X = *Y;
*Y = AIDE;
return 1;
}
else
return 0;
}

Exercice 7 : Tri par propagation

Ecrire la fonction TRI_BULLE qui trie un tableau de N éléments entiers par ordre croissant en appliquant la méthode de la bulle (tri par propagation - voir exercice 7.15). Employer la fonction RANGER de l'exercice ci-dessus.

Ecrire un programme pour tester la fonction TRI_BULLE.

Correction exercice 7 : Tri par propagation



#include <stdio.h>
main()
{
/* Prototypes des fonctions appelées */
void LIRE_TAB (int *TAB, int *N, int NMAX);
void TRI_BULLE(int *T, int N);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
int T[100]; /* Tableau d'entiers */
int DIM; /* Dimension du tableau */
/* Traitements */
LIRE_TAB (T, &DIM, 100);
printf("Tableau donné : \n");
ECRIRE_TAB (T, DIM);
TRI_BULLE(T, DIM);
printf("Tableau trié : \n");
ECRIRE_TAB (T, DIM);
return 0;
}

void TRI_BULLE(int *T, int N)
{
/* Prototypes des fonctions appelées */
int RANGER(int *X, int *Y);
/* Variables locales */
int I,J; /* indices courants */
int FIN; /* position où la dernière permutation a eu lieu */
/* permet de ne pas trier un sous-ensemble déjà trié. */
/* Tri de T par propagation de l'élément maximal */
for (I=N-1 ; I>0 ; I=FIN)
{
FIN=0;
for (J=0; J<I; J++)
if (RANGER(T+J, T+J+1)) FIN = J;
}
}

int RANGER(int *X, int *Y)
{
. . .
}
void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}
void ECRIRE_TAB (int *TAB, int N)
{
. . .
}

Exercice 8 : Fusion de tableaux triés

Ecrire la fonction FUSION qui construit un tableau FUS trié par ordre croissant avec les éléments de deux tableaux A et B triés par ordre croissant. Pour deux tableaux de dimensions N et M, le tableau FUS aura la dimension N+M. (Méthode: voir exercice 7.13)

Ecrire un programme qui teste la fonction FUSION à l'aide de deux tableaux lus au clavier et triés à l'aide de TRI_BULLE.

Correction exercice 8 : Fusion de tableaux triés



#include <stdio.h>

main()
{
/* Prototypes des fonctions appelées */
void FUSION(int *A, int *B, int *FUS, int N, int M);
void TRI_BULLE(int *T, int N);
void LIRE_TAB (int *TAB, int *N, int NMAX);
void ECRIRE_TAB (int *TAB, int N);
/* Variables locales */
/* Les tableaux et leurs dimensions */
int A[100], B[100], FUS[200];
int N, M;
/* Traitements */
printf("*** Tableau A ***\n");
LIRE_TAB (A, &N, 100);
printf("*** Tableau B ***\n");
LIRE_TAB (B, &M, 100);
TRI_BULLE(A, N);
printf("Tableau A trié : \n");
ECRIRE_TAB (A, N);
TRI_BULLE(B, M);
printf("Tableau B trié : \n");
ECRIRE_TAB (B, M);
FUSION(A,B,FUS,N,M);
printf("Tableau FUS : \n");
ECRIRE_TAB (FUS, N+M);
return 0;
}


void FUSION(int *A, int *B, int *FUS, int N, int M)
{
/* Variables locales */
/* Indices courants dans A, B et FUS */
int IA,IB,IFUS;
/* Fusion de A et B dans FUS */
IA=0, IB=0; IFUS=0;
while ((IA<N) && (IB<M))
if (*(A+IA)<*(B+IB))
{
*(FUS+IFUS)=*(A+IA);
IFUS++;
IA++;
}
else
{
FUS[IFUS]=B[IB];
IFUS++;
IB++;
}
/* Si A ou B sont arrivés à la fin, alors */
/* copier le reste de l'autre tableau. */
while (IA<N)
{
*(FUS+IFUS)=*(A+IA);
IFUS++;
IA++;
}
while (IB<M)
{
*(FUS+IFUS)=*(B+IB);
IFUS++;
IB++;
}
}

void TRI_BULLE(int *T, int N)
{
/* Prototypes des fonctions appelées */
int RANGER(int *X, int *Y);
. . .
}
int RANGER(int *X, int *Y)
{
. . .
}
void LIRE_TAB (int *TAB, int *N, int NMAX)
{
. . .
}
void ECRIRE_TAB (int *TAB, int N)
{
. . .
}


Why Static Code Analysis is Important?

From last few years, Software code quality and security has went from being a �nice to have� to a necessity, and many organizations, including investment banks are making it mandatory to pass static code analysis test, penetration testing and security testing before you deploy your code in production. Static analysis tools like findbugs and fortify are getting popular every passing day and more and more companies are making fortify scan mandatory for all new development. For those unaware of what static code analysis is, static code analysis is about analysing your source code without executing them to find potential vulnerabilities, bugs and security threats. Static code analyser looks for patterns, defined to them as rules, which can cause those security vulnerability or other code quality problems, necessary for production quality code. But like every other technology, static analysis has it�s set of advantages and disadvantages, which is also best way to judge any technology. Static code analyser are not a new thing, and they are here from long time, but as a senior Java developer or Team lead, you have responsibility to set-up process like automated code analysis, continuous integration, automation testing to keep your project in healthy state and promote best development practices in your team. In my opinion, unit testing, code review and static code analysis makes a nice combo, along with continuous integration. In this article, we will learn some pros and cons of static code analysis, to let you decide, whether static analysis is important or not. I am already convinced with pros, and we are using fortify scanning in all our projects, and have seen benefits of that, but its not all good, its also time consuming. When your tool alert you with false positive, you start taking them lightly and then it become habit to treat everything as false positive, which eventually take away all benefits of static code analysis. You need to be discipline enough, not to fall on that trap.
Read more �

Tuesday, February 11, 2014

Display tag Pagination, Sorting Example in JSP and Servlet

If you are a Java programmer, writing JSP pages for your web application and doesn't know much about JavaScript, jQuery, CSS and HTML, then display tag is best for creating dynamic tables, pagination, sorting, and exporting data into PDF, Word and Excel format. Display tag is a JSP tag library, where code is written in Java but you can use them like HTML tags e.g. <display></display> . Though display tag is old library, I have always used in JSP for displaying tabular data. It comes with sample CSS as well, which is good enough for many applications. Long time back, I have shared some display tag tips and example, and many of my reader asked me to write about how to do pagination and sorting in JSP page. I haven't really got chance to work on JSP after that, so it took me so long to share this display tag pagination and sorting example tutorial. Anyway, In this tutorial we will not only learn about pagination and sorting but also learn how to display multiple tables using display tag in one JSP file. There is a non obvious detail, which can trouble you if you are also like many programmers, who write code by copying, including me :). If you create another table by just copying the table already exists in page, it may not work, until you remember to provide two different ids or uids. In absence of unique identifier like this, any pagination or sorting activity on one table will also disturb other table. So always remember to provide unique id or uid to each table, created by display tag in same page.
Read more �

Monday, February 10, 2014

Cours java : Les collections en Java

Les collections en Java :


1. Structures de données

C'est l'organisation efficace d'un ensemble de données, sous la forme de tableaux, de listes, de piles etc. Cette efficacité réside dans la quantité mémoire utilisée pour stocker les données, et le temps nécessaire pour réaliser des opérations sur ces données.


2. Collections & Java


Une collection gère un groupe d'un ensemble d'objets d'un type donné ; ou bien c'est un objet qui sert à stocker d'autres objets.  Dans les premières versions de Java, les collections étaient représentées par les "Array","Vector","Stack" etc. Puis avec Java 1.2 (Java 2), est apparu le frameWork de collections qui tout en gardant les principes de bases, il a apporté des modifications dans la manière avec laquelle ces collections ont été réalisées et hiérarchisées.

Tout en collaborant entre elles, ces collections permettent de réaliser dans des catégories de logiciels des conceptions réutilisables.


3. Collections Framwork de Java

Réparties en deux groupes:

3.1. Interfaces




Organisées en deux catégories: Collection & Map.

- Collection: un groupe d'objets où la duplication peut-être autorisée.

- Set: est ensemble ne contenant que des valeurs et ces valeurs ne sont pas dupliquées. Par exemple l'ensemble A = {1,2,4,8}. Set hérite donc de Collection, mais n'autorise pas la duplication. SortedSet est un Set trié.

- List: hérite aussi de collection, mais autorise la duplication. Dans cette interface, un système d'indexation a été introduit pour permettre l'accès (rapide) aux éléments de la liste.

- Map: est un groupe de paires contenant une clé et une valeur associée à cette clé. Cette interface n'hérite ni de Set ni de Collection. La raison est que Collection traite des données simples alors que Map des données composées (clé,valeur). SortedMap est un Map trié.


4. Algorithmes

Sont utilisés pour traiter les éléments d'un ensemble de données. Ils définissent une procédure informatique, par exemple: tris, recherche etc.


5. Itérateurs


Fournissent aux algorithmes un moyen pour parcourir une collection du début à la fin. Ce moyen permet de retirer donc à la demande des éléments donnés de la collection.

6. Description des interfaces

6.1. Collection


public interface Collection<E> extends Iterable<E> {
    // Basic Operations
    int size();
    boolean isEmpty();
    boolean contains(Object element);
    boolean add(E element);         // Optional
    boolean remove(Object element); // Optional
    Iterator iterator();

    // Bulk Operations
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c); // Optional
    boolean removeAll(Collection<?> c);        // Optional
    boolean retainAll(Collection<?> c);        // Optional
    void clear(); // Optional

    // Array Operations
    Object[] toArray();
    <T> T[] toArray(T[] a);
}

Les interfaces contiennent des méthodes optionnelles. Cette approche permet de traiter les collections particulières sans que nous soyons dans l'obligation de définir les méthodes optionnelles. Ces méthodes optionnelles sont définies qu'en cas de besoin. Un Set non modifiable n'a pas besoin de la méthode add, puisque nous ne pouvons pas le modifier!  Par contre, puisqu’il implémente l’interface, il doit tout de même la redéfinir, dans ce cas la méthode génère une exception de type UnsupportedOperationException.

Il y a des opérations réalisées sur un seul objet ou bien sur une collection (un ensemble d'objets).

add (remove) permet d'ajouter (resp. de retirer) un élément. Quand à addAll (removeAll) permet d'ajouter (resp. de retirer même si les éléments sont dupliqués dans la collection originale) une collection.

contains (containsAll) permet de vérifier si un objet (resp. les éléments d'une collection) est présent dans la collection.

size, isEmpty et clear, permettent respectivement de donner la taille de la collection, de vérifier si la collection est vide et finalement d'effacer le contenu de la collection.

retainsAll se comporte comme le résultat de l'intersection de deux ensembles. Si A={1,2,5,8} et B={3,8} alors A = {8}.

equals permet de tester si deux objets sont égaux.

hashCode retourne le code de hachage calculé pour la collection.

toArray retourne les éléments de la collection sous le format d'un tableau.

toArray(T[] a) permet de préciser le type du tableau à retourner. Si le tableau est grand les éléments sont rangés dans ce tableau, sinon un nouveau tableau est crée pour recevoir les éléments de la collection.  ex : String[] a = c.toArray(new String[0]);

L'interface collection est dotée d'une instance d'une classe qui implante l'interface Iterator. C'est l'outil utilisé pour parcourir une collection. L'interface Iterator contient ce qui suit:

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); // Optional
}

hasNext permet de vérifier s'il y a un élément qui suit.
next permet de pointer l'élément suivant et retourne une référence du bon type, donc, pas besoin de conversion de type (Type Cast).
remove permet de retirer l'élément courant.


Collection<String> collection = new ArrayList<String>();
...
Iterator<String> iterator = collection.iterator();
while (iterator.hasNext()) {
      String element = iterator.next();
      if (removalCheck(element)) {
       iterator.remove();
      }
}


Les  collections vues comme des ensembles réalisent les 3 opérations mathématiques sur des ensembles:

union: add et addAll

intersection: retainAll

différence: remove et removeAll

6.2. Set

C'est une interface identique à celle de Collection. Trois implémentations possibles:

TreeSet: les éléments sont rangés de manière ascendante.
HashSet: les éléments sont rangés suivant une méthode de hachage.
LinkedHashSet: Comme HashSet mais éléments accessibles en ordre d’insertion.

import java.util.*;
public class SetExample {
    public static void main(String args[]) {
        Set<String> set = new HashSet<String>(); // Une table de Hachage
        set.add("Bernadine");
        set.add("Elizabeth");
        set.add("Gene");
        set.add("Elizabeth");
        set.add("Clara");
        System.out.println(set);
        Set<String> setTrie = new TreeSet<String>(set); // Un Set trié
        System.out.println(setTrie);
    }
}
[Gene, Clara, Bernadine, Elizabeth]
[Bernadine, Clara, Elizabeth, Gene]

6.2. List

Liste est une collection ordonnée. Elle permet la duplication des éléments. L'interface est renforcée par des méthodes permettant d'ajouter ou de retirer des éléments se trouvant à une position donnée. Elle permet aussi de travailler sur des sous listes. On utilise le plus souvent des ArrayList sauf s'il y a insertion d'élément(s) au milieu de la liste. Dans ce cas il est préférable d'utiliser une LinkedList pour éviter ainsi les décalages.

public interface List<E> extends Collection<E> {
   // Positional Access
   E get(int index);
   E set(int index, E element);    // Optional
   boolean add(E element);         // Optional
   void add(int index, E element); // Optional
   E remove(int index);            // Optional
   abstract boolean addAll(int index, Collection<? extends E> c);//Opt.

   // Search
   int indexOf(Object o);
   int lastIndexOf(Object o);

   // Iteration
   ListIterator<E> listIterator();
   ListIterator<E> listIterator(int index);

   // Range-view
   List<E> subList(int from, int to);
}
Les méthodes de l'interface List permettent d'agir sur un élément se trouvant à un index donné ou bien un ensemble d'éléments à partir d'un index donné dans la liste.

get (remove) retourne (resp. retirer) l'élément se trouvant à la position index.
set (add & addAll) modifie (resp. ajouter) l'élément (resp. un seul ou une collection) se trouvant à la position index.

indexOf (lastIndexOf) recherche si un objet se trouve dans la liste et retourner son (resp. son dernier) index.

subList permet de créer un sous liste d'une liste.

Pour parcourir une liste, il a été défini un itérateur spécialement pour la liste.

public interface ListIterator<E> extends Iterator<E> {
    boolean hasNext();
    E next();
    boolean hasPrevious();
    E previous();
    int nextIndex();
    int previousIndex();
    void remove(); // Optional
    void set(E o); // Optional
    void add(E o); // Optional
}

permet donc de parcourir la liste dans les deux directions et de modifier un élément (set) ou d'ajouter un nouveau élément.

List<Type> list = ...;
for (ListIterator<Type> i = list.listIterator(list.size());
     i.hasPrevious(); ) {
    Type t = i.previous();
    ...
}

ou encore :

List<Type> list = ...;
ListIterator<Type> iterator = list.listIterator(list.size());
while (iterator.hasPrevious()) {
      Type element = iterator.previous();
      ...
}


hasNext permet de vérifier s'il y a un élément qui suit.
next permet de pointer l'élément courant.
nextIndex retourne l'index de l'élément courant.

Pour les sous listes, elles sont extraites des listes de fromIndex (inclus) à toIndex (non inclus). Tout changement sur les sous listes affecte la liste de base, et l'inverse provoque un état indéfini s'il y a accès à la sous liste.

import java.util.*;

public class ListExample {
       public static void main(String args[]) {
            List<String> list = new ArrayList<String>();
            list.add("Bernadine");
            list.add("Elizabeth");
            list.add("Gene");
            list.add("Elizabeth");
            list.add("Clara");
            System.out.println(list);
            System.out.println("2: " + list.get(2));
            System.out.println("0: " + list.get(0));
            LinkedList<String> queue = new LinkedList<String>();
            queue.addFirst("Bernadine");
            queue.addFirst("Elizabeth");
            queue.addFirst("Gene");
            queue.addFirst("Elizabeth");
            queue.addFirst("Clara");
            System.out.println(queue);
            queue.removeLast();
            queue.removeLast();
            System.out.println(queue);
       }
}

[Bernadine, Elizabeth, Gene, Elizabeth, Clara]
2: Gene
0: Bernadine
[Clara, Elizabeth, Gene, Elizabeth, Bernadine]
[Clara, Elizabeth, Gene]


6.3. Map

C'est un ensemble de paires, contenant une clé et une valeur (en réalité, nous pouvons associer plusieurs valeurs. Dans ce cas la, nous sommes en présence d'une multimap … à voir en démo.).

Deux clés ne peuvent être égales au sens de equals.

L'interface interne Entry permet de manipuler les éléments d'une paire comme suit:

      public  interface Map.Entry<K,V>
{
        K getKey();
        V getValue();
        V setValue(V value);
}

getKey & getValue retournent respectivement la clé et la valeur associée à cette clé. setValue permet de modifier une valeur d'une paire. Remarque: faire attention de ne pas modifier directement la valeur associée à une clé. Pour le faire, retirer l'ancienne clé (et donc sa valeur aussi) et ajouter une nouvelle clé (avec cette nouvelle valeur).

public interface Map <K,V> {
    // Basic Operations
    V put(K key, V value);
    V get(Object key);
    V remove(Object key);
    boolean containsKey(Object key);
    boolean containsValue(Object value);
    int size();
    boolean isEmpty();
    // Bulk Operations
    void putAll(Map<? extends K,? extends V> t);
    void clear();

    // Collection Views
    public Set<K> keySet();
    public Collection<V> values();
    public Set<Map.Entry<K,V>> entrySet();
    // Interface for entrySet elements
    public interface Entry {
        K getKey();
        V getValue();
        V setValue(V value);
    }
}

values retourne les valeurs sous la forme d’une Collection.
keySet et entrySet retournent, respectivement, un ensemble (Set) de clés et un ensemble (set) d'Entry.

Ceci permet donc d'itérer sur les Map comme suit:

si m est un HashMap alors:

// sur les clés
for (Iterator<TypeCles> i = m.keySet().iterator();i.hasNext();)
      System.out.println(i.next());

// sur les valeurs
for (Iterator<TypeVal>  i = m.values().iterator();i.hasNext();)
      System.out.println(i.next());

// sur la paire clé/valeur
for (Map.Entry<TypeCles, TypeVals> e : m.entrySet())
               System.out.println(e.getKey() + ": " + e.getValue());




import java.util.*;
public class Freq {
 public static void main(String args[]) {
    Map<String, Integer> m1 = new HashMap<String, Integer>();
    Map<String,Integer> m2 = new LinkedHashMap<String, Integer>();

    // Initialize frequency table from command line
    for (String a : args) {             // Utilisation de for ... each
       Integer freq = m1.get(a);
       m1.put(a, (freq == null ? 1 : freq + 1));    //1 est enrobé dans
       m2.put(a, (freq == null ? 1 : freq + 1)); // dans un Integer
    }
    System.out.println(m1.size() + " distinct words:");
    System.out.println("Avec HashSet " + m1);
    System.out.println("Avec LinkedHashSet " + m2);
  }
}

exemples de résultats

=> java Freq Je suis le chef le grand chef

5 distinct words:
Avec HashSet {grand=1, chef=2, suis=1, Je=1, le=2}
Avec LinkedHashSet {Je=1, suis=1, le=2, chef=2, grand=1}

7. Description des algorithmes


L'ensemble des algorithmes manipulant les collections se trouve dans la classe Collections (à ne pas confondre avec l'interface Collection). Ces méthodes ont été définies statiques.

Des algorithmes qui ne s'appliquent que sur des listes:

Trier:
trier une liste :
public static <T extends Comparable<? super T>> void sort(List<T> list)
trie une liste en utilisant un comparateur.
public static <T> void sort(List<T> list, Comparator<? super T> c);

Mélanger:
public static void shuffle(List<?> list);
mélange les éléments de manière aléatoire.

Manipuler:
void reverse(List<?> list) ; inverse les éléments de la liste.
public static <T> void fill(List<? super T> list, T obj); initialise les éléments de la liste avec obj.
public static <T> void copy(List<? super T> dest, List<? extends T> src); copy une liste src dans une liste dest.

Rechercher:
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key);
une recherche binaire d'un élément.(key).
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key. Comparator<? super T> c)); d'un élément en utilisant un comparateur.


Des algorithmes qui s'appliquent sur toutes les collections:

effectuer des recherches extrêmes:
            min, max etc.

public static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
public static <T extends Object & Comparable<? super T>> T max (Collection<? extends T> coll)

8. Interface Comparable


Un algorithme extrêmement rapide et stable (les éléments équivalents ne sont pas réordonnés) est utilisé pour trier la liste en utilisant l'ordre naturel du type. Le tri ne peut avoir lieu que si les classes implémentent la méthode Comparable, ce qui n'est toujours pas le cas. Cette classe contient une seule méthode compareTo:

public interface Comparable<T> {
        public int compareTo(T obj);
}

Cette méthode retourne:

- entier positif si l'objet qui fait l'appel est plus grand que obj,
- zéro s'ils sont identiques,
- négatif si l'objet qui fait l'appel est plus petit que obj.

Dans le cas d'une classe qui n'implante pas la classe Comparable, ou bien vous voulez spécifier un autre ordre, vous devez implanter l'interface Comparator. Cette dernière permet de comparer deux éléments de la collection. Pour trier, nous passons une instance de cette classe à la méthode Sort().

public interface Comparator<T> {
        int compare(T o1, T o2);
}

 class CaseInsensitiveComparator implements Comparator<String> {
       public int compare(String element1,String element2) {
             String lowerE1 =  element1.toLowerCase();
             String lowerE2 = element2.toLowerCase();
             return lowerE1.compareTo(lowerE2);
       }
}

Exercices corrigés java : Gestion des comptes bancaires

Exercice : Gestion des comptes Bancaires :


Un compte bancaire possède à tout moment une donnée : son solde. Ce solde peut être positif (compte créditeur) ou négatif (compte débiteur).

Chaque compte est caractérisé par un code incrémenté automatiquement.
A sa création, un compte bancaire a un solde nul et un code incrémenté.
Il est aussi possible de créer un compte en précisant son solde initial.

Utiliser son compte consiste à pouvoir y faire des dépôts et des retraits. Pour ces deux opérations, il faut connaître le montant de l'opération.

L'utilisateur peut aussi consulter le solde de son compte par la méthode toString().
Un compte Epargne est un compte bancaire qui possède en plus un champ « TauxInterêt =6» et une méthode calculIntérêt() qui permet de mettre à jour le solde en tenant compte des interêts.

Un ComptePayant est un compte bancaire pour lequel chaque opération de retrait et de varsement est payante et vaut 5 dh

Exercice :

-Faire le diagramme des classes
   Définir la classe CompteBancaire .
   Définir la classe CompteEpargne.
   Définir la classe ComptePayant.
   Définir une classe contenant la fonction main() permettant de tester les classes CompteBancaire et        CompteEpargne avec les actions suivantes:

-Créer une instance de la classe CompteBancaire , une autre de la classe CompteEpargne et une instance de la classe ComptePayant

-Faire appel à la méthode deposer() de chaque instance pour déposer une somme quelconque dans ces comptes.

-Faire appel à la méthode retirer() de chaque instance pour retirer une somme quelconque de ces comptes.

-Faire appel à la méthode calculInterêt() du compte Epargne.

-Afficher le solde des 3 comptes.

Correction exercice:

-Diagramme de classes :



-Classe CompteBancaire :

public class CompteB {
 int code;
 float solde;
 static int nbComptes=0;

 public CompteB(float s){
     solde=s;
     ++nbComptes;
     code=nbComptes;
 }
 public CompteB(){
     this(0);
 }

 public void verser(float mt){
     solde=solde+mt;
 }
 public void retirer(float mt){
     solde-=mt;
 }
 public String toString(){
     return ("code="+code+ "Solde="+solde);
 }

}

-Classe CompteEpargne :

public class CompteE extends CompteB {
 float taux=6;
 public CompteE(float s){
     super(s);
 }
 public CompteE(){
     super(0);
 }
 public void calculInterets(){
     solde=solde*(1+taux/100);
 }
 public String toString(){
     return "Compte Epargne"+super.toString()+ "taux="+taux;
 }
}

-Classe Payant :

public class CompteP extends CompteB {
    public CompteP(float s){
        super(s);
    }
    public CompteP(){
        super(0);
    }
    public void verser(float mt){
        //solde=solde+mt;
        //solde=solde-5;
        super.verser(mt);
        super.retirer(5);
    }
    public void retirer(float mt){
        //solde=solde-mt;
        //solde=solde-5;
        super.retirer(mt);
        super.retirer(5);
    }
    public String toString(){
        return "Compte Payant"+super.toString();
    }

}

-Classe TestCompte :


public class TestCompte {

    public static void main(String[] args) {
        CompteB c1=new CompteB(5000);
        CompteE c2=new CompteE(55000);
        CompteP c3=new CompteP();
     
        c1.verser(6000);
        c1.retirer(4000);
        System.out.println(c1.toString());
        c2.verser(3300);
        c2.retirer(2000);
        System.out.println(c2);
        c2.calculInterets();
        System.out.println(c2);
        c3.verser(2000);
        System.out.println(c3.toString());
    }
}

Résultat de l’exécution :

code=1Solde=7000.0
Compte Epargnecode=2Solde=56300.0taux=6.0
Compte Epargnecode=2Solde=59677.996taux=6.0
Compte Payantcode=3Solde=1995.0

Exercices corrigés en algorithmique : algorithmes de base

Exercices en  Algorithmique


Exercice 1: 

Ecrire un programme qui échange la valeur de deux variables. Exemple, si a = 2 et b = 5, le programme donnera a = 5 et b = 2.

Correction exercice 1 :

Début
a=2
b=5
t  <--  a
a  <-- b
b  <-- t
Fin

ou bien

Début
a=2
b=5
a  <--  a+b
b  <-- a-b
a  <-- a-b
Fin

Exercice 2

Ecrire un programme qui demande un nombre à l’utilisateur, puis qui calcule et affiche le carré de ce nombre.

Correction exercice 2 :

Variables nb, carr en Entier
Début
Ecrire ”Entrez un nombre :”
Lire nb
carr <--  nb * nb
Ecrire ”Son carré est : ”, carr
Fin

En fait, on pourrait tout aussi bien économiser la variable carr en remplaçant les deux avant-dernières lignes par :

Ecrire ”Son carré est : ”, nb*nb

C’est une question de style ; dans un cas, on privilégie la lisibilité de l’algorithme, dans l’autre, on privilégie l’économie d’une variable.


Exercice 3 :


Ecrire un programme qui lit le prix HT d’un article, le nombre d’articles et le taux de TVA, et qui fournit le prix total TTC correspondant. Faire en sorte que des libellés apparaissent clairement.

Correction exercice 3 :

Variables nb, pht, ttva, pttc en Numérique
Début
Ecrire ”Entrez le prix hors taxes :”
Lire pht
Ecrire ”Entrez le nombre d’articles :”
Lire nb
Ecrire ”Entrez le taux de TVA :”
Lire ttva
pttc  <-- nb * pht * (1 + ttva)
Ecrire ”Le prix toutes taxes est : ”, pttc
Fin

Là aussi, on pourrait squeezer une variable et une ligne en écrivant directement. :

Ecrire ”Le prix toutes taxes est : ”, nb * pht * (1 + ttva)

C’est plus rapide, plus léger en mémoire, mais un peu plus difficile à relire (et à écrire !)

Exercice 4 :

Ecrire un algorithme qui demande deux nombres à l’utilisateur et l’informe ensuite si leur produit est négatif ou positif (on laisse de côté le cas où le produit est nul). Attention toutefois : on ne doit pas calculer le produit des deux nombres.

Correction exercice 4 :

Variables m, n en Entier
Début
Ecrire ”Entrez deux nombres : ”
Lire m, n
Si (m > 0 ET n > 0) OU (m < 0 ET n < 0) Alors
Ecrire ”Leur produit est positif”
Sinon
Ecrire ”Leur produit est négatif”
Finsi
Fin

Exercice 5 :

Ecrire un algorithme qui demande l’âge d’un enfant à l’utilisateur. Ensuite, il l’informe de sa catégorie :
”Poussin” de 6 à 7 ans
”Pupille” de 8 à 9 ans
”Minime” de 10 à 11 ans
”Cadet” après 12 ans

Peut-on concevoir plusieurs algorithmes équivalents menant à ce résultat ?

Correction exercice 5 :

Variable age en Entier
Début
Ecrire ”Entrez l’âge de l’enfant : ”
Lire age
Si age >= 12 Alors
Ecrire ”Catégorie Cadet”
SinonSi age >= 10 Alors
Ecrire ”Catégorie Minime”
SinonSi age >= 8 Alors
Ecrire ”Catégorie Pupille”
SinonSi age >= 6 Alors
Ecrire ”Catégorie Poussin”
Finsi
Fin

On peut évidemment écrire cet algorithme de différentes façons, ne serait-ce qu’en commençant par la catégorie la plus jeune.

Exercice 6 :


Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse convienne. En cas de réponse supérieure à 20, on fera apparaître un message : Plus petit ! , et inversement, Plus grand ! si le nombre est inférieur à 10.

Correction exercice 6 :

Variable N en Entier
Debut
N <--  0
Ecrire ”Entrez un nombre entre 10 et 20”
Lire N
TantQue N < 10 ou N > 20
Si N < 10 Alors
Ecrire ”Plus grand !”
SinonSi N > 20 Alors
Ecrire ”Plus petit !”
FinSi
FinTantQue
Fin

Exercice 7 :

Ecrire un algorithme qui demande un nombre de départ, et qui calcule la somme des entiers jusqu’à ce nombre. Par exemple, si l’on entre 5, le programme doit calculer : 1 + 2 + 3 + 4 + 5 = 15 NB : on souhaite afficher uniquement le résultat, pas la décomposition du calcul.

Correction exercice 7 :

Variables N, i, Som en Entier
Debut
Ecrire ”Entrez un nombre : ”
Lire N
Som <--  0
Pour i  <-- 1 à N
Som <--  Som + i
i Suivant
Ecrire ”La somme est : ”, Som
Fin

Exercice 8 :

Ecrire un algorithme qui demande un nombre de départ, et qui calcule sa factorielle.

NB : la factorielle de 8, notée 8 !, vaut 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 Variables N, i, F en Entier

Correction exercice 8 :

Debut
Ecrire ”Entrez un nombre : ”
Lire N
F <--  1
Pour i <--  2 à N
F <--  F * i
i Suivant
Ecrire ”La factorielle est : ”, F
Fin

Exercice 9 :

Que produit l’algorithme suivant ?

Tableau Nb(5) en Entier
Variable i en Entier
Début
Pour i <--  0 à 5
Nb(i) <--  i * i
i suivant
Pour i <--  0 à 5
Ecrire Nb(i)
i suivant
Fin

Peut-on simplifier cet algorithme avec le même résultat ?

Correction exercice 9 :

Cet algorithme remplit un tableau avec six valeurs : 0, 1, 4, 9, 16, 25.

Il les écrit ensuite à l’écran. Simplification :

Tableau Nb(5) en Numérique
Variable i en Numérique
Début
Pour i  <-- 0 à 5
Nb(i)  <-- i * i
Ecrire Nb(i)
i Suivant
Fin


Exercice 10 :

écrivez un algorithme permettant, à l’utilisateur de saisir les notes d’une classe. Le programme, une fois la saisie terminée, renvoie le nombre de ces notes supérieures à la moyenne de la classe.

Correction exercice 10 :

Variables Nb, i, Som, Moy, Nbsup en Numérique
Tableau T() en Numérique
Debut
Ecrire “Entrez le nombre de notes à saisir : “
Lire Nb
Pour i <--  1 à Nb
Ecrire “Entrez le nombre numero”, i
Lire T(i)
i Suivant
Som   0
Pour i  <-- 1à Nb
Som <--  Som + T(i)
i Suivant
Moy <--  Som / Nb
NbSup <--  0
Pour i  <-- 1 à Nb
Si T(i) > Moy Alors
NbSup  <-- NbSup + 1
FinSi
i Suivant
Ecrire NbSup, “ élèves dépassent la moyenne de la classe”
Fin

Sunday, February 9, 2014

Exercices corrigés en algorithmique : Instructions conditionnelles et répétitives



 Exercice 1 : Tarifs

Écrire l’algorithme décrivant un programme permettant à une hôtesse de calculer le prix d’une place en fonction de l’âge du passager. Les enfants de moins de deux ans ne paient pas, ceux qui ont moins de 10 ans paient moitié prix, et les personnes de moins de 27 ans et celles de plus de 70 ans ont une réduction de 10%. L’utilisateur doit saisir le prix de base du billet et l’âge du passager. Le programme affiche le résultat.

Correction exercice 1 :

PROGRAMME Tarifs

VAR      prix,age : entier

DEBUT
AFFICHER « Entrez le prix de la place, puis votre age : »
SAISIR prix,age
Si age<2
Alors AFFICHER« Vous ne payez pas »
Sinon
     Si age<10
Alors AFFICHER« Vous devez payer : »,prix/2
Sinon
Si age<27 OUage>70
Alors AFFICHER« Vous devez payer : »,prix-(prix*10)/100
Sinon AFFICHER« Vous devez payer : »,prix
FinSi
     FinSi
FinSi
FIN

Exercice 2 : Indice de masse corporelle

Écrire le pseudo-code d’un programme demandant à une personne de saisir au clavier son sexe (H/F), sa taille (en cm) et son poids (en kg) et affichant les messages :
  • « vous devriez surveiller votre alimentation » si l’indice de masse corporelle (poids/(taille*taille)) est supérieur ou égal à 25 pour un homme ou 23 pour une femme.
  • « vous devriez prendre des forces » s’il est inférieur ou égal à 19 pour un homme ou 18 pour une femme.
  • « vous êtes à votre poids de forme » sinon.
NB : Les données fournies dans cet exercice n’ont aucune valeur scientifique.

Correction exercice 2 :

PROGRAMME MasseCorpo

VAR      taille,poids,indice     : entier
         sexe               : charactère
         phrase_finale      : chaine

DEBUT
AFFICHER « Quel est votre sexe ? (H/F) »
SAISIR sexe
AFFICHER « Entrez votre taille (en cm) puis votre poids (en kg) »
SAISIR taille,poids
indice <- (poids/(taille*taille))
Si sexe = ‘H’
Alors
Si indice >= 25
Alors phrase_finale<-« vous devriez surveiller votre alim. »
Sinon
Si indice <= 19
Alors phrase_finale<-« vous devriez prendre des forces. »
Sinon phrase_finale<-« Vous êtes à votre poids de forme »
FinSi
FinSi
Sinon
Si indice >= 23
Alors phrase_finale<-« vous devriez surveiller votre alim. »
Sinon
Si indice <= 18
Alors phrase_finale<-« vous devriez prendre des forces. »
Sinon phrase_finale<-« Vous êtes à votre poids de forme »
FinSi
FinSi
FinSi
AFFICHER phrase_finale
FIN


Exercice 3 : Triangles

Écrire en pseudo-code un programme qui demande à l’utilisateur de saisir les valeurs des trois côtés d’un triangle et affiche si le triangle est rectangle, isocèle, isocèle rectangle, ou équilatéral.


Correction exercice 3 :

PROGRAMME Triangles

VAR      a,b,c    : entier
         estRectangle,estIsocele,estEquilateral : booléen

DEBUT
AFFICHER « veuillez entrer l’hypoténuse : »
SAISIR a
AFFICHER « veuillez entrer les 2 autres cotés : »
SAISIR b,c
estRectangle <- a*a=b*b+c*c
estIsocele <- a=b OU a=c OU b=c
estEquilateral <- a=b ET a=c
Si estEquilateral
Alors
AFFICHER « le triangle est equilatéral ! »
Sinon
Si estIsocele ETestRectangle
Alors AFFICHER « le triangle est isocèle rectangle ! »
Sinon
Si estIsocele
Alors
AFFICHER « le triangle est isocèle ! »
Sinon
SI estRectangle
Alors AFFICHER « le triangle est rectangle ! »
Sinon AFFICHER « le triangle n’a pas de propriétés… »
FinSi
FinSi
FinSi
FinSi
FIN

Exercice 4 : Minimum

Écrire l’algorithme affichant le minimum d’une suite de 10 réels saisis au clavier.

Correction exercice 4 :

PROGRAMME Minimum

VAR      boucle   : entier
         min,val  : reel
DEBUT
AFFICHER « Entrez un réel : »
SAISIR min
Pour boucle de 1 à 9 pas de 1, faire
AFFICHER « Entrez un autre réel : »
SAISIR val
Si val<min
Alors min=val
FinSi
FinPour
AFFICHER « le minimum est : », min
FIN

Exercice 5 : Saisie correcte

Ecrire un algorithme qui demande un nombre compris entre 10 et 20, jusqu’à ce que la réponse convienne. En cas de réponse supérieure à 20, on fera apparaître un message : « Plus petit ! », et inversement, « Plus grand ! » si le nombre est inférieur à 10.

Correction exercice 5 :

PROGRAMME SaisieCorrecte

VAR      valeur   : entier
DEBUT
Répéter
AFFICHER « Entrez un nombre entier : »
SAISIR valeur
Si valeur >20
Alors AFFICHER« Plus petit ! »
FinSi
Si valeur <10
Alors AFFICHER« Plus grand ! »
FinSi
Jusqu’à valeur <20 ETvaleur >10
FIN


Exercice 6 : Table de multiplication

Ecrire un algorithme qui demande un nombre de départ, et qui ensuite écrit la table de multiplication de ce nombre, présentée comme suit (cas où l'utilisateur entre le nombre 7) :
Table de 7 :
7 x 1 = 7
7 x 2 = 14
…
7 x 11 = 77
…
7 x 20 = 140

Correction exercice 6 :

PROGRAMME Multiplication

VAR      table,boucle  : entier
DEBUT
AFFICHER « Entrez la table de multiplication : »
SAISIR table
Pour boucle de 1 à 20 pas de 1, faire
AFFICHER table,‘x’, boucle,’=’,table*boucle
FinPour

FIN