Exercice 1 :
Ecrire
un programme qui lit deux chaînes de caractères CH1 et CH2 au clavier et
supprime la première occurrence de CH2 dans CH1. Utiliser uniquement des
pointeurs, une variable logique TROUVE et la fonction strcpy.
Solution :
#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;
}
Exercice 2 :
Ecrire
un programme qui lit une chaîne de caractères CH au clavier et qui compte les
occurrences des lettres de l'alphabet en ne distinguant pas les majuscules et
les minuscules. Utiliser un tableau ABC de dimension 26 pour mémoriser le
résultat et un pointeur PCH pour parcourir la chaîne CH et un pointeur PABC
pour parcourir ABC. Afficher seulement le nombre des lettres qui apparaissent
au mois une fois dans le texte.
Exemple:
Entrez un ligne de texte (max. 100 caractères)
:
Jeanne
La chaîne "Jeanne" contient :
1 fois
la lettre 'A'
2 fois
la lettre 'E'
1 fois
la lettre 'J'
3 fois
la lettre 'N'
Solution :
#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 3:
Ecrire
un programme qui lit 5 mots d'une longueur maximale de 50 caractères et les
mémorise dans un tableau de chaînes de caractères TABCH. Inverser l'ordre des
caractères à l'intérieur des 5 mots à l'aide de deux pointeurs P1 et P2.
Afficher les mots.
Solution :
#include <stdio.h>
main()
{
/*
Déclarations */
char
TABCH[5][51];/* tableau de chaînes de caractères */
char
AIDE; /* pour la permutation des
caractères */
char
*P1, *P2; /* pointeurs d'aide */
int
I; /* indice courant */
/*
TABCH+I est l'adresse de la I-ième chaîne du tableau */
/*
Il vaut mieux convertir TABCH+I en pointeur sur char */
/*
Saisie des données */
printf("Entrez 5 mots :\n");
for (I=0; I<5; I++)
{
printf("Mot %d (max.50 caractères) :
", I);
gets((char *)(TABCH+I));
}
/*
Inverser l'ordre des caractères à l'intérieur des mots */
for (I=0; I<5; I++)
{
P1 = P2 = (char *)(TABCH+I);
/* Placer P2 à la fin de
la chaîne */
while (*P2)
P2++;
P2--; /* sinon '\0' est placé au début de la chaîne */
while (P1<P2)
{
AIDE = *P1;
*P1 = *P2;
*P2 = AIDE;
P1++;
P2--;
}
}
/*
Affichage des mots inversés */
for (I=0; I<5; I++)
puts((char *)(TABCH+I));
return 0;
}
Aucun commentaire:
Enregistrer un commentaire