- On peut définir un type pour les chaînes de caractères en stockant la longueur effective de la chaîne, c'est-à-dire la première occurrence du caractère `\0`
```C
struct _chaine {
char* str;
int len;
} chaine;
```
- Quelques implémentations de fonctions
```C
chaine chaine_build(char* phrase) {
chaine ch;
ch.len = length(phrase);
ch.str = malloc((ch.len+1)*sizeof(char));
for (int i=0;i<ch.len;i++) {
ch.str[i] = phrase[i];
}
return ch;
}
chaine deep_copy(chaine ch) {
return chaine_build(ch.str);
}
// Dangereux, car plusieurs pointeurs
// sur le même tableau de caractères !!!
chaine shallow_copy(chaine ch) {
chaine cpy;
cpy.len = ch.len;
cpy.str = ch.str;
return cpy;
}
// Si plusieurs pointeurs sur même tableau de caractères,
// alors autres pointeurs dessus ne seront pas mis à NULL
void chaine_free(chaine* ch) {
if (NULL != ch>str)
free(ch>str);
ch>str = NULL;
}
ch>len = -1;
}
```
- Illustration
## Récursivité
- Exemple de la factorielle : n ! = n·(n-1)·(n-2)·... ·3·2·1 = n·(n-1) !
Donc fact(n) = n·fact(n-1) (récursivité)
et fact(1) = 1 (condition d'arrêt)
```C
int fact(int n) {
if (n > 1) {
return n*fact(n1);
} else {
return 1;
}
}
void main() {
int f = fact(4);
}
```
- Exemple du PGCD
Algorithme d'Euclide pour le PGCD de 42 et 27
> 42 = 27·1 + 15
> 27 = 15·1 + 12
> 15 = 12·1 + 3
> 12 = 3·4 + 0
PGCD(42,27)=PGCD(27,15)=PGCD(15,12)=PGCD(12,3)=3
```C
int pgcd(int n,int m) {
if (n%m > 0) {
return pgcd(m,n%m);
} else {
return m;
}
}
```
- Exemple de l'écriture binaire
```C
void binaire(int n) {
printf("%d",n%2);
if (n/2 != 0) {
binaire(n/2);
} else {
printf("\n");
}
// printf("%d",n%2);
}
Binaire(13); // affiche 1 0 1 1 puis un retour à la ligne`
```
> > > $\hspace*{36mm} 2^0 2^1 2^2 2^3$
- Que se passe-t-il si on décommente le deuxième `printf` ?