à l'aide, j'ai un problème dans un programme
varfendell Messages postés 3259 Date d'inscription Statut Membre Dernière intervention -
J'ai fait un programme pour pouvoir comparer 3 nombres définis qui est le suivant
#include <stdio.h>
#include <math.h>
int Comparaison (int X, int Y)
{
int A;
if (X>Y)
{
X=A;
}
else
{
Y=A;
}
return A;
}
int Comparaison2 (int X, int Y, int Z)
{
int A;
Comparaison (X, Y);
if (A>Z)
{
printf ("Le plus grand nombre est %d.\n", A);
}
else
{
printf ("Le plus grand nombre est %d.\n", Z);
}
return 0;
}
int main ()
{
int X, Y, Z;
X=23;
Y=236;
Z=4;
Comparaison2 (X, Y, Z);
return 0;
}
Et il m'affiche comme résultat que le plus grand nombre est 4
Je ne trouve pas où est la faille. On pourrait m'aider, s'il vous plait?
Merci d'avance
- à l'aide, j'ai un problème dans un programme
- Programme demarrage windows - Guide
- Mettre en veille un programme - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Desinstaller un programme - Guide
- Forcer la fermeture d'un programme - Guide
18 réponses
Le souci principal réside dans une variable A non initialisée et une attribution incorrecte dans Comparaison, qui ne renvoie pas le maximum de X et Y mais une valeur indéterminée. Dans Comparaison2, le résultat de Comparaison n’est pas capté dans A et la comparaison s’effectue sur une valeur non initialisée, ce qui conduit à afficher 4 comme plus grand. La correction consiste à affecter A = Comparaison(X, Y) et à comparer ensuite A avec Z pour afficher le maximum réel, c’est-à-dire que A doit représenter le maximum de X et Y avant la comparaison avec Z. Le fil évoque aussi brièvement d’autres sujets (conversion majuscule/minuscule, usage de fonctions séparées pour le PGCD), mais le problème central porte sur la gestion des valeurs et le flux de retour entre les fonctions.
Comparaison (X, Y);
Il manque quelque chose ;)
Bonne réflexion.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void minuscule(char s[])
{
int mot;
/* la chaîne est parcourue par index */
for (mot= 0; s[mot] != '\0'; mot++)
/* si le caractère à la position index est majuscule*/
if (s[mot] >= 'A' && s[mot] <= 'Z')
/* le remplacer par son équivalent en minuscule */
s[mot]= s[mot] - 'A' + 'a';
}
int main ()
{
int salut;
minuscule(salut);
return 0;
}
Il ne veut pas marcher. Il y a quoi comme erreur?
Etant un peu fainéant j'aurais essayé "strlwr" et "strupr"
qui font tout par simple appel de fonction.
Tape "man strlwr" et "man strupr" sur Google ;p
Autre question, je vois que tu fais tout a la main.. A la mode Epitech.. Tu t'autorises a utiliser les fonctions systemes ou tu fait tout toute seule ?
Un moyen simple de convertir "a la main" une chaine en majuscule/minuscule et inversement, c'est de passer par la table ASCII (man ascii sur google ;D)
int main ()
{
int salut;
minuscule(salut);
return 0;
}
Et le prototype de ta fonction :
void minuscule(char s[]);
Ta fonction indique qu'elle attend un tableau de char comme argument (donc une chaine de caractère..)
Or, dans ton main, tu déclares une variable qui s'appelle salut (que tu n'initialises jamais déjà) mais qui est surtout du type int...
Tu envoies donc a ta fonction un entier au lieu d'une chaine de caractère..
Comprends-tu ton erreur et comment y remédier ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
void minuscule(char s[])
{
int mot;
/* la chaîne est parcourue par index */
for (mot= 0; s[mot] != '\0'; mot++)
/* si le caractère à la position index est majuscule*/
if (s[mot] >= 'A' && s[mot] <= 'Z')
/* le remplacer par son équivalent en minuscule */
s[mot]= s[mot] - 'A' + 'a';
printf ("%s", s);
}
int main ()
{
char SALUT;
char tab["SALUT"];
minuscule(tab["SALUT"]);
return 0;
}
c'est bon? Ou j'ai pas encore compris dans la fonction main?
char A=SALUT.
Chico a dit un peu plus haut qu'un tableau devait être entourée de guillemets.
Il a aussi précisé que tu ne déclares qu'un char, qui ne représente qu'un caractère alors qu'il te faut un tableau.
Suis les deux conseils qu'il t'a donné, et essaye de changer cette ligne pour qu'elle soit fonctionnelle.
On est revenu au même point qu'hier...
Gwenalizee.. Prends le temps de lire calmement ce que je (on maintenant ?) t'ecris(/t) .. Et prends le temps de réfléchir sans vouloir tout essayer..
Reprends ton dernier code :
int main ()
{
char A=SALUT;
minuscule(A);
return 0;
}
Relis ce que Gaunts et moi t'avons écris, et reposte la bonne réponse :p
int main ()
{
char A=SALUT;
char tab["A"];
minuscule(tab["A"]);
return 0;
}
c'est bon?
char A=SALUT;
qui est fausse dans ce code :
int main ()
{
char A=SALUT;
minuscule(A);
return 0;
}
Pour rappel, encore une fois, tu n'as besoin de rajouter AUCUNE ligne, nous attendons juste la déclaration un tableau de chaine de caractère a la place de celle d'un caractère que tu appelleras toujours A.. Et pour affecter une chaine, a un tableau de caractère tu dois entourer sa valeur par des guillemets..
Courage courage !
Encore une fois, regarde le prototype :
void minuscule(char s[])
Il faut que ce soit EXACTEMENT le même type déclaration de ce qu'il y a entre les parenthèses..
Comme dans mon exemple tout a l'heure on avait :
afficherNombre(int nb)
et dans le main : int monChiffre = 5
Des deux cotes on avait "int"
Ici on doit non seulement avoir char a gauche.. mais aussi autre chose a droite, de la même manière qu'entre les parenthèses :)
Et tableau, ne veut pas forcement dire qu'il faut rajouter tab quelque part, cela veut juste dire crochet ici ;)
J'en ai un autre de problème (sorry de vous déranger pour ça)
alors voilà je dois faire le PGCD de deux nombres que l'on peut choisir
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int PGCD (int X, int Y)
{
int z;
printf ("Choisir deux nombres entiers X et Y, de telle façon que X>Y.\n");
scanf ("X=%d\n Y=%d\n", &X, &Y);
z=X/Y;
printf("Le PGCD de X=%d et de Y=%d est %d\n", X, Y, z);
return PGCD (X, Y);
}
int main ()
{
int X;
int Y;
PGCD (X, Y);
return 0;
}
je prends X=12346 et Y=22 et on me dit
"Floating point exception"
ça veut dire quoi?
Choisir deux nombres entiers X et Y, de telle fan que X>Y.
Le PGCD de X=123456 et de Y=22 est 5611
A l'infini !
Tu sais pourquoi ?
Parceque tu écris dans ton return : return PGCB (X,Y)
Ce qui veut dire que tu rappelles ta fonction infiniment, une fois arrivé au return, tu retournes en haut redemander les valeurs etc.. et donc ca fait une boucle infinie..
Ce phénomène s'appelle la récursivité, tu peux en avoir besoin parfois, mais pas ici !
Quand une fonction fini bien, comme dans le main, tu dois retourner 0 :)
Par contre, tu ne trouves pas le PGCD la.. tu fais une simple division, l'algo n'est pas bon !
int main ()
{
int X=12346;
int Y=22;
int z;
z=X/Y;
printf ("Le PGCD de X=%d et de Y=%d est %d.\n", X, Y, z);
return 0;
}
Or le problème je dois utiliser une fonction (autre que le main). Et dans cette fonction on nous demande de choisir deux valeurs.
Et je ne vois pas où est mon problème (à part celui que tu m'as dis, chico200987).
Je viens de le modifier:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int PGCD (int X, int Y)
{
int X1;
int Y1;
X=X1;
Y=Y1;
printf ("Choisir deux nombres entiers X et Y, de telle façon que X>Y.\n");
scanf ("X=%d\n Y=%d\n", &X, &Y);
int z;
while (z==0)
{
int r;
z=X/Y;
r=X%Y;
printf("%d=%d*%d+*d\n", X, Y, z, r);
X=z;
Y=r;
}
printf("Le PGCD de X=%d et de Y=%d est %d\n", X1, Y1, z);
return 0;
}
int main ()
{
int X;
int Y;
/*int X=12346;
int Y=22;*/
PGCD (X, Y);
return 0;
}
mais il m'affiche comme warning "too man y arguments for format"
ça veut dire quoi?
Si tu regardes la ligne du Warning, c'est celle-ci :
printf("%d=%d*%d+*d\n", X, Y, z, r);
C'est juste une petite erreur d'inattention.. trouve l'erreur ;)
Ensuite il y a plusieurs problèmes dans ton algo.. les vois-tu ?
Voici le code que tu devrais avoir, commenter pour que tu comprenne bien toute tes erreurs.
Je me suis inspirer de l'explication de l'algorithme pour le faire et de ton code.
Je n'ai pas de compilateur C donc il peut y avoir des petites erreurs toute bete.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int PGCD ()
{
int X1, X;
int Y1, Y;
printf ("Entrez X et Y.\n");
scanf ("X=%d\n Y=%d\n", &X, &Y); //tu demande les valeur des deux nombres dont on veut calculer le PGCD
X1 = X; //tu initialise X1
Y1 = Y; //Tu inialise Y1
int r; // tu declare le reste r
do // on execute ce qui suit en boucle
{
r = X1%Y1; // on divise X1 par Y1 et on met le reste dans r
if (r != 0) // si le reste n'est pas nul
{
X1=Y1; // on met Y1 dans X1
Y1=r; // on met le reste r dans Y1
}
}while (r>0); // tant que le reste n'est pas nul
printf("Le PGCD de X=%d et de Y=%d est %d\n", X1, Y1, z);
return 0;
}
int main ()
{
PGCD (X, Y);
return 0;
}
En effet tu as dit ne pas savoir comment initialiser ton reste r (enfin z tout à l'heure).
Et bien l'avantage c'est qu'il va d abord rentrer dans la boucle, et dans cette boucle r sera initialisé.
en gros:
int r;
do
{
r = 4;
}
while (r !=4)
fonctionne alors que
int r;
while (r !=4)
{
r = 4;
}
ne marchera pas vu que r est inconnu
edit:
t'en fais pas chico, y a toujours qque erreur (comme dans le scanf)
Si tu veux une fois que tu auras compris celui la, je reposterai ma méthode pour te l'expliquer.
In function `PGCD':
c:24: error: `z' undeclared (first use in this function)
c:24: error: (Each undeclared identifier is reported only once
c:24: error: for each function it appears in.)
In function `main':
c:31: error: `X' undeclared (first use in this function)
c:31: error: `Y' undeclared (first use in this function)
Je crois qu'il a oublié d'utilisé 'z' et il a oublié d'enlever dans le main X et Y.
Mais je ne vois pas pourquoi il n'utilise pas 'z'.
Comme chico a dit, reprend le code que tu avais avant, et essaye de voir comment tu trouves un PGCD à la main. Quand on aura bien avancé comme ça, et que tu auras bien compri le fonctionnement du programme, on essaiera d'utiliser le code de Varfendell ainsi que le mien, pour te donner de nouveaux exemples à comprendre :), et on corrigera les erreurs que tu as obtenues avec son code.
Mais pour l'instant garde ce que tu avais, et pense à l'algo que tu vas utiliser.
Regarde la site que Varfendell t'avait donné, c'est assez bien expliqué
scanf ("%d %d\n", &X, &Y);
Quelque chose ne va pas sur cette ligne, chico t'en avait parlé.
Ensuite :
int z; int r; while (z>0)Ici toujours pareil, tu compares z à 0 alors qu'il n'a pas de valeur.
Il faut soit lui en donner une avant le while, soit utiliser un do..while comme avait dit varfendell, que tu peux apprendre à utiliser sur le site que l'on t'a donné.
ça me donne le contenu de chaque calcul mais je n'ai pas mon dernier printf contenant "Le PGCD de X et de Y est ..." et à la fin j'ai floating pion exception (je ne vois toujours pas ce qui pourrait poser problème avec ce float alors que j'en mets pas).
La derniere ligne que tu obtiens est : 6=2*3+0 avant ton exception.
Ce qui veut dire que :
X1 = 6
Y1 = 2
z = 3
r = 0
Ensuite tu fais :
X1=Y1; Y1=r;
Donc :
X1 = 2
Y1 = 0
Puis tu remontes en haut puisque z > 3 et tu fais :
z=X1/Y1;
Soit z = 2 / 0 ...
Et ca.. il aime pas du tout !
Edit : Ah lol Gaunts, je complétais ta réponse :p
Bon, bah je ne vais pas me reposer sur mes lauriers, j'ai déjà un nouveau code qui me pose problème: je dois faire la fonction factorielle de n.
Il marche mais il ne m'affiche pas les résultats que je veux voir.
J'envoie le code:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/*Écrire un sous-programme en C pour calculer n!. Écrire alors l'appel.*/
int Factorielle (int n)
{
if (n>1)
{
return n*Factorielle (n-1);
}
else
{
return 1;
}
return Factorielle (n);
}
int main ()
{
int n;
printf ("Vous voulez faire factorielle de n=");
scanf ("%d", &n);
printf("\n");
Factorielle (n);
printf("\n");
return 0;
}
essaye comme ça:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/*Écrire un sous-programme en C pour calculer n!. Écrire alors l'appel.*/
int Factorielle (int n)
{
int i;
int resultat;
for (i=n; i>1; i--)
{
resultat=n*Factorielle (n-1);
}
return resultat;
}
int main ()
{
int n;
printf ("Vous voulez faire factorielle de n=");
scanf ("%d", &n);
printf("\n");
int resultat = Factorielle (n);
printf("Le résultat est: %d\n", resultat);
return 0;
}
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/*Écrire un sous-programme en C pour calculer n!. Écrire alors l'appel.*/
int Factorielle (int n)
{
int i;
int resultat = 1;
for (i=n; i>1; i--)
{
resultat = n * Factorielle (n - 1);
}
return resultat;
}
int main ()
{
int n;
printf ("Vous voulez faire factorielle de n=");
scanf ("%d", &n);
printf("\n");
int resultat = Factorielle (n);
printf("Le résultat est: %d\n", resultat);
return 0;
}
Alors voici le programme que je dois faire (enfin l'énoncé):
je dois calculer la solution de x=cos (x) par la suite [je mets les indices]
(grande accolade)
X[0]=0
X[i+1]=cos X[i]
avec pour condition d'arrêt telle que valeur absolue de (X[i+1]-X[i]) est plus petit que ?.
Je dois alors écrire l'appel.
En fait là, je n'ai pas d'idée pour l'algo. Je ne vois pas comment démarrer.
Ensuite tu creer une boucle while ou tu effectue ton algorithme.
Tu peut choisir avec la boucle while:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
/**/
int CosEgaleX (int n)
{
float epsilon = 0.0001;
float X = 0, temp;
while (diff > espilon)
{
temp = X;
X = cos(X);
diff = X - temp;
}
return X;
}
int main ()
{
float resultat = CosEgaleX ();
printf("Le résultat est: %f\n", resultat);
return 0;
}
ou avec un boucle do{}while();
Alors j'ai réfléchi à programme et je crois qu'en fait je pense qu'il faut poser le problème doit se poser comme ça:
comme i=0; X=0
i=1; X=cos0=1
i=2; X=cos1
i=3; X=cos(cos1)
...
Est-ce que tu vois comment le problème doit être résolu (et en fait je voulais mettre un i et non un X au départ pour demander à quel niveau on doit avoir le résultat)?
Je refais des modifs et je reposte le programme