Je bloque sur une parti de mon exercice. Les fonctions SaisieTab et AfficheTab marchent correctement, mais je n'arrive pas à extraire les valeurs de la fonction CalculPairImpaire. J'ai très certainement fait des erreurs de pointeurs. Voici l'énoncé :
Soit T un tableau de NMAX (=30) éléments, contenant des valeurs entières strictement positives saisies dans un ordre croissant.Le programme consistera à déterminer et à afficher parmi les valeurs de T, le nombre de valeurs paires et impaires.
a) Ecrire la fonction SaisieTab qui permet de saisir dans un ordre croissant nb valeurs entières strictement positives (nb saisi dans la fonction main et passé en paramètres). NB: les valeurs saisies devront être vérifiées pour correspondre aux valeurs autorisées.
b) Ecrire la fonction CalculPairImpair, qui permet de « renvoyer » le nombre de valeurs paires et le nombre de valeurs impaires présentes dans le tableau tab passé en paramètres (vous n’utiliserez pas de tableaux pour stocker le nombre de valeurs paires et impaires)
c) Ecrire une fonction AfficheTab qui permet d’afficher les valeurs entières d'un tableau.
d) Ecrire la fonction main qui x demande à l’utilisateur de saisir le nombre de valeurs n à rentrer dans le tableau T, x appelle la fonction SaisieTab, x appelle la fonction CalculPairImpair. x appelle la fonction AfficheTab x affiche le nombre de valeurs paires et impaires présentes dans le tableau.
Voici ou j'en suis :
#include <stdio.h>
#define NBMAX 30
void SaisieTab (int *tab2, int *n) {
int x;
for (int i = 0; i < *n; ++i)
{
printf("x = \n");
scanf("%d", &x);
tab2[i] = x;
}
}
void Affichage (int const *tab2, int *n)
{
int i;
for (i = 0; i < *n; i++)
{
printf ("%d ", tab2[i]);
}
printf ("\n");
}
int Calcul (int *tab2, int *n) {
int *pair, *impaire;
for (int i = 0; i < *n; ++i)
{
if (tab2[i] % 2 == 0) (pair++);
else (impaire++);
}
}
int main()
{
int tab[30];
int n;
int *pair = 0;
int *impaire = 0;
printf("Nombre de valeur dans le tableau : ");
scanf("%d", &n);
SaisieTab(tab, &n);
Affichage(tab, &n);
Calcul(tab, &n);
printf("Nombre de cas pair : %d\n", &pair);
printf("Nombre de cas impair : %d\n", &impaire);
return 0;
}
J'ai modifié pour qu'il marche, je poste le code puis t'explique:
#include <stdio.h>
#define NBMAX 30
void SaisieTab (int *tab2, int *n) {
int x;
for (int i = 0; i < *n; ++i)
{
printf("x = \n");
scanf("%d", &x);
tab2[i] = x;
}
}
void Affichage (int const *tab2, int *n)
{
int i;
for (i = 0; i < *n; i++)
{
printf ("%d ", tab2[i]);
}
printf ("\n");
}
int Calcul (int *tab2, int *n, int *pair, int *impaire) {
for (int i = 0; i < *n; ++i)
{
if (tab2[i] % 2 == 0) *pair = *pair + 1;
else *impaire = *impaire + 1;
}
}
int main()
{
int tab[30];
int n;
int pair = 0;
int impaire = 0;
printf("Nombre de valeur dans le tableau : ");
scanf("%d", &n);
SaisieTab(tab, &n);
Affichage(tab, &n);
Calcul(tab, &n, &pair, &impaire);
printf("Nombre de cas pair : %d\n", pair);
printf("Nombre de cas impair : %d\n", impaire);
return 0;
}
Alors les erreurs, en fait tu n'a pas envoyé pair et impaire par adresse quand tu appel ta fonction Calcul, alors qu'elle en a besoin!
tu déclares tes variables dans la fonction main, ensuite tu les passes par adresse dans ta fonction Calcul, puis quand tu affiches dans ta fonction main, tu n'affiche pas les adresses avec &, tu affiches juste les variables c'est tout!
Voilà voilà bonne fin de journée
EDIT: Par contre NBMAX fonctionne pas, mais ça c'est vraiment simple alors je te laisse essayer de trouver tout seul, parce que la peut importe le nombre que tu saisies, ça passe, il faut pouvoir redemander la saisie si l'utilisateur tape un nombre > 30.
- Edité par Galak1802 12 novembre 2018 à 15:06:48
Technicien informatique, Brevet de technicien supérieur Système Numérique.
Bonjour, voici le code que j'ai corrigé et qui marche :
Il fonctionne sans doute, mais ne répond pas aux directives:
PierreVoillot a écrit:
b) Ecrire la fonction CalculPairImpair, qui permet de « renvoyer » le nombre de valeurs paires et le nombre de valeurs impaires présentes dans le tableau tab passé en paramètres (vous n’utiliserez pas de tableaux pour stocker le nombre de valeurs paires et impaires)
Ce que tu ne fais pas.
- Edité par edgarjacobs 12 novembre 2018 à 19:05:35
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
En prenant du recul, il faut voir "calculPairImpair" en tant qu'action qui
reçoit en entrée un tableau
fournit en résultat deux nombres
Revenons à C, le langage étant ce qu'il est (hélas), pour fournir un tableau, on indique deux choses en paramètres
le tableau C
sa taille
...... CalculPairImpair (int tableau[], int taille, ....)
{
...
}
et pour fournir deux résultats d'un coup... il n'y a pas de moyen direct.
Alors on contourne.
La solution qui est rejetée par l'énoncé, c'est de passer un tableau qui servira à récupérer les résultats
void CalculPairImpair(int tableau[], int taille, int resultats[2])
{
...
}
C'est pas idiot - c'est d'ailleurs la solution utilisée par l'appel système pipe(), pour retourner deux numéros de descripteurs - mais bon, il faut autre chose.
la solution présentée au dessus, c'est voir les résultats comme des "paramètres de sorties" de l'action, des trucs qui indiquent où la fonction doit placer les résultats. En C, faute de passage par référence, on passe les adresses des entiers
void CalculPairImpair(int tableau[], int taille, int *adr_min, int *adr_max)
{
...
}
Enfin, une autre solution est faire retourner une paire de nombres.... dans une structure qui représente une paire
struct Paire {
int min, max;
};
struct Paire CalculPairImpair(int tableau[], int taille)
{
struct Paire resultat;
resultat.min = 0;
resultat.max = 0;
...
if (....) resultat.min++;
....
return resultat;
}
- Edité par michelbillaud 12 novembre 2018 à 19:27:30
Grâce à vous j'ai enfin pu comprendre un peu mieux cette histoire de pointeur ! Et en reprenant un peu mes cours j'avance plus vite maintenant. Merci à vous pour votre temps et vos explications !
Cordialement
Fonction : Pair_Impaire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Technicien informatique, Brevet de technicien supérieur Système Numérique.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent