Le type entier, boucles, comptages

De Wicri Manuel
(Redirigé depuis Le type entier, comptages)

Ce module montre comment utiliser le type entier dans des programmes C et lex.

logo travaux ce module est provisoirement écrit comme une suite de notes pour des lecteurs ayant déjà une pratique de programmation

Le type entier

Une variable de type int (integer) occupe généralement un mot machine.

Elle est obligatoirement déclarée en tête d'un bloc (portée locale) ou dans le corps d'un fichier source (portée globale). Exemple :

int monCompteur;

Une constante entière peut être définie par

  • un nombre décimal, exemple : 123
  • un nombre en octal (si son premier chiffre est un zéro), exemple : 044
  • un nombre en hexadécimal si'il est préfixé par 0x, exemple : 0xA44

On peut affecter une valeur à une variable par une affectation notée par l'opérateur =. Les opérateurs classiques sont utilisables ; exemple :

 monCompteur = 5 * 2 ;
 monCompteur = monCompteur + 2 ;

Il existe un opérateur d'incrémentation noté ++. Par exemple les 2 instructions suivantes donnent le même résultat :

 monCompteur++ ;
 monCompteur = monCompteur + 1 ;

Pour imprimer un nombre entier, on peut utiliser la fonction printf avec une spécification %d. Exemple :

 printf ("résultat : %d\n", monCompteur);

Utilisation du type entier pour contrôler une boucle while

Voici un exemple de programme imprimant les 10 premiers nombres entiers.

Pour créer un fichier contenant ce programme.

cat <<... > monExo.c
#include <stdio.h> 

int main() { 
        int i;
        i=0;
        while (i < 10) {
           printf ("%d\n", i); 
           i++;
           }
        return 0; 
}
...

Compilation et exécution :

gcc monExo.c -ll -o monExo

./monExo

Exercices :

  • modifier ce programme pour imprimer la table de multiplication par 4,
  • avec des boucles imbriquées, écrire un tableau de 10 lignes contenant les 10 chiffres décimaux.

Utilisation du type entier pour des comptages dans des filtres écrits en lex

Exemple comptage des dates dans un texte

Dans le module précédent, nous avons vu comment repérer des dates à 4 chiffres dans un texte :

rappel

%%
[1-2][0-9][0-9][0-9]   {ECHO; printf("\n");}
.                      ;
\n                     ;
%%
int main() {
  yylex();
  return 0;
}

compter les dates

Ce programme peut être adapté à un simple comptage de dates. Pour cela, nous allons utiliser une variable pour compter le nombre de dates.

Pour compter les dates il suffira de remplacer l'instruction d'impression

  ...
[1-2][0-9][0-9][0-9]   {ECHO; printf("\n");}
  ...

par :

  ...
[1-2][0-9][0-9][0-9]   compteurDates++ ;
  ...

Déclaration globale en lex

Pour déclarer le compteur, le générateur lex utilise une section spéciale cadrée par les notations %{ et %} en début de ligne.

Pour des raisons internes les déclarations de variables ne doivent pas commencer en première ligne.

le début de notre programme lex sera le suivant :

%{
  int compteurDates;
%}

Programme complet

cat <<... >monTP.lex

%{
  int compteurDates;
%}
%%
[1-2][0-9][0-9][0-9]   compteurDates++ ;
.                      ;
\n                     ;
%%
int main() {
  compteurDates=0 ;
  yylex();
  printf ("Il y a %d dates dans ce fichier\n", compteurDates);
  return 0;
}
...

lex monTP.lex

gcc lex.yy.c -ll -o monTP

./monTP <<...
1789 révolution
1515 Marignan
...

Exercices

Sans modification :

En adaptant les règles précédentes :

  • sachant qu'une expression comme A[a-z][a-z][a-z] sélectionne les mots de 4 lettres commenceant par un A majuscule.
  • modifier ce programme pour qu'il compte les dates supérieures à 1800. (solution en page discussion).

Avec plusieurs compteurs

  • sachant que les règles sont évaluées
    • en retenant la chaine la plus longue,
    • si égalité par la première rencontrée,
  • le modifier pour qu'il imprime