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 :) !!

Systeme d'exploitation linux

Bonjour chers Informaticiens, aujourd'hui , on va commencer un cours de système d’exploitation ,Le 'LINUX'.

Mais avant de démarrer , c'est quoi deja un systém d'exploitation ?

Introduction :

un systéme d'exploitation est un ensemble de programmes qui chargés de faire l'interface entre le materiel et vous. exemple de système : iOS,Windows NT, Minix......

bon Linux est un système d’exploitation comme les autre , moderne, très stable, multi-utilisateurs, Open source et gratuit. C'est une plate-forme riche et puissante offrant autant de capacités que MS Windows et nécessitant moins de puissance matérielle pour effectuer des tâches semblables.

Installation 

- Système

Installer Linux sur sa machine est la première étape pour aborder avec profit ce cours d’administration. Installer Linux à  partir d’une distribution sur CD-ROM est relativement aisé si on dispose d’une machine qui peut booter à partir du lecteur CD et qu’on suive pas à pas les indications du programme d’installation. Toutefois quelques indications sont utiles pour mener à bien l’installation. Ces indications concernent deux points essentiels de l’installation : le Partitionnement du disque et le système de boot.
ci-dessous on rappelle une arborescence.

voila une vue sur l'arborescence de linux : 

linux tuto video

 Je passe directement au chapitre des commandes les plus utilisées sur linux, et je vous recommande de consulter ces documents pour mieux maitriser ce système d'exploitation :

Espace téléchargement :

Premier document à telecharger -introduction unix/linux(premiers pas) : cliquer ici
deuxieme document :  administration linux : cliquer ici  
commande linux avec des différents exemples : cliquer ici

 Les commandes : 

 voila la listes des commandes les plus utilisées sur linux.

alias bg cat clear cd chmod cp
date diff df du fdisk fg find
free grep gunzip gzip halt kill ln
login logout lpq lpr lprm ls man
mkdir mkswap more mount mv passwd ps
pwd umount reboot rm rmdir shutdown swapon
swapoff tar unalias 



pour savoir a quoi sert chaque une de ces commandes , voila un site qui explique cela :

cliquer ici

Partie 2 :

les cours Videos :) , tout le monde les préfères.

la premiere video :

video complete sur toutes les commandes : par ici
video sur les commandes avancés : clique ici 




Et comme d'habitude n'oublier pas de partager cela avec vos amis , bonne lecture