Jean-Jacques BOURDIN Liste d‘execrcices
Facile
Récursions
Récursivité terminale
Itérations
Faire avec des while, des do while, des for et des goto les fonctions suivantes :Vecteurs
vecteur initial : [8, 13, 21, 11, 9, 20, 6, 3, 9, 12]
Vecteur final : [21, 20, 13, 12, 11, 9, 9, 8, 6, 3]
Structures
Nous utilisons maintenant la structure suivante :
typedef struct table_alt { int larg; int haut; float t[100][100]; } table_alt_t; /* table_alt_t est un type qui contient - deux valeurs de taille et - un vecteur float [100][100]*/ |
void affiche (table_alt_t t) { int x, y, sx, sy; sx = t.larg; sy = t.haut; printf("Tailles max %d et %d\n", t.larg, t.haut); for (x = 0; x < sx; x = x + 1) { for (y = 0; y < sy; y = y + 1) printf("%5.2f\t", t.t[x][y]); printf("\n"); } } |
table_alt_t remplirt (int sx, int sy) { int x, y, sxy; float v, eps, add, pas; table_alt_t tt; tt.larg = sx; tt.haut = sy; pas = 0.5; v = pas; add = 5.0; sxy = sx * sx + sy * sy; eps = 100.0 / (float) (sxy); for (x = 0; x < sx; x += 1) { for (y = 0; y < x; y += 1) { tt.t[x][y] = (float) (x * x - y * y + add) * eps; } for (y = x; y < sy; y += 1) { tt.t[x][y] = (float) ( y * y - x * x + add) * eps; } /* for (y = 0; y < sy; y = y + 1) printf("%f \t", (*tt).t[x][y]); printf("\n"); */ add += v; if (add > 10.0) v = - pas; if (add < 0.1) v = pas; } return tt; } |
Avec les nombres complexes et les vecteurs de nombres complexes
struct complex mulc (struct complex a, struct complex b) { struct complex res; res.real = a.real + b.real; res.imag = b.imag + a.imag; return res; } struct vecc { int nbe; complex tab [100]; }; typedef struct vecc vecc_t ; |
En utilisant des pointeurs pour accéder aux cases du vecteur :
Listes
Attention, cette définition est légèrement différente de celle donnée en cours.
typedef struct cell * liste_t; typedef struct cell { float obj; struct cell * suiv; } cell_t; |
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.
int estvide (liste_t l) { if (l == (liste_t) 0) { return 1; } return 0; } int estnonvide (liste_t l) { if (l == (liste_t) 0) { return 0; } return 1; } |
float soml (liste_t l) { if (estvide(l)) { return 0.0; } return (*l).obj + soml((*l).suiv); } |
int howmany (liste_t l) { if (estvide(l)) { return 0; } return 1 + howmany ((*l).suiv); } |
liste_t cons (float nb, liste_t l) { liste_t new; new = (liste_t) malloc (sizeof(cell_t)); assert(new); (*new).obj = nb; (*new).suiv = l; return new; } liste_t creercours (int nb) { liste l; int i; float x; x = 0.1; l = (liste_t) 0;; while (nb--) { l = cons (x, l); x += 0.15; if (x > 0.5) x -= 0.45; } return l; } liste_t creeriter (int nb) { liste_t debut; int i, j, k, t; j = 13; k = 21; debut = (liste_t) 0; for (i = 0; i < nb; i++) { debut = cons (j, debut); t = (j + k) % 31; k = j; j = t; } return debut; } |
void affl (liste_t l) { if (estvide (l)) { printf("\n"); } else { printf("%5.2f ", (*l).obj); affl ((*l).suiv); } } |
Voici une structure puis les fonctions de remplissage d‘un arbre.
/* Arbres binaires tout simplement */ #include <stdio.h> #include <stdlib.h> #include <time.h> struct noeud { int num; float val; struct noeud * fg; struct noeud * fd; } ; typedef struct noeud noeud; typedef struct noeud * arbre_t; |
arbre_t ajout (arbre_t a, int v, float x) { arbre_t new; int rande; if (! a) { new = (arbre_t) malloc (sizeof (noeud)); new->num = v; new->val = x; new->fg = (arbre_t) 0; new->fd = (arbre_t) 0; return new; } rande = rand (); /* printf(" insere %d en %d avec %2d\n", v, a->num, rande %10); */ if (rande % 2) { /* on le met à gauche*/ if (! (a->fg)) { /* s‘il ny a pas de fils gauche */ a->fg = (arbre_t) malloc (sizeof (noeud)); a->fg->num = v; a->fg->val = x; a->fg->fg = (arbre_t) 0; a->fg->fd = (arbre_t) 0; return a; } a->fg = ajout(a->fg, v, x); return a; } /* on le met donc a droite*/ if (! (a->fd)) { /* s‘il ny a pas de fils droit */ a->fd = (arbre_t) malloc (sizeof (noeud)); a->fd->num = v; a->fd->val = x; a->fd->fg = (arbre_t) 0; a->fd->fd = (arbre_t) 0; return a; } a->fd = ajout(a->fd, v, x); return a; } /* To create the tree, you add, one after the other, the values in the tree.*/ arbre_t creation (int n) { arbre_t a; float x, y; x = 1.5; y = 0.21; a = (arbre_t) 0; srand(time(NULL)); while (n--) { a = ajout (a, n, x); x += y; y += 0.06; if (x > 3.0 || x < -2.0) { y = - y; } } return a; } |
int appartient (int nu, arbre_t a) { if (! a) return 0; if (a->num == nu) return 1; if (appartient (nu, a->fd)) return 1; return appartient (nu, a->fg); } |