eishtein
Messages postés52Date d'inscriptiondimanche 6 décembre 2009StatutMembreDernière intervention23 janvier 2014
-
17 mai 2011 à 12:05
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 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
krimog
Messages postés1860Date d'inscriptionlundi 28 novembre 2005StatutMembreDernière intervention14 février 201549 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é. -