IUP2 : TP informatique 1

l'environnement Turbo C

découverte des différentes fonctionnalités de Turbo C.

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");
	}

évaluation de l'erreur de calcul sur les réels

On additionne petit à petit le pas, compte le nombre d'additions, quand l'erreur est supérieure au pas on s'arrête.

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);
}

résultats tests d'erreur

debutpasnbpascommentaire
10.00110435 plus l'ordre de grandeur entre les nombres additionnés est grande, plus l'erreur est importante
100.0012474
1000.0011821
10000.00143
10000.011024
100000.261110 pour un même ordre de grandeur, l'erreur dépend de la facilité de représenter les nombres en binaires
100000.25plus de 32000
Conclusion : il n'y a que les calculs entre nombres de même ordre de grandeur qui donneront à coup sûr une erreur négligeable

programme qui résoud ax2+bx+c=0 dans tous les cas

#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);
    }
  }
}

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

attention, ce n'est pas la bonne méthode, ce problème est uniquement posé pour vous faire travailler les boucles

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+bx2+cx+d=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