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


TP n°5

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, comme pour le TP 1)

EXERCICE 1*

On veut calculer le carré d'un entier naturel n en utilisant le "théorème des impairs" : le carré de n est la somme des n premiers nombres impairs. Par exemple, 32=1+3+5=9, 82=1+3+5+7+9+11+13+15=64.

1.1. Ecrire un algorithme Carré qui retourne par cette méthode le carré d'un entier naturel n, en n'utilisant ni multiplication ni division.

1.2. Ecrire en C la fonction correspondante, ainsi que le programme principal qui utilise cette fonction pour afficher les carrés de différents entiers naturels saisis au clavier.

1.3. Tester ce programme, notamment avec des saisies contenant des caractères inattendus. (essayer par exemple de saisir : 2 3e2 4.5 q 6+7)

1.4. Prendre en compte ces tests pour rendre le programme plus robuste, avec en particulier la saisie possible d'un nombre réel. (un programme est robuste s'il peut continuer de fonctionner dans des situations inattendues)

1.5. Dans quelle mesure pourrait-on améliorer la fonction de saisie scanf pour que les caractères inattendus soient tout de même pris en compte et signalés comme tels au programmeur ?

EXERCICE 2*

2.1. Ecrire un algorithme Compter qui compte le nombre d'occurrences d'un caractère c dans une chaine non vide s.

2.2. Ecrire un algorithme Remplacer qui remplace, dans une chaine s, toutes les occurrences d'un caractère c par un caractère d.

2.3. Ecrire en C un programme qui implémente ces deux fonctions et utilise un menu principal pour donner à l'utilisateur le choix de la fonction à utiliser pour des caractères et chaines et caractères à saisir ensuite.
Les prototypes des fonctions seront :
 int Compter(char s[],char c);
 void Remplacer(char (*s)[],char c,char d);
Pour une chaine déclarée par  char ch[10]={0},  un appel à la fonction de remplacement aura la forme :  Remplacer(&ch,c,d).

2.4. Tester le programme avec des chaines de longueur variables.
N.B. Pourquoi le caractère c à détecter ne peut-il être ni un espace ni '\n' si la chaine est saisie au clavier ?

EXERCICE 3

Ecrire en C un programme qui :
– déclare une constante entière taillemax=10,
– déclare un tableau T de 10 entiers initialisé avec des 0,
– demande à l'utilisateur de saisir une suite d'entiers non nuls,
– place, à mesure de leur saisie, ces nombres dans T,
– termine la saisie quand le tableau est complet ou quand l'utilisateur saisit la valeur 0,
– affiche ensuite T et le nombre de valeurs effectivement placées dans T, sous la forme : T=[n1, ..., nk] ; taille(T)=k
N.B. Ne pas oublier la différence en C entre la taille réservée pour un tableau (taillemax) et le nombre (N) de valeurs effectivement présentes dans le début du tableau (N≤taillemax).


EXERCICE 4*

4.1. Ecrire un algorithme Fusion qui fusionne deux tableaux d'entiers naturels non nuls triés T et U, de tailles respectives p et q, pour former un tableau trié W regroupant les valeurs de ces deux tableaux, et de taille n=p+q.
Exemple. T=[1, 12, 45] et U=[4, 5, 16, 24], avec p=3 et q=4, donne T+U=[1, 4, 5, 12, 16, 24, 45] avec n=7.

4.2. Traduire cette algorithme en C et écrire un programme permettant de la tester. Les trois tableaux seront définis comme des variables globales. D'autres fonctions pourront être ajoutées en vue du test : remplissage aléatoire d'un tableau, affichage d'un tableau.

EXERCICE 5 (pour aller plus loin)

5.1. Donner un algorithme EstTrié qui vérifie si un tableau est trié par ordre croissant de valeurs.

5.2. Traduire cet algorithme en C pour un tableau d'entiers et le tester.