Il faut utiliser turbo C version DOS (donc quitter windows), et se placer dans le répertoire C:\USER avant de taper la commande TC
il est interdit de sauver vos programmes autre part que dans le répertoire USER, il est interdit de modifier la configuration de Turbo C (menu options).
Pour vous "faire la main", entrez le programme vu en cours (l'ordinateur vous demande de deviner un nombre, et vous aide en disant "trop petit" ou "trop grand"). On remarque que l'ordinateur choisit toujours le même nombre (un ordinateur (bien conçu) ne peut rien faire d'alléatoire). En fait le générateur de nombres aléatoires génère toujours la même suite de nombres, tout ce qu'on lui demande c'est d'avoir la même probabilité pour tous (on s'en servira par exemple pour évaluer une moyenne approximative de très nombreuses valeurs). Une solution consiste à "tirer" des nombres dans cette suite (un calcul dure moins de 10-7s) jusqu'au premier appui sur une touche.
Programme proposé par Moritz et Maire-Lentz :
#include <stdio.h> #include <stdlib.h> #include <conio.h> void main (void) { int nbatrouver,proposition,compteur=0; puts("tapez ENTREE pour commencer"); do nbatrouver=rand()%100+1; while (!kbhit()); do { compteur++; puts("entrez un nombre entre 1 et 100"); scanf("%d",&proposition); if(proposition<nbatrouver) puts("trop petit"); else if(proposition!=nbatrouver) puts("trop grand"); } while (proposition!=nbatrouver); printf("gagné en %d essais \n",compteur); if (compteur<5)puts ("bravo,tu es un vrai tony"); else if (compteur<10) puts("pas mal, tu es presque aussi bon que tony the god of universe"); else puts("espece de gros phihipeux"); }
Programme proposé par Thomas Manglé:
#include<stdio.h> #include<math.h> void main(void) { float somme, pas=0.001; int nbpas=0, debut=100; somme=debut; do { somme+=pas; nbpas++; } while(fabs(somme-(debut+(pas*nbpas)))<pas); printf("le nombre de pas est %d\n",nbpas); }
debut | pas | nbpas | commentaire |
1 | 0.001 | 10435 | plus l'ordre de grandeur entre les nombres additionnés est grande, plus l'erreur est importante |
10 | 0.001 | 2474 | |
100 | 0.001 | 1821 | |
1000 | 0.001 | 43 | |
1000 | 0.01 | 1024 | |
10000 | 0.26 | 1110 | pour un même ordre de grandeur, l'erreur dépend de la facilité de représenter les nombres en binaires |
10000 | 0.25 | plus de 32000 |
#include <stdio.h> #include <math.h> void main (void) { float a,b,c; float delta,r1,r2; puts ("entrez la valeur de a"); scanf("%f",&a); puts ("entrez la valeur de b"); scanf("%f",&b); puts ("entrez la valeur de c"); scanf("%f",&c); if (a==0) /* sinon diviser par 2*a risque de poser problème */ { if (b!=0) printf("une racine simple x=%f\n",-c/b); else if (c==0) printf("il y a une infinité de solutions à Ox=0\n"); else printf("aucune solution à l'équation %f=0\n",c); } else { delta=b*b-4*a; /* c'est comme cela qu'on calcule un carré */ if (delta==0) printf("une solution unique : %f\n",-b/(2*a)); else if (delta<0) puts("racines complexes"); else { r1=(-b-(delta))/(2*a); r2=(-b+(delta))/(2*a); printf("il y a 2 racines réelles : x1=%f et x2=%f\n",r1,r2); } } }
On cherche d'abord à encadrer la première racine positive (f(x) change de signe) par pas de 1 (si on arrive à 10000) on abandonne. Puis dans un second temps on restreind l'encadrement de moitié jusqu'à ce qu'on ait une précision de 10-3 (dichotomie)
#include<stdio.h> #include<math.h> #include<conio.h> #include<stdlib.h> float f(float a,float b,float c,float d,float x) {return( a*x*x*x+b*x*x+c*x+d);} void main(void) { float a, b, c, d,x,yprec,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); yprec=f(a,b,c,d,0); for (x=1;((y=f(a,b,c,d,x))*yprec>0 && x<1000);x+=1) yprec=y; if(x==1000) {puts ("pas de solution"); exit(0);} printf("la solution est comprise entre %f et %f",x-1,x); gauche=x-1; droite=x; do { x= (gauche+droite)/2; if (f(a,b,c,d,x)==0) gauche=droite=x; elseif ((f(a,b,c,d,gauche)*f(a,b,c,d,x))<0) droite=x; else gauche=x; } while ((droite-gauche)>0.01) ; printf("\nla solution est comprise entre %f et %f",gauche,droite); }
Patrick TRAU,ULP - IPST 06/11/97