Travaux dirigés 1

  • Bases de la programmation en C
  • Parcours d'un tableau
  • Sous-programmes


Rappels de cours

Langage C

Equivalent Pascal

Déclarations / affectations

  • des constantes
#define NOMBRE 1
#define CHAINE "ALPHA"
CONST NOMBRE = 1;
CONST CHAINE = 'ALPHA';

  • des variables
int i,j;
int k,l=0;

char c;
float r;
VAR i,j:INTEGER;
VAR k,l:INTEGER;
...l:=0;
VAR c:CHAR;
VAR r:REAL;

  • des tableaux
int tab1[50];
int tab2[50][10];
Exemple : ...tab2[i][j]=6;
VAR tab1:ARRAY [0..49] OF INTEGER;
VAR tab2:ARRAY [0..49,0..9] OF INTEGER;
Exemple : ...tab2[i,j]:=6;

Comparateurs / Opérateurs logiques / Opérateurs arithmétiques

==, !=, >, >=, <, <=
&&, ||, !
+, -, *, /, %
=, <>, >, >=, <, <=
AND, OR, NOT
+, -, *, / (ou DIV), MOD

Instructions

= (affectation)
c=getchar();
printf("Message %d : \n",j);
:=
read(c);
writeln('Message ',j,' : ');

Structures de contrôle

{
}
/* Commentaires */
BEGIN
END;
(* Commentaires *)
if (condition1) action1;
else action2;
IF condition1 THEN action1
ELSE action2;
while ((! condition2) || (condition3)) action;

for (i=1;i<=10;i++) action;
WHILE (NOT condition2) OR (condition3) DO action;

FOR i:=1 TO 10 DO action;

Exemple de programme


#include "stdio.h"
#define CHAINE "ALPHA"
int a;



int paire(int b)

{
int c;
if (b % 2 == 0)c=1;
else c=0;
return(c);
}

main()
{
int d=3;
a=d+1;
a+=5;
a=paire(a);
}
PROGRAM prgm;
USES CRT;
CONST CHAINE = 'ALPHA';
VAR a:INTEGER;
VAR d:INTEGER;
(* Pas de variable locale au programme principal en Pascal *)
FUNCTION paire(b:INTEGER):INTEGER;
VAR c:INTEGER;
BEGIN

IF (b MOD 2 = 0) THEN c:=1
ELSE c:=0;
paire:=c
END;


BEGIN
d:=3;
a:=d+1;
a:=a+5;
a:=paire(a)
END.

Quelques remarques

Les différences importantes entre C et Pascal

Syntaxe de la boucle "For"

L'instruction :

for (expr1;expr2;expr3) action;

est équivalente à

expr1;
while(expr2)
{ action; expr3;
}

Incrémentation d'un compteur

Les quatre instructions suivantes produisent le même résultat après leur exécution :

Exemples :
j=1;
a=j++; /* a vaut 1 et j vaut 2 */


Au contraire :
j=1;
a=++j; /* a vaut 2 et j vaut 2 */

Structure conditionnelle

Lecture d'un caractère

Le sous-programme getchar() renvoie le caractère le plus ancien se trouvant dans le "buffer d'entrée". Lors de la lecture d'un texte caractère par caractère, ce buffer n'est rempli qu'au moment d'un retour-chariot.
L'instruction fflush(stdin); permet de vider le buffer de l'entrée standard.

Affichage

Le sous-programme printf permet d'afficher à l'écran du texte et des valeurs de variables. La syntaxe de l'appel à ce sous-programme est :
printf("chaîne de caractères",variable1,variable2,variable3,...);
Cet appel est interprété de la manière suivante :
- La chaîne de caractères est affichée jusqu'au premier caractère % qui peut y figurer.
- Les caractères % et le (ou les) caractères qui suivent sont des spécificateurs de formats. Ils sont remplacés par la valeur des variables situées après la chaîne de caractères.

Exemple :
i = 5;
c = 'a';
printf("nombre : %d - caractère : %c\n",i,c);


provoque à l'écran l'affichage suivant :

nombre : 5 - caractère : a

Remarque : le caractère \n équivaut au caractère "retour-chariot". De même, le caractère %\t indique la présence d'une tabulation.

La fonction printf envoie la chaîne de caractères interprétée sur le "buffer de sortie". Pour forcer l'affichage du contenu de ce buffer, on utilise fflush(stdout);


Exemple d'un programme C

#include "stdio.h"
#define NOMBRE 5

int lire()
{

int s=0;
char c;
fflush(stdin);
c=getchar();
while(c != '#')
{

if ((c == 'a') ||
(c == 'e') ||
(c == 'i') ||
(c == 'o') ||
(c == 'u') ||
(c == 'y')) s++;
c=getchar();

}
return(s);

}

main()
{

int a;
printf("Entrez votre texte (non-accentué, terminé par un caractère #) :\n");
fflush(stdout);
a = lire();
if (a != 0) printf("Il y avait %d voyelles.\n",a);
fflush(stdout);

}


Exercice 1

Ecrire un programme C qui calcule le nombre de consonnes ou de voyelles (au choix de l'utilisateur) dans un texte non-accentué, terminé par un caractère # et tapé par un utilisateur.
On utilisera pour cela un sous-programme qui testera si une lettre entrée au clavier est une consonne ou une voyelle.
On suppose que le texte n'est composé que de minuscules non-accentuées, que les mots ne sont séparés que par des espaces, qu'il n'y a aucune ponctuation et qu'il n'y a pas de "retour-chariot".


Exercice 2

Ecrire un programme C qui lit un texte contenant au plus 1000 caractères, se terminant par un caractère $ et qui le réaffiche.


Exercice 3

Réaliser un programme en langage C permettant de rechercher dans une suite de caractères donnée, le nombre de fois qu'apparaît une séquence particulière.
La suite de caractères à tester sera entrée la première, dans un tableau de taille égale à 1000.
Le texte de l'utilisateur se termine par le caractère $.
Le texte de la séquence à rechercher se termine par un caractère $ et contient au plus 10 caractères.
On suppose que ni le texte, ni la séquence ne sont vides.


Exercice 4 (subsidiaire)

Déterminer si une phrase entrée au clavier, d'au plus 100 caractères, terminée par un "retour-chariot", est un palindrome. On suppose que le texte n'est composé que de minuscules non-accentuées, que les mots ne sont séparés que par des espaces, et qu'il n'y a aucune ponctuation.
Un palindrome est un mot ou une phrase qui n'est pas modifié lorsqu'on inverse l'ordre des lettres qui le compose.

Exemples :


Ces pages ont été adaptées à partir de celles réalisées par J.D. Durou et Ph. Joly avec leur aimable autorisation.