Beruflich Dokumente
Kultur Dokumente
A.U :2011/2012
Programme
10/11/2011
Evaluation
CC1 CC2 & Examen de TP
8 semaines
PARTIE 1
Oprateurs
Arithmtiques Logiques De comparaison incrmentatio n
+ , * , - , && , || , ! /
++, --
PARTIE 1
char
int
2 ou 4 octets
float
4 octets
8 octets
long
5
PARTIE 1
PARTIE 1
permet de renommer un type. Syntaxe: typedef type nouveau_type ; Exp: Typdef short type1; Typdef int type2; Typdef struct ETUD STR_ETD;
PARTIE 1
Syntaxe:
nom_type indent_var1,ident_var2,,ident_varn; const nom_type ident_var;
? var1 Var 6 . . Var i Mmoire
les constantes symboliques : const int nb = 15; const int constante_symbolique = 15; int i = constante_symbolique; ne peuvent faire partie d'une expression constante (les indices de tableaux)
les valeurs numriques 15 => int 15L => long int 15.0 => double (les vbles relles sont par dfaut doubles) 15.0F => float
/* vert */ /* bizarre mais accept */ /* impossible jaune n'est pas une Lvalue */
Les unsigned char renvoient un chiffre entre 0 255 alors que les char renvoient un nombre entre -128 et 127
Loprateur squentiel
Loprateur squentiel est la virgule. a*b ,c+d a * b est valu dabord puis c + d. if ( i++, a > b) <==> i++; if ( a > b )... for (i = 0, j = 10; . .. ; ...) <==> i = 0; f or ( j = 10; . .. ; ...)
Caractre invalide
scanf("%d^%c",&n,&c); 45a@ ===> La rencontre d'un caractre invalide (le point dans un entier) provoque l'arrt du traitement du code format.
PARTIE 1
PARTIE 1
PARTIE 1
PARTIE 1
Efficacit Rapidit?
INSTANTANE !
DUREE DE VIE ?
- Lisible - Structur
35
PARTIE 1
PARTIE 1
Programme principal
37
En faisant le rapprochement avec les mathmatiques, on dit encore que "A est un vecteur de dimension N Exemple: La dclaration int JOURS[12]={31,28,31,30,31,30,31,31,30,31,30,31}; dfinit un tableau du type int de dimension 12. Les 12 composantes sont initialises par les valeurs respectives 31, 28, 31, ... , 31. On peut accder la premire composante du tableau par JOURS[0], la deuxime composante par JOURS[1], . . . , la dernire composante par JOURS[11]
Si un tableau est form de N composantes et si une composante a besoin de M octets en mmoire, alors le tableau occupera de N*M octets.
Exercice 1 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I; /* indice courant */ long SOM; /* somme des lments - type long cause */ /* de la grandeur prvisible du rsultat. */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); }
/* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); /* Calcul de la somme */ for (SOM=0, I=0; I<N; I++) SOM += T[I]; /* Edition du rsultat */ printf("Somme de lments : %ld\n", SOM); return 0; }
Exercice 2 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I,J; /* indices courants */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn : \n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); /* Effacer les zros et comprimer : */ /* Copier tous les lments de I vers J et */ /* augmenter J pour les lments non nuls. */
for (I=0, J=0 ; I<N ; I++) { T[J] = T[I]; if (T[I]) J++; } /* Nouvelle dimension du tableau ! */ N = J; /* Edition des rsultats */ printf("Tableau rsultat :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); return 0; }
Exercice 3 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50]; /* tableau donn */ int N; /* dimension */ int I,J; /* indices courants */ int AIDE; /* pour l'change */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn : \n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n");
/* Inverser le tableau */ for (I=0, J=N-1 ; I<J ; I++,J--) /* Echange de T[I] et T[J] */ { AIDE = T[I]; T[I] = T[J]; T[J] = AIDE; } /* Edition des rsultats */ printf("Tableau rsultat :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n"); return 0; }
Exercice 4 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ /* Les tableaux et leurs dimensions */ int T[50], TPOS[50], TNEG[50]; int N, NPOS, NNEG; int I; /* indice courant */ /* Saisie des donnes */ printf("Dimension du tableau (max.50) : "); scanf("%d", &N ); for (I=0; I<N; I++) { printf("Elment %d : ", I); scanf("%d", &T[I]); } /* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<N; I++) printf("%d ", T[I]); printf("\n");
/* Initialisation des dimensions de TPOS et TNEG */ NPOS=0; NNEG=0; /* Transfer des donnes */ for (I=0; I<N; I++) { if (T[I]>0) { TPOS[NPOS]=T[I]; NPOS++; } if (T[I]<0) { TNEG[NNEG]=T[I]; NNEG++; } } /* Edition du rsultat */ printf("Tableau TPOS :\n"); for (I=0; I<NPOS; I++) printf("%d ", TPOS[I]); printf("\n"); printf("Tableau TNEG :\n"); for (I=0; I<NNEG; I++) printf("%d ", TNEG[I]); printf("\n"); return 0; }
En faisant le rapprochement avec les mathmatiques, on peut dire que "A est un vecteur de L vecteurs de dimension C", ou mieux:"A est une matrice de dimensions L et C". Exemple: Pour mmoriser les notes des lves dans les 10 devoirs d'un trimestre, nous pouvons rassembler plusieurs de ces tableaux uni-dimensionnels dans un tableau NOTES deux dimensions : int NOTE[10][20] = {{45, 34, ... , 50, 48}, {39, 24, ... , 49, 45}, {40, 40, ... , 54, 44}};
Affectation avec des valeurs provenant de l'extrieur #include<stdio.h> int main(int argc, char *argv[]) { Affichage du contenu d'un tableau int A[5][10]; #include<stdio.h> int I,J; int main(int argc, char *argv[]) /* Pour chaque ligne ... */ { for (I=0; I<5; I++) int A[5][10]; /* ... considrer chaque composante */ int I,J; for (J=0; J<10; J++) /* Pour chaque ligne ... */ scanf("%d", &A[I][J]); for (I=0; I<5; I++) return 0; { } /* ... considrer chaque composante */ for (J=0; J<10; J++) printf("%7d", A[I][J]); /* Retour la ligne */ printf("\n"); } return 0; }
Exercice 1 #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int T[50][50]; /* tableau donn */ int L, C; /* dimensions */ int I, J; /* indices courants */ long SOM; /* somme des lments - type long cause */ /* de la grandeur prvisible du rsultat. */ /* Saisie des donnes */ printf("Nombre de lignes (max.50) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.50) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &T[I][J]); }
/* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", T[I][J]); printf("\n"); } /* Calcul de la somme */ for (SOM=0, I=0; I<L; I++) for (J=0; J<C; J++) SOM += T[I][J]; /* Edition du rsultat */ printf("Somme des lments : %ld\n", SOM); return 0; }
Exercice 2
#include <stdio.h> int main(int argc, char *argv[]) {/* Dclarations */ int T[50][50]; /* tableau donn */ int L, C; /* dimensions */ int I, J; /* indices courants */ long SOM; /* Saisie des donnes */ printf("Nombre de lignes (max.50) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.50) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &T[I][J]); } /* Affichage du tableau */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", T[I][J]); printf("\n"); }
/* Calcul et affichage de la somme des lignes */ for (I=0; I<L; I++) { for (SOM=0, J=0; J<C; J++) SOM += T[I][J]; printf("Somme - ligne %d : %ld\n",I,SOM); } /* Calcul et affichage de la somme des colonnes */ for (J=0; J<C; J++) { for (SOM=0, I=0; I<L; I++) SOM += T[I][J]; printf("Somme - colonne %d : %ld\n",J,SOM); } return 0; }
Exercice 3
#include <stdio.h> int main(int argc, char *argv[]) {/* Dclarations */ int M[10][10]; /* tableau 2 dimensions */ int V[100]; /* tableau 1 dimension */ int L, C; /* dimensions */ int I, J; /* indices courants */ /* Saisie des donnes */ printf("Nombre de lignes (max.10) : "); scanf("%d", &L ); printf("Nombre de colonnes (max.10) : "); scanf("%d", &C ); for (I=0; I<L; I++) for (J=0; J<C; J++) { printf("Elment[%d][%d] : ",I,J); scanf("%d", &M[I][J]); } /* Affichage du tableau 2-dim */ printf("Tableau donn :\n"); for (I=0; I<L; I++) { for (J=0; J<C; J++) printf("%7d", M[I][J]); printf("\n"); }
/* Transfer des lments ligne par ligne */ for (I=0; I<L; I++) for (J=0; J<C; J++) V[I*C+J] = M[I][J]; /* Affichage du tableau 1-dim */ printf("Tableau rsultat : "); for (I=0; I<L*C; I++) printf("%d ", V[I]); printf("\n"); return 0; }
printf("Entrez lieu et date de naissance : \n"); scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE); Remarques importantes - La fonction scanf a besoin des adresses de ses arguments: * Les noms des variables numriques (int, char, long, float, ...) doivent tre marqus par le symbole '&. * Comme le nom d'une chane de caractres est le reprsentant de l'adresse du premier caractre de la chane, il ne doit pas tre prcd de l'oprateur adresse '&' ! - La fonction scanf avec plusieurs arguments prsuppose que l'utilisateur connaisse exactement le nombre et l'ordre des donnes introduire! Ainsi, l'utilisation de scanf pour la lecture de chanes de caractres est seulement conseille si on est forc de lire un nombre fix de mots en une fois.
Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char TXT[201]; /* chane donne */ int I,J; /* indices courants */ /* Saisie des donnes */ printf("Entrez une ligne de texte (max.200 caractres) :\n"); gets(TXT); /* Eliminer les lettres 'e' et comprimer : */ /* Copier les caractres de I vers J et incrmenter J */ /* seulement pour les caractres diffrents de 'e'. */ for (J=0,I=0 ; TXT[I] ; I++) { TXT[J] = TXT[I]; if (TXT[I] != 'e') J++; } /* Terminer la chane !! */ TXT[J]='\0'; /* Edition du rsultat */ puts(TXT); return 0; }
Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { char NOM[40], PRENOM[40]; printf("Introduisez votre nom et votre prnom: \n"); scanf("%s %s", NOM, PRENOM); printf("\nBonjour %s %s !\n", NOM, PRENOM); printf("Votre nom est compos de %d lettres.\n", strlen(NOM) + strlen(PRENOM)); /* ou bien printf("Votre nom est compos de %d lettres.\n", strlen(strcat(NOM,PRENOM))); */ return 0; }
Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[200], CH2[200]; /* chanes entres */ int RES; /* rsultat de la fonction strcmp */ printf("Introduisez la premire chane de caractres : "); gets(CH1); printf("Introduisez la deuxime chane de caractres : "); gets(CH2); /* Comparaison et affichage du rsultat */ RES = strcmp(CH1,CH2); if (RES<0) printf("\"%s\" prcde \"%s\"\n",CH1 ,CH2); else if (RES>0) printf("\"%s\" prcde \"%s\"\n",CH2 ,CH1); else printf("\"%s\" est gal \"%s\"\n",CH1, CH2); return 0; }
Exercice Utiliser les fonctions spciales de <string>. #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[100], CH2[100]; /* chanes donnes */ char CH3[100]=""; /* chane rsultat */ /* Saisie des donnes */ printf("Introduisez la premire chane de caractres : "); gets(CH1); printf("Introduisez la deuxime chane de caractres : "); gets(CH2); /* Traitements */ strncpy(CH3, CH1, strlen(CH1)/2); strncat(CH3, CH2, strlen(CH2)/2); /* Affichage du rsultat */ printf("Un demi \"%s\" plus un demi \"%s\" donne \"%s\"\n", CH1, CH2, CH3); return 0; }
Exercice Utiliser uniquement les fonctions gets et puts. #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char CH1[100], CH2[100]; /* chanes donnes */ char CH3[100]=""; /* chane rsultat */ /* Copier la premire moiti de CH2 vers CH3 */ int L1,L2; /* longueurs de CH1 et CH2 */ J=I; int I; /* indice courant dans CH1 et CH2 */ for (I=0 ; I<(L2/2) ; I++) int J; /* indice courant dans CH3 */ { /* Saisie des donnes */ puts("Introduisez la premire chane de caractres : "); CH3[J]=CH2[I]; gets(CH1); J++; puts("Introduisez la deuxime chane de caractres : "); } gets(CH2); /* Terminer la chane CH3 */ /* Dtermination les longueurs de CH1 et CH2 */ for (L1=0; CH1[L1]; L1++) ; CH3[J]='\0'; for (L2=0; CH2[L2]; L2++) ; /* Affichage du rsultat */ /* Copier la premire moiti de CH1 vers CH3 */ puts("Chane rsultat : "); for (I=0 ; I<(L1/2) ; I++) CH3[I]=CH1[I]; puts(CH3);
return 0; }
Exercice #include <stdio.h> #include <string.h> int main(int argc, char *argv[]) { /* Dclarations */ char VERB[20]; /* chane contenant le verbe */ strcat(AFFI, "e"); char AFFI[30]; /* chane pour l'affichage */ puts(AFFI); int L; /* longueur de la chane */ /* Saisie des donnes */ printf("Verbe : "); ... gets(VERB); /* Contrler s'il s'agit d'un verbe en 'er' */ AFFI[0]='\0'; L=strlen(VERB); if ((VERB[L-2]!='e') || (VERB[L-1]!='r')) strcat(AFFI, "ils "); puts("\aCe n'est pas un verbe du premier groupe.!"); strcat(AFFI, VERB); else { strcat(AFFI, "ent"); /* Couper la terminaison 'er'. */ puts(AFFI); VERB[L-2]='\0'; } /* Conjuguer ... */ AFFI[0]='\0'; return 0; strcat(AFFI, "je "); } strcat(AFFI, VERB);
Les tableaux de chanes sont mmoriss ligne par ligne. La variable JOUR aura donc besoin de 7*9*1 = 63 octets en mmoire.
L'attribution d'une chane de caractres une composante d'un tableau de chanes se fait en gnral l'aide de la fonction strcpy: Exemple La commande strcpy(JOUR[4], "Friday"); changera le contenu de la 5e composante du tableau JOUR de "vendredi" en "Friday".
L'attribution d'une chane de caractres une composante d'un tableau de chanes se fait en gnral l'aide de la fonction strcpy: Exemple La commande strcpy(JOUR[4], "Friday"); changera le contenu de la 5e composante du tableau JOUR de "vendredi" en "Friday".
Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ int N; /* nombre entr */ char JOUR[8][9] = {"\aErreur!", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi","dimanche"}; /* Saisie du nombre */ printf("Entrez un nombre entre 1 et 7 : "); scanf("%d", &N); /* Affichage du rsultat - pour perfectionnistes */ if (N>0 && N<8) printf("Le %de%c jour de la semaine est %s.\n", N, (N==1)?'r':' ', JOUR[N]); else puts(JOUR[0]); return 0; }
Exercice #include <stdio.h> int main(int argc, char *argv[]) { /* Dclarations */ char MOT[5][50]; /* tableau pour les 5 mots */ int I; /* indice courant */ /* Saisie des mots */ printf("Entrez 5 mots, spars par des espaces :\n"); /* Aprs le retour la ligne, scanf lit */ /* les 5 donnes la fois. */ for (I=0; I<5; I++) scanf("%s", MOT[I]); /* Affichage du rsultat */ for (I=4; I>=0; I--) printf("%s ", MOT[I]); printf("\n"); return 0; }
{ Exercice /* Couper la terminaison 'er'. */ #include <stdio.h> int main(int argc, char *argv[]) VERB[L-2]='\0'; { /* Conjuguer ... */ /* Dclarations */ /* Sujets et terminaisons */ for (I=0; I<6; I++) char SUJ[6][5] = {"je","tu","il","nous","vous","ils"}; printf("%s %s%s\n",SUJ[I], VERB, TERM[I]); char TERM[6][5] = {"e","es","e","ons","ez","ent"}; } char VERB[20]; /* chane contenant le verbe */ int L; /* longueur de la chane */ return 0; int I; /* indice courant */ } /* Saisie des donnes */ printf("Verbe : "); scanf("%s", VERB); /* Contrler s'il s'agit d'un verbe en 'er' */ L=strlen(VERB); if ((VERB[L-2] != 'e') || (VERB[L-1] != 'r')) printf("\"%s\" n'est pas un verbe du premier groupe.\n",VERB); else
/* Recherche du prochain mot droite de A[I] */ Exercice PMOT=I; #include <stdio.h> #include <string.h> for (J=I+1; J<10; J++) int main(int argc, char *argv[]) if (strcmp(MOT[J], MOT[PMOT]) < 0) { /* Dclarations */ PMOT=J; char MOT[10][50]; /* tableau de 10 mots trier */ /* Echange des mots l'aide de strcpy */ char AIDE[50]; /* chane d'aide pour la permutation */ strcpy(AIDE, MOT[I]); int I; /* rang partir duquel MOT n'est pas tri */ strcpy(MOT[I], MOT[PMOT]); int J; /* indice courant */ int PMOT; /* indique la position du prochain mot */ strcpy(MOT[PMOT], AIDE); /* dans la suite lexicographique. */ } /* Saisie des donnes */ /* Edition du rsultat */ for (J=0; J<10; J++) { printf("Tableau tri lexicographiquement :\n"); printf("Mot %d : ", J); for (J=0; J<10; J++) gets(MOT[J]); /* ou : scanf ("%s\n", MOT[J]); */ puts(MOT[J]); /* ou : printf("%s\n",MOT[J]); */ } /* Tri du tableau par slection directe du */ printf("\n"); /* prochain mot dans la suite lexicographique. */ return 0; for (I=0; I<9; I++) { }