Vous êtes sur la page 1sur 5

{ delta=b*b-4*a*c; /* b*b : c'est comme cela qu'on calcule un carr */ if (delta==0) printf("une racine double : %f\n",-b/(2*a)); else if (delta<0)

printf("aucune racine relle (mais complexes)\n"); else { r1=(-b-sqrt(delta))/(2*a); r2=(-b+sqrt(delta))/(2*a); printf("il y a 2 racines relles : x1=%f et x2=%f\n",r1,r2); } } }

2) recherche d'une racine positive de ax3+bx2+cx+d=0


#include<stdio.h> #include<math.h> #include<stdlib.h> #define f(x) (a*(x)*(x)*(x)+b*(x)*(x)+c*(x)+d) int main(void) { float a, b, c, d,x,f0,gauche,droite,y; printf("ax3+bx+cx +c=0"); printf("\nEntrez la valeur de a ?"); scanf("%f",&a); printf("\nEntrez la valeur de b ?"); scanf("%f",&b); printf("\nEntrez la valeur de c ?"); scanf("%f",&c); printf("\nEntrez la valeur de d ?"); scanf("%f",&d); f0=f(0); x=1; while(f(x)*f0>0 && x<10000) x+=1; if(x==10000) {printf ("pas de solution\n"); exit(0);} printf("la solution est comprise entre %f et %f\n",x-1,x); gauche=x-1; droite=x; do { x= (gauche+droite)/2; if ((f0*f(x))<0) droite=x; else gauche=x; } while ((droite-gauche)>0.001) ; printf("la solution est comprise entre %f et %f\n",gauche,droite); }

3) jeu du plus ou moins


#include <stdio.h> #include <stdlib.h> #include <time.h> int main (void) { int nbatrouver,proposition,compteur=0; int min=1,max=100;

61

printf("Vous devez deviner un nombre entre %d et %d \n",min,max); srand(time(NULL)); nbatrouver=(rand()%(max+1))+min; do { compteur++; printf("entrez votre proposition :"); scanf("%d",&proposition); if(proposition<nbatrouver) if(proposition>min) { printf("trop petit\n"); min=proposition; } else printf("donne incohrente\n"); else if(proposition!=nbatrouver) if(proposition<max) { printf("trop grand\n"); max=proposition; } else printf("donne incohrente\n"); } while (proposition!=nbatrouver); printf("gagn en %d essais \n",compteur); if (compteur<2)printf("tricheur !\n"); else if (compteur<5)printf ("bravo\n"); else if (compteur<10)printf("pas mal\n"); else printf("plutt nul\n"); }

TP programmation informatique n 3
1) Etude de la rcursivit. Soit la fonction
int f(int n) { int p; if(n<2) return 1; else { p=n*f(n-1); return p } }

testez son rsultat pour quelques valeurs simples. Essayez de comprendre comment elle fonctionne. Vous pouvez insrer des printf pour mieux comprendre son droulement. 2) Ecrire un programme demandant deux nombres flottants (par scanf), puis qui calcule leur somme et l'affiche. (le programme doit tre trs simple) 3) Amliorer le programme pour qu'il sache traiter les 4 oprations . On demandera le premier nombre, puis le signe opratoire que l'on stockera dans une variable de type char, puis on demandera le second nombre.

Pour saisir un caractre, on peut utiliser scanf(''%c '' &variable) ; ou alors variable=getchar(); ou encore mieux : do s=getchar(); while (s<=' ');

62

Que se passe-t-il si vous tapez directement une expression (par ex. 1+2) ds la 1re question (dans les 3 cas) ? Pour slectionner l'opration effectuer, utilisez des tests if-else if mais prvoyez aussi (grce aux else ) le cas o l'utilisateur a demand une opration non prvue. Vous pouvez galement, si vous y tenez, utiliser une instruction switch.

4) Ajout d'une boucle : on veut maintenant faire une suite d'oprations : par exemple on veut entrer 5 * 3 (le programme affiche 15) puis + 2 (le programme affiche 17), etc jusqu' ce qu'on donne le signe opratoire = qui termine le programme. 5) fonction factorielle : on dsire galement pouvoir calculer des factorielles. Exemples : !5=, ou 3+!5= . Vous dcomposerez bien videment votre programme en plusieurs fonctions. 6) dernire proposition : vous pouvez tenter de rajouter des parenthses, mais c'est plus compliqu. Si vous vous limitez un seul niveau de parenthses (pas d'imbrications) il suffit de prvoir une variable supplmentaire pour stocker le rsultat intermdiaire.

proposition de solution
pour une version pdf voyez ici.

1) F calcule (rcursivement) une factorielle.


f(1) ou tout nb <1 donnent 1. f(2) donne 2*f(1)=2. f(3) donne 3*f(2)=6. f(4) donne 4*f(3)=4*6=24.

2) version que tous doivent savoir faire (question 4)


#include int main(void) { float n2,res; char signe; printf("premier nombre ?"); scanf("%f",&res); do { printf("signe opratoire ?"); do signe=getchar(); while(signe<=' ')); if(signe!='=') { printf("prochain nombre ?"); scanf("%f",&n2); if(signe=='+')res=res+n2; else if(signe=='-')res=res-n2; else if(signe=='*')res=res*n2; else if(signe=='/')res=res/n2; else printf("signe non conforme\n"); printf("rsultat intermdiaire : %f\n",res); } } while(signe!='='); printf("le rsultat vaut %f\n",res); }

3) version avec parenthses et ! (question 6)


#include // on est oblig de prototyper au moins la fonction calculer

63

char lire_un_signe(void); float lire_un_nb(void); float calculer(void); int fact(int); int fact(int n) { int p; if(n<2) return 1; else { p=n*fact(n-1); return p; } } char lire_un_signe(void) { //lit un signe, qui devrait tre +, -, *, /, (, ) ou = char s; do s=getchar(); while (s<=' '); //on limine les espace et CR return(s); } float lire_un_nb(void) { float n; int nb; char c; nb=scanf("%f",&n); if(nb==0) //on n'a pas pu lire, ne peut tre que (, ! ou une erreur { c=lire_un_signe(); if(c=='!') n=fact(lire_un_nb()); else if(c!='(')printf("erreur dans vos parenthses !!!\n"); else n=calculer(); //on calcule jusqu' la prochaine ) } return(n); } float calculer(void) { float res,n2; char signe; res=lire_un_nb(); do { signe=lire_un_signe(); if(signe=='+'||signe=='*'||signe=='-'||signe=='/') { n2=lire_un_nb(); if(signe=='+')res+=n2; else if(signe=='-')res-=n2; else if(signe=='*')res*=n2; else if(signe=='/')res/=n2; } } while(signe!='='&&signe!=')'); return(res); } int main(void) {

64

float res; printf("entrez votre quation, termine par = (sur printf("vous pouvez utiliser des parenthses (bien signs\n"); printf("!5 ou !(2+3) donnent factorielle(5), alors factorielle(2)+3\n"); printf("exemple : (2*(-1))+(-1*-3)*(1/(4*0.5))+1) res=calculer(); printf("le rsultat vaut %f\n",res); }

une ou plusieurs lignes)\n"); appaires) et des nombres que !2+3 donnde (doit donner 1.5)\n?");

TP programmation informatique n4
Nous allons tudier l'utilisation de base des tableaux (statiques unidimensionnels), ainsi que les fonctions. Nous supposons vouloir traiter diverses valeurs relles (des tempratures) mesures lors d'un essai thermique, regroupes dans un tableau. Soient les dclarations :
#define DIM 100 typedef float tableau[DIM]; int main (void) { tableau t; int nb; }

1. Dans un premier temps, compltez le programme pour qu'il :


demande le nombre de tempratures demande les valeurs des tempratures puis affiche le tableau

2. Dcomposez ce programme en fonctions : une fonction qui effectue la saisie, une pour l'affichage, et videment le programme principal. Les donnes seront obligatoirement transmises en arguments des fonctions. Je vous conseille de commencer par l'affichage, car il ne ncessite pas de modification des arguments. 3. Calculez la temprature moyenne ( l'aide d'une fonction qui retourne un flottant) mais imprimez la dans le programme principal 4. Crez une boucle dans le programme principal qui permette de rpter ce menu : que voulez vous faire ? 1 -> saisir le tableau 2 -> l'afficher 3 -> moyenne 0 -> quitter le programme 5. 6. 7. 8. Rajoutez la possibilit d'ajouter une temprature ( la suite des autres) via une fonction. Rajoutez la possibilit de supprimer une valeur(demander sa position) Modifiez l'ajout d'une temprature en permettant de l'insrer un endroit prcis Rajoutez la possibilit d'excuter une rotation, dans les deux sens : le premier passe en dernier et tous les autres se dcalent; le dernier passe en premier et tous les autres se dcalent. (2 fonctions) 9. Si vous vous vous sentez en forme, tentez de trier les tempratures (optionnel)

65