Tableaux, pointeurs en C
Dernière réponse : dans Programmation
Salut,
Voici un code simple provenant du site du zéro :
void affiche(long *tableau, long tailleTableau);
int main(int argc, char *argv[])
{
long tableau[4] = {10, 15, 3}, i = 0;
// On affiche le contenu du tableau
affiche(tableau, 4);
return 0;
}
void affiche(long *tableau, long tailleTableau)
{
long i;
for (i = 0 ; i < tailleTableau ; i++)
{
printf("%ld\n", tableau);
}
}
Je me pose quelques questions qui provoquent la confusion dans mon esprit.
J'ai assez bien compris le système des pointeurs je pense.
Ici, avec le pointeur *tableau on récupère l'adresse de la variable (pointeur) tableau qui est donc tableau.
1. Je ne vois pas l'intérêt de mettre le pointeur *tableau ici.
2. On dit que la variable tableau eset aussi un pointeur, donc pourquoi ne pas mettre long **tableau ?
3. Si j'ai bien compris, avec la boucle for, on va parcourir toutes les adresses du tableau et en retirer les valeurs grâce aux nombre dans les crochets qui augmentent avec la boucle ?
Je ne vois toujours pas l'utilité du pointeur, vu que tableau lui même est un pointeur et tableau = une adresse.
Non ?
On aurait pas pu mettre juste
void affiche(long tableau, long tailleTableau)
Ou alors le * est indispensable pour dire qu'on reçoit un pointeur ..? ça commence à confuser
Merci pour les futures réponses !
+++++++++
Sinon j'ai un deuxième petit problème, donc autant le poser en même temps :
J'ai fait un petit truc tout court :
#include <stdlib.h>
int main ( int argc, char** argv )
{
int nombre;
do
{
printf ("=== Menu ===\n\n" );
printf ("1. Royal Cheese\n" );
printf ("2. Mc Deluxe\n" );
printf ("3. Mc Bacon\n" );
printf ("4. Big mac\n\n" );
printf ("Votre choix ?" );
scanf ("%ld", &nombre);
switch (nombre)
{
case 1:
printf ("Ah vous avez choisi le Royal Cheese ? Bon choix
\n\n");
break;
case 2:
printf ("Mc Deluxe ..? Mouais moyen !\n\n");
break;
case 3:
printf ("Mc Bacon, ça peut aller !\n\n");
break;
case 4:
printf ("Big mac, miam !\n\n");
break;
default:
printf ("Abruti, faut taper un chiffre de la liste !\n\n");
break;
}
}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4);
system ("PAUSE");
return 0;
}
Le programme marche bien sauf pour une chose.
Le programme tourne en boucle, pourtant j'ai bien spécifié ça à la fin :
}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4)
Ai-je fait une erreur ?
Sinon pour faire moins moche
Si je voulais retourner au début pour ne pas répéter le menu à chaque fois qu'on tape quelque chose de faux,
un goto conviendrait comme en batch ?
Thks
Voici un code simple provenant du site du zéro :
Citation :
// Prototype de la fonction d'affichagevoid affiche(long *tableau, long tailleTableau);
int main(int argc, char *argv[])
{
long tableau[4] = {10, 15, 3}, i = 0;
// On affiche le contenu du tableau
affiche(tableau, 4);
return 0;
}
void affiche(long *tableau, long tailleTableau)
{
long i;
for (i = 0 ; i < tailleTableau ; i++)
{
printf("%ld\n", tableau);
}
}
Je me pose quelques questions qui provoquent la confusion dans mon esprit.
J'ai assez bien compris le système des pointeurs je pense.
Ici, avec le pointeur *tableau on récupère l'adresse de la variable (pointeur) tableau qui est donc tableau.
1. Je ne vois pas l'intérêt de mettre le pointeur *tableau ici.
2. On dit que la variable tableau eset aussi un pointeur, donc pourquoi ne pas mettre long **tableau ?
3. Si j'ai bien compris, avec la boucle for, on va parcourir toutes les adresses du tableau et en retirer les valeurs grâce aux nombre dans les crochets qui augmentent avec la boucle ?
Je ne vois toujours pas l'utilité du pointeur, vu que tableau lui même est un pointeur et tableau = une adresse.
Non ?
On aurait pas pu mettre juste
void affiche(long tableau, long tailleTableau)
Ou alors le * est indispensable pour dire qu'on reçoit un pointeur ..? ça commence à confuser
Merci pour les futures réponses !
+++++++++
Sinon j'ai un deuxième petit problème, donc autant le poser en même temps :
J'ai fait un petit truc tout court :
Citation :
#include <stdio.h>#include <stdlib.h>
int main ( int argc, char** argv )
{
int nombre;
do
{
printf ("=== Menu ===\n\n" );
printf ("1. Royal Cheese\n" );
printf ("2. Mc Deluxe\n" );
printf ("3. Mc Bacon\n" );
printf ("4. Big mac\n\n" );
printf ("Votre choix ?" );
scanf ("%ld", &nombre);
switch (nombre)
{
case 1:
printf ("Ah vous avez choisi le Royal Cheese ? Bon choix
\n\n");break;
case 2:
printf ("Mc Deluxe ..? Mouais moyen !\n\n");
break;
case 3:
printf ("Mc Bacon, ça peut aller !\n\n");
break;
case 4:
printf ("Big mac, miam !\n\n");
break;
default:
printf ("Abruti, faut taper un chiffre de la liste !\n\n");
break;
}
}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4);
system ("PAUSE");
return 0;
}
Le programme marche bien sauf pour une chose.
Le programme tourne en boucle, pourtant j'ai bien spécifié ça à la fin :
}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4)
Ai-je fait une erreur ?
Sinon pour faire moins moche
Si je voulais retourner au début pour ne pas répéter le menu à chaque fois qu'on tape quelque chose de faux,
un goto conviendrait comme en batch ?
Thks
Autres pages sur : tableaux pointeurs
Lassé par la pub ? Créez un compte
On veut passer un tableau d'entiers (long) à la fonction affiche : le type est donc long *. En C un tableau est un pointeur = l'adresse du premier élément = l'adresse de l'élément d'indice 0.
On accède au ième élément du tableau par cette syntaxe tableau. C'est équivalent à *(tableau + i).
Si le type était long** alors cela représenterait un tableau de pointeurs sur des entiers et non pas un tableau d'entiers.
En ce qui concerne la condition :
nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4
je te laisse réfléchir et te rendre compte qu'elle sera toujours vraie...
On accède au ième élément du tableau par cette syntaxe tableau. C'est équivalent à *(tableau + i).
Si le type était long** alors cela représenterait un tableau de pointeurs sur des entiers et non pas un tableau d'entiers.
En ce qui concerne la condition :
nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4
je te laisse réfléchir et te rendre compte qu'elle sera toujours vraie...
Ce code n'est pas terrible, car 2 variables avec le même nom existe (tableau dans le main, et tableau dans affiche).
le passage par paramètre doit se faire avec un pointeur que ce soit de type long* ou long[], c'est la même chose, puisque un tableau c'est une adresse mémoire comme un pointeur.
ça ferait un pointeur qui pointe sur un pointeur, ou un pointeur qui pointe sur un tableau, ou encore un tableau de pointeurs.
En mémoire un tableau c'est un pointeur sur le premier élément. Les éléments suivant se suivent toujours en mémoire, donc les adresses sont toujours l'adresse du premier + 1, puis +2 etc.
Non ?
ça fonctionne aussi avec ça:
void affiche(long tableau[], long tailleTableau)
mais c'est la même chose. Dans les 2 cas on fait passer l'adresse mémoire du premier élément du tableau.
}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4)
Ai-je fait une erreur ?
Oui,
c'est équivalent à ça boucle tant que nombre != 1 ou nombre !=2 ou...
Comme ce sont des OU, il suffit qu'une des conditions soit vérifiée pour que la boucle continue.
J'imagine que tu veux continuer à boucler lorsque nombre est différent de tous les chiffres, donc différent de 1, différent de 2, différent de 3 ET différent de 4.
Sinon on peut voir la logique inverse. Tu veux que la boucle s'arrête lorsque nombre == 1 OU nombre == 2 OU nombre ==3 OU nombre == 4. Comme on veux prendre l'opposé, les == deviennent != (et inversement), et les || deviennent && (et inversement).
Si je voulais retourner au début pour ne pas répéter le menu à chaque fois qu'on tape quelque chose de faux,
un goto conviendrait comme en batch ?
Non le goto toto; est à bannir !
parce que si tu en fais plusieurs, un lecteur ne comprendrait plus grand chose, au pire on peut faire un break;, mais à éviter si on peut simplement faire un while comme ici.
Citation :
1. Je ne vois pas l'intérêt de mettre le pointeur *tableau ici. le passage par paramètre doit se faire avec un pointeur que ce soit de type long* ou long[], c'est la même chose, puisque un tableau c'est une adresse mémoire comme un pointeur.
Citation :
2. On dit que la variable tableau eset aussi un pointeur, donc pourquoi ne pas mettre long **tableau ? ça ferait un pointeur qui pointe sur un pointeur, ou un pointeur qui pointe sur un tableau, ou encore un tableau de pointeurs.
Citation :
3. Si j'ai bien compris, avec la boucle for, on va parcourir toutes les adresses du tableau et en retirer les valeurs grâce aux nombre dans les crochets qui augmentent avec la boucle ? En mémoire un tableau c'est un pointeur sur le premier élément. Les éléments suivant se suivent toujours en mémoire, donc les adresses sont toujours l'adresse du premier + 1, puis +2 etc.
Citation :
Je ne vois toujours pas l'utilité du pointeur, vu que tableau lui même est un pointeur et tableau = une adresse.Non ?
ça fonctionne aussi avec ça:
void affiche(long tableau[], long tailleTableau)
mais c'est la même chose. Dans les 2 cas on fait passer l'adresse mémoire du premier élément du tableau.
Citation :
Le programme tourne en boucle, pourtant j'ai bien spécifié ça à la fin :}while ( nombre != 1 || nombre!=2 || nombre!=3 || nombre!=4)
Ai-je fait une erreur ?
Oui,
c'est équivalent à ça boucle tant que nombre != 1 ou nombre !=2 ou...
Comme ce sont des OU, il suffit qu'une des conditions soit vérifiée pour que la boucle continue.
J'imagine que tu veux continuer à boucler lorsque nombre est différent de tous les chiffres, donc différent de 1, différent de 2, différent de 3 ET différent de 4.
Sinon on peut voir la logique inverse. Tu veux que la boucle s'arrête lorsque nombre == 1 OU nombre == 2 OU nombre ==3 OU nombre == 4. Comme on veux prendre l'opposé, les == deviennent != (et inversement), et les || deviennent && (et inversement).
Citation :
Sinon pour faire moins moche
Si je voulais retourner au début pour ne pas répéter le menu à chaque fois qu'on tape quelque chose de faux,
un goto conviendrait comme en batch ?
Non le goto toto; est à bannir !
parce que si tu en fais plusieurs, un lecteur ne comprendrait plus grand chose, au pire on peut faire un break;, mais à éviter si on peut simplement faire un while comme ici.
Re,
Merci à vous deux pour vos réponses claires.
Je crois avoir compris
(Erreur en effet très bête de ma part pour les conditions que j'avais mise
)
Juste une dernière question ;
Je ne vois pas l'utilité de le pratique rmais bon.
Si je voulais savoir l'adresse par exemple de tableau[3]
Un &tableau[3] marcherait ? Ou il faut procéder autrement pour les tableaux qui est un cas plus particulier de pointeurs.?
Merci à vous deux pour vos réponses claires.
Je crois avoir compris
(Erreur en effet très bête de ma part pour les conditions que j'avais mise
)Juste une dernière question ;
Je ne vois pas l'utilité de le pratique rmais bon.
Si je voulais savoir l'adresse par exemple de tableau[3]
Un &tableau[3] marcherait ? Ou il faut procéder autrement pour les tableaux qui est un cas plus particulier de pointeurs.?
Citation :
Je ne vois pas l'utilité de le pratique rmais bon.C'est surtout utilise pour tout ce qui est dynamique. Dans ton cas, le tableau a une taille fixe, mais si tu veux faire un tableau à taille variable selon certains cas, les pointeurs sont très utiles
Citation :
Si je voulais savoir l'adresse par exemple de tableau[3]Un &tableau[3] marcherait ?
oui ça marche, et c'est exactement la même chose que (tableau + 3).
Tiens ouais j'y avais même pas pensé.
Pour l'utilité de la pratique, je parlais de ma question sur l'adresse du tableau[3]
A peine ai-je voulu commencer un exo là dessus que ça veut pas compiler
Consigne : créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur).
Pour vous aider, voici le prototype de la fonction à créer :
long sommeTableau(long tableau[], long tailleTableau)
Peut-on m'aiguiller sans donner la réponse ?
D'ailleurs j'ai fait ça qui est nul évidemment mais bon :
#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est égale à %ld", sommeTableau(table, 6));
return 0;
}
long sommeTableau(long tableau[], long tailleTableau)
{
long i;
for (i=0; i<tailleTableau; i++)
{
printf ("%ld", tableau);
}
}
Et ya un message d'erreur :
1>Édition des liens en cours...
1>tableau.obj : error LNK2005: _main déjà défini(e) dans main.obj
1>C:\Users\Antoine\Documents\Visual Studio 2005\Projects\Test\Debug\Test.exe : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés.
C'est pas une faute dans le script apparemment et j'utilise visual c++
Pour l'utilité de la pratique, je parlais de ma question sur l'adresse du tableau[3]
A peine ai-je voulu commencer un exo là dessus que ça veut pas compiler
Consigne : créer une fonction sommeTableau qui renvoie la somme des valeurs contenues dans le tableau (utilisez un return pour renvoyer la valeur).
Pour vous aider, voici le prototype de la fonction à créer :
long sommeTableau(long tableau[], long tailleTableau)
Peut-on m'aiguiller sans donner la réponse ?
D'ailleurs j'ai fait ça qui est nul évidemment mais bon :
Citation :
#include <stdio.h>#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est égale à %ld", sommeTableau(table, 6));
return 0;
}
long sommeTableau(long tableau[], long tailleTableau)
{
long i;
for (i=0; i<tailleTableau; i++)
{
printf ("%ld", tableau);
}
}
Et ya un message d'erreur :
1>Édition des liens en cours...
1>tableau.obj : error LNK2005: _main déjà défini(e) dans main.obj
1>C:\Users\Antoine\Documents\Visual Studio 2005\Projects\Test\Debug\Test.exe : fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés.
C'est pas une faute dans le script apparemment et j'utilise visual c++
A oui cet exercice, je l'ai déjà fait aussi.
dans ta fonction main, tu fait appel 2 fois à la fonction sommeTableau.
Ensuite l'exercice dit qu'il faut que la fonction sommeTableau retourne la somme des valeurs du tableau et je vois aucune addition dans ta seconde fonction ?
Pour t'aider sur cet exercice voici à quoi doit ressembler ta fonction main :
Ensuite faut que ta seconde fonction fasse la somme des valeurs du tableau et renvoie cette somme.
dans ta fonction main, tu fait appel 2 fois à la fonction sommeTableau.
Ensuite l'exercice dit qu'il faut que la fonction sommeTableau retourne la somme des valeurs du tableau et je vois aucune addition dans ta seconde fonction ?
Pour t'aider sur cet exercice voici à quoi doit ressembler ta fonction main :
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est égale à %ld", somme);
return 0;
}
Ensuite faut que ta seconde fonction fasse la somme des valeurs du tableau et renvoie cette somme.
Oui, en effet, je n'ai pas trouvé comment faire, là je l'ai exposé surtout pour montrer le message d'erreur qui m'étonne .. d'habitude, c'est des erreurs de script mais là non apparemment.
En fait je vois comment obtenir les valeurs du tableau, mais après les aditionner, je vois pas comment faire ça dans une boucle en tout cas.
Et je ne vois pas non plus comment récupérer chaque valeur du tableau individuellement ou séparément. Car là, la fonction me mettrait toutes les valeurs à la suite.
En fait je vois comment obtenir les valeurs du tableau, mais après les aditionner, je vois pas comment faire ça dans une boucle en tout cas.
Et je ne vois pas non plus comment récupérer chaque valeur du tableau individuellement ou séparément. Car là, la fonction me mettrait toutes les valeurs à la suite.
JE vais te donner le programme :
regarde bien la fonction sommeTableau.
Cette formule, ce répète tant que i<taille du tableau :
somme=somme+tableau;
Donc ça fait :
0=0+5; i=0
5=5+6; i=1
11=11+9; i=2
20=20+4; i=3
24=24+5; i=4
29=29+3; i=5 la fonction s'arrète ici car i>tailleTableau
Donc la somme (32) est renvoyer dans la fonction main. Je sais pas si c'était bien expliquer. ^^
#include <stdio.h>
#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
long somme=0;
somme=sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %ld\n", somme);
system ("PAUSE");
return 0;
}
long sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau[i];
}
return somme;
}
regarde bien la fonction sommeTableau.
Cette formule, ce répète tant que i<taille du tableau :
somme=somme+tableau;
Donc ça fait :
0=0+5; i=0
5=5+6; i=1
11=11+9; i=2
20=20+4; i=3
24=24+5; i=4
29=29+3; i=5 la fonction s'arrète ici car i>tailleTableau
Donc la somme (32) est renvoyer dans la fonction main. Je sais pas si c'était bien expliquer. ^^
Merci, c'est très bien expliqué, je ne l'aurais en effet pas trouvé.
Si maintenant javais voulu multiplié toutes les valeurs entre elles, j'aurais juste eu à remplacer le + par * ?
++++++
Si j'avais voulu faire une moyenne de toutes les valeurs aditionnées (exercice 2).
ça aurait été bon ça ? :
return somme/(i + 1)
Et en mettant des doubles à la place des longs dans les variable et déclaration de fonction.
++++++++++++
ça aurait commencé à l'adresse [3] du tableau? en ayant dit que le tableau faisait 5 cases ?
++++++
J'ai essayé pour la moyenne ça marche pas
#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
long moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
system ("PAUSE" );
return 0;
}
long sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0, moyenne=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/(i+1);
return moyenne;
}
Si maintenant javais voulu multiplié toutes les valeurs entre elles, j'aurais juste eu à remplacer le + par * ?
++++++
Si j'avais voulu faire une moyenne de toutes les valeurs aditionnées (exercice 2).
ça aurait été bon ça ? :
return somme/(i + 1)
Et en mettant des doubles à la place des longs dans les variable et déclaration de fonction.
++++++++++++
Citation :
sommeTableau(tableau + 3, 5); ça aurait commencé à l'adresse [3] du tableau? en ayant dit que le tableau faisait 5 cases ?
++++++
J'ai essayé pour la moyenne ça marche pas
Citation :
#include <stdio.h>#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
long moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
system ("PAUSE" );
return 0;
}
long sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0, moyenne=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/(i+1);
return moyenne;
}
Heu tu sais comment on calcule une moyenne ? ^^
Tu doit diviser la somme par la taille du tableau. Et ton calcule de moyenne n'a rien à faire dans la boucle, justement elle doit être après la boucle.
et ici :
printf ("La moyenne des valeurs du tableau est egale a %ld\n", somme);
C'est la moyenne que tu veut afficher et pas la somme.
PS : Une moyenne est un double et pas long.
Tu doit diviser la somme par la taille du tableau. Et ton calcule de moyenne n'a rien à faire dans la boucle, justement elle doit être après la boucle.
et ici :
printf ("La moyenne des valeurs du tableau est egale a %ld\n", somme);
C'est la moyenne que tu veut afficher et pas la somme.
PS : Une moyenne est un double et pas long.
XmichouX a dit :
Ben c'est bien ce que j'ai fait non ?J'ai divisé la somme par i+1 <- la longueur du tableau non ?
Par contre oui en effet je me suis trompé pour la boucle
J'ai oublié d'éditer pour le somme désolé
mais ta formule va faire 32/7; et ton programme te diras :
La moyenne des valeurs du tableau est egale a 4.
C'est bien ça ? Alors que c'est faux.
Au lieu de ça :
moyenne= somme/(i+1);
Remplace^par :
moyenne=somme/tailleTableau;
C'est plus compréhensible et au moin c'est juste.
PS : N'oublie pas qu'une moyenne est un nombre décimale en règle générale.
Re,
Oui en effet, c'est exactement ça qu'il m'affichait, mais je ne comprends pas le I après la boucle ne fait pas 5 ?
Ce qui aurait fait i+1 = 6 , ou alors il fait 6 .. la boucle est réexécutée mais cette fois, rien n'es fait c'est ça? en voyant que la condition n'est plus remplie?
DOnc ce que tu m'as dit est tout à fait correct mais je pourrais aussi mettre i tout court ?
et oui je vais mettre des double
Je vous mets mon script final :
#include <stdlib.h>
double sommeTableau(doubletableau[], double tailleTableau);
int main (int argc, char *argv[])
{
double table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
system ("PAUSE" );
return 0;
}
double sommeTableau(double tableau[], double tailleTableau)
{
double i, somme=0.0, moyenne=0.0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i (àconfirmer) ; ou somme/tailleTableau
return moyenne;
}
Est-ce que ce code peut marcher ou je dois mettre .0 après chaque nombre ?
Oui en effet, c'est exactement ça qu'il m'affichait, mais je ne comprends pas le I après la boucle ne fait pas 5 ?
Ce qui aurait fait i+1 = 6 , ou alors il fait 6 .. la boucle est réexécutée mais cette fois, rien n'es fait c'est ça? en voyant que la condition n'est plus remplie?
DOnc ce que tu m'as dit est tout à fait correct mais je pourrais aussi mettre i tout court ?
et oui je vais mettre des double
Je vous mets mon script final :
Citation :
#include <stdio.h>#include <stdlib.h>
double sommeTableau(doubletableau[], double tailleTableau);
int main (int argc, char *argv[])
{
double table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
system ("PAUSE" );
return 0;
}
double sommeTableau(double tableau[], double tailleTableau)
{
double i, somme=0.0, moyenne=0.0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i (àconfirmer) ; ou somme/tailleTableau
return moyenne;
}
Est-ce que ce code peut marcher ou je dois mettre .0 après chaque nombre ?
Je corrige :
" 0=0+5; i=0
5=5+6; i=1
11=11+9; i=2
20=20+4; i=3
24=24+5; i=4
29=29+3; la fonction s'arrète ici sinon i>tailleTableau "
Ca c'était pour le premier dans le cas ou la taille du tableau = 4 donc i=4, mais la tout change car la taille de ton tableau=6 donc a la fin de la boucle i=6.
Donc oui tu peut mettre moyenne= somme/i ; ou bien
moyenne= somme/tailleTableau; c'est la même chose, mais je te conseille la seconde formulle (Plus claire).
Sinon pour ton programme ta 2 problèmes, i n'est pas un double mais bien un long. Et ici regarde bien :
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
Ton programme risque de t'afficher n'importenawak, je te laisse deviner pourquoi.
Sinon le .0 tu peut le mettre mais c'est inutile vue que c'est déjà un double.
" 0=0+5; i=0
5=5+6; i=1
11=11+9; i=2
20=20+4; i=3
24=24+5; i=4
29=29+3; la fonction s'arrète ici sinon i>tailleTableau "
Ca c'était pour le premier dans le cas ou la taille du tableau = 4 donc i=4, mais la tout change car la taille de ton tableau=6 donc a la fin de la boucle i=6.
Donc oui tu peut mettre moyenne= somme/i ; ou bien
moyenne= somme/tailleTableau; c'est la même chose, mais je te conseille la seconde formulle (Plus claire).
Sinon pour ton programme ta 2 problèmes, i n'est pas un double mais bien un long. Et ici regarde bien :
printf ("La moyenne des valeurs du tableau est egale a %ld\n", moyenne);
Ton programme risque de t'afficher n'importenawak, je te laisse deviner pourquoi.
Sinon le .0 tu peut le mettre mais c'est inutile vue que c'est déjà un double.
Re)
j'ai corrigé mais ça me met toujours 4
#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %lf \n", moyenne);
system ("PAUSE" );
return 0;
}
double sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0.0;
double moyenne=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i;
return moyenne;
}
j'ai corrigé mais ça me met toujours 4
Citation :
#include <stdio.h>#include <stdlib.h>
long sommeTableau(long tableau[], long tailleTableau);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %lf \n", moyenne);
system ("PAUSE" );
return 0;
}
double sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0.0;
double moyenne=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i;
return moyenne;
}
Voila j'ai tout corrigé, à toi de voir ou tu à fait faux.
#include <stdio.h>
#include <stdlib.h>
double moyenneTableau(long tableau[], long tailleTableau);
int main(int argc, char *argv[])
{
long tableau[6]={5,6,9,4,5,3};
double moyenne=0;
moyenne= moyenneTableau(tableau, 6);
printf("La moyenne du tableau est : %lf\n\n", moyenne);
system("PAUSE");
return 0;
}
double moyenneTableau(long tableau[], long tailleTableau)
{
long i;
double moyenne=0, somme=0;
for (i=0; i<tailleTableau; i++)
{
somme=somme+tableau[i];
}
moyenne=somme/i;
return moyenne;
}
#include <stdio.h>
#include <stdlib.h>
double sommeTableau(long tableau[], long tailleTableau); // Le prototype n'est pas le même que la fonction.
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=sommeTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %lf \n", moyenne);
system ("PAUSE");
return 0;
}
double sommeTableau(long tableau[], long tailleTableau)
{
long i, somme=0; /*somme est un double, si tu divise un long par un long, moyenne seras dans tout les cas 5.00000*/
double moyenne=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau[i];
}
moyenne= somme/i;
return moyenne;
}
Voila, la correction est en verre, maintenant modifie tes printf car c'est pas correct, et change aussi le nom de ta fonction.
Tant mieux alors
Je voulais être sûr. merci !
+++++++
J'ai essayé l'autre exercice : créer une fonction maximumTableau qui aura pour rôle de remettre à 0 toutes les cases du tableau ayant une valeur supérieure à un maximum. Cette fonction prendra en paramètre le tableau ainsi que le nombre maximum autorisé (valeurMax). Toutes les cases qui contiennent un nombre supérieur à valeurMax doivent être mises à 0.
Mais rien ne s'affiche pour le printf qui concerne justement cette nouvelle fonction:
#include <stdlib.h>
double moyenneTableau(long tableau[], long tailleTableau);
void maximumTableau(long tableau[], long tailleTableau, long valeurMax);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=moyenneTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %lf \n", moyenne);
system ("PAUSE" );
long youpi[5] = {4, 19, 26, 3, 5};
maximumTableau (youpi, 5, 6);
long i;
for (i=0; i<5; i++)
{
printf ("%ld", youpi);
}
return 0;
}
double moyenneTableau(long tableau[], long tailleTableau)
{
long i;
double moyenne=0, somme=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i;
return moyenne;
}
void maximumTableau(long tableau[], long tailleTableau, long valeurMax)
{
long i;
for (i=0; i<tailleTableau; i++)
{
if (tableau>=valeurMax)
{
tableau=0;
}
}
}
Je voulais être sûr. merci !
+++++++
J'ai essayé l'autre exercice : créer une fonction maximumTableau qui aura pour rôle de remettre à 0 toutes les cases du tableau ayant une valeur supérieure à un maximum. Cette fonction prendra en paramètre le tableau ainsi que le nombre maximum autorisé (valeurMax). Toutes les cases qui contiennent un nombre supérieur à valeurMax doivent être mises à 0.
Mais rien ne s'affiche pour le printf qui concerne justement cette nouvelle fonction:
Citation :
#include <stdio.h>#include <stdlib.h>
double moyenneTableau(long tableau[], long tailleTableau);
void maximumTableau(long tableau[], long tailleTableau, long valeurMax);
int main (int argc, char *argv[])
{
long table[6] = {5, 6, 9, 4, 5, 3};
double moyenne=0;
moyenne=moyenneTableau(table, 6);
printf ("La somme des valeurs du tableau est egale a %lf \n", moyenne);
system ("PAUSE" );
long youpi[5] = {4, 19, 26, 3, 5};
maximumTableau (youpi, 5, 6);
long i;
for (i=0; i<5; i++)
{
printf ("%ld", youpi);
}
return 0;
}
double moyenneTableau(long tableau[], long tailleTableau)
{
long i;
double moyenne=0, somme=0;
for(i=0; i<tailleTableau; i++)
{
somme=somme+tableau;
}
moyenne= somme/i;
return moyenne;
}
void maximumTableau(long tableau[], long tailleTableau, long valeurMax)
{
long i;
for (i=0; i<tailleTableau; i++)
{
if (tableau>=valeurMax)
{
tableau=0;
}
}
}
Oui je l'ai mis avant pour que ça fasse une pause avant de continuer.
Et normalement Visual C++ (que j'utilise) fait une pause automatiquement avant le return 0;
Je viens d'essayer en décalant le pause après, ça met toujours rien entre les deux pauses (celui mis par le code et celui mis automatiquement par visual)
Et normalement Visual C++ (que j'utilise) fait une pause automatiquement avant le return 0;
Je viens d'essayer en décalant le pause après, ça met toujours rien entre les deux pauses (celui mis par le code et celui mis automatiquement par visual)
ça ne change rien.
J'ai sûrement du faire un erreur.
Voici les erreurs données :
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(17) : error C2143: erreur de syntaxe : absence de ';' avant 'type'
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : error C2065: 'youpi' : identificateur non déclaré
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : warning C4047: 'fonction' : 'long *' diffère de 'int' dans les niveaux d'indirection
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : warning C4024: 'maximumTableau' : types différents pour le paramètre formel et réel 1
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(20) : error C2143: erreur de syntaxe : absence de ';' avant 'type'
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(21) : error C2065: 'i' : identificateur non déclaré
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(23) : error C2109: un indice requiert un type tableau ou pointeur
J'ai sûrement du faire un erreur.
Voici les erreurs données :
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(17) : error C2143: erreur de syntaxe : absence de ';' avant 'type'
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : error C2065: 'youpi' : identificateur non déclaré
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : warning C4047: 'fonction' : 'long *' diffère de 'int' dans les niveaux d'indirection
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(19) : warning C4024: 'maximumTableau' : types différents pour le paramètre formel et réel 1
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(20) : error C2143: erreur de syntaxe : absence de ';' avant 'type'
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(21) : error C2065: 'i' : identificateur non déclaré
1>c:\users\antoine\documents\visual studio 2005\projects\tableau\tableau\dfdf.c(23) : error C2109: un indice requiert un type tableau ou pointeur
Comprends pas alors
J'avais déjà eu pareil précédemment enfin .. ^^
Sinon en même temps, je viens de voir les char, les chaînes de caractère.
(siteduzero). Il répète que les chaînes de caractères sont des tableaux de char , pourtant la va "variable" stockée dans un scan f et dans un print f sont les mêmes.
Pour moi c'est comme si on disait adresse = valeur,
puisqu'on peut faire :
scanf ("%s", prenom);
et printf ("%s", prenom);
Le %s fait-il donc une sorte d'adaptation au scanf et printf ?
Je ne comprends pas pourquoi ce n'est pas plutôt:
printf ("%s, *prenom).
Pour les tableaux par exemple, on bien on faisait :
- &tableau[3]
- (tableau +3)
pour les adresse
et
- tableau[3]
- *(tableau + 3)
Or ici, c'est le nom du tableau tout seul qui donne toutes les valeurs de la variable. Si ça avait été un tableau tout court, ça aurait affiché l'adresse de la case "0", non ?
J'avais déjà eu pareil précédemment enfin .. ^^
Sinon en même temps, je viens de voir les char, les chaînes de caractère.
(siteduzero). Il répète que les chaînes de caractères sont des tableaux de char , pourtant la va "variable" stockée dans un scan f et dans un print f sont les mêmes.
Pour moi c'est comme si on disait adresse = valeur,
puisqu'on peut faire :
scanf ("%s", prenom);
et printf ("%s", prenom);
Le %s fait-il donc une sorte d'adaptation au scanf et printf ?
Je ne comprends pas pourquoi ce n'est pas plutôt:
printf ("%s, *prenom).
Pour les tableaux par exemple, on bien on faisait :
- &tableau[3]
- (tableau +3)
pour les adresse
et
- tableau[3]
- *(tableau + 3)
Or ici, c'est le nom du tableau tout seul qui donne toutes les valeurs de la variable. Si ça avait été un tableau tout court, ça aurait affiché l'adresse de la case "0", non ?
prenons une chaine:
c'est un table de char, si on y met une chaine "toto":
tu auras en fait:
le '\0' sert à marquer la fin d'une chaine de caractère.
str représente un pointeur, donc:
est juste, et vu qu'on a passé un "%s" comme format, scanf s'attend à une chaine, qu'il va stocker dans str, str+1, str+2, etc...
pour le printf, c'est pareil, le "%s" lui indique qu'il faut attendre un tableau de char, et un tableau est par définition (en C) un pointeur.
char str[256];
c'est un table de char, si on y met une chaine "toto":
char str[256]="toto";
tu auras en fait:
str[0]='t';
str[1]='o';
str[2]='t';
str[3]='o';
str[4]='\0';
le '\0' sert à marquer la fin d'une chaine de caractère.
str représente un pointeur, donc:
scanf ("%s", str);
est juste, et vu qu'on a passé un "%s" comme format, scanf s'attend à une chaine, qu'il va stocker dans str, str+1, str+2, etc...
pour le printf, c'est pareil, le "%s" lui indique qu'il faut attendre un tableau de char, et un tableau est par définition (en C) un pointeur.
Re,
Désolé d'encore vous ennuyer mais encore un problème avec visual ou c'est moi qui suis vraiment nul ? ..
J'ai fait quelque chose de tout simple juste pour tester des nouvelles choses apprises et à mon grand étonnement ça ne marche pas; pas pratique pour s'exercer
Voilà le c :
#include <stdlib.h>
#include "main.h"
int main ( int argc, char*argv[])
{
personne joueur1;
printf ("Salut Joueur1, quel est ton prenom ?");
scanf ("%s", joueur1.prenom);
printf ("Yo %s, et quel est nom ?", joueur1.prenom);
scanf ("%s", joueur1.nom);
printf ("Bien %s %s, et quel ton age?", joueur1.prenom, joueur1.nom);
scanf ("%ld", &joueur1.age);
printf ("Ok ! Une dernière question ! Etes-vous un homme ou une femme ?");
scanf ("%s", joueur1.sexe);
printf ("Ahhh.. a bientot !");
system ("PAUSE");
return 0;
}
Voilà le h :
struct personne
{
char prenom[25];
char nom[25];
long age;
char sexe[25];
};
Alors ça ne lance pas mon fichier (met encore plein d'erreurs) et ce qui est énervant c'est que ça lance un fichier que j'avais mis avant mais que j'ai supprimé puisque je l'ai remplacé par ce script là ^^
Désolé d'encore vous ennuyer mais encore un problème avec visual ou c'est moi qui suis vraiment nul ? ..
J'ai fait quelque chose de tout simple juste pour tester des nouvelles choses apprises et à mon grand étonnement ça ne marche pas; pas pratique pour s'exercer
Voilà le c :
Citation :
#include <stdio.h>#include <stdlib.h>
#include "main.h"
int main ( int argc, char*argv[])
{
personne joueur1;
printf ("Salut Joueur1, quel est ton prenom ?");
scanf ("%s", joueur1.prenom);
printf ("Yo %s, et quel est nom ?", joueur1.prenom);
scanf ("%s", joueur1.nom);
printf ("Bien %s %s, et quel ton age?", joueur1.prenom, joueur1.nom);
scanf ("%ld", &joueur1.age);
printf ("Ok ! Une dernière question ! Etes-vous un homme ou une femme ?");
scanf ("%s", joueur1.sexe);
printf ("Ahhh.. a bientot !");
system ("PAUSE");
return 0;
}
Voilà le h :
Citation :
typedef struct personne personne;struct personne
{
char prenom[25];
char nom[25];
long age;
char sexe[25];
};
Alors ça ne lance pas mon fichier (met encore plein d'erreurs) et ce qui est énervant c'est que ça lance un fichier que j'avais mis avant mais que j'ai supprimé puisque je l'ai remplacé par ce script là ^^
extrait du manuel de scanf correspondant au convertisseur %s:
Le pointeur associé doit être un pointeur sur char.
L'espace alloué à la réception de la chaîne saisie doit être assez grand pour contenir à la fois la séquence et le caractère de terminaison de chaîne ('\0', qui est ajouté automatiquement)
La séquence s'arrête lorsque scanf rencontre un caractère d'espacement, ou bien lorsque la longueur précisée (champ de taille vu plus haut) a été atteinte
Citation :
séquence de caractères différents d'un caractère d'espacement.Le pointeur associé doit être un pointeur sur char.
L'espace alloué à la réception de la chaîne saisie doit être assez grand pour contenir à la fois la séquence et le caractère de terminaison de chaîne ('\0', qui est ajouté automatiquement)
La séquence s'arrête lorsque scanf rencontre un caractère d'espacement, ou bien lorsque la longueur précisée (champ de taille vu plus haut) a été atteinte
Re
Désolé de vous embêter encore mais bon ^^
J'ai commencé un autre chapitre en C assez important, l'ouverture fermeture de fichier..
Hepdéjà un petit problème au début ..
J'ai testé ça :
#include <stdlib.h>
int main (int argc, char *argv[])
{
FILE *fichier = NULL;
fichier = fopen("C:\\Utilisateurs\\Antoine\\Documents\\test.txt", "r+");
if (fichier=NULL)
{
printf ("Impossible d'ouvrir le fichier !");
}
fclose("C:\\Utilisateurs\\Antoine\\Documents\\test.txt");
return 0;
}
Donc c'est tout simple.
Mais le compilateur m'affiche une erreur, le programme doit fermer etc ..
Note : J'ai volontairement appelé un fichier qui n'existe pas pour que le mesage d'erreur s'affiche.
Or, même quand j'enlève le Fclose (cette fois-ci plus de message d'erreur), mais le message ne s'affiche pas
Aurais-je fait une erreur ?
Merci et bonne soirée
Désolé de vous embêter encore mais bon ^^
J'ai commencé un autre chapitre en C assez important, l'ouverture fermeture de fichier..
Hepdéjà un petit problème au début ..
J'ai testé ça :
Citation :
#include <stdio.h>#include <stdlib.h>
int main (int argc, char *argv[])
{
FILE *fichier = NULL;
fichier = fopen("C:\\Utilisateurs\\Antoine\\Documents\\test.txt", "r+");
if (fichier=NULL)
{
printf ("Impossible d'ouvrir le fichier !");
}
fclose("C:\\Utilisateurs\\Antoine\\Documents\\test.txt");
return 0;
}
Donc c'est tout simple.
Mais le compilateur m'affiche une erreur, le programme doit fermer etc ..
Note : J'ai volontairement appelé un fichier qui n'existe pas pour que le mesage d'erreur s'affiche.
Or, même quand j'enlève le Fclose (cette fois-ci plus de message d'erreur), mais le message ne s'affiche pas
Aurais-je fait une erreur ?
Merci et bonne soirée
Re,
Je crois avoir fait ce que tu m'as dit.
#include <stdlib.h>
int main (int argc, char *argv[])
{
FILE *fichier = NULL;
fichier = fopen("C:\\Utilisateurs\\Antoine\\Documents\\test.txt", "r+");
if (fichier==NULL)
{
printf ("Impossible d'ouvrir le fichier !");
}
else
{
fclose(fichier);
}
return 0;
}
Normal que le message s'affice alors que le fichier est présent ?
J'ai essayé en mettant le close, dans le if, dans le if et dans le else, mais ça ne change pas, si plus de messages d'erreur
+++++++++
Sinon j'aurais une question pour un petit programme.
Il ya un moyen facile pour mettre une sorte de compteur de secondes ?
Ce serait pour un petit jeu.
Par exemple, je pose une question et je donne tant de secondes pour que l'utilisateur réponde, et ça passe à la suite du programme.
Merci
Je crois avoir fait ce que tu m'as dit.
Citation :
#include <stdio.h>#include <stdlib.h>
int main (int argc, char *argv[])
{
FILE *fichier = NULL;
fichier = fopen("C:\\Utilisateurs\\Antoine\\Documents\\test.txt", "r+");
if (fichier==NULL)
{
printf ("Impossible d'ouvrir le fichier !");
}
else
{
fclose(fichier);
}
return 0;
}
Normal que le message s'affice alors que le fichier est présent ?
J'ai essayé en mettant le close, dans le if, dans le if et dans le else, mais ça ne change pas, si plus de messages d'erreur
+++++++++
Sinon j'aurais une question pour un petit programme.
Il ya un moyen facile pour mettre une sorte de compteur de secondes ?
Ce serait pour un petit jeu.
Par exemple, je pose une question et je donne tant de secondes pour que l'utilisateur réponde, et ça passe à la suite du programme.
Merci
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumC vecteur de pointeurs
- ForumC les tableaux multidimensionnels
- ForumC liste chainee probleme pointeurs
- ForumC liste chainee, passage des pointeurs
- ForumTableau de pointeurs sur fonction en php
- ForumLes tableaux dans dreamweaver cs
- ForumLangage c deplacer pointeur tableaux
- ForumLiberer un tableau de pointeurs
- ForumInitialisation tableau de pointeurs
- articlesTableau de pointeurs c
- Voir plus