IUT R&T - 1ère année - Informatique
Programmation et algorithmique 1


TP n°3

A la fin du TP, envoyer sur l'ENT un compte-rendu contenant les solutions des exercices marqués d'une étoile.
(compte-rendu au format texte, sur le modèle de modeleTP1.txt)

EXERCICE 1*

1.1. Ecrire un algorithme précisé résolvant le problème suivant :
Procédure Ligner
Donnée : un caractère C de code ASCII supérieur à 32, un entier naturel p.
Résultat : affichage de p fois le caractère C.
Exemple. Ligner('x',5) affiche xxxxx.

1.2. Ecrire un algorithme précisé résolvant le problème suivant :
Procédure Border
Donnée : un caractère C de code ASCII supérieur à 32, un entier naturel q.
Résultat : affichage de deux caractères C séparés par q espaces.

1.3. Ecrire un programme C utilisant ces deux procédures dans un programme affichant un carré de dimension n×n caractères. L'intérieur du carré est composé d'espaces et l'extérieur de caractères C, n et C étant donnés par l'utilisateur.
Exemple. Carré de taille 5×5 composé de 'x' :
xxxxx
x   x
x   x
x   x
xxxxx


1.4. Compléter ce programme pour afficher successivement différents carrés. Choisir ce qui arrêtera le programme.

EXERCICE 2*
Quand on demande à un programme en C de saisir un entier naturel, la fonction scanf utilise le formatage "%u" pour transformer en entier naturel la chaine de caractères saisie (composées de caractères compris entre '0' et '9'). Nous nous proposons ici de réaliser une fonction analogue pour le cas où la chaine saisie est une représentation binaire du nombre (composés uniquement de caractères '0' et '1').
Voici un algorithme précisé qui réalise cette transformation :
Fonction ScanBinaire
Entrée : une chaine S composée de n caractères '0' et '1'.
Sortie : la valeur décimal D de l'entier naturel correspondant à S.
Variable d'usage : un entier i.
D←0;
Pour i de 0 à n−1 faire
D←2*D;
Si S[i]='1' alors D←D+1;
Retourner D.

2.1. Réaliser une trace de cet algorithme (c'est-à-dire faire le tourner) pour S="1011", en complétant le tableau suivant :
initialement : D=0.
i= ?  | i<n ? | modifications de D :
...   | ...   | ...


2.2. Traduire en C cette fonction et l'intégrer dans un programme qui donne la valeur décimale d'une chaine ch saisies. Le prototype de la fonction sera unsigned int ScanBinaire(char S[]); et la variable ch du programme principal sera déclarée par char ch[10]={0};
N.B. On pourra utiliser la fonction strlen de la bibliothèque string.h pour avoir la taille n d'une chaine.

2.3. Compléter ce programme afin qu'il affiche les valeurs de chaines successives saisies. Ce programme s'arrêtera quand une chaine de caractère non conforme sera saisie.

2.4. Tester ce programme.

EXERCICE 3*
On donne l'algorithme précisé suivant :
Fonction Opère
Entrée : deux entiers naturels n et p et un caractère c de l'ensemble {'+','−','*','/'}.
Sortie : le résultat de l'opération correspondante : n+p, n−p, n*p, ou n/p (division entière).
Selon c faire
Cas '+' : Retourner n+p;
Cas '−" : Si n>p
alors Retourner n−p
sinon Retourner 0;
Cas '*' : Retourner n*p;
Cas '/' : Retourner n div p.

3.1. Traduire en C cette fonction et l'intégrer dans un programme qui réalise une sorte de calculette en calculant les opérations demandées par l'utilisateur, jusqu'à rencontrer une impossibilité de calcul.
Le prototype de la fonction sera unsigned int Opere(unsigned int n, char c, unsigned int p);
La saisie se fera dans l'ordre n, puis c, puis p.
L'affichage du résultat se fera sous la forme n+p=résultat

3.2. Tester ce programme sur des exemples bien choisi. Ce programme est-il robuste ? convivial ? ergonomique ?



EXERCICE 4 (pour aller plus loin)

Reprendre l'exercice 3 en :
– utilisant les possibilités de décalage de bit du langage C pour éviter des opérations de multiplication, et
– saisissant les caractères entrés un par un avec la fonction getchar.
N.B. La touche ENTREE donne le caractère '\n'.