Licence Sciences et technologies Informatique/Mathématiques
Transcription
Licence Sciences et technologies Informatique/Mathématiques
Licence Sciences et technologies Informatique/Mathématiques/Mathématiques-Informatique Algorithmes et Programmation TD numéro 3 :itérations Université de Provence Année 2006-2007 Exercice 1 (itération simple) Ecrire un programme C qui demande de rentrer un nombre entier nb et calcule la somme des carrés des entiers entre 1 à nb. Ecrire une version avec while et une avec for. Exercice 2 Ecrire le programme du jeu de devinette correspondant au cas général (l’humain a droit à plusieurs essais). Rappel : la machine choisit au hasard un nombre entre 1 et N, et il s’agit de deviner ce nombre. L’humain propose un nombre et la machine répond gagne si celui-ci est le même que celui qu’elle a choisi. Sinon, elle répond trop grand ou trop petit et on recommence tant que le nombre n’est pas trouvé. 1. Ecrire le programme C traduisant l’algorithme du TD 1. 2. Modifier le programme de manière à ce que l’utilisateur n’ait pas droit à plus de ⌊log2 (nb)⌋ + 1 essais ( ⌊x⌋ est la partie entière de x). Il est inutile de connaitre comment calculer la fonction log en C pour répondre à cette question. Exercice 3 Ecrire un programme qui demande à lire des caractères rentrés par l’utilisateur sur stdin et – si le caractère lu est ’#’ alors le programme affiche “termine” et s’arrête, – si le caractère lu est un chiffre alors on affiche la valeur (par exemple on affiche l’entier 9 si on lit ’9’, – si le caractère lu n’est pas un chiffre et n’est pas ’#’, le programme affiche “pas un chiffre”. Dans les deux derniers cas, le programme continue en demandant un nouveau caractère à l’utilisateur. Attention : pour que le programme fonctionne correctement en pratique, il faut que le caractère retour charriot rentré par l’utilisateur soit consommé ce qui demande un getchar() supplémentaire. Exercice 4 (Jeu des 7 erreurs). 1. Des erreurs se sont glissées dans les programmes suivants. Certaines donneront soit une erreur à la compilation, soit une erreur à l’exécution. Les trouver. #include <stdlib.h> #include <stdlib.h> #include <math.h> #include <math.h> main () { main () { float a,b,c,delta,x1,x2; float a,b,c,delta,x1,x2; printf("entrer a,b,c\n"); printf("entrer a,b,c\n"); scanf("%f, %f, %f",&a,&b,&c); scanf("%f, %f, %f",&a,&b,&c); delta=b2-4ac; a2=2*a; delta=b*b-4*(a*c); if (delta <0) if (delta <0) {printf("pas de solution \n"); printf("pas de solution \n"); } else if (delta == 0 ) else if (delta == 0 ) {x1=b /(a2); {x1=b /(2*a); printf("une solution : %f\n",x1) printf("une solution : %f\n",x1); else } {x1=-(b-sqrt(delta))/(a2); else x2=-(b+sqrt(delta))/(a2); {x1=-(b-sqrt(delta))/(2a); printf("racines %f\n",x1,x2); x2=-(b+sqrt(delta))/(2a); } printf("racines %f\n%f\n",x1,x2);} } } main () { float a,b,c,delta,x1,x2; printf("entrer a,b,c\n"); scanf("%c, %c, %c",&a,&b,&c); delta=b*b-4*(a*c); if (delta <0) {printf("pas de solution \n"); } else if (delta == 0 ) {x1=b /(2*a); printf("une solution : %c\n",x1); } else {x1=-(b-sqrt(delta))/(2*a); x2=-b-sqrt(delta))/(2*a); printf("racines %c\n%c\n",x1,x2);} } 2. Ecrire un programme correct qui calcule les solutions réelles d’une équation du second degré dont les coefficients sont demandés à l’utilisateur. 2