Kommunauty
Connexion
Inscription

CreationDeListesTaille100 (langage C#)


Vanyali Messages : 1298

Hum, je ne sait pas quoi te dire, j'ai pas vraiment le temps de t'expliquer là, mais ta fonction CalculSommeEntiersCommunListes est fausse même s'il y a de l'idée. il y a plusieurs grosses erreurs (enfin une grosse erreur) et l'autre problème c'est plus au niveau de la logique. je trouve un moyen de t'expliquer ça parce que je vois bien que tu n'as pas compris, et juste te dire comment faire ça ne t'aidera pas à retenir je pense. Je vais essayer de voir pour te donner un indice pour te faire trouver la solution par toi même

mercredi 13 novembre 2013

Faandemanga Messages : 35

Je crois que j'ai réussi avec ce code:

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

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


            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)
        {
            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; x < liste1.Count; i++)
            {
                if (liste1[x] == liste2[i])
                {
                    sommeEntiersC = sommeEntiersC + (liste1[x] + liste2[i]);
                    i = 99;
                }

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

            }
            return sommeEntiersC;
        }
    }
}

J'ai obtenu 5700.

J'ai réessayé avec des tableaux de taille10 et j'obtiens bien 30.

Mais normalement je devrais obtenir 315 avec des tableaux de taille100 alors je sais pas vraiment si c'est moi qui me suis planté ou bien c'est l'instructeur du TP.

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

Vanyali Messages : 1298

Ce que tu a fait là semble correct, après il existe une version plus simple à comprendre et moins risquée en fait

Après, ta solution est pas mal dans le sens ou tu coupe directement quand il a trouvé une égalité. Dans ton cas ça marche mais dans un tableau normal, qui te dis que les nombres sont triés ? que tu ne trouvera pas deux fois le même nombre dans la liste ?

Ensuite ta fonction a quelques choses qui sont assez "dangereuses" et à ne pas faire dans un programme plus complexe :

  • Le for incrémente une variable et fait le test sur une autre. ça peut amener à une boucle infinie si c'est mal géré.
  • Modifier les variables utilisés dans la condition du for est assez déconseillé, dans ce cas mieux vaut utiliser un while, c'est plus par convention qu'autre chose, mais les for deviennent plus clair si tu ne peut pas sauter de nombre ni revenir en arrière, surtout que tu pourrait sortir de la zone testable ou revenir toujours au même point et donc finir dans une boucle infinie

Voilà la façon que j'aurais fait moi, avec deux boucles imbriquées :


static int CalculSommeEntiersCommunListes(List<int> liste1, List<int> liste2)
        {
            int sommeEntiersC = 0, i = 0, x = 0;
            for (x = 0; x < liste1.Count; x++)//pour chaque case du premier tableau
            {
                for (i = 0; i < liste2.Count; i++)//pour chaque case du second tableau
                {
                    if (liste1[x] == liste2[i])//on fait le test entre les deux
                    {
                            sommeEntiersC = sommeEntiersC + (liste1[x] + liste2[i]);
                    }
                }
            }
            return sommeEntiersC;
        }

Teste avec ça si ça fonctionne

samedi 16 novembre 2013

Faandemanga Messages : 35

Merci pour ton soutien et tes conseilles Vanyali. Tu m'as beaucoup aidé!

samedi 16 novembre 2013

Ideophage Messages : 115

Je crois que ce qui importe à l'OP est d'avoir un truc qui fonctionne, mais je précise quand même qu'il existe une meilleure solution. J'ai lu en diagonale les posts de ce sujet, je vois juste le post de Vanyali qui donne la fonction CalculSommeEntiersCommunListes. La solution de Vanyali est quadratique, il existe une solution quasi-linéaire (en triant les listes puis en les parcourant en parallèle) :

static int CalculSommeEntiersCommunListes(List<int> liste1, List<int> liste2)
{
    int sommeEntiersC = 0;

    liste1.Sort();
    liste2.Sort();

    for (int i1 = 0, i2 = 0; i1 < liste1.Count; i1++)
    {
        while (i2 < liste2.Count && liste2[i2] < liste1[i1])
            i2++;

        while (i2 < liste2.Count && liste2[i2] == liste1[i1])
        {
            sommeEntiersC += liste1[i1] + liste2[i2];
            i2++;
        }
    }

    return sommeEntiersC;
}
lundi 18 novembre 2013

Vanyali Messages : 1298

disons que moi j'ai la version simple ' le but c'est surtout de faire comprendre après, les algorithme plus efficaces c'est plus à étudier par la suite, déjà comprendre les bases c'est bien

lundi 18 novembre 2013

Ideophage Messages : 115

Hum. Oui, désolé.

[edit]

Je vais rédiger un mini-tuto sur les algorithmes où je vais expliquer l'exemple donné ici. (mais je ne sais pas quand je vais le mettre en ligne)

lundi 18 novembre 2013 (Dernière édition lundi 18 novembre 2013)

Répondre Pour répondre, tu dois d'abord t'inscrire rapidement sur Kommunauty. Rejoins-nous vite !