Université de Savoie Module ETRS-505 Travaux Pratiques Initiation à la programmation en C Sylvain MONTAGNY sylvain.montagny@univ-savoie.fr Bâtiment chablais, bureau 13 04 79 75 86 86 Liste des exercices TP1 : Conversion binaire, solution d équation du second degré, tri à bulle, double cryptage d une chaine de caractère. TP2 : Tableau et nombre divisibles, fonctions statistiques, trame Ethernet, occurrence d un mot, copie de motif. TP3 : Jeu du morpion Retrouver tous les documents de Cours/TD/TP sur le site www.master-electronique.com
Université de Savoie Module ETRS-505 Introduction au langage C TP 1 Exercice 1 : Conversion binaire Ecrire un programme qui calcul et affiche la représentation binaire d un nombre entier positif. La représentation doit se lire naturellement de gauche à droite et doit avoir une représentation sur 16 bits. Exercice 2 : Solution d'une équation polynomiale du second degré Ecrire un programme qui calcule les solutions d'une équation du type ax 2 +bx+c=0. Tous les cas possibles (sauf complexe) doivent être traités. Rappel sur les tableaux : Un tableau (unidimensionnel) A est une variable structurée formée d'un nombre entier N de variables simples du même type, qui sont appelées les composantes du tableau. Le nombre de composantes N est alors la dimension du tableau. En faisant le rapprochement avec les mathématiques, on dit encore que "A est un vecteur de dimension N" La déclaration d un tableau (exemple) : int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31}; // définit un tableau du type int de dimension 12. Les 12 composantes sont initialisées par les valeurs respectives 31, 28, 31,..., 31. Accéder à une valeur du tableau (exemple) : On peut accéder à la première composante du tableau par JOURS[0], à la deuxième composante par JOURS[1],..., à la dernière composante par JOURS[11]. Affectation des valeurs du tableau (exemple) : On affecte les valeurs du tableau de la facon suivante : JOURS[0]=10 ; // affectation de la composante 0 par 10
JOURS[11]=120 ; // affectation de la composante 11 par 120 Exercice 3 : Tri à bulle Ecrire un programme qui trie un tableau à l'aide de l'algorithme dit du "tri à bulle" qui est le suivant : Répéter Parcourir tous les éléments du tableau Si la valeur du i ème élément du tableau est plus grande que celle du suivant, réaliser une permutation (c'est-à-dire affecter au i ème élément la valeur du suivant et réciproquement) Tant que des permutations sont effectuées Le tableau sera initialisé avec des valeurs constantes que vous choisirez pour illustrer votre tri. Vous afficherez donc le tableau avant et après. Exercice 4 : Double cryptage d'une chaîne de caractères Le but de cet exercice est d'effectuer un double cryptage sur une chaîne de caractères. Seules les lettres en minuscule de 'a' à 'z' seront encodées. Les majuscules, les caractères accentués et les autres symboles ne sont pas pris en compte. 1. Codage «a vaut k»: Ecrire une fonction qui retourne la version cryptée d'un caractère donné en paramètre selon la formule "a vaut k" : 'a' devient la lettre 'k', 'b' devient la lettre 'l',... 'y' devient la lettre 'i' 'z' devient la lettre 'j'. Les autres caractères ne sont pas modifiés. 2. Voyelle en chiffre Ecrire une fonction qui transforme les voyelles en chiffre. La fonction doit retourner le caractère : '0' pour 'a', '1' pour 'e',..., '5' pour 'y'. Les autres caractères ne sont pas modifiés. 3. Codage complet Ecrire une fonction qui transforme et crypte entièrement une chaîne de caractères (donnée en paramètre) en utilisant les fonctions précédentes avec l'ordre suivant : cryptage selon la formule "a vaut k" puis codage des voyelles.
Université de Savoie Module ETRS-505 Introduction au langage C TP 2 Exercice 1 : Tableaux et nombres divisibles 1. Condition de divisibilité Ecrire une fonction qui retourne vrai (utiliser les valeurs entières 0 et 1) si un nombre entier donné en paramètre vérifie les conditions de divisibilité suivantes : soit le nombre est impair et est divisible par 3, soit le nombre est divisible 5. 2. Remplissage conditionnel d un tableau Ecrire la fonction principale du programme (main) dont le but est de remplir un tableau statique selon le principe suivant : tout nombre compris entre 1 et 2000 qui vérifie les conditions de divisibilité est ajouté dans le tableau. Vous afficherez ensuite l ensemble de ces nombres. Exercice 2 : Fonctions statistiques 1. Nombre de voyelles Ecrire une fonction qui calcule et retourne le nombre de voyelles contenues dans une chaîne de caractères donnée en paramètre. On considère que la chaine de caractère fournie en paramètre ne possède que des lettres en minuscule. 2. Nombre de consonne Ecrire une fonction qui calcule et retourne le nombre de consonnes contenues dans une chaîne de caractères donnée en paramètre. On considère que la chaine de caractère fournie en paramètre ne possède que des lettres en minuscule. 3. Nombre de mots Ecrire une fonction qui calcule et retourne le nombre de mots contenus dans une chaîne de caractères donnée en paramètre.
Exercice 3 : Trame Ethernet Le but de cet exercice est d analyser et d extraire les informations contenues dans les champs d en-tête d une trame Ethernet dont le format est donné ci-dessous : Octets de synchronisation (7 octets) valeur constante égale à 7 fois l octet 10101010 (représentation binaire) Octet de début de trame (1 octet) Valeur constante égale à l octet 10101011 (représentation binaire) @Ethernet destination (6 octets) @Ethernet source (6 octets) Longueur ou protocole (2 octets) On ne s occupera pas du champ de données, ni du CRC contenus dans le reste de la trame. Pour cela, deux exemples de trame Ethernet sont mis à disposition pour tester les fonctions à programmer. Ces trames sont fournies sous la forme d un tableau d octets (tableau de type char, cf annexe). 1. Test de la synchronisation Ecrire la fonction int testsynchrodebut(char * trame) qui teste si les 8 premiers octets sont valides (si aucun bit n a été modifié par rapport aux valeurs attendues). La fonction retournera 1 si le test est positif ; 0 sinon. 2. Affichage de l adresse MAC Ecrire la fonction void afficheraddrmac(char * trame) qui affiche en hexadécimal l adresse MAC selon la notation habituelle (exemple : 00:0c:12:1A:37:DE). 3. Affichage du protocole : Ecrire la fonction void afficherprotocole(char * trame) qui affiche en hexadécimal la valeur du protocole. 4. Affichage de la trame Ecrire la fonction void affichertrame(char * trame) qui utilise les fonctions précédentes. Elle doit indiquer si la trame est valide et, le cas échéant, afficher les informations contenues dans l en-tête. Exercice 4 : Occurrence d un mot Ecrire une fonction occurrences qui compte le nombre d apparitions d un mot (occurrences) dans une phrase. Cette fonction doit avoir le prototype suivant : int occurrences(char * texte, char * mot); Exemple d utilisation de cette fonction qui doit produire la phrase suivante en sortie : la phrase "cheval chien chien cheval chien" contient 3 fois le mot "chien" On ne tiendra pas compte des mots contenus dans d autre mots (exemple : chienne) 1. 2. int main(void) 3. { 4. int n; 5. char mot[] = "chien"; 6. char phrase[] = "cheval chien chien cheval chien";
7. 8. n = occurrences(phrase, mot); 9. printf("la phrase \"%s\" contient %d fois le mot \"%s\"\n", phrase, n, mot); 10. return 0; 11. } Exercice 5 : Copie de motif Ecrire une fonction qui copie et reproduit une chaîne de caractère (motif) dans une autre chaîne de caractère autant de fois que possible. Les motifs recopiés seront espacés d un nombre fixe de caractères donnés en paramètre. Exemple : copie du motif "abc" dans la chaîne "0123456789012345678901" avec 2 espaces entre chaque copie du motif. Avant copie du motif : 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 \0 2 caractères entre chaque motif Après copie du motif : a b c 3 4 a b c 8 9 a b c 3 4 a b c 8 9 a b \0 motif motif L espace entre deux reproductions du motif doit être supérieur ou égal à 1 caractère (nombre donné en paramètre). De plus, en fonction de la place disponible, le motif peut ne pas être copié entièrement (voir exemple). La fonction doit avoir pour prototype : void copiemotif(char * texte, char * motif, int espaces); Exemple d utilisation de la fonction pour l exemple donné ci-dessus : 1. int main(void) 2. { 3. char texte[] = "0123456789012345678901"; 4. 5. copiemotif(texte, "abc", 2); 6. printf("%s\n", texte); 7. return 0; 8. }
Annexe /* ------------------------------------------------------------------ Fichier : exemple.c Creation : 01/11/04 Auteur(s) : Yann Laurillau Objectif : Analyse de trame ------------------------------------------------------------------ */ /* --- Includes ----------------------------------------------------- */ #include <stdio.h> /* ------------------------------------------------------------------ Nom : affichertrame ------------------------------------------------------------------ */ void affichertrame(char * trame) { /* A COMPLETER */ } /* ------------------------------------------------------------------ Nom : main ------------------------------------------------------------------ */ int main(void) { unsigned char trame1[] = { 170, 170, 170, 170, 170, 170, 170, 171, 255, 255, 255, 255, 255, 255, 0, 12, 110, 244, 185, 217, 8, 6 }; unsigned char trame2[] = { 170, 170, 170, 172, 170, 170, 170, 171, 0, 12, 26, 33, 234, 87, 0, 12, 110, 244, 185, 217, 8, 0 }; affichertrame(trame1); affichertrame(trame2); return 0; }
Université de Savoie Module ETRS-505 Introduction au langage C TP 3 L'objectif de ce TP est de programmer un jeu du morpion qui consiste à aligner trois symboles identiques soit en ligne verticale, horizontale ou diagonale sur une grille 3x3. Ce jeu se joue à deux, tour à tour, l'un utilisant le symbole X, l'autre le O. A chaque étape du jeu, le programme doit afficher la grille en mode texte et demander dans quelle case poser un pion. Les colonnes seront identifiées par les lettres a, b et c ; les lignes par les chiffres 1, 2 et 3. A l'écran, vous devez obtenir un résultat semblable a ceci : a b c 1 X O 2 O X 3 O Placer un pion X > c 1 Position déjà occupée! Placer un pion X > b 3 a b c 1 X O 2 O X 3 X O Placer un pion O > c 2 a b c 1 X O 2 O X O 3 X O O a gagné! Mais vous pouvez faire beaucoup mieux en termes de convivialité et de fonctionnalité du programme!!! Contraintes : Réaliser les affichages de la grille en mode texte, Réaliser la saisie de la position du pion souhaitée pour chaque joueur (utiliser la fonction scanf("%c",<variable>) pour la saisie de caractères) et traiter les positions interdites,
Tester si le jeu est terminé et indiquer qui est le vainqueur, Utiliser un tableau pour représenter la grille en mémoire, Segmenter le programme en plusieurs fonctions, avec au moins o Une fonction pour l'affichage de la grille, o Une fonction pour la saisie de la position, o Une fonction de test de choix de position, o Une fonction de test de fin de jeu. Pour le reste vous êtes libre d appréhender le sujet de la façon dont vous le souhaiter. Lorsque votre programme fonctionne, vous pouvez utiliser une librairie graphique pour modifier le design de votre interface. ATTENTION : Il ne sert à rien de passer à cette étape si votre programme ne fonctionne pas correctement et que tous les bugs ne sont pas convenablement résolus.