Sven De Félice et Jean-Jacques BOURDIN

Université Paris 8
Labo IA, Dépt. Programmation et Informatique Fondamentale
2, rue de la Liberté
93526 Saint-Denis Cedex
FRANCE


Programmation Impérative
Imperative Programming

Spring 2022


Overview

Ch I) Let's try!

Ch II) Easy C

    II.A) Variables, Expressions, Types, Instructions

    II.A) Operators

    II.B) Control Flow

    II.C) Data Structures

    II.D) Compilation

Ch III) C Addresses

    III.A) Déjà vu

    III.B) Arrays

    III.D) Lists

    III.D) Trees

    III.C) Functions' Pointeers

Ch IV) C more than that

Ch V) Just for you (Projects 2022)

    V.A) Example: a report in LaTeX

 

 

 

 


Ch III) Adresses C

    III.D) Listes Chaînées

  1. Lisp like lists
    Liste Lisp

    Hereafter is a function building a list of n numbers. It's written in scheme, you'll have to translate it.

    Voici une fonction qui construit une liste de n nombres entiers. Elle est en Lisp, il faut donc la transcrire.

    (define (creerl n)
        (if (< n 1)
             ‘(0)
             (cons n (creerl (- n 1)))))
    

  2. Type definition
    Définition des types
    struct cell {
      int nb;
      struct cell * nxt;
    } ;
    typedef struct cell cell_t;
    typedef struct cell * liste;
    

    Here you see that a list is only the adress of a structure.

    Où on voit que la liste est en fait uniquement l'adresse d'une structure qui contient une valeur et une liste.

  3. fonctions simples
    int estvide (liste l) {
      if (l == (liste) 0) {
        return 1;
      }
      return 0;
    }
    int estnonvide (liste l) {
      if (l == (liste) 0) {
        return 0;
      }
      return 1;
    }
    
  4. La somme des éléments
    int soml (liste l) {
      if (estvide(l)) {
        return 0;
      }
      return (*l).nb + soml((*l).nxt);
    }
    
  5. Le nombre d‘éléments
    int howmany (liste l) {
      if (estvide(l)) {
        return 0;
      }
      return 1 + howmany ((*l).nxt);
    }
    
  6. La construction
    liste cons (int nb, liste l) {
      liste new;
      new = (liste) malloc (sizeof(cell_t));
      assert(new);
      (*new).nb = nb;
      (*new).nxt = l;
      return new;
    }
    liste creer (int nb) {
      liste debut;
      int i, j, k, t;
      j = 13;
      k = 21;
      debut = (liste) 0;
      for (i = 0; i < nb; i++) {
        debut = cons (j, debut);
        t = (j + k) % 33;
        k = j;
        j = t;
      }
      return debut;
    }
    		  
  7. Trois fonctions d‘affichage
    void affl (liste l) {
      if (estvide (l)) {
        printf("\n");
      }
      else {
        printf("%3d ", (*l).nb);
        affl ((*l).nxt);
      }
    }
    
    Notons que (*l).nxt s‘écrit aussi l->nxt, la flèche, ici "-" et ">", est un nouvel opérateur qui remplace une écriture un peu longue.
    void affll (liste l) {
      if (estvide (l)) {
        printf("\n");
      }
      else {
        printf("%3d ", l->nb);
        affll (l->nxt);
      }
    }
    void affw (liste l) {
      while (estnonvide (l)) {
        printf("%3d ", l->nb);
        l = l->nxt;
      }
      printf("\n");
    }
    
    Des entêtes à inclure :
    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    La fonction main :
    int main () {
      liste l;
      int nb, s;
      nb = 10;
      l = creer(nb);
      affw(l);
      s = soml(l);
      printf("Total : %d\n", s);
      s = howmany(l);
      printf("Il y a %d elements\n", s);
    }
    
  8. Liste d‘exercices à faire.
    1. Trouver le plus grand élément.
    2. Afficher les éléments dans l‘ordre inverse.
    3. Mettre les éléments de la liste en ordre inverse. (Attention, il n‘y a pas besoin de malloc pour faire cette fonction).
    4. Fabriquer une liste avec les n premiers entiers (dans l‘ordre décroissant).
    5. Faire la somme des éléments d‘une liste.
    6. Faire la somme des éléments plus petits que 50 d‘une liste.
    7. Faire la moyenne des éléments d‘une liste.
    8. Enlever le premier élément d‘une liste.
    9. Enlever le dernier élément d‘une liste.
    10. Fonction de concaténation de deux listes.
    11. Dans une liste rangée, insérer une cellule à sa place.
    12. Faire le tri d‘une liste, par insertion.
    13. Trouver le médian des éléments d‘une liste.
    14. Fabriquer une liste des carrés de tous les éléments d‘une autre liste passée en paramètre.
    Exemple de solution
    int plusgrandliste (liste l, int candidat) {
       if (l) {
          if (l->nb > candidat)
             return plusgrandliste (l->next, l->nb);
          return plusgrandliste (l->next, candidat);
          
       }
       return candidat; /* il n‘y a plus d‘autre possible*/
    }
    int plusgrandl (liste l) {
       if (l)
          return plusgrandliste (l->next, l->nb);
       return INT_MIN; /* impose d‘avoir inclus limits.h */
    }
    
    Ou encore
    int plusgrandliter (liste l) {
       int plgd;
       liste crt, ptrplgd;
       if (! l)
          return INT_MAX;
       ptrplgd = l;
       plgd = ptrplgd->nb;
       crt = l->nxt;
       while (crt) {
          if (crt->nb > plgd) {
             plgd = crt->nb;
             ptrplgd = crt;
          }
          crt = crt->nxt;
       }
       return plgd;
    }
    

     

  9. Inversion d‘une liste.
  10. Inversion par la méthode PG/DG.
    (define (re l)
        (ifn (cdr l) l
             (cons (car (re (cdr l)))
                   (re (cons (car l)
                             (re (cdr (re (cdr l)))))))))
    

Quelques solutions vues en cours