Cliquez ici pour retirer la feuille de style si vous souhaitez imprimer ce document (ou en cas de problème d'affichage).

Partie I : Rappels

Exercice 1 

Ecrire une procédure qui prend en paramètre un nombre de secondes et affiche l'heure correspondante. Par exemple la procédure affiche "00:00:30" si on lui passe 30, "00:02:10" si on lui passe 130, "01:00:00" si on lui passe 3600.

Aide : l'expression a%b en c permet de calculer le reste de la division entière de a par b. L'expression a/b permet elle de calculer le quotient. Pour répondre au problème posé, il peut etre utile de décomposer le problème en deux sous problèmes : 1) trouver le nombre total de minutes et le nombre de secondes restantes ; 2) à partir du nombre de minutes, trouver le nombre d'heures que cela représente et le nombre restant de minutes.

Ecrire la fonction main() correspondante qui prend le nombre de seconde à convertir sur la ligne de commande. Lorsque l'argument de ligne de commande est manquant ou n'est pas un entier, la fonction demande à l'utilisateur de le saisir.

Exercice 2 

Ecrire une fonction qui prend en paramètre une chaine de caractères et renvoit la somme des valeurs dans la table ascii des caractères qui la composent.

Ecrire le main() correcpondant qui prend la chaine de caractère en argument sur la ligne de commande et la demande à l'utilisateur si elle n'est pas présente (il sera nécéssaire dans ce cas de définir une constante représentant la taille maximale pour la chaine). Utilisez dans un premier temps scanf("%s") puis lorsque vous aurez terminé l'exercice, lisez le manuel de gets et de fgets et modifiez votre code en conséquence si besoin.

Des explications seront données par le chargé de TP lorsque l'ensemble du groupe aura terminé cet exercice.

Exercice 3

Faites une fonction qui affiche un tableau d'entiers.

Exercice 4

Faites une fonction qui prend un tableau de n entiers (n n'est pas une constante) et demande à l'utilisateurs de les saisirs afin de remplir le tableau.

 

Partie II : pointeurs et tableaux

Le but est d'écrire une fonction swap() qui prend deux arguments et permet d'inverser le contenu de deux variables entières.

Exemple de code appelant : 

int main()
{
  int a = 3;
  int b = 4;
  /* appel de swap() a completer */
  printf("a=%d, b=%d\n",a,b); /* doit afficher a=4, b=3 */
  return 0;
}

 Etape 1

Ecrire une fonction swap_tab() qui prend en paramètre un tableau d'entiers (tab) et deux indices i et j, et échange le contenu de la case i avec le contenu de la case j.

En principe une fonction qui prend en paramètre un tableau prend aussi la taille en paramètre. Ici ce n'est pas nécessaire car on ne travaillera qu'avec les cases i et j, et ces indices sont fournis en paramètre.

Ecrire une fonction main() correspondante qui appelle votre fonction avec un tableau de taille deux et les indices 0 et 1.

 Etape 2

Transformez le code de votre fonction swap_tab() selon les règles d'équivalance que vous avez apprises en cours,

Dans le prototypde de la fonction : int tab[]   <=> int * tab

Dans le corps de la fonctino         : tab[toto]  <=> *(tab+toto)

 Etape 3

On peut maintenant ecrire swap() : la fonction sera très similaire à swap_tab(), sauf qu'au lieu de prendre en paramètre un pointeur (tab dans l'exemple précédant) et deux indices de décalages (i et j), elle prendra directement en paramètre deux pointeurs, par exemple p1 et p2.

Au lieu d'écrire *(tab+i), on écrira donc *p1 et au lieu d'écrire *(tab+j) on écrire *p2.

 Etape 4

Il ne reste plus qu'a changer le code appelant. On a plus besoin de creer un tableau, mais simplement de déclarer deux entiers et de passer leurs adresses comme paramètres à la fonction.

 Bilan : 

Dessinez la pile mémoire lors de l'appel à swap_tab et lors de l'appel à swap()

 Partie III : Types structurés

 

Complexes

  • Ecrire, dans un fichier complex.h, la définition d'un nombre complexe sous la forme d'un type structuré. Déclarer également les prototypes des fonctions suivantes :
    • new_complex qui crée un nombre complexe en prenant les parties réelle et imaginaire comme paramètres;
    • print_complex qui affiche, sur la sortie standard, un nombre complexe de la façon suivante : la partie réelle suivie d'un espace puis de la partie imaginaire;
    • sum qui calcule la somme de deux nombres complexes;
    • conjugate qui calcule le conjugué d'un nombre complexe;
    • norm qui calcule la norme d'un nombre complexe.
  • Implémenter dans un fichier complex.c, les fonctions précédentes. Tester votre code en créant un fichier main.c où seront implémentés des tests. Ne pas oublier de faire un Makefile pour compiler vos sources. Vous pouvez vous inspirer du template de Makefile, issu de l'étape 7 ou 8 du tutoriel.