Ameliorer un programme C

Fermé
surame - 28 oct. 2007 à 16:48
 surame - 4 nov. 2007 à 18:06
Bonjour,

le programme ci-dessous permet de calculer et d'afficher les valeurs d'une expression mathématique
comme la fonction f(x) =x*x*x -2*x +1 par exemple.
Le problème est que l'expression à calculer est "figée " dans le code.

Je souhaite modifier ce programme afin que l'utilisateur rentre lors de chaque execution
l'expression à calculer.


Est ce que quelqu'un peut me donner quelques informations à ce sujet?

Merci.

/* Ce programme calcule puis affiche les N valeurs d'une fonction f(x), saisies au clavier. */
/* Il utilise 4 fonctions appelées successivement par le programme principal */

#include <stdio.h>

/* Déclarations des fonctions */
void NB_VALEURS (int *ad);
void LIRE_VALEURS (float x [ ], int N);
void CALCUL_VALEURS (int N, float x[ ], float f[ ]);
void AFFICHAGE_TABLEAU (int N, float x[ ], float f[ ]);

int i; /* variable globale pour le compteur de boucle */

int main (void)
{
int N;
float x [100];
float f[100];

NB_VALEURS (&N); /* Saisie du nombre N de valeurs de x */
LIRE_VALEURS (x, N); /* Lecture des N valeurs de x */
CALCUL_VALEURS (N, x, f); /* Calcul des N valeurs f(x) de la fonction */
AFFICHAGE_TABLEAU (N,x, f); /* Affichage du tableau de valeurs calculées */

printf("\n\n\n");
return 0;
}

void NB_VALEURS (int *ad)
{
do
{
printf("\nNombre de valeurs a calculer (entre 1 et 100):\n ");
scanf("%d", ad); /* Lecture de la variable N pointée par ad */
}
while ( *ad <1 || *ad >100);
}

void LIRE_VALEURS (float x[ ], int N)
{
for (i = 0 ; i < N ; i++)
{
printf("Entrer la %d%s%s valeur: ", i+1,(i==0)?"er":"",(i>0)?"eme":"" );
scanf("%f4.2", &x[i]);
}
}

void CALCUL_VALEURS (int N, float x[ ], float f[ ])
{
for (i = 0 ; i < N ; i++)
f[i] = 0;
for (i = 0 ; i < N ; i++)
f[i] = x[i]*x[i]*x[i] - 2*x[i] + 1;
}

void AFFICHAGE_TABLEAU (int N, float x[ ], float f[ ])
{
printf("\n\n **************************");
printf("\n\nTableau des valeurs:\n\n");
printf("-------------------------------------------------------------------------------");

printf("\n N | ");
for (i = 0 ; i < N ; i++) printf("%d | ", i+1);
printf("\n-------------------------------------------------------------------------------");

printf("\n x | ");
for (i = 0 ; i < N ; i++) printf("%5.1f|", x[i]);
printf("\n-------------------------------------------------------------------------------");

printf("\nf(x) | ");
for (i = 0 ; i < N ; i++) printf("%4.1f |", f[i]);
printf("\n-------------------------------------------------------------------------------");
}

5 réponses

groustegy45 Messages postés 1 Date d'inscription samedi 3 novembre 2007 Statut Membre Dernière intervention 3 novembre 2007
3 nov. 2007 à 08:00
Bonjour,
Pour faire ca il faut que tu demande a l'utilisateur via un menu, si sa fonction est polynomiale ou rationnelle etc.

exemple:

CALCULE MATH
==========

CHOISISSEZ LE TYPE DE VOTRE FONCTION:

1. POLYNOMIALE
2. RATIONNELLE
3. TRIGONOMETRIQUE
4.etc


tu demande a l'utilisateur les valeur de a, b, c, etc.
le fonction est alors: f(x)= ax*x + bx + c ((polynomiale))
ou alors: f(x) =( ax*x + bx + c)/(x*x + 1) ((rationnelle))

alors tu ne va créer que des simples conditions.
exemple:

if (polynomiale)
{
traiter les resultats pour polynomiale.....
}
else if (rationnelle)
{
traiter les resultats pour polynomiale.....
}

etc.

comme ca la fonction ne restera pas static tout au long du programme.

"il ya d'autre choses a ajouter ex: des boucles etc ." cela n'est que l'idée

alors si tu veux, je peux travailler avec toi dans ce projet.
0
Bonjour

Merci pour ta réponse.

Cela me permet d'avoir déja quelques élements pour commencer.

Si j'ai bien compris, il doit y avoir obligatoirement un bloc d'instruction (ou fonction) pour traiter chaque type de calcul.
De ce fait on ne peut écrire un programme qui traite "tous" les cas possibles.

Est ce que j'ai bien compris ou j'écris des betises?
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
4 nov. 2007 à 00:29
je te donne le principe du main a toi de te debrouillé pour coder les fonctions que tu veux dans ton menu ;)

#include <stdio.h>

int main() {

int choix;

printf("Expression mathematique\n");
printf("1 : Fonction1\n");
printf("2 : Fonction2\n");
printf("3 : Fonction3\n");
printf("Quel expression voulez vous ?\n");
scanf("%d",&choix);

switch(choix) {
case 1:Ton_expression1;
break;
case 2:Ton_expression2;
break;
case 3:Ton_expression3;
break;
default: printf("Vous avez choisi une expression qui n'existe pas");
break;
}
return 0;
}
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
4 nov. 2007 à 00:44
Salut

Sinon, tu peux l'améliorer encore bien mieux. Tu demandes à l'utilisateur de rentrer une chaine de caractère (par exemple : 5*X*X*X+2*X+3) en notation infixée.

Ensuite, lorsque tu demandes à l'utilisateur de calculer l'image de la fonction. Tu remplaces les X par le nombre de l'utilisateur dans la chaine et tu l'évalues.

Pour l'évaluer, tu vas devoir utiliser des piles etc. Tu peux trouver de l'aide sur google (évaluation notation infixée algorithme).

Cela te prendra du temps, mais ce sera ensuite une petite calculatrice ;). Si tu n'as pas le temps ou la volonté, la solution de mype est d'un bon recours.

N'hésite pas à demander encore de l'aide.

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour

Merci pour vos réponses .
J'ai effectivement modifié le code selon les propositions de Groustegy45 et Mype et
en utilisant des switch. Ca fonctionne bien.

Mon but final c'est d'écrire un code qui permet à l'utilisateur de saisir n'importe quelle équation
(en X, en X2, en X3....) sous forme de chaine de caractères et d'en calculer la valeur.
C'est ce que proposes fiddy.

Par contre les piles et la notation infixée, je ne connais pas encore.

Je vais faire des recherches sur ces notions et je ne manquerai sans doute pas de revenir sur ce
topic pour solliciter votre aide, si vous le voulez bien.
0