





























Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
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
1 / 37
This page cannot be seen from the preview
Don't miss anything!






























#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); }
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 :
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.
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 :
Strictement supérieur ; >= supérieur ou égal ; < Strictement inférieur ; <= inférieur ou égal ; == égal ; != différent
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.
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);
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.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 “) ; } }
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) ; }
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};
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.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» ;
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.
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 :
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 :
Exemple :
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_