Exercice 1
#include <stdio.h> main() { /* Déclarations */ int A[100], B[50]; /* tableaux */ int N, M; /* dimensions des tableaux */ int *PA,*PB; /* pointeurs d'aide */ /* Saisie des données */ printf("Dimension du tableau A (max.50) : "); scanf("%d", &N ); for (PA=A; PA<A+N; PA++) { printf("Elément %d : ", PA-A); scanf("%d", PA); } printf("Dimension du tableau B (max.50) : "); scanf("%d", &M ); for (PB=B; PB<B+M; PB++) { printf("Elément %d : ", PB-B); scanf("%d", PB); } /* Affichage des tableaux */ printf("Tableau donné A :\n"); for (PA=A; PA<A+N; PA++) printf("%d ", *PA); printf("\n"); printf("Tableau donné B :\n"); for (PB=B; PB<B+M; PB++) printf("%d ", *PB); printf("\n"); /* Copier B à la fin de A */ for (PA=A+N,PB=B ; PB<B+M ; PA++,PB++) *PA = *PB; /* Nouvelle dimension de A */ N += M; /* Edition du résultat */ printf("Tableau résultat A :\n"); for (PA=A; PA<A+N; PA++) printf("%d ", *PA); printf("\n"); return 0; }
Exercice 2
a) en utilisant uniquement le formalisme tableau
#include <stdio.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ int I,J; /* indices courants */ int PALI; /* indicateur logique: */ /* vrai si CH est un palindrome */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); /* Placer J sur la dernière lettre de la chaîne */ for(J=0; CH[J]; J++) ; J--; /* Contrôler si CH est un palindrome */ PALI=1; for (I=0 ; PALI && I<J ; I++,J--) if (CH[I] != CH[J]) PALI=0; /* Affichage du résultat */ if (PALI) printf("La chaîne \"%s\" est un palindrome.\n", CH); else printf("La chaîne \"%s\" n'est pas un palindrome.\n", CH); return 0; }
b) en utilisant des pointeurs au lieu des indices numériques :
#include <stdio.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ char *P1,*P2; /* pointeurs d'aide */ int PALI; /* indicateur logique: */ /* vrai si CH est un palindrome */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); /* Placer P2 sur la dernière lettre de la chaîne */ for (P2=CH; *P2; P2++) ; P2--; /* Contrôler si CH est un palindrome */ PALI=1; for (P1=CH ; PALI && P1<P2 ; P1++,P2--) if (*P1 != *P2) PALI=0; /* Affichage du résultat */ if (PALI) printf("La chaîne \"%s\" est un palindrome.\n", CH); else printf("La chaîne \"%s\" n'est pas un palindrome.\n", CH); return 0; }
Exercice 3
#include <stdio.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ char *P; /* pointeur d'aide */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); /* Placer P à la fin de la chaîne */ for (P=CH; *P; P++) ; /* Affichage du résultat */ printf("La chaîne \"%s\" est formée de %d caractères.\n", CH, P-CH); return 0; }
Exercice 4
#include <stdio.h> #include <ctype.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ char *P; /* pointeur d'aide */ int N; /* nombre des mots */ int DANS_MOT; /* indicateur logique: */ /* vrai si P pointe à l'intérieur un mot */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); /* Compter les mots */ N=0; DANS_MOT=0; for (P=CH; *P; P++) if (isspace(*P)) DANS_MOT=0; else if (!DANS_MOT) { DANS_MOT=1; N++; } /* Affichage du résultat (pour perfectionnistes) */ printf("La chaîne \"%s\" \nest formée de %d mot%c.\n", CH, N, (N==1)?' ':'s'); return 0; }
Exercice 5
#include <stdio.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ char *PCH; /* pointeur d'aide dans CH */ int ABC[26]; /* compteurs des différents caractères */ int *PABC; /* pointeur d'aide dans ABC */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); /* Initialiser le tableau ABC */ for (PABC=ABC; PABC<ABC+26; PABC++) *PABC=0; /* Compter les lettres */ for (PCH=CH; *PCH; PCH++) { if (*PCH>='A' && *PCH<='Z') (*(ABC+(*PCH-'A')))++; /* Attention aux parenthèses! */ if (*PCH>='a' && *PCH<='z') (*(ABC+(*PCH-'a')))++; } /* Affichage des résultats */ /* (PABC-ABC) est le numéro de la lettre de l'alphabet. */ printf("La chaîne \"%s\" contient :\n", CH); for (PABC=ABC; PABC<ABC+26; PABC++) if (*PABC) printf(" %d\tfois la lettre '%c' \n", *PABC, 'A'+(PABC-ABC)); return 0; }
Exercice 6
#include <stdio.h> #include <string.h> main() { /* Déclarations */ char CH[101]; /* chaîne donnée */ char C; /* lettre à éliminer */ char *P; /* pointeur d'aide dans CH */ /* Saisie des données */ printf("Entrez une ligne de texte (max.100 caractères) :\n"); gets(CH); printf("Entrez le caractère à éliminer (suivi de Enter) : "); C=getchar(); /* Comprimer la chaîne à l'aide de strcpy */ P=CH; while (*P) { if (*P==C) strcpy(P, P+1); else P++; } /* Affichage du résultat */ printf("Chaîne résultat : \"%s\"\n", CH); return 0; }
Exercice 7
#include <stdio.h> #include <string.h> main() { /* Déclarations */ char CH1[101], CH2[101]; /* chaînes données */ char *P1, *P2; /* pointeurs d'aide dans CH1 et CH2 */ int TROUVE; /* indicateur logique: vrai, si le caractère */ /* actuel dans CH1 a été trouvé dans CH2. */ /* Saisie des données */ printf("Entrez la première chaîne de caractères" " (max.100 caractères) :\n"); gets(CH1); printf("Entrez la deuxième chaîne de caractères" " (max.100 caractères) :\n"); gets(CH2); /* Eliminer les lettres communes */ /* Idée: Parcourir CH2 de gauche à droite et contrôler */ /* pour chaque caractère s'il se trouve aussi dans CH1. */ /* Si tel est le cas, éliminer le caractère de CH1 à */ /* l'aide de strcpy. */ for (P2=CH2; *P2; P2++) { TROUVE = 0; for (P1=CH1 ; *P1 && !TROUVE ; P1++) if (*P2==*P1) { TROUVE = 1; strcpy(P1, P1+1); } } /* Affichage du résultat */ printf("Chaîne résultat : \"%s\" \n", CH1); return 0; }
Exercice 8
#include <stdio.h> #include <string.h> main() { /* Déclarations */ char CH1[101], CH2[101]; /* chaînes données */ char *P1, *P2; /* pointeurs d'aide dans CH1 et CH2 */ int TROUVE; /* indicateur logique: vrai, si le caractère */ /* actuel dans CH1 a été trouvé dans CH2. */ /* Saisie des données */ printf("Entrez la chaîne à transformer" " (max.100 caractères) :\n"); gets(CH1); printf("Entrez la chaîne à supprimer " " (max.100 caractères) :\n"); gets(CH2); /* Rechercher CH2 dans CH1 : */ /* L'expression P2-CH2 est utilisée pour déterminer l'indice */ /* de P2 dans CH2. On pourrait aussi résoudre le problème à */ /* l'aide d'un troisième pointeur P3 parcourant CH1. */ TROUVE=0; for (P1=CH1 ; *P1 && !TROUVE ; P1++) { for (P2=CH2 ; *P2 == *(P1+(P2-CH2)) ; P2++) ; if (!*P2) TROUVE = 1; } /* A la fin de la boucle, P1 est incrémenté, donc */ P1--; /* Si CH2 se trouve dans CH1, alors P1 indique la position */ /* de la première occurence de CH2 dans CH1 et P2 pointe à */ /* la fin de CH2. (P2-CH2) est alors la longueur de CH2. */ if (TROUVE) strcpy(P1, P1+(P2-CH2)); /* Affichage du résultat */ printf("Chaîne résultat : \"%s\" \n", CH1); return 0; }