correction TP X01 Structures de Données et algorithme


 Correction  TP X01 Structure de données et algorithmique.




  
Bonjour les développeurs , j’espère que vous allez très bien , aujourd'hui , je vais avec vous un tp  qu'un ami m'a envoyer dernièrement , apparemment , il est conçu a la faculté des science  saad dahleb en Algérie , Bonne lecture 


Université Saad Dahleb Blida
Faculté des Sciences
Département d’Informatique



1ère Epreuve de Moyenne Durée

« Structures de Données et Algorithmes »

Février 2010



Exercice 1 (7 pts): On se propose d’implémenter les algorithmes de recherche auto-adaptative appliqués à une LLC unidirectionnelle.

1 – Rappeler en deux lignes ce qu’est la recherche auto-adaptative (1pt)

La recherche auto-adaptative consiste à favoriser la recherche ultérieure d’un élément déjà recherché. A chaque fois qu’un élément est recherché, sa position se rapproche du début.

2 – Rappeler les deux méthodes permettant d’implémenter une technique de recherche auto-adaptative (1 pt)

La première méthode consiste à placer l’élément recherché en tête de la liste ; la seconde consiste à le faire monter d’un rang (s’il est 20e par exemple, il devient 19e).

3 – Nommer les deux idées permettant d’implémenter la recherche auto-adaptative (idée1 et idée2). Rappeler alors le constat de Donald Knuth relatif aux deux idées. (1pt)

Si l’on nomme les deux idées précédemment décrites idée1 et idée2 dans l’ordre où elles ont été énoncées, selon Knuth, si on a un nombre de recherches inférieur ou égal à n2, n étant le nombre d’éléments, la première idée est meilleure. Au-delà de ce seuil, la seconde est meilleure.

4 – Ecrire deux fonctions C distinctes réalisant chacune une des deux idées (une fonction C pour la première idée et une seconde pour la seconde) appliquée à une LLC unidirectionnelle. (2pts pour chaque fonction)


int idee1(liste *l, int e)
{
            int sortie = 0; int x;
            liste p = *l; liste prec = NULL;
            while ((p != NULL) && (sortie == 0))
                        if ((x = val(p)) == e)
                        {
                                   aff_adr(prec, suiv(p));
                                   aff_adr(p, *l);
                                   *l = p;
                                   sortie = 1;
                        }
                                   else
                                               {
                                                           prec = p;
                                                           p = suiv(p);
                                               }
            return sortie;
}


int idee2(liste *l, int e)
{
            int sortie = 0; int x;
            liste p = *l; liste prec = NULL;
            while ((p != NULL) && (sortie == 0))
                        if ((x = val(p)) == e)
                                   {if (prec != NULL)
                                   {
                                               aff_val(p, val(prec));
                                               aff_val(prec, x);
                                   }
                                               sortie = 1;
                                   }
                                   else
                                               {
                                                           prec = p;
                                                           p = suiv(p);
                                               }
            return sortie;
}

Exercice 2 (4pts):

On voudrait écrire une fonction C « récursive » qui évalue un nombre écrit en binaire. La fonction aura en entré une chaîne de caractères représentant un nombre binaire et donnera en sortie l’équivalent décimal. Exemple : la fonction ayant en entrée la chaîne « 11011 » donnera la valeur 27.
Ecrire la fonction C « récursive » effectuant ce travail.

int BinToDec(char c[])
{
            int sortie = 0, n = strlen(c);
            if (n != 0)
                                   if (c[0] == '1')
                                               sortie = pow(2,n-1) + BinToDec(c+1);
                                   else
                                               sortie = BinToDec(c+1);
            return sortie;
}

Exercice 3 (6pts) :

1 – rappeler le principe du tri par insertion (1pt)

Le tri par insertion à considérer, lorsque l’itération arrive au ie élément, que les éléments allant du premier au (i-1)e sont triés. Ainsi, si le ie élément  n’est pas à sa place (il est plus petit que le (i-1)e), il faudra le placer à sa place dans l’intervalle [premier, (i-1)e[.

2 – ce tri s’applique-t-il aux LLC unidirectionnelles (0,5 pt)? aux LLC bidirectionnelles ? (0,5 pt)

Oui il s’applique aux LLC unidirectionnelles. Pour placer l’élément à sa place dans l’intervalle [premier, (i-1)e[, il suffira de démarrer les tests pour savoir s’il est plus petit que les éléments de l’intervalle à partir du début de l’intervalle et non de la fin car on ne peut aller de la fin au début, les chaînages ayant un sens unique.

Il s’applique également aux LLC bidirectionnelles. On peut, lors des comparaisons nécessaires pour placer l’élément, commencer indifféremment du premier au (i-2)e ou du (i-2)e au premier.

3 – que faudrait-il faire afin que la fonction C qui effectue le tri s’applique sans aucune modification aussi bien aux LLC unidirectionnelles qu’aux LLC bidirectionnelles ? (1 pt)

Etant donné que pour la LLC uni., il faut comparer avec le premier puis le second jusqu’au (i-2)e au besoin et que le LLC bidi., on peut indifféremment aller du premier au (i-2)e ou du (i-2)e au premier, il suffit de choisir la solution qui convient aux deux à la fois, à savoir comparer avec le premier puis le second etc. et n’opérer que des changements de valeurs et non de chaînages, le changement de valeurs étant le même dans les deux cas alors que le changement de chaînage est différent.

4 – Ecrire une fonction C qui effectue ce tri et qui soit utilisable pour les deux types de listes

void TriInsertion(liste l)
{
            liste p,prec,q,s;
            int x,y;
            if (l != NULL)
            {

                        prec = l;
                        p = suiv(l);
                        while (p != NULL)
                        {
                                   if ((x = val(p)) < val(prec))
                                   {
                                               //trouver la place de l'élément
                                               q = l;
                                               while ((y = val(q)) < val(p))
                                                           q = suiv(q);
                                               //q pointe la place ou devrait se placer l'élément
                                               //il faut déplacer tous les autres
                                               s = q;
                                               while (q != suiv(p))
                                               {
                                                                       y = val(q);
                                                                       aff_val(q, x);
                                                                       x = y;
                                                                       q = suiv(q);
                                               }
                                   }
                                   prec = p;
                                   p = suiv(p);
                        }
                        }
}

Exercice 4 (3pts) :

On voudrait transformer un nombre représenté par une chaîne de caractères en un autre nombre qui sera copié dans la chaîne d’origine de la façon suivante :
Tous les chiffres pairs deviennent en tête dans leur ordre d’origine et tous les chiffres impairs seront copiés à la suite des pairs dans leur ordre inverse.
Exemple : 123456      è        246531
Ecrire une fonction C qui transforme ainsi les chaînes-nombres en utilisant une file et une pile. (utiliser les fonctions du modèle Pile et File sans les réécrire)

void transforme(char c[])
{
            file F; pile P;
            int x;
            int n = strlen(c);
            int i;
            for (i = 0; i<n ; i++)
                        if ((c[i]-'0') % 2 == 0)
                                   enfiler(&f, c[i]);
                                   else
                                               empiler(&p, c[i]);
            i = 0;
            while (Desenfiler(&f, &x))
                        c[i++] = x;
            while (Desempiler(&p, &x))
                        c[i++] = x;
}

pour consulter plus d'exercices en algorithmique ou programmation langage c  : par ici

le lien vers les questions de ce tp : par ici

Je vous souhaite bonne lecture et n'oublier pas de partager tout cela :) !!

TP X01 Structures de Données et algorithme

tp langage c
Bonjour les développeurs , j’espère que vous allez très bien , aujourd'hui , je vais partager avec vous un tp  qu'un ami m'a envoyer dernièrement , apparemment , il est conçu a la faculté des science  saad dahleb en Algérie , Bonne lecture 

Lien vers la correction de ce tp :  par ici




 

Université Saad Dahleb Blida
Faculté des Sciences
Département d’Informatique


1ère Epreuve de Moyenne Durée
« Structures de Données et Algorithmes »
Février 2010


Exercice 1 (7 pts): 

 On se propose d’implémenter les algorithmes de recherche auto-adaptative appliqués à une LLC unidirectionnelle.

1 – Rappeler en deux lignes ce qu’est la recherche auto-adaptative (1pt)
2 – Rappeler les deux méthodes permettant d’implémenter une technique de recherche auto-adaptative (1 pt)
3 – Nommer les deux idées permettant d’implémenter la recherche auto-adaptative (idée1 et idée2). Rappeler alors le constat de Donald Knuth relatif aux deux idées. (1pt)
4 – Ecrire deux fonctions C distinctes réalisant chacune une des deux idées (une fonction C pour la première idée et une seconde pour la seconde) appliquée à une LLC unidirectionnelle. (2pts pour chaque fonction)

Exercice 2 (4pts):


On voudrait écrire une fonction C « récursive » qui évalue un nombre écrit en binaire. La fonction aura en entré une chaîne de caractères représentant un nombre binaire et donnera en sortie l’équivalent décimal. Exemple : la fonction ayant en entrée la chaîne « 11011 » donnera la valeur 27.
Ecrire la fonction C « récursive » effectuant ce travail.

Exercice 3 (6pts) :


1 – rappeler le principe du tri par insertion (1pt)
2 – ce tri s’applique-t-il aux LLC unidirectionnelles (0,5 pt)? aux LLC bidirectionnelles ? (0,5 pt)
3 – que faudrait-il faire afin que la fonction C qui effectue le tri s’applique sans aucune modification aussi bien aux LLC unidirectionnelles qu’aux LLC bidirectionnelles ? (1 pt)
4 – Ecrire une fonction C qui effectue ce tri et qui soit utilisable pour les deux types de listes

Exercice 4 (3pts) :


On voudrait transformer un nombre représenté par une chaîne de caractères en un autre nombre qui sera copié dans la chaîne d’origine de la façon suivante :
Tous les chiffres pairs deviennent en tête dans leur ordre d’origine et tous les chiffres impairs seront copiés à la suite des pairs dans leur ordre inverse.
Exemple : 123456      è        246531
Ecrire une fonction C qui transforme ainsi les chaînes-nombres en utilisant une file et une pile. (utiliser les fonctions du modèle Pile et File sans les réécrire)



Je vous souhaite bonne lecture et n'oublier pas de partager tout cela :) !!

Serie 5 d'algorithme a résoudre - Marouane jabal

tp algorithme marouane jabal
Bonjour les Futures programmeur , aujourd'hui nous allons attaquer une Série d'exercices , apres la consultation de la série vidéos de Marouane jabal, voila la partie pratique , j'attends vos solutions, passer les sur commentaires ou bien par le biais de la messagerie électronique : Bonne lecture !

Si vous voulez consulter la première série poster par marouane jabal c'est par ici :








      Les  Différentes parties :



Série n° : 3 –Les structures itératives (boucle for)-


Exercice 3.1

Ecrire un programme qui affiche tous les entiers de 8 jusqu’à 23 (bornes incluses).

Exercice 3.2 : Sommes
1-      Ecrire un programme 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
2-      Ecrire un programme qui demande à l’utilisateur de taper 10 entiers et qui affiche leur somme et leur moyenne.
3-      Ecrire un programme qui affiche la somme des entiers positifs compris entre les entiers relatifs a et b. Les valeurs de a et b sont saisies au clavier lors de l'exécution.
4-      Ecrire un programme qui affiche la somme des valeurs absolues des entiers compris entre les entiers relatifs a et b. Les valeurs de a et b sont saisies au clavier lors de l'exécution.
5-      Ecrire un programme qui affiche la somme des valeurs absolues des entiers pairs compris entre les entiers relatifs a et b. Les valeurs de a et b sont saisies au clavier lors de l'exécution.

Exercice 3. 3 : Table de multiplication

Ecrire un programme 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 8 :
8 x 1 = 8
8 x 2 = 16
8 x 3 = 24
8 x 10 = 80

Exercice 3.4 : Factorielle

Ecrire un programme qui demande un nombre de départ, et qui calcule sa factorielle. Par exemple, si l’utilisateur saisit la valeur 7, le programme doit calculer  1 x 2 x 3 x 4 x 5 x 6 x 7.

Exercice 3.5 : Minimum et Maximum
Ecrire un programme qui demande à l’utilisateur de taper 10 entiers et qui affiche le plus petit (noté min) et le plus grand (noté max) de ces entiers, ainsi que sa position.
 
Exercice 3.6 : Somme de puissances  
1-      Ecrire un programme qui lit un entier positif N et qui affiche la somme des N premières puissances de 2.
Exemple : donnée : 5
      résultat : 20 + 21 + 22 + 23 + 24 + 25 = 63
2-      Ecrire un programme qui calcule la somme des inverses des carrés des n premiers entiers (1/12 + 1/22 + … + 1/n2), n étant donné par l’utilisateur.
3-      Ecrire un programme qui demande à l'utilisateur de taper un entier N et qui calcule la somme des cubes de 5^3 à N^3.

Exercice 3.7: multiplication

Écrire un programme effectue la multiplication de deux entiers positifs (notés x et y) donnés par l’utilisateur en utilisant uniquement l’addition entière.

Exercice 3.8: Calcul de xn
Ecrire un programme qui lit un nombre x puis un entier n, puis calcule et affiche la puissance nième de x : xn, en utilisant uniquement la multiplication.

Exercice 3.9 : Nombres premiers

Écrire un programme qui à partir d’un entier strictement positif donné, retourne le résultat 0 ou 1 selon que le nombre est premier ou non.
Pour mémoire, voici la liste des nombres premiers inférieurs à 100 : 1, 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.

Exercice 3.10 : Nombres parfaits
1.      Ecrire un programme qui à partir d’un entier strictement positif donné, retourne le résultat 0 ou 1 selon que le nombre est parfait ou non.
Un nombre est dit parfait s’il est égal à la somme de ses diviseurs stricts.
Exemple : 28 = 1 + 2 + 4 + 7 + 14
2.      Écrire un programme qui affiche la suite de tous les nombres parfaits inférieurs ou égaux à un nombre entier positif donné (noté n).
Voici la liste des nombres parfaits inférieurs à 10000 : 6, 28, 496, 8128.

Exercice 3.11 : triangle d'étoiles

1- Ecrire un programme qui affiche une ligne de n étoiles ("*") séparées par un éspace, n étant donné par l'utilisateur.
2- Ecrire un programme qui affiche un triangle composé d'étoiles comme le montre la figure:
*
* *
* * *
* * * *
* * * * *
Le nombre de lignes est demandé à l'utilisateur.