Le type entier, boucles, comptages : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Déclaration globale en lex)
imported>Asma Lahssini
(Exercices)
 
(12 révisions intermédiaires par 2 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
 
  |module=Le type entier, boucles, comptages
 
  |module=Le type entier, boucles, comptages
 
  |précédent=Prise de contact avec lex
 
  |précédent=Prise de contact avec lex
  |suivant=
+
  |suivant=Prise de contact avec XML
 
}}
 
}}
 
Ce module montre comment utiliser le type entier dans des programmes C et lex.
 
Ce module montre comment utiliser le type entier dans des programmes C et lex.
Ligne 75 : Ligne 75 :
 
<source lang="c">
 
<source lang="c">
 
%%
 
%%
[1-2][0-9][0-9][0-9]  {ECHO; printf("\n");
+
[1-2][0-9][0-9][0-9]  {ECHO; printf("\n");}
 
.                      ;
 
.                      ;
 
\n                    ;
 
\n                    ;
Ligne 84 : Ligne 84 :
 
}
 
}
 
</source>
 
</source>
 +
 
====compter les dates====
 
====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.
 
Ce programme peut être adapté à un simple comptage de dates. Pour cela, nous allons utiliser une variable pour compter le nombre de dates.
Ligne 90 : Ligne 91 :
 
<source lang="c">
 
<source lang="c">
 
   ...
 
   ...
[1-2][0-9][0-9][0-9]  {ECHO; printf("\n");
+
[1-2][0-9][0-9][0-9]  {ECHO; printf("\n");}
 
   ...
 
   ...
 
</source>
 
</source>
Ligne 99 : Ligne 100 :
 
   ...
 
   ...
 
</source>
 
</source>
 +
 
====Déclaration globale en lex====
 
====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 <code>%{</code> et <code>%}</code> en début de ligne.
 
Pour déclarer le compteur, le générateur lex utilise une section spéciale cadrée par les notations <code>%{</code> et <code>%}</code> en début de ligne.
Ligne 113 : Ligne 115 :
  
 
====Programme complet====
 
====Programme complet====
 +
 +
 +
<source lang="c">
 +
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
 +
...
 +
 +
 +
</source>
 +
 +
===Exercices===
 +
<span id="exercice 1">Sans modification :</span>
 +
* exécuter ce programme avec la page [[wicri-sante.fr:La grippe ou influenza (1908) André/Historique]].
 +
 +
<span id="exercice 2>En adaptant les règles précédentes :</span>
 +
* sachant qu'une expression comme <code>A[a-z][a-z][a-z]</code> sélectionne les mots de 4 lettres commenceant par un A majuscule.
 +
* modifier ce programme pour qu'il compte les dates supérieures à 1800. ([[Discussion:Le type entier, boucles, comptages#Compter 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
 +
**le nombre de dates supérieures à 1800 ,
 +
**<span id="exercice 3> le nombre de dates inférieures </span>, ([[Discussion:Le type entier, boucles, comptages#Compter les dates supérieures à 1800|solution en page discussion]]).
 +
 +
**<span id="exercice 4> le nombre total de dates</span> ([[Discussion:Le type entier, boucles, comptages#Compter les dates supérieures à 1800|solution en page discussion]]).

Version actuelle datée du 22 juin 2020 à 16:51

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