1 Tableaux statiques/dynamiques 2 Chaˆınes de caract`eres 3

Transcription

1 Tableaux statiques/dynamiques 2 Chaˆınes de caract`eres 3
U
1
2 mars 2009
S6 GMI
François Lemaire
C/Unix
TD 1
Tableaux statiques/dynamiques
Un tableau statique est un tableau créé dans la pile par la syntaxe type tab[nb elts], où nb elts est un entier
positif. Ce type de tableau est libéré automatiquement (puisque dans la pile).
Un tableau dynamique est un tableau alloué dynamiquement par un malloc :
tab = (type*)malloc(nb elts*sizeof(type)) où tab est une variable pointeur (type *tab) déclarée préalablement.
Un tableau dynamique doit donc être explicitement libéré par un free.
Dans les deux cas, on peut voir tab comme une variable pointeur de type. Le tableau sera toujours manipulé par
l’intermédiaire du pointeur.
Q 1 . Proposer des entêtes pour les fonctions suivantes :
– une fonction qui renvoie un tableau d’entiers dont le nombre est donné en paramètre
– une fonction qui trie un tableau d’entiers
– une fonction qui libère un tableau d’entiers alloué dynamiquement
– une fonction qui duplique un tableau d’entiers
– une fonction qui recopie un tableau dans un autre
– une fonction qui teste si un entier appartient à un tableau
2
Chaı̂nes de caractères
Une chaı̂ne de caractères n’est rien d’autre qu’un tableau de caractères. Les routines standard du C supposent que
les chaı̂nes de caractères sont terminées par le caractère de code ASCII nul (i.e. ’\0’).
Q 2 . Proposer des entêtes pour les fonctions suivantes :
– une fonction qui renvoie la longueur d’une chaı̂ne
– une fonction qui alloue dynamiquement une chaı̂ne de caractères, dont le nombre est passé en paramètre
– une fonction (et une procédure) qui compare deux chaı̂nes
– une fonction (et une procédure) qui duplique une chaı̂ne de caractères
Q 3 . Ecrire une fonction qui lit des caractères au clavier et qui les met bout à bout dans une chaı̂ne de caractères.
Vous vous inspirerez de
int main() {
int c;
c = getchar();
while (c != EOF) {
/* EOF est un code spécial signifiant la fin du flux en entrée
printf("%c", c);
c = getchar();
}
}
*/
et vous utiliserez la fonction realloc (en faisant uniquement des réallocations de 16 en 16).
3
Définition de types
On utilise l’opérateur typedef.
Q 4 . Définir les types correspondants à :
– un entier int
– un tableau statique de 10 caractères
– un pointeur de char
– un pointeur de pointeur d’entier
4
Structures
On définit une structure (ou enregistrement) grâce au mot clé struct. L’utilisation est assez particulière. En effet,
la ligne struct personne { char nom[10] ; char prenom[10] ; } définit le type struct personne (et non pas le
type personne). On utilise struct personne comme un type habituel.
En pratique, on essaye d’éviter de retaper le struct. Pour cela, on définit un type avec typedef. Ici, on ferait
typedef struct personne tPersonne, qui définit le type tPersonne.
On peut également réaliser les deux opérations d’un coup :
typedef struct personne {
char nom[10];
char prenom[10];
} tPersonne;
On peut également utiliser une version plus concise dans laquelle on ne définit pas struct personne, mais uniquement tPersonne :
typedef struct {
char nom[10];
char prenom[10];
} tPersonne;
Quelle est la différence entre :
typedef struct {
char nom[10];
char prenom[10];
} tPersonne;
et
typedef struct {
char *nom;
char *prenom;
} tPersonne;
Un opérateur très pratique est -> qui permet de remplacer (*p).nom par p->nom dans le cas où p est un pointeur
de personne.
Q 5 . Ecrire les entêtes des fonctions suivantes :
– une fonction et une procédure qui saisit une personne
– une fonction qui compare deux personnes
5
Exercices
Q 6 . Définir un type tTabVariable qui est un tableau de taille variable (i.e. une structure avec un tableau et un
champ égal à la taille du tableau).
Q 7 . Ecrire une fonction alloueTab qui alloue un tableau dont la taille est passée en paramètre.
Q 8 . Ecrire une fonction qui compare deux tableaux.
Q 9 . Comparer les deux entêtes (et leurs conséquences sur l’exécution) : int compareTableaux(tTabVariable t1,
tTabVariable t2) et int compareTableaux(tTabVariable *t1, tTabVariable *t2).
Q 10 . On voudrait une structure permettant de stocker une moitié de tableau à deux dimensions, i.e. un tableau
tab à deux dimensions pour lequel on n’accéderait qu’à tab[i][j] avec j≤i.
Proposer un type permettant de réaliser cela. Donner une fonction permettant d’allouer une telle structure (on
passe la taille en paramètre) et une procédure pour libérer cette structure.