Voici quelques exercices à résoudre en langage C...
 
Rappel: la ligne de compilation recommandée est la suivante.
$ gcc -g -Og -Wall -Wextra -o toto toto.c

0   Quelques éléments de syntaxe

Déclarations de variables

Comme en Java, les variables sont déclarées avec une expression de la forme : type nom_de_variable;

Les types simples autorisés sont :

  • types entiers : char, int, short, long, ...
  • types entiers non signés : unsigned char, unsigned (ou unsigned int), unsigned long, ...
  • types réels : float, double, ...

Attention : il n'y a pas de type string

Exemple :

int un_entier;
float un_reel;

un_entier = 42;
un_reel = 3.1416;

Écriture de messages

L'écriture de messages sur la sortie standard se fait avec la fonction printf().

Exemples :

printf("Un message simple. Notez le '\\n' pour le retour à la ligne\n");

printf("Valeur d'un entier : %d (c''est beau, non?)\n", un_entier);
printf("Valeur d'un réel : %f\n", un_reel);
printf("On peut en mettre plusieurs : %d + %f\n", un_entier, un_reel);

Lecture de variables

La lecture de variable sur l'entrée standard se fait avec la fonction scanf().

Exemples :

scanf("%d", &un_entier); // notez la présence de l'opérateur &
scanf("%f", &un_reel);

Note: pour être rigoureux, il faut vérifier que la lecture demandée a pu se faire correctement. Pour cela, on peut vérifier la valeur retournée par scanf(). En effet, cette valeur correspond au nombre de valeurs correctement lues et affectées aux variables.

Exemple :

if (scanf("%d", &un_entier) != 1) {
    printf("Erreur de lecture\n");
    exit(0); // termine le programme. Nécessite un #include <stdlib.h>
}
// ... la lecture s'est faite correctement, on peut utiliser la valeur de un_entier

 Sur certains systèmes (Ubuntu par exemple), le compilateur émet un warning lorsque la vérification n'est pas faite.

Structures de contrôle

Les structures de contrôle (if, switch..case, for, while, ...) fonctionnent de manière similaire au langage Java déjà connu.

Exemple :

for (int i = 10; i > 0; i--) {
    printf("il reste %d secondes...\n", i);
    sleep(1);
}
printf("BOUM!\n");

 

1   Heures - minutes - secondes

Étant données deux durées en secondes, les convertir en heures - minutes - secondes puis les additionner.

2   Années bissextiles

Déterminer si une année est bissextile.

  • une année est bissextile si elle est divisible par 4 et pas par 100,
  • sauf les années divisibles par 400 qui sont bissextiles

3   Dessiner un sapin

Dessiner un sapin de hauteur h. Exemples (h = 4)

  • sapin plein:
           *
          ***
         *****
        *******
    
  • sapin vide:
           *
          * *
         *   *
        *******
    
  • sapin couché:
           *
          **
         ***
        ****
         ***
          **
           *
    

4   Tables de multiplication

Écrire une fonction affichant la table de multiplication d'un entier sous le format (exemple pour 3):

3   6   9   12   15
18   21   24   27   30

puis une autre affichant cette fois-ci la table dans l'ordre:

3   9   15   21   27
6   12   18   24   30


Écrire un programme C affichant les 10 premières tables de multiplication. Le format d'affichage est demandé à l'utilisateur.

Remarque: si une fonction ne retourne rien, son type de retour est void.

5   Deviner un nombre

Écrire un programme qui réalise le petit jeu suivant. Tout d'abord, l'ordinateur choisit un entier x entre 1 et 100. L'utilisateur essaie ensuite de le deviner. Il entre alors successivement des entiers, et à chaque coup l'ordinateur lui indique si l'entier est supérieur à x, inférieur à x, ou égal à x auquel cas la partie s'arrête et le nombre de coups est affiché.

Modifier ensuite le programme afin que l'utilisateur puisse, s'il le souhaite, recommencer une partie. En quittant le programme, le meilleur score s'affiche.

Voici une fonction retournant un entier entre min et max:

#include <stdlib.h>
#include <time.h>
  
int choisir_nombre(int min, int max)
{
    static int seeded = 0;
    if (!seeded) {
        srand(time(NULL));
        seeded = 1;
    }
    return min + rand() % (1 + max - min);
}

6   Mise en majuscule

Écrire un programme qui lit un texte saisi au clavier, le met en majuscule et écrit le résultat à l'écran. On pourra utiliser la fonction suivante qui prend un caractère en argument, le convertit en majuscule (si besoin) et retourne le résultat:

#include <ctype.h>
int toupper(int c);
 

On pourra tester ce programme

  • soit en tapant un texte au clavier;
  • soit en lui donnant le contenu d'un fichier par cat pipo.txt | ./toto ou bien ./toto < pipo.txt.