Vous êtes sur la page 1sur 12

Exercices Tableaux, chanes et pointeurs Question Exercices sur les tableaux 1.

Initialisation de tableaux : crire un programme qui remplit les 100 lments d'un tableau avec la valeur 3 et affiche ce tableau l'cran. Solution Correction #include <stdio.h> void main() { int tab[100]; int i; for (i=0;i<=99;i++) { tab[i]=3; printf("%d ",tab[i]); } } Question 2. Moyenne : crire un programme qui lit 12 nombres, en fait la moyenne, et affiche les nombres suprieurs cette moyenne. Solution Correction #include < stdio.h > int main(){

int tab[12]; int i,j,som=0; float moy; for (i=0; i < 12 ; i++) { /*saisie des nombres*/ printf("entrez le %d chiffre : ",i); scanf("%d",&tab[i]); som+=tab[i]; } moy=(float)som/12; printf("affichage des chiffres superieur la moyenne\n"); for (i=0; i < 12 ; i++) { if (tab[i]>moy) printf("%d\n",tab[i]); } return 0; } Question 3. Produit scalaire : On peut reprsenter un vecteur de l'espace vectoriel Rn l'aide d'un tableau de n rels. crire un programme qui lit deux vecteurs de R10, calcule leur produit scalaire et affiche les deux vecteurs et leur produit scalaire. Solution Correction #include < stdio.h > int main(){

float tab1[10]; float tab2[10]; int i,j; float prod=0; for (i=0;i<10;i++) { printf("\nentrez la coordonnee %d du premier vecteur : ",i+1); scanf("%f",&tab1[i]); } for (i=0;i<10;i++) { printf("\nentrez la coordonnee %d du deuxime vecteur : ",i+1); scanf("%f",&tab2[i]); } for (j=0;j<10;j++) { prod = prod + tab1[j]*tab2[j]; } printf("le produit sacalaire des deux vecteurs est : %f" ,prod); return 0; } Question 4. Somme des vecteurs : On peut reprsenter un vecteur de l'espace vectoriel Rn l'aide d'un tableau de n rels.

crire un programme qui lit deux vecteurs de R10, calcule leur somme et affiche cette somme. Solution Correction #include < stdio.h > int main() { float tab1[10]; float tab2[10]; float res[10]; int i,j; for (i=0;i<10;i++) { printf("\nentrez la coordonnee %d du premier vecteur : ",i+1); scanf("%f",&tab1[i]); } for (i=0;i<10;i++) { printf("\nentrez la coordonnee %d du deuxieme vecteur : ",i+1); scanf("%f",&tab2[i]); } printf("la somme des deux vecteur est \n"); for (j=0;j<10;j++) { res[j]= tab1[j]+tab2[j];

printf("%f",res[j]); } return 0; } Question Exercices sur les pointeurs 1. Pointeurs sur chane de caractre : crire un programme qui lit une chane de caractres CH de taille maximum 100 et dtermine la longueur de la chane l'aide d'un pointeur P. Le programme n'utilisera pas de variables numriques. Solution Correction #include < stdio.h> main() { /* Dclarations */ char CH[101]; /* chane donne */ char *P; /* pointeur d'aide */ /* Saisie des donnes */ printf("Entrez une ligne de texte (max.100 caractres) :\n"); scanf("%s", CH); /* Placer P la fin de la chane */ for (P = CH; *P !='\0'; P++) ; /* Affichage du rsultat */ printf("La chane \"%s\" est forme de %d caractres.\n", CH, P - CH); return 0;

} Question 2. Pointeurs sur tableaux deux dimensions : crire un programme qui lit 5 mots d'une longueur maximale de 50 caractres et les mmorise dans un tableau de chanes de caractres TABCH. Inverser l'ordre des caractres l'intrieur des 5 mots l'aide de deux pointeurs P1 et P2. Afficher ces mots. Solution Correction #include <stdio.h> int main() { /* Dclarations */ char TABCH[5][51];/* tableau de chanes de caractres */ char AIDE; /* pour la permutation des caractres */ char *P1, *P2; /* pointeurs d'aide */ int I; /* indice courant */ /* TABCH+I est l'adresse de la I-ime chane du tableau */ /* Il vaut mieux convertir TABCH+I en pointeur sur char */ /* Saisie des donnes */ printf("Entrez 5 mots :\n"); for (I=0; I<5; I++) { printf("Mot %d (max.50 caractres) : ", I); scanf("%s", TABCH[I]); }

/* Inverser l'ordre des caractres l'intrieur des mots */ for (I=0; I<5; I++) { P1 = (char *)(TABCH+I); P2=P1; /* Placer P2 la fin de la chane */ while (*P2 != '\0') P2++; P2--; /* sinon '\0' est plac au dbut de la chane */ while (P1 < P2) { AIDE = *P1; *P1 = *P2; *P2 = AIDE; P1++; P2--; } } /* Affichage des mots inverss */ for (I=0; I < 5; I++) printf("\n%s", TABCH[I]); return 0; } Question Exercices sur les chanes de caractres 1. Initialisation de chane de caractre : Lesquelles des chanes suivantes sont initialises correctement ?

Corrigez les dclarations fausses et indiquez pour chaque chane de caractres le nombre d'octets qui sera rserv en mmoire. a) char a[ ] = "un\ndeux\ntrois\n" ; b) char b[12] = "un deux trois" ; c) char c[] = 'abcdefg' ; d) char d[10] = 'x' ; e) char e[5] = "cinq" ; f ) char f[] = "Cette " "phrase" "est coupe"; g) char g[2] = { 'a', '\0' }; h) char h[4] = { 'a', 'b', 'c' } ; i) char i[4] = "'o' Solution Correction a) char a[] = "un\ndeux\ntrois\n"; Dclaration correcte Espace: 15 octets b) char b[12] = "un deux trois"; Dclaration incorrecte: la chane d'initialisation dpasse le bloc de mmoire rserv. Correction: char b[14] = "un deux trois"; ou mieux: char b[] = "un deux trois"; Espace: 14 octets c) char c[] = 'abcdefg'; Dclaration incorrecte: Les symboles ' et encadrent des caractres;

pour initialiser avec une chane de caractres, il faut utiliser les guillemets (ou indiquer une liste de caractres). Correction: char c[] = "abcdefg"; Espace: 8 octets d) char d[10] = 'x'; Dclaration incorrecte: Il faut utiliser une liste de caractres ou une chane pour l'initialisation Correction: char d[10] = {'x', '\0'} ou mieux: char d[10] = "x"; Espace: 2 octets e) char e[5] = "cinq"; Dclaration correcte Espace: 5 octets f) char f[] = "Cette ", "phrase", "est coupe"; Dclaration incorrecte On ne peut affecter plusieurs chanes spares ainsi. g) char g[2] = {'a', '\0'}; Dclaration correcte Espace: 2 octets h) char h[4] = {'a', 'b', 'c'}; Dclaration incorrecte: Dans une liste de caractres, il faut aussi indiquer le symbole de fin de chane. Correction: char h[4] = {'a', 'b', 'c', '\0'}; Espace: 4 octets i) char i[4] = "'o'"; Dclaration correcte, mais d'une chane contenant les caractres '\'', 'o', '\'' et '\0'. Espace: 4 octets

Question 2. inverser l'ordre des mots : crire un programme qui lit 5 mots, spars par des espaces et qui les affiche ensuite dans une ligne, mais dans l'ordre inverse. Les mots sont mmoriss dans 5 variables nommes de M1 M5. Exemple voici une petite phrase ! ! phrase petite une voici Solution Correction #include < stdio.h > main() { char M1[30], M2[30], M3[30], M4[30], M5[30]; printf("Entrez 5 mots, spars par des espaces :\n"); scanf ("%s %s %s %s %s", M1, M2, M3, M4, M5); printf("%s %s %s %s %s\n",M5, M4, M3, M2, M1); return 0; } Question 3. Conjugaison : crire un programme qui lit un verbe du premier groupe (se terme avec "er") au clavier et qui affiche la conjugaison au prsent de l'indicatif de ce verbe. Contrlez s'il s'agit bien d'un verbe qui se termine avec "er" avant de conjuguer. Vous utiliserez pour rsoudre ce programme les fonctions scanf, printf, strcat et strlen. Exemple: erbe : fter je fte tu ftes

il fte nous ftons vous ftez ils ftent Solution Correction #include <stdio.h> #include <string.h> main() { /* Dclarations */ char VERB[20]; /* chane contenant le verbe */ char AFFI[30]; /* chane pour l'affichage */ int L; /* longueur de la chane */ /* Saisie des donnes */ printf("\nVerbe : "); 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("\nCe n'est pas un verbe du premier groupe.!"); else { /* Couper la terminaison 'er'. */ VERB[L-2]='\0'; /* Conjuguer ... */ AFFI[0]='\0';

strcat(AFFI, "je "); strcat(AFFI, VERB); strcat(AFFI, "e"); printf(AFFI); ... AFFI[0]='\0'; strcat(AFFI, "ils "); strcat(AFFI, VERB); strcat(AFFI, "ent"); printf(AFFI); } return 0; }