Problème avec les fonctions
Résolu
geekon
Messages postés
25
Date d'inscription
Statut
Membre
Dernière intervention
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
ce bout de programme n'est pas complet, il demande à l'utilisateur de remplir un tableau puis lui demande de choisir entre tri par selection, tri shell, tri rapide, tri comptage pour trier le tableau(j n'ai pas encore fini sur ce point là) il doit à la fin demander à l'utilisateur s'il veut remplir à nouveau un tableau etc... ou s'il veut quitter (j'ai pas fait ça aussi), il est exécutable parcontre, pour le moment je veut juste utiliser une fonction affiche_tableau qui contient ça" for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}"
et une fonction remplir_tableau qui contient ça
"do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n ",i+1);
scanf("%d",&table[i]);"
et non pas les mettre directement dans main, j'ai déja essayer mais sans résultat (je ne peut pas encore manipuler les fonctions facilement), comment faire svp je suis novice en c.
Merci d'avance.
voila:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
void tri_selection(int table[],int n)
{
int i,min,j,tmp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if (table[j]<table[min])
min=j;
if (min!=i)
{
tmp=table[i];
table[i]=table[min];
table[min]=tmp;
}
}
}
int main()
{
int table[100],tri,n,i;
do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n ",i+1);
scanf("%d",&table[i]);
}
printf("Merci, maintenant etape suivante...\n\n");
system("PAUSE");
printf("\nVeuillez choisir le type de tri que le programme va effectuer...\n\n");
Sleep(1000);
printf("Le nombre 0 refere au Tri de selection\n\n");
Sleep(500);
printf("Le nombre 1 refere au Tri shell\n\n");
Sleep(500);
printf("Le nombre 2 refere au Tri rapide\n\n");
Sleep(500);
printf("Le nombre 3 au Tri comptage\n\n");
tri=getch();
switch(tri){
case '0': printf("Vous avez choisi le Tri par selection.\n");
tri_selection(table,n);
break;
case '1':printf("Vous avez choisi le Tri shell.\n\n");
break;
case '2':printf("Vous avez choisi le Tri rapide.\n\n");
break;
case '3':printf("Vous avez choisi le Tri comptage.\n\n");
break;
default:printf("Entrer un nombre entre 0 et 3...\n\n");
}
for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}
system("PAUSE");
return 0;
}
ce bout de programme n'est pas complet, il demande à l'utilisateur de remplir un tableau puis lui demande de choisir entre tri par selection, tri shell, tri rapide, tri comptage pour trier le tableau(j n'ai pas encore fini sur ce point là) il doit à la fin demander à l'utilisateur s'il veut remplir à nouveau un tableau etc... ou s'il veut quitter (j'ai pas fait ça aussi), il est exécutable parcontre, pour le moment je veut juste utiliser une fonction affiche_tableau qui contient ça" for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}"
et une fonction remplir_tableau qui contient ça
"do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n ",i+1);
scanf("%d",&table[i]);"
et non pas les mettre directement dans main, j'ai déja essayer mais sans résultat (je ne peut pas encore manipuler les fonctions facilement), comment faire svp je suis novice en c.
Merci d'avance.
voila:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
void tri_selection(int table[],int n)
{
int i,min,j,tmp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if (table[j]<table[min])
min=j;
if (min!=i)
{
tmp=table[i];
table[i]=table[min];
table[min]=tmp;
}
}
}
int main()
{
int table[100],tri,n,i;
do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n ",i+1);
scanf("%d",&table[i]);
}
printf("Merci, maintenant etape suivante...\n\n");
system("PAUSE");
printf("\nVeuillez choisir le type de tri que le programme va effectuer...\n\n");
Sleep(1000);
printf("Le nombre 0 refere au Tri de selection\n\n");
Sleep(500);
printf("Le nombre 1 refere au Tri shell\n\n");
Sleep(500);
printf("Le nombre 2 refere au Tri rapide\n\n");
Sleep(500);
printf("Le nombre 3 au Tri comptage\n\n");
tri=getch();
switch(tri){
case '0': printf("Vous avez choisi le Tri par selection.\n");
tri_selection(table,n);
break;
case '1':printf("Vous avez choisi le Tri shell.\n\n");
break;
case '2':printf("Vous avez choisi le Tri rapide.\n\n");
break;
case '3':printf("Vous avez choisi le Tri comptage.\n\n");
break;
default:printf("Entrer un nombre entre 0 et 3...\n\n");
}
for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}
system("PAUSE");
return 0;
}
A voir également:
- Problème avec les fonctions
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Fonction si avec ou - Guide
- Les fonctions excel en anglais - Guide
- Mise en forme conditionnelle avec fonction si - Guide
- Fonctions excel - Guide
Au fait j'ai essayé, mais rien... ici le programme demande de remplir le tableau de choisir le tri à faire et il affiche quel tri j'ai choisi, mais il ne retourne pas un résultat (affichage du tableau trier).
De l'aide sur ce point svp ^^...
Voila:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
int remplir_tableau(int table[100],int n)
{
int i;
do
{printf("Veuillez entrer la taille du tableau...\n");
scanf("%d",&n);
printf("Taille du tableau: -%i-\n\n",n);
}
while (n>=100);
Sleep(1000);
for (i=0;i<n;i++)
{
printf("Veuillez entrer l'element %d \n %d)",i+1,i+1);
scanf("%d",&table[i]);
}
}
int affiche(int table[],int n)
{
int i;
for (i=0; i<n; i++)
{
printf("%d ",table[i]);
}
}
void tri_selection(int table[],int n)
{
int i,min,j,tmp;
for (i=0;i<n-1;i++)
{
min=i;
for(j=i+1;j<n;j++)
if (table[j]<table[min])
min=j;
if (min!=i)
{
tmp=table[i];
table[i]=table[min];
table[min]=tmp;
}
}
}
int main()
{
int table[100],tri,n,i;
remplir_tableau(table,n);
printf("Merci, maintenant etape suivante...\n\n");
system("PAUSE");
printf("\nVeuillez choisir le type de tri que le programme va effectuer...\n\n");
Sleep(1000);
printf("Le nombre 0 refere au Tri de selection\n\n");
Sleep(500);
printf("Le nombre 1 refere au Tri shell\n\n");
Sleep(500);
printf("Le nombre 2 refere au Tri rapide\n\n");
Sleep(500);
printf("Le nombre 3 au Tri comptage\n\n");
tri=getch();
switch(tri){
case '0': printf("Vous avez choisi le Tri par selection.\n");
tri_selection(table,n);
break;
case '1':printf("Vous avez choisi le Tri shell.\n\n");
break;
case '2':printf("Vous avez choisi le Tri rapide.\n\n");
break;
case '3':printf("Vous avez choisi le Tri comptage.\n\n");
break;
default:printf("Entrer un nombre entre 0 et 3...\n\n");
}
affiche(table,n);
system("PAUSE");
}
Tu y es presque :-)
1.
Ton problème vient de ta fonction remplir_tableau.
Vu que ta fonction va modifier les valeurs de "table" et de "n", tu dois passer des références aux variables (des pointeurs).
Comme "table" est un tableau, tu n'as rien à faire pour cet argument (tu passes en fait déjà un pointeur sur le premier élément du tableau).
En revanche, pour "n", qui est un entier, tu dois spécifier dans ta définition de fonction qu'elle attend un pointeur sur un entier, et non un entier (int * n).
Du coup, dans ton code, tu dois de plus :
- modifier l'appel à cette fonction dans main pour passer une référence à n (en utilisant &n)
- modifier le code dans ta fonction remplir_tableau pour déréférencer n (en utilisant *n)
2.
Les autres fonctions ne modifient pas les valeurs passées, ou seulement le tableau, qui est déjà passé par référence.
3.
Il y a aussi les problème suivants, qui ont dû t'être signalés par ton compilateur si tu compiles avec les avertissements, et que tu devrais résoudre pour avoir un code plus propre :
- à la fin de ta fonction main, fais "return 0;" (après ton "system("PAUSE");")
- si tes fonctions ne retournent rien, déclare le type de valeur de retour comme étant "void" et non "int".
- c'est une bonne habitude de mettre des "break" à la fin de chaque "case", et même du "default", même si dans ton cas ci-dessus un pass-through n'occasionne pas de problèmes (on ne sais jamais quelles modifications du code peuvent être faites plus tard)
- tu déclares une variable "i" que tu n'utilises pas
Dal
Je savais pas qu'en C, on pouvait faire des références ;-).
- l'opérateur unaire & donne l'adresse d'un objet (d'une variable dans notre cas) en mémoire
- cette adresse peut être affectée à un pointeur
- c'est ce qui se produit en passant celle-ci à une fonction dont les paramètres sont déclarés comme des pointeurs
- l'opérateur unaire * est l'opérateur de déréférencement (ou d'indirection), permettant notamment à partir d'un pointeur contenant l'adresse d'un objet, d'accéder à l'objet pointé par ce pointeur
- ce procédé permet de modifier les valeurs de l'objet à l'intérieur de la fonction appelée, quand bien même il est déclaré dans la fonction appelante
... pas sûr que cela soit plus clair, mais bon.
Tiens, pour information en Perl, ou on appelle les pointeurs ou emplacements mémoire de données des "références" : http://oreilly.com/catalog/advperl/excerpt/ch01.html
Et après tout, si on peut déréférencer en C avec l'opérateur *, c'est bien qu'on a pu référencer au préalable. On a beau programmer, on a quand même le droit de parler français :-D
Dal