Ce sujet a dû ressortir plusieurs fois, mais cela fait 2 jours que je bloque sur l'exercice 4 du cours sur les tableaux, j'ai revu ma fonction, plusieurs fois (utilisé différents types de boucles, de conditions... Rien n'y fait) Par conséquent, je vous demande votre aide et surement de meilleurs yeux que moi.
j'ai créé un fichier main.c et main.h pour une meilleure visibilité.
Voici le main.c :
#include <stdio.h>
#include <stdlib.h>
#include "main.h"
int sum = 0;
double moyenne = 0;
int maxval = 0;
int main(int argc, char *argv[])
{
int tableau[4] = {15, 23, 33}, tableau1[4] = {0};
afftab(tableau, 4);
sommeTab(tableau, 4, &sum);
moytab(&moyenne, &sum);
printf("La somme du tableau est de %d\n", sum);
printf("La moyenne du tableau est de %f\n\n", moyenne);
copietab(tableau, tableau1);
printf("Saisissez la valeur maximum pour remettre a zero la case du tableau :\n\n");
scanf("d%", &maxval);
Maxtab(tableau1, 4, &maxval);
afftab(tableau1, 4);
return 0;
}
Et voici le main.h :
#ifndef MAIN_H_INCLUDED
#define MAIN_H_INCLUDED
void afftab(int tableau[], int tailletab)
{
int i;
for (i = 0; i < tailletab; i++)
{
printf("%d\n", tableau[i]);
}
}
int sommeTab(int tableau[], int tailletab,int *somme)
{
int i;
for (i = 0; i < tailletab; i++)
{
*somme = *somme + tableau[i];
}
}
double moytab (double *moy, int *somme)
{
*moy = *somme / 2;
}
int copietab (int tableau[], int tableau1[])
{
tableau1 = tableau;
printf("le tableau copie est : \n");
afftab(tableau1, 4);
}
void Maxtab(int tableau[], int tailletab, int *valmax)
{
int i = 0;
do
{
if (tableau[i] < *valmax)
{
i++;
}
else
{
tableau[i] = 322;
i++;
}
} while (i < tailletab);
}
#endif // MAIN_H_INCLUDED
Mon casse tête est le suivant :
La dernière fonction (void Maxtab) n'effectue pas son travail correctement, soit toutes les "cases" du tableau sont à 322 avec le code tel quel, soit avec d'autres fonctions :
for (i = 0; i < tailletab; i++)
{
if (tableau[i] > *valmax);
{
tableau[i] = 0
}
}
j'obtiens tout à 0... Je me doute avoir fait une erreur quelque part, mais là je sèche un peu... J'ai l'impression d'avoir un soucis avec le pointeur valmax.
Si vous avez des idées, elles sont les bienvenues ! Merci d'avance
Pourrais-tu expliquer ce qu'est sensé faire la fonction 'Maxtab' ? En me creusant les méninges pour comprendre, j'ai l'impression qu'elle remplace les valeurs inférieures à un maximum donné (*valmax) par 322. C'est bien ça ? (C'est bizarre, une fonction pareille... À la limite je les aurais remplacés par *valmax.) A priori je ne vois pas de raison pour que la fonction ne marche pas. Tu as utilisé quoi, comme valeur de *valmax ? Affiche sa valeur dans la fonction 'Maxtab' pour être sûr que c'est toujours la bonne. Est-ce que tu as vérifié que 'tableau1' est bien la recopie de 'tableau', y compris lorsqu'on est sorti de la fonction de recopie ?
Et c'est quoi ces histoires d'autres fonctions ? On parle de qui, de Maxtab ou d'autre chose ? Et pourquoi, dans la boucle que tu as mis à part, tu testes si tableau[i] est supérieur à *valmax ? Je comprends rien. Quel est le problème ?
Bon, je reviens, je vais prendre une aspirine...
(Ce qui n'aide pas à te lire, aussi, c'est que tu utilises des do... while au lieu de for, et tous tes arguments de fonctions sont des pointeurs même quand ça n'est pas nécessaire. C'est exprès ?)
Ce sujet a dû ressortir plusieurs fois, mais cela fait 2 jours que je bloque sur l'exercice 4 du cours sur les tableaux
Bonjour,
Tu n'as respecté la donnée d'aucun des exercices sur les tableaux. Ni pour la somme, ni pour la moyenne, ni pour la copie, ni pour le maximum. Tu as tout faux dès le départ.
@rouloude : J'ai envoyé l'adresse sur le pointeur de la fonction... mais situ me pose la question c'est qu'il y a déjà un soucis la dessus...
@ Marc Mongenet : J'ai du mal à saisir ta remarque, je n'ai pas fait de copier/coller des indices donnés pour les exercices, j'ai voulu utiliser les notions apprises précédemment (pointeurs). Juste pour te préciser, les autres fonctions s'accomplissent bien, mais ce n'est pas ce qui est demandé c'est vrai.
Ok, je vais rester sur le sobre afin de bien comprendre ce qui m'est demandé.
Ta fonction sommeTab() a un gros problème: teste ceci (tu ajoutes juste ce code dans ton main):
int array1[]={1,2,3,4};
int array2[]={5,6,7,8};
affTab(array1,4);
sommeTab(array1,4,&sum);
printf("Somme=%d\n",sum);
affTab(array2,4);
sommeTab(array2,4,&sum);
printf("Somme=%d\n",sum);
- Edité par edgarjacobs 19 avril 2018 à 14:56:59
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
BarashKa : je pense que rouloude s'est laissé embrouiller par le fait que tous tes arguments de fonction sont des pointeurs, ce qui est complètement inhabituel et m'a bien embrouillé aussi... (apparemment tu aimes les pointeurs ) Donc regarde en priorité les autres problèmes.
BarashKa : je pense que rouloude s'est laissé embrouiller par le fait que tous tes arguments de fonction sont des pointeurs, ce qui est complètement inhabituel et m'a bien embrouillé aussi... (apparemment tu aimes les pointeurs ) Donc regarde en priorité les autres problèmes.
C'est en cela que la donnée n'a pas été respectée. Et du coup les fonctions ont des prototypes tarabiscotés, d'un style déplorable par rapport à ce que les fonctions doivent faire.
BarashKa, lorsqu'un exercice d'informatique donne le prototype d'une fonction à implémenter
intsommeTableau(inttableau[],inttailleTableau);
ne pas implémenter une fonction ayant ce prototype revient à ne pas faire l'exercice. C'est comme si dans un exercice de calcul on demande ce que vaut 123+456 et qu'à la place on écrit 987+654=1641. C'est faux avant même d'avoir commencé.
Entendu, là j'ai bien compris vos argumentations et vais me tenir explicitement aux exercices pour tout les chapitres.
@Robun : Excuse moi l'ami je n'avais pas vu ton message (tu as été le premier à répondre en plus).
Pour ton premier post, oui tu as bien compris pour la fonction Maxtab, elle met la valeur à 322 (car j'avais un autre soucis à la base et je voulais tester si mon "if" fonctionnait ou si il sautait à la trappe dans la fonction). Et j'ai utilisé le "for" au tout début la fonction contenait juste un for avec un "if" pour tester *valmax < ou > que tailletab... Mais ça n'a pas fonctionné... Codeblocks me disait qu'il attendait un "(" avant ";", sauf que tout était correctement écrit (je me suis crevé les yeux dessus quelques heures avant de faire un while pour que sa compile...) La valeur *valmax est saisie par l'utilisateur (ce qui me permettait de tester de différentes manières le programme...)
Bref lol... Oui j'ai bien aimé la notion de pointeurs, j'ai d'ailleurs voulu tester ça dès que possible pour bien m’intégrer le fonctionnement de ces petites bestioles... Ce qui m'a conduit à ce type de codage OVNI ^^.
@edgarjacobs : Je vais tester ça ce soir avant de tout effacer pour recommencer, je reviens vers toi ;).
@Marc Mongenet : Effectivement je fais une addition mais pas des bons chiffres, vu comme ça, c'est pas con ! :). J'en reviens (pour me justifier même si on s'en fou) à vouloir tester la notion de pointeurs, après les utiliser à tord et à travers... Bah ça donne ça !
Merci pour vos conseils les amis je vais reprendre tout ça, ça devrait être bon cette fois ;p
@Marc Mongenet : Effectivement je fais une addition mais pas des bons chiffres, vu comme ça, c'est pas con ! :). J'en reviens (pour me justifier même si on s'en fou) à vouloir tester la notion de pointeurs, après les utiliser à tord et à travers... Bah ça donne ça !
Dans le prototype donné par l'exercice du cours,
int sommeTableau(int tableau[], int tailleTableau);
la variable tableau est un pointeur de int. La notation avec les crochets est trompeuse, mais il faut savoir que ce prototype est strictement équivalent à
int sommeTableau(int *tableau, int tailleTableau);
@ Marc Mongenet : Yes un tableau est un pointeur de part nature ! Si j'ai bien compris pour "tableau[i]" tu peux aussi écrire "*(tableau + i)". Non mais je vais reprendre à zéro ça sera mieux pour tout le monde et mon hygiène mentale.
@ edgarjacobs : Ah ouais je vois ce que tu veux dire... je vais me pencher dessus là c'est pas normal. Ça mérite investigation !
Oh non, la nature d'un tableau est extrêmement différente de celle d'un pointeur. Un pointeur ne contient qu'une valeur scalaire. Tandis qu'un tableau est multivalué, et peut contenir à peu prêt n'importe quoi: entiers, pointeurs, structures, tableaux, etc.
Là où les tableaux se confondent avec les pointeurs, c'est quand on utilise une variable de type tableau dans une expression: dans la plupart des cas, on se retrouve avec l'adresse du premier élément du tableau (donc une valeur de type pointeur).
x[y] est effectivement équivalent à *(x+y). Mais tu sais, l'opérateur [] opère sur des pointeurs, tout comme l'opérateur unaire *. Si l'on peut écrire tableau[0] = 123; c'est parce que tableau est évalué comme l'adresse de son premier élément (donc une valeur de type pointeur). S'il n'y avait pas cette conversion implicite, on ne pourrait pas utiliser l'opérateur [] sur les tableaux.
Aaaah Un tableau peut contenir des pointeurs... ça m'a l'air puissant ça ! Après effectivement j'ai manqué de précision lorsque j'ai dis que la nature d'un tableau était celle d'un pointeur !
J'espère en apprendre autant que toi avec les cours et les autres ressources sur le web ! Je vais approfondir sur les opérateurs, ça me permettra de mieux appréhender le futur ;).
D'ailleurs si tu as des ressources à me proposer pour compléter les cours d'open class room, je suis preneur !
Juste un retour vers vous, j'ai pu solutionner mon problème, en suivant vos conseils et en reprenant les modèles comme dans l'exercice.
Pourquoi faire simple quand on peut faire compliqué...
En tous cas merci !
[Exercices] Les tableaux
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent