Kommunauty
Connexion
Inscription

CreationDeListesTaille100 (langage C#)


Faandemanga Messages : 35

Bonjour,

Es ce que quelqu'un aurait une alternative à ce code:

  static void CreationDeListesTaille100(List<int> liste, int x)
        {
            int n = 1, i = 0;

            while (i < 100)
            {

                liste[i] = (x * n);
                n++;
                i++;
            }      


        }

J'ai d'abord pensé que c'était la boucle for qui n'était pas capable d'incrémenter 2 variables à la fois,

alors je l'ai remplacé par une boucle while mais je ne tombe toujours sur la même exception.

Si quelqu'un a une idée.

PS:Je sais pas comment faire pour copier l'exception.

samedi 9 novembre 2013 (Dernière édition samedi 9 novembre 2013)

Homer Messages : 1814

Heu, tu as quoi comme erreur ? je vois pas ce qui cloche là dans le code.

J'ai juste un doute dans ta déclaration de la fonction (List liste, int x) le List liste veux dire quoi  ? tableau de int ?

samedi 9 novembre 2013

Faandemanga Messages : 35

Oui c'est ça.

A la génération il y a pas de problème mais lorsque je compile j'obtiens l'exception(copié à la main):

Unhandled Exception: System.ArgumentOutOfRange Exception::

Index was out of range. Must be non-negative and less than the size of the collection.

Parameter name:index

at System.ThrowHelper.ThrowArgumentOutOfRangeException<>

at MaPremiereApplication:Program.CreationDeListesTaille100

at MaPremiereApplication.Proram.Main in C:\Users\Public\Programmation\ApplicationBIS\ApplicationBIS\Program.cs:line18

Sinon voilà l'intégralité du code:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;

namespace MaPremiereApplication
{
    class Program
    {
        static void Main(string[] args)
        {

            int chiffre;


            List<int> a = new List<int>();
            List<int> b = new List<int>();
            CreationDeListesTaille100(a, 3);
            CreationDeListesTaille100(b, 5);

            Console.WriteLine(CalculSommeEntiersCommunListes(a, b));



        }
        static void CreationDeListesTaille100(List<int> liste, int x)
        {
            int n = 1, i = 0;

            while (i < 100)
            {

                liste[i] = (x * n);
                n++;
                i++;
            }      


        }

        static int CalculSommeEntiersCommunListes(List<int> liste1, List<int> liste2)
        {
            int sommeEntiersC = 0, i = 0;
            for (i = 0; i < liste1.Count || i < liste2.Count; i++)
            {
                if (liste1[i] == liste2[i])
                    sommeEntiersC = sommeEntiersC + (liste1[i] + liste2[i]);
            }

            return sommeEntiersC;

        }






    }
}

samedi 9 novembre 2013

Homer Messages : 1814

Je vais peut être te dire une connerie, mais, tu passe ton tableau en paramètre, tu lui donne des valeurs, mais il n'y a aucun retour, donc quand tu exécutes ta dernière fonction, a et b n'aurons pas de valeur...

Sinon, je vois pas ou ça merde. Tu est sur pour la déclaration du tableau dans les paramètre de ta fonction ?

samedi 9 novembre 2013

Vanyali Messages : 1298

l'erreur donnée c'est parce que tu instancie des tableau vide donc avec une seule case mémoire. normalement ça devrais marcher avec ces deux ligne là à la place des anciennes :

 
List<int> a = new List<int>(100);
List<int> b = new List<int>(100);

par contre ce que dis hommer, je ne pourrait pas dire si c'est pareil en C# qu'en C ou C++, il y a un système de pointeurs référence et variables locales ou tout est référence en C# comme en Java (si tu ne comprends pas ce que je te pose comme question, ça répondra a ma question )

samedi 9 novembre 2013

Faandemanga Messages : 35

J'ai essayé mais ça ne change rien la génération réussi mais lors de la compilation j'ai toujours cette exception.

Sinon oui en C# il y a pas de pointeurs comme en Java.

dimanche 10 novembre 2013

Vanyali Messages : 1298

Une solution plus dynamique pour ta fonction serait la suivante :

        static void CreationDeListesTaille100(List<int> liste, int x)
        {
           liste.clear();
           for(int i = 0; i < 100; i ++)
            {
                liste.add(x * i);
            }      
        }

Le add rajoute à la fin de la liste un élément et si la liste est trop petite, il l'agrandis donc tu ne pourra pas avoir l'erreur qui te dis que tu a dépassé la capacité de la liste (sauf si tu dépasse la capacité de la mémoire mais c'est quasiment impossible et ça sera pas exactement la même erreur '). le liste.clear() c'est pour vider le tableau s'il y a déjà quelquechose dedans pour que ça redémarre à l'indice 0.

D'ailleurs, dans la seconde fonction il y a une erreur de logique,

for (i = 0; i < liste1.Count || i < liste2.Count; i++)

Ça, si i dépasse la taille de liste1, et qu'il ne dépasse pas la taille de liste2, le code va planter quand tu va faire :

if (liste1[i] == liste2[i])

Parce que comme c'est un OU, il va voir que la première condition n'est pas vérifié, mais il faut qu'au moins une des deux soit vérifiée. et comme l'autre est vraie, alors il passe la condition et rentre dans la boucle for. et quand il va chercher liste1[i], il va te dire que tu est sortis des limites de la liste (ArgumentOutOfRangeException) c'est donc un && qu'il faut mettre car les deux condtioons doivent être vraies pour continuer à boucler

dimanche 10 novembre 2013

Faandemanga Messages : 35

Merci

Cette fois ci le programme à marché mais j'obtiens 0 à l'écran...

dimanche 10 novembre 2013

Vanyali Messages : 1298

C'est normal, dans ton cas la condition : if (liste1[i] == liste2[i]) ne sera jamais vraie (sauf si les deux valent 0).

en effet, tu commence avec une liste à 3 et une à 5, celle à 5 augmentant plus vite, les deux valeurs seront toujours différentes, on va prendre l'exemple avec les 10 premières valeurs :

liste1 à pour 5 premières valeurs 3,6,9,12,15, et liste2 : 5,10,15,20,25 on vois bien qu'il y a 15 en commun.

cependant toi, tu parcours les deux tableau avec la même variable donc tu teste : 3 == 5, 6 == 10, 9 == 15, 12 == 20 et 15 == 25. Aucun de ces tests ne sont vrai. il faut que tu commence par tester toute les valeur de la liste liste2 avec la première valeur de liste1 puis pareil avec la seconde valeur, la troisième,...

comme ça on fera les tests 3==5, 3==10, 3==15,..., 6==5, 6==10, 6==15,..., 9==5,..., 12==5,..., 15 == 5, 15==10, 15==15, 15==20,.......

et là il trouvera toutes les valeur en commun. je te laisse chercher comment faire, vu que tu est dans l'apprentissage mieux vaut que tu trouve par toi même plutôt que je te donne directement la solution

dimanche 10 novembre 2013 (Dernière édition dimanche 10 novembre 2013)

Faandemanga Messages : 35

Je me suis trompé j'ai refais mon code:

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System;

namespace MaPremiereApplication
{
    class Program
    {
        static void Main(string[] args)
        {

            int chiffre;


            List<int> a = new List<int>(100);
            List<int> b = new List<int>(100);
            CreationDeListesTaille100(a, 3);
            CreationDeListesTaille100(b, 5);

            Console.WriteLine(CalculSommeEntiersCommunListes(a, b));



        }
      
        static void CreationDeListesTaille100(List<int> liste, int x)
        {
            liste.Clear();
            for (int i = 0; i < 100; i++)
            {
                liste.Add(x * i);
            }
        }


        static int CalculSommeEntiersCommunListes(List<int> liste1, List<int> liste2)
        {
            int sommeEntiersC = 0, i = 0, x = 0;
            for (i = 0; i < liste1.Count ; i++)
            {
                if (liste1[x] == liste2[i])
                    sommeEntiersC = sommeEntiersC + (liste1[x] + liste2[i]);
                i = 99;
            }

            if (i == 99)
            {
                i = -1;
                x++;
            }

            return sommeEntiersC;
           
        }
        
    }
}

Mais le problème c'est que j'obtiens encore 0!

lundi 11 novembre 2013

Page suivante »