0% ont trouvé ce document utile (0 vote)
65 vues6 pages

Exercices de programmation en C

Ce document présente une série d'exercices de programmation en C, conçus pour aider les étudiants à renforcer leurs compétences en programmation. Les exercices couvrent divers aspects du langage C, y compris des concepts de base, des manipulations de chaînes, et des opérations sur des entiers. Des références à des lectures supplémentaires sont également fournies pour approfondir la compréhension du langage.

Transféré par

ScribdTranslations
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
65 vues6 pages

Exercices de programmation en C

Ce document présente une série d'exercices de programmation en C, conçus pour aider les étudiants à renforcer leurs compétences en programmation. Les exercices couvrent divers aspects du langage C, y compris des concepts de base, des manipulations de chaînes, et des opérations sur des entiers. Des références à des lectures supplémentaires sont également fournies pour approfondir la compréhension du langage.

Transféré par

ScribdTranslations
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats DOCX, PDF, TXT ou lisez en ligne sur Scribd

Exercices de programmation en C

Dr Alun Moon

Janvier 2007

Abstrait

Instructions : Effectuez les exercices. La première section est un ensemble général de problèmes pour vous aider à vous souvenir
de ce que vous savez sur la programmation. Les sections suivantes détaillent certaines parties de C. Si vous êtes bloqué dans une
section, réessayez, puis passez à la section suivante et revenez plus tard.
Les lectures importantes incluent (McGrath 2006) une bonne introduction à C. (Kernighan & Ritchie 1988) est le livre sur la norme
C89 pour ANSI C. (Holmes 1995) est un très bon didacticiel Internet et une référence.

1 Exemples généraux
Il s’agit d’exercices généraux de complexité variable. Un bon moyen de rafraîchir la mémoire du C et de développer des compétences
en résolution de problèmes.

Exercice. 1.1 Écrivez et exécutez le programme « hello, world ! ». Expérimentez différents formats de sortie en insérant des nouvelles
lignes et des tabulations dans la chaîne de contrôle.

Exercice. 1.2 Écrivez un programme pour générer un entier au format décimal et un nombre à virgule flottante au format float.
Expérimentez la sortie d'un entier au format flottant et vice versa. Affiche un caractère au format décimal (imprime le code du
caractère, par exemple ascii). Résolvez tous les problèmes en utilisant une coercition ou un cast de type explicite.

Exercice. 1.3 Écrivez un programme pour déterminer, par essais et erreurs, la valeur minimale de 196/n + n où n est un entier.
N'utilisez pas de boucle, essayez différentes valeurs de n. Notez qu'en général 196/n + n sera une quantité flottante.

Exercice. 1.4 Écrivez un programme pour vérifier que le volume et l'aire de surface d'une sphère de rayon 0,1234567789e2 sont
respectivement d'environ 7881,948508 et 1915,313445. Le volume d'une sphère est égal à quatre tiers de Pi fois le rayon au cube et
l'aire est égale à quatre Pi fois le rayon au carré. Considérez que Pi est égal à 3,14159265.

Exercice. 1.5 Un nombre est spécial s’il est divisible (sans reste) par 15. Un nombre est grand s'il est supérieur à 999. Un nombre est
étrange s’il est divisible par 5 et 6 mais pas par 18. Un nombre fait peur s’il est grand ou étrange.
Écrivez un programme pour vérifier lesquels des nombres suivants, 450, 540, 600 et 675, sont spéciaux mais pas effrayants.
Déclarez quatre variables appelées spéciale, grande, étrange et effrayante et attribuez-leur des affectations appropriées au fur et
à mesure qu'un nombre est testé.

Exercice. 1.6 Écrivez un programme pour exprimer un nombre donné de secondes (qui peut être un littéral dans le programme) en
termes d'heures, de minutes et de secondes et affichez le résultat. Utilisez des variables distinctes pour des quantités distinctes. Par
exemple, pour représenter le nombre total de secondes qui peut être supérieur à 59 et la partie secondes de la sortie qui ne peut
jamais être supérieure à 59.

Exercice. 1.7 Écrivez un programme pour stocker et extraire indépendamment deux entiers courts de 16 bits (appelés car et cdr)
dans un entier de 32 bits (appelé cell). Tous les entiers sont positifs.

cellule

voiture cdr
Le stockage ou l’accès à un numéro ne doit pas affecter l’autre. Par exemple, si la cellule contient une valeur car de 2 et une
valeur cdr de 3, alors la valeur de la cellule est 131075 (hex 00020003). Si la valeur de la voiture est ensuite stockée dans la cellule,
la valeur de la cellule devient 65539 (hex 00010003).
Commencez par déclarer des entiers appropriés et initialisez-les. Écrivez des fonctions pour définir et extraire les valeurs de car
et cdr.
Écrivez une version du programme précédent en utilisant une structure avec les champs car et cdr.
Testez les deux avec divers exemples de voiture et de cdr.

1
Exercice. 1.8 Écrire des fonctions en utilisant des expressions conditionnelles,

1. abs, qui renvoie la valeur absolue d'un entier, par exemple 3 7→ 3 et -3 7→ 3

2. zeroCut, qui renvoie le maximum d'un entier et zéro par exemple 3 7→ 3 et -3 7→ 0

3. absDiff, qui renvoie la différence absolue de deux entiers

2 Chaînes et E/S
Exercice. 2.1 Considérez le programme

#inclure<st dio . h>


char word [ ] = « feu » ;
principal ()
{
mot [ 0 ] = ' h ' ;
printf (”%s\n” , mot ) ;
}

exécutez-le avec les substitutions suivantes ajoutées avant le printf,

• mot[1]='e' ;

• mot[3]='d';

• mot[4]='\n';

que se passe-t-il dans le dernier cas ?

Exercice. 2.2 Écrivez un programme pour écrire les arguments de chaîne dans main dans l'ordre inverse.

Exercice. 2.3 Un argument de main est soit une option, soit un mot. Une option commence par un trait d'union '-', la partie restante est
le nom de l'option.
Écrivez un programme pour examiner chaque argument et imprimer s'il s'agit d'une option ou d'un mot, ainsi que le nom de
l'option ou la valeur du mot. Un exemple de sortie est présenté ci-dessous.

option: version
mot : 1.5.a

Exercice. 2.4 scanf divise naturellement son entrée au niveau des espaces (voir la page de manuel). En utilisant ce fait, écrivez un
programme qui compte les mots lus à partir de l'entrée standard. Astuce : lisez la page de manuel de scanf, consultez la section
« VALEUR DE RETOUR » pour savoir comment terminer la boucle.

« Quelle boucle ? » – réfléchissez-y !

2
3 caractères et chaînes
Les ordinateurs représentent les caractères avec des chiffres, chaque chiffre représentant une lettre de l'alphabet. Le système le plus
courant est ASCII, dans lequel « A » est 65, « B » est 66, « C » est... Les lettres majuscules sont comprises entre 65 et 90, et les
lettres minuscules sont comprises entre 32 et 97, soit entre 122 et 128. En C, les individus peuvent être stockés dans un type de
données char. Les valeurs peuvent être écrites sous la forme de la lettre entre guillemets simples « A ». Alternativement, le nombre
peut être écrit, auquel cas la valeur doit être convertie en un type char.
Les affirmations suivantes sont équivalentes

c = 'A' ; c = ( char ) 65 ;

l'arithmétique peut être effectuée avec des caractères


c = 'A'+5;
b = 'Z'-'A';

En plus des caractères imprimables, il existe des codes ascii pour les caractères « spéciaux », dont certains sont 0 '\n'
caractère nul (terminateur de chaîne)
7 '\un'cloche (bip)
9 '\t'onglet horizontal
13 '\r'retour

3.1 Personnages
Exercice. 3.1 Le programme suivant imprime l'alphabet de A à Z. Copiez, compilez et exécutez le programme.
#include < st di o . h> principal ()
{
char i ;
pour ( i='A' ; i<='Z ' ; ++i ) putchar( i ) ;

Modifiez le programme pour imprimer uniquement les 10 premières lettres de l'alphabet.

Exercice. 3.2 Copiez, compilez et exécutez le programme suivant. Il prend ses entrées de la même manière que cat (sauf qu'il ne lit
pas les fichiers). Si vous lisez à partir du clavier, il faut au moins un retour chariot et un contrôle-D pour terminer la saisie. Cela est dû
à la manière dont le noyau met en mémoire tampon les entrées, et non à la manière dont le programme lit les données.
#inclure<st dio . h>
principal ()
{
caractère c ;
c = getchar() ;
tandis que ( c != EOF ) {
si ( 'A ' <= c && c <= ' Z ' )

c = c + 32 ;
putchar(c); c = getchar();

Que fait le programme?

Exercice. 3.3 Comparez le dernier programme avec le suivant

#inclure<st dio . h>


#inclure<ctype . h>
principal ()
{
caractère c ;
tandis que ( ( c=get char ( ) ) != EOF) {
si ( est supérieur (c))
c = touper ( c) ;
putchar(c);

3
}
}

3.2 Cordes
Les chaînes en C sont stockées sous la forme d'une séquence de codes ASCII (tableau de caractères) terminée par un caractère
nul \0. La chaîne « hello-world » comporte 11 caractères visibles, mais nécessite 12 emplacements de stockage pour les 11
caractères et le caractère nul.

Exercice. 3.4 Copiez et essayez ce programme

#inclure<st dio . h>


principal ()
{
caractère a [ 2 7 ] ;
int i ;
pour ( i = 65 ; i < 91 ; ++i ) a[i-'A'] = i ;

a[26] = '\0';
imprimerf (a);
}

Supprimez maintenant la ligne a [26] = '\0' ; , quel est l'effet ?

Le programme essaiera toujours d'imprimer les lettres « A »... « Z ». Avec le zéro, la sortie s'arrête. Sans le zéro, le programme
continue, en imprimant tout ce qui se trouve en mémoire – des caractères aléatoires, jusqu’à ce qu’un octet zéro soit atteint.
Dans un programme C, une valeur de chaîne peut être écrite en utilisant des guillemets doubles ", le compilateur allouera la
mémoire et ajoutera l'octet zéro. Les fonctions d'entrée fgets et le champ %s dans scanf ajoutent également l'octet zéro. Il existe un
certain nombre de fonctions permettant de fournir des informations sur des chaînes ou de les manipuler. Pour les utiliser, le fichier
d'en-tête string.h est nécessaire.

• strlen(char s) renvoie la longueur de la chaîne (sans inclure l'octet zéro).

• strcat(char s,char cs) copiera les caractères de la deuxième chaîne à la fin de la première. Si la première chaîne n'a pas
assez d'espace, strcat continuera à écraser tout ce qui se trouve en mémoire.

Exercice. 3.5 Que fait ce qui suit


#inclure<st dio . h>

principal ()
{
énumération { BUFSIZE = 1 00 } ;
char buf[BUFSIZE] ;
int i ;
fgets ( buf , BUFSIZE, stdin ) ;
buf [ strlen ( buf)-1]= ' \0 ' ; /∗ supprimer le for ( i = 0 ; buf [ i caractère de nouvelle ligne ∗/
] ; ++i )
si ( est inférieur (buf[ i ]))
printf (”%c1_____1 est 1_______1 inférieur 1 buf[i]);
____________________1case\n” , sinon si ( isupper
(buf [ i ]printf
)) (”%c1—1 est 1—1 majuscule 1—1case\ buf[i]);
n” , else
printf (”'%c '1_______1 est 1 1ni \n” , buf[i]);

}
comment le programme peut-il être amélioré (pour plus de clarté) en incluant plus d'accolades et

Exercice. 3.6 Le programme suivant lira les mots de l'entrée standard et les concatènera ensemble. Il s'arrête lorsque la fin du fichier
(contrôle-D) est atteinte ou que le tampon est plein. La fonction scanf renvoie une valeur EOF si elle tente de lire au-delà de la fin d'un
fichier.
#inclure<st dio . h>
#include < stri ng . h>

4
principal ()
{
énumération { BUFSIZE = 1000 , INPUTSIZE = 100 };
const char SEP [ ] = ” Je__________JE";
caractère s [ BUFSIZE] ;
char cs [ TAILLE D'ENTRÉE] ;
∗s = '\0';
tandis que ( scanf(”%s” , cs)!=EOF && strlen (s) < (BUFSIZE - INPUTSIZE)) { strcat ( s , SEP ) ;
strcat(s , cs);
}
printf (”%s” ,s ) ;
}

• expérimenter la modification de la chaîne SEP. Essayez ", " ou "\t".

Exercice. 3.7 3. Écrivez un programme qui lit le prénom et le nom d'un utilisateur, sur des lignes séparées (astuce : utilisez fgets, il
s'arrête à la fin d'une ligne, scanf("%s") s'arrête à un espace). La sortie correspond aux deux noms sous forme d'une seule chaîne,
par exemple « smith, john » en conservant la casse de l'entrée.

Exercice. 3.8 Écrivez un programme similaire qui génère le nom sous la forme « SMITH, John », cette fois en utilisant la casse dans
la chaîne d'exemple.

5
Références
Eckel, B. (2000). Penser en C++, Volume 1 : Introduction au C++ standard (2e édition), Prentice Hall.
[Link]

Hanly, JR, Koffman, EB et Horvath, JC (1997). Conception de programme C pour les ingénieurs, Addison-Wesley. classmark
518.567.5 HAN.

Holmes, S. (1995). Programmation en C, tutoriel Internet, Centre informatique de l'Université de Strathclyde.


[Link]

Hunt, A. et Thomas, D. (1999). Le programmeur pragmatique, Addison-Wesley.

Kernighan, BW et Ritchie, D. (1988). Langage de programmation C (2e édition), Prentice Hall PTR.

Knuth, DE (1984). TeXbook, Addison-Wesley Professionnel.

Knuth, DE (1999). L'art de la programmation informatique, volumes 1 à 3, coffret, Addison-Wesley Professional.

McGrath, M. (2006). Programmation en C, en étapes faciles, étape par étape.


[Link]

Pike, R. (sans date). Notes sur la programmation en c.


[Link]

Pozo, R. et Remington, K. (sd). Programmation C++ pour scientifiques, NIST.


[Link]

Raymond, ES (1999). La cathédrale et le bazar : réflexions sur Linux et l'Open Source par un révolutionnaire accidentel (O'Reilly
Linux), O'Reilly.

Raymond, ES (2004). L'art de la programmation Unix, série informatique professionnelle, Addison-Wesley.


[Link]

van der Linden, P. (1994). Programmation experte en C : les secrets profonds du C, Prentice Hall.

Vous aimerez peut-être aussi