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   -
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;
}

1 réponse

[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut geekon,

La fonction (qui est dans ton code) "void tri_selection(int table[],int n)" ne t'inspire pas ?


Dal
0
geekon Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Bonsoir,
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");

}
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
Salut geekon,

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
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
@[Dal],
Je savais pas qu'en C, on pouvait faire des références ;-).
0
geekon Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Merci Dall :)
0
[Dal] Messages postés 6205 Date d'inscription   Statut Contributeur Dernière intervention   1 105
 
@fiddy : hehe, ok, alors on pourrait être plus orthodoxe en disant :

- 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
0