LANGAGE DE PROGRAMMATION, Exercises of Programming Methodologies

Trouver le nom, le prénom, et le numéro des acteurs qui ont joué dans tous les films de Lelouch, s'il y en a. 12. Pour chaque film de Bergman, trouver le nom et le prénom de l'acteur qui a eu le plus gros salaire.

Typology: Exercises

2019/2020

Uploaded on 06/14/2022

david-iddir
david-iddir 🇩🇿

4

(1)

1 document

1 / 37

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
1
Support langage C
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20
pf21
pf22
pf23
pf24
pf25

Partial preview of the text

Download LANGAGE DE PROGRAMMATION and more Exercises Programming Methodologies in PDF only on Docsity!

Support langage C

Sommaire

  • Partie 1 : Initiation au langage C : Notions de base ……………………
  • Partie 2 : Les fonctions d’E/S standards……………………………….
  • Partie 3 : Les instructions de branchement conditionnel……………..
  • Partie 4 : Les structures répétitives…………………………………….
  • Partie 5 : Les Tableaux………………………………………………….
  • Partie 6 : Les chaînes de caractères…………………………………….
  • Partie 7 : Les Fonctions………………………………………………….
  • Partie 8 : Les Structures………………………………………………...
  • Partie 9 : Pointeurs et Allocation dynamique………………………….
  • Partie 10 : Les listes chaînées…………………………………………...

#include … #define … Entete fonction fonction …. Prototype des fonctions main() { définitions, instructions, et appel de fonctions. } Bloc principal fonction1 {…} fonction2 {…} ….. Définition des fonctions #include … #define … Entete fonction1 {…} fonction2 {…} ….. Définition des fonctions main() { définitions, instructions, et appel de fonctions. } Bloc principal Figure : Structure d’un programme C Exemple : calcul de la surface d’un cercle. #include <stdio.h> #define PI 3. float f_surface( float rayon) { float s; s=rayonrayonPI; return (s); } void main () { float surface; surface=f_surface(2.0); printf ("%f\n",surface); } #include <stdio.h> #define PI 3. float f_surface(float); void main () { float surface; surface=f_surface(2.0); printf ("%f\n",surface); } float f_surface(float rayon) { float s; s=rayonrayonPI; return (s); }

3. Les composants élémentaires du C

Un programme en langage C est constitué des six groupes de composants élémentaires suivants :  les identificateurs  les mots-clefs  les constantes  les chaînes de caractères,  les opérateurs  les signes de ponctuation. On peut ajouter à ces six groupes les commentaires, qui ne sont pas considérés par le pré processeur.

int NB_ligne ; NB_ligne = 15 ; /* déclaration d’une variable de type entière / / initialisation de la variable à 15 / const annee = 2022 / affecte une valeur à une variable, cette valeur ne pourra plus être changée */ 3.1. Les identificateurs  Le rôle d'un identificateur est de donner un nom à une entité du programme. Plus précisément, un identificateur peut designer :

  • un nom de variable ou de fonction,
  • un type défini par typedef, struct, union ou enum,
  • une étiquette.  Un identificateur est une suite de caractères parmi les lettres (minuscules ou majuscules, mais non accentuées), les chiffres, le tirait bas.  Le premier caractère d'un identificateur ne peut pas être un chiffre.  Les majuscules et minuscules sont différenciées.  Le compilateur peut tronquer les identificateurs au-delà d'une certaine longueur. Cette limite dépend des implémentations, mais elle est toujours supérieure à 31 caractères. (Le standard dit que les identificateurs externes, c'est-à-dire ceux qui sont exportés à l'édition de lien, peuvent être tronqués à 6 caractères, mais tous les compilateurs modernes distinguent au moins 31 caractères). 3.2. Les mots-clefs Un certain nombre de mots, appelés mots-clefs, sont réservés pour le langage lui-même et ne peuvent pas être utilisés comme identificateurs. L'ANSI-C compte 32 mots clefs : auto const double float int short struct unsigned break continue else for long signed switch void case default enum goto register sizeof typedef volatile char do extern if return static union while 3.3. Les commentaires Un commentaire débute par /* et se termine par /. Par exemple : / Ceci est un commentaire */. On ne peut pas imbriquer des commentaires. 3.4. Les constantes Une constante est une valeur qui apparaît littéralement dans le code source d'un programme, le type de la constante étant déterminé par la façon dont la constante est écrite. Les constantes vont être utilisées, par exemple, pour l’initialisation de variables. Exemples :

4. Les types de données

En C, il n’existe que quelques types fondamentaux de données :  Le type char : un seul byte représentant un caractère.  Le type int : un nombre entier dont la taille correspond à celles des entiers du SE.  Le type float : un nombre en virgule flottante en simple précision.  Le type double : un nombre en virgule flottante en double précision.

5. Déclaration de variables

Les variables doivent toutes être déclarées avant d’être utilisées bien que certaines soient faîtes implicitement par le contexte. A une variable correspond un espace en mémoire et un mécanisme permettant d’adresser cet emplacement. En C une variable est caractérisée par :  Son nom (un identificateur)  Son type (type de base ou type définie par l’utilisateur)

main() { int a = 0 ; int b =1 ; if (a = b) printf(“a et b sont égaux”) ; else printf(“a et b sont différents”) ; } imprime pour x la valeur 6.5 (et non 7), car dans l'instruction i = j + x;, l'expression j +x a été convertie en entier. 6.2. Les opérateurs arithmétiques Les opérateurs arithmétiques classiques sont l’opérateur unaire - (changement de signe) ainsi que les opérateurs binaires :

  • addition ; - soustraction ; * multiplication ; / division ; % reste de la division (modulo) (pour les entiers) Ces opérateurs agissent de la façon attendue sur les entiers comme sur les flottants. Leurs seules spécificités sont les suivantes :  Contrairement à d'autres langages, le C ne dispose que de la notation / pour désigner à la fois la division entière et la division entre flottants. Si les deux opérandes sont de type entier, l'opérateur / produira une division entière (quotient de la division). Par contre, il délivrera une valeur flottante dès que l’un des opérandes est un flottant.  L'opérateur % ne s'applique qu’à des opérandes de type entier. Si l'un des deux opérandes est négatif, le signe du reste dépend de l'implémentation, mais il est en général le même que celui du dividende.  Notons enfin qu’il n'y a pas en C d’opérateur effectuant l’élévation à la puissance. De façon générale, il faut utiliser la fonction pow(x,y) de la librairie math.h pour calculer xy 6.3. Les opérateurs relationnels

Strictement supérieur ; >= supérieur ou égal ; < Strictement inférieur ; <= inférieur ou égal ; == égal ; != différent

Leur syntaxe est : expression1 op expression

Les deux expressions sont évaluées puis comparées. La valeur rendue est de type int (il n'y a pas de type booléen en C); elle vaut 0 si la condition est faux, et une valeur différente de 0 sinon. Attention à ne pas confondre l'opérateur de test d’égalité == avec l’opérateur d’affection =. Ainsi, le programme suivant imprime à l’écran : a et b sont égaux .: 6.4. Les opérateurs logiques (booléens) && : et logique || : ou logique! : négation logique Comme pour les opérateurs de comparaison, la valeur retournée par ces opérateurs est unint qui vaut 0 si la condition est faux. Dans une expression de type : expression1 op1 expression2 op2 ...expressionN , l’évaluation se fait de gauche à droite et s'arrête dès que le résultat final est déterminé.

int a =3, b, c ; b = ++a ; /* a et b valent 4 / c = b++ ; / c vaut 4 et b vaut 5 */ Condition? expression1 : expression int i = 3, j = 2 ; printf(“%f “, (float)i/j) ; 6.5. Les opérateurs d'affectation composée Les opérateurs d'affectation composée sont : += - = = /= %= Pour tout opérateur op , l'expression : expression1 op= expression2  expression1 = expression1 op expression2. 6.6. Les opérateurs d'incrémentation et de décrémentation Les opérateurs d'incrémentation ++ et de décrémentation -- s'utilisent aussi bien en suffixe (i++) qu'en préfixe (++i). Dans les deux cas la variable i sera incrémentée, toutefois dans la notation suffixe la valeur retournée sera l'ancienne valeur de i alors que dans la notation préfixe ce sera la nouvelle. Par exemple : 6.7. L'opérateur conditionnel ternaire L'opérateur conditionnel?* est un opérateur ternaire. Sa syntaxe est la suivante : Cette expression est égale à expression1 si condition est satisfaite, et à expression2 sinon. Par exemple, l'expression x >= 0? x : - x correspond à la valeur absolue d'un nombre. De même l'instruction m = ((a > b)? a : b); affecte à m le maximum de a et de b. 6.8. L'opérateur de conversion de type L'opérateur de conversion de type, appelé cast , permet de modifier explicitement le type d'un objet. On écrit (type) objet Par exemple : la valeur 1.5 sera affichée. 6.9. L'opérateur adresse L'opérateur d'adresse & appliqué à une variable retourne l'adresse mémoire de cette variable. La syntaxe est &objet.

7. Les types prédéfinis

Les types de base en C concernent les caractères, les entiers et les flottants (nombres réels). Ils sont désignés par les mots-clefs suivants : char int float double 7.1. Les types caractères Le mot-clef char désigne un objet de type caractère. Il est codé sur un octet et il peut être assimilé à un entier : tout objet de type char peut être utilisé dans une expression qui utilise des objets de type entier.

Char * gets (char * s) ; int scanf (const char *format, liste d’adresses) ; int a = - 1 ; unsigned int b = 25 ; char c = ‘X’; scanf (“%d%u%c”,&a,&b,&c);

Partie 2 : Les fonctions d’E/S standards

1. Les fonctions d’entrées

1.1. La fonction scanf Cette fonction lit à partir de l’entrée standard (clavier) une liste de variables en mémoire selon un format donné. liste d’adresses représente une liste d’adresses de variables déclarées ; format représente le format de lecture des données. Elle est composée de spécificateurs qui indique le type de variables qu’on va lire. Chaque spécificateur correspond à un type de variable et doit donc apparaître dans le même ordre que la variable dans la liste. Les principaux spécificateurs de format sont résumés dans le tableau suivant : Spécificateur Signification %d ou %x ou %o Pour une variable de type int %u Pour une variable de type unsigned int %h Pour une variable de type short int %f Pour une variable de type float %lf Pour une variable de type double %c Pour une variable de type char %s Pour une variable de type texte (chaine) Exemple : Remarque:  On peut placer la longueur de la variable entre le signe % et la lettre spécificateur. Par exemple « %3d » indique qu’on va lire un entier de 3 chiffres.  Si l’on sépare les spécificateurs de format par des espaces ou par des virgules alors les valeurs à lire seront séparées par les mêmes séparateurs. 1.2. La fonction gets Elle renvoie une chaîne de caractères lue dans le flux en entrée stdin. Sa déclaration est la suivante :

int puts (const char * s) ; char * CH ; gets (CH) ; int printf (const char *format, liste d’expressions) ; int i ; int j = 5 ; printf(“entrer une valeur:\n“) ; printf(“la valeur de j est :%d“, j) ; puts (“ceci est un exemple“) ; int putchar (int c) ; Lorsqu’on lit une chaîne de caractères avec scanf, la lecture s’arrête dès la rencontre d’un blanc. Avec la fonction gets, la lecture se termine à la réception d’un retour chariot ‘\n’. Exemple : 1.3. Les fonctions getch(), getche() et getchar() La première fonction renvoie un caractère lu au clavier sans écho à l’écran alors que la deuxième renvoie un caractère lu au clavier avec écho à l’écran. La fonction getchar renvoie un caractère depuis stdin.

2. Les fonctions de sorties

2.1. La fonction printf Elle permet la traduction de quantité alphanumérique en chaîne de caractères ainsi qu’une présentation formatée des éditions. format : format de représentation. liste d’expressions : variables et expressions dont les valeurs sont à éditer. La première partie est en fait une chaîne de caractères qui peut contenir  du texte  des séquences d’échappement qui permettent de contrôler l’affichage des données. Exemple ‘\n’ qui permet le passage à la ligne suivante  des spécificateurs de format ou de conversion Elle contient exactement un spécificateur de format pour chaque expression. Exemple : 2.2. Les fonctions puts, putchar La fonction puts envoie une chaîne de caractères vers stdout et ajoute un saut de ligne (newline). Exemple : La fonction putchar envoie un caractère vers stdout (écran)

if ( expression ) bloc d’instructions 1 else bloc d’instructions 2 if (a > b) max = a ; else max = b; if (temperature < 0) { printf (“glace”); } else { if (temperature < 100) { printf (“eau“) ; } else { printf (“vapeur “) ; } }

Partie 3 : Les instructions de branchement conditionnel

1. If – else

  • Si l' expression fournit une valeur différente de zéro, alors le bloc d'instructions 1 est exécuté
  • Si l' expression fournit la valeur zéro, alors le bloc d'instructions 2 est exécuté La partie expression peut désigner :
  • une variable d'un type numérique,
  • une expression fournissant un résultat numérique. La partie bloc d'instructions peut désigner :
  • un (vrai) bloc d'instructions compris entre accolades.
  • une seule instruction terminée par un point-virgule. On peut avoir des « if » imbriqués. Exemples:

2. Switch

C’est un moyen qui permet de décider dans une structure à plusieurs cas. Cette instruction teste si une expression prend une valeur parmi un ensemble de constante et fait le branchement en conséquence.

int mois ; scanf (%d, &mois) ; switch (mois) { case 1 : printf (janvier) ; break ; case 2 : printf (fevrier) ; break ; … case 12 : printf (décembre) ; break ; default : printf (erreur) ; }

  • Le choix de l’ensemble d’instructions à exécuter est calculé par l’évaluation de expression qui doit envoyer un type entier.
  • expr_cste doit être un int et doit être unique. Exemple : L’instruction break permet de sortir de l’instruction switch. Elle est importante car si on ne la met pas après chaque cas d’exécution alors toutes les instructions après ce cas seront exécutées (bien sûr s’ils ne sont pas suivis d’une autre instruction break). Remarque : Il existe des instructions de branchement non conditionnels : goto, continue et break. Switch (expression) { case expr_cst1 : liste d’instructions 1 case expr_cst2 : liste d’instructions 2 … default : liste d’instructions N }

for (expr1 ; expr2 ; expr3) bloc d’instructions /* affichage des carrés des nombres entiers compris entre 0 et 20 / int i ; for (i = 0 ; i <= 20 ; i++) printf(« le carré de %d est %d »\n », i, ii) ; 2.3. For La structure pour en langage algorithmique est utilisée pour faciliter la programmation de boucles de comptage. La structure for en C est plus générale et beaucoup plus puissante. Est équivalente à : expr1 est évaluée une fois avant le passage de la boucle. Elle est utilisée pour initialiser les données de la boucle. expr2 est évaluée avant chaque passage de la boucle. Elle est utilisée pour décider si la boucle est répétée ou non. expr3 est évaluée à la fin de chaque passage de la boucle. Elle est utilisée pour réinitialiser les données de la boucle. En pratique, les parties expr1 et expr2 contiennent souvent plusieurs initialisations ou réinitialisations, séparées par des virgules. Exemple1: expr1 ; while (expr2) { bloc d’instructions expr3 ; }

TypeSimple NomTableau[Dimension] ; int Notes [8] ; /* déclaration d’un tableau nommé Notes, de type int et de dimension 8 / char Tab [100] ; / déclaration d’un tableau nommé Tab, de type char et de dimension 100 / float moy [40] ; / déclaration d’un tableau nommé my, de type float et de dimension 100 */ char A[5] = {‘A’, 66, 70, ‘C’, 240} ; int A[5] = {10, 20, 30, 40, 50};

Partie 5 : Les Tableaux

1. Les tableaux à une dimension

1.1. Déclaration et mémorisation  Déclaration Les noms des tableaux sont des identificateurs. Exemples : Mémorisation En C, le nom d'un tableau est le représentant de l'adresse du premier élément du tableau. Les adresses des autres composantes sont calculées (automatiquement) relativement à cette adresse. Exemple: ……… 65 66 70 67 240 ……….. 1E A Si un tableau est formé de N composantes et si une composante a besoin de M octets en mémoire, alors le tableau occupera N*M octets. 1.2. Initialisation et réservation automatique Lors de la déclaration d'un tableau, on peut initialiser les composantes du tableau, en indiquant la liste des valeurs respectives entre accolades. Exemple :

TypeSimple NomTableau [DimLigne][DimCol] ; double A[2][5] ; /* déclaration d’un tableau à deux dimensions nommé A et de type double / char B[4][2] ; / déclaration d’un tableau à deux dimensions nommé B et de type char */ short A[2][3] = { {1, 2, 6}, {10, 20, 54} } ; NomTableau[Ligne][Colonne] main () { int A[5][10] ; int i, j ; for (i=0 ;i<5 ;i++) { for (j=0 ;j<10 ;j++) printf(« %7d »,A[i][j]) ; /* Retour à la ligne */ printf(« \n ») ; } }

2. Les tableaux à deux dimensions

2.1. Déclaration et mémorisation Déclaration Exemples : Mémorisation et initialisation Comme pour les tableaux à une dimension, le nom d'un tableau est le représentant de l'adresse du premier élément du tableau (c.-à-d. l'adresse de la première ligne du tableau). Les composantes d'un tableau à deux dimensions sont stockées ligne par ligne dans la mémoire. Exemple: Mémorisation d'un tableau à deux dimensions 2.2. Accès aux composantes L’accès à un élément d’un tableau à deux dimensions se fait selon le schéma suivant : 2.3. Affichage et affectation Lors du travail avec les tableaux à deux dimensions, nous utiliserons deux indices (p.ex: I et J), et la structure for , souvent imbriquée, pour parcourir les lignes et les colonnes des tableaux.  Affichage du contenu d'un tableau à deux dimensions

char NOM [20] ; /*déclarartion sans initialisation / char Prenom [] = « ALI » ; / déclaration avec initialisation */ char TXT [10] = « BONJOUR !» ; char TXT [6] = « Hello» ;

Partie 6 : Les chaînes de caractères

NB : Il n'existe pas de type spécial chaîne ou string en C. Une chaîne de caractères est traitée comme un tableau à une dimension de caractères.

1. Déclaration

La déclaration d’une chaîne de caractères se fait par l’une des méthodes suivantes :  char NomChaine [Longueur];char * NomChaine ; Exemple :

2. Mémorisation

Le nom d'une chaîne est le représentant de l'adresse du premier caractère de la chaîne. Pour mémoriser une variable qui doit être capable de contenir un texte de N caractères, nous avons besoin de N+1 octets en mémoire: Exemple :

3. Accès aux éléments

Exemple :

4. Utilisation des chaînes de caractères

Les bibliothèques de fonctions de C contiennent une série de fonctions spéciales pour le traitement de chaînes de caractères. Exemples 1: les fonctions de stdio.h char TXT [6] = « Hello» ; char CH[5] ; printf(« %s »,TXT) ; / * affiche hello sans retour à la ligne/ _printf(«%s »,CH) ; / CH contient l’adresse du premier caractère de la châne / puts(TXT) ; / affiche Hello avec un retour à la ligne / puts(« bonjour ») ; /affiche bonjour avec un retour à la ligne / gets(CH) ; / lit une ligne de caractères de stdin_