Ensemble d'entiers...

eishtein Messages postés 52 Date d'inscription dimanche 6 décembre 2009 Statut Membre Dernière intervention 23 janvier 2014 - 17 mai 2011 à 12:05
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 - 17 mai 2011 à 17:48
bonjour les gars;
j'aimerais bien si vous m'aidiez à resoudre un probleme concernant des tests sur des classe représentant des listes chainées de nbrs entires naturels...
voici la définition de ma classe :
public class list
{
public int[]vect;
public list suiv;

}
public class EnsembleInts
{
public list lst;
public int sigma;
public EnsembleInts()
{
lst.vect=new int[5];
sigma=0;
}
public EnsembleInts(int[] x)//please take a second look to this fucking method...it really sucks XD
{

lst=new list();
lst.vect=new int[5] ;
sigma=x.Length;

int j;

int i;

j=0;

while(j<5)
{
lst.vect[j]=x[j];
j++;



}

//cas ou la taille de 'x' est supperieure à 5 :

if(x.Length>5){
list l1=new list();
list l2=lst;

int h=0;

while(h<(sigma/5)+1)
{

i=0;
l1=new list();
l1.vect=new int[5];

while(i<5&&j<taille())
{
l1.vect[i]=x[j];
j++;
i++;

}
h+=sigma/j;


lst.suiv=l1;
l1.suiv=lst;
l1.suiv=l2;
lst=l1;



}
//					sigma++;
}
else lst.suiv=null;

}
public EnsembleInts(EnsembleInts e)
{
lst.vect=new int[5];
sigma=0;
int i,j;
i=0;
while(e.lst!=null)
{
j=0;
while(j<5)
{
lst.vect[j]=e.lst.vect[i];
j++;
i++;
sigma++;
}
lst=lst.suiv;

e.lst=e.lst.suiv;
}
}
public static EnsembleInts operator + (EnsembleInts a,int b)
{
list  prec=null,svt=a.lst;
EnsembleInts a1=a;
while(svt!=null )
{
prec=svt;
svt=svt.suiv;
}
int j=0;
e:if(a.lst.suiv!=null)
{


a1.lst.suiv.vect[j]=b;
a.sigma++;
a1.lst.suiv.suiv=svt;}
if(a.lst.vect.Length>5)
{
a1.lst=a1.lst.suiv;
a.lst=a.lst.suiv;
goto e;
}
return a1;
}

public int taille()
{
return sigma;
}
public void afficher()
{
EnsembleInts P=this;

 int i;
 int j=0;
 while(P.lst!= null && j<P.taille())
{
i=0;
while(i<5&&j<=P.taille()+1)
{

Console.WriteLine(P.lst.vect[i]);
i++;

}
P.lst=P.lst.suiv;
j+=i;
}
}

}


le problème avec ma classe c'est que je n'arrive pas à ajouter le nouveau mini vecteur d'ensemble à la fin mais au début..[bon , j'avoue qu ec un peu compliqué en c# que dans d'autres langages si on implémente notre propre structure].
je vous serais donc très reconnaissant de vouloir m'aider à resourdre ce problème...
ET MERCI D'AVANCE
EISHTEIN

1 réponse

krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
17 mai 2011 à 17:48
Salut

Déjà, commençons par le commencement :
- Ton code n'est pas commenté (à part 1 commentaire, et un autre qui ne sert à rien).
- Les membres de tes classes sont public. Sauf cas exceptionnels, les membres doivent être privés, et accessibles via des propriétés publiques.
- En C#, les classes, les propriétés et les méthodes commencent par une majuscule.
- Pour récupérer la taille, il aurait fallu faire soit une propriété Taille en lecture seule (meilleure solution), soit appeler ta méthode GetTaille().
- Tu fais initialise j, puis tu fais un while (condition) à la fin duquel tu fais j++... Pourquoi ne pas faire un for, qui est justement fait pour ça ? En l'occurrence for(j = 0; j < 5; j++)
- Plutôt que de créer un constructeur qui prend comme argument un tableau, autant en faire un qui prend un IEnumerable. Ainsi, non seulement il acceptera les tableaux, mais également les List ou toute autre classe implémentant cette interface.
- Tu devrais donner un nom moins générique à ta classe "list"

Quant à ton code, entre le manque de commentaire, les variables non explicites (x, i, j, h, l1, l2...), les calculs non pas complexes mais pas du tout intuitifs, il en est presque illisible.

Voici une façon de créer ce deuxième constructeur :
/// <summary>
/// Constructeur initialisant un EnsembleInts à partir des données d'un IEnumerable
/// </summary>
/// Données source


public EnsembleInts(IEnumerable source)
{
    list finListe = null; // Référence vers le dernier élément de la liste chainée. Null puisque liste vide lors de sa création
    list listTemporaire = null; // Element temporaire de la liste chainée
    int indicePlacement = 0; // Indice où placer le prochain entier dans le tableau de l'élément courant (entre 0 et 4)

    // On traite un par un les entiers de la source
    foreach (int entier in source)
    {
        // Si l'entier doit être placé dans le premier indice du tableau, on crée un nouvel élément à la liste chainée
        if (indicePlacement == 0)
        {
            listTemporaire = new list();
            listTemporaire.vect = new int[5];
            listTemporaire.suiv = null;

            // On place ce nouvel élément à la fin de la liste chainée
            if (finListe == null) // Premier élément
            {
                lst = listTemporaire;
            }
            else // S'il y a déjà des éléments dans la liste chainée
            {
                finListe.suiv = listTemporaire;
            }

            // On indique que le dernier élément a changé
            finListe = listTemporaire;
        }

        listTemporaire.vect[indicePlacement] = entier;

        indicePlacement++;
        // Une fois qu'on a placé 5 éléments, on revient à un indice de 0, pour le nouvel élément
        if (indicePlacement 5) indicePlacement 0; 
    }

    sigma = source.Count();
}


Cette méthode est plus simple, plus courte, plus compréhensible, mieux commentée et probablement plus performante. Après, c'est une question d'habitude, ça viendra.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
Rejoignez-nous