C# na c++ Pomocy


(Bea27 1968) #1

Czy ktoś mi pomoze jak to bedzie wyglądać w c++?? ;/

public void FindNumbers()

{

startTime = DateTime.Now;

this.ResetVariables();

int searchedSum = NumbersSum / 2;

bool[] usedIndexes = new bool[Numbers.Length];

int percentComplete = 0;

for (int i = 0; i < Numbers.Length; i++)

{

FindNumbers(i, 0, searchedSum, usedIndexes);

percentComplete = (int)(((float)((i + 1) * 2) / (float)(Numbers.Length * 2)) * 100);

this.OnProgressChanged(this, new ProgressChangedEventArgs(percentComplete));

}

stopTime = DateTime.Now;

}

public void FindNumbers(int currentIndex, int currentSum, int searchedSum, bool[] usedIndexes)

{

bool goFurther = true;

currentSum += Numbers[currentIndex];

usedIndexes[currentIndex] = true;

if (currentSum == searchedSum)

{

Results.AddResultItem(usedIndexes, Numbers);

goFurther = false;

}

else if (currentSum > searchedSum)

goFurther = false;

if (goFurther)

{

for (int i = 0; i < usedIndexes.Length; i++)

{

if (!usedIndexes_)_

this.FindNumbers(i, currentSum, searchedSum, usedIndexes);

}

}

usedIndexes[currentIndex] = false;

}


(Tomek Matz) #2

Ten kod jest nieaktualny, bo już go zmieniłem. Tu jest aktualna wersja http://forum.dobreprogramy.pl/algorytm-nawrotami-t437472-15.html#p2781593. Jest tam też nowa wersja programu.

Jak będziesz zamieniał na C++ to tych linijek nie potrzebujesz:

if (currentIndex == 0)

{

     int percentComplete = (int)(((float)(i * 2) / (float)((Numbers.Length - 1) * 2)) * 100);

     this.OnProgressChanged(this, new ProgressChangedEventArgs(percentComplete));

}

Spróbuj zamienić to sam, bo na prawdę nie ma tu żadnych dostępnych tylko dla C# typów danych/klas.


(Bea27 1968) #3

ok dzięki popróbuje zmienić ale w ogóle nie znam się na c#;/


(Tomek Matz) #4

Tu akurat użyta jest taka składnia, że nie powinieneś mieć żadnych problemów, mimo tego, że się nie znasz na C#. Dodam tylko, że Numbers to tablica int-ów (przechowuje liczby wprowadzone przez użytkownika), a NumbersSum to suma wszystkich tych liczb. Istotne też jest, że tablica usedIndexes przekazywana jest do metody FindNumbers przez referencję. Zacznij od tego, że zamień sobie ten kod (odrobinę odchudzona wersja kodu z linku, który podałem wyżej):

public void FindNumbers()

{

    int searchedSum = NumbersSum / 2;

    bool[] usedIndexes = new bool[Numbers.Length];

    FindNumbers(0, 0, searchedSum, usedIndexes);

}


private void FindNumbers(int currentIndex, int currentSum, int searchedSum, bool[] usedIndexes)

{

    bool goFurther = true;

    currentSum += Numbers[currentIndex];

    usedIndexes[currentIndex] = true;


    if (currentSum == searchedSum)

    {

        Results.Add(usedIndexes, Numbers);

        goFurther = false;

    }

    else if (currentSum > searchedSum)

        goFurther = false;


    if (goFurther)

    {

        for (int i = 1; i < usedIndexes.Length; i++)

        {

            if (!usedIndexes[i])

                FindNumbers(i, currentSum, searchedSum, usedIndexes);

        }

    }

    usedIndexes[currentIndex] = false;

}

Wątpliwości zapewne będziesz mieć odnośnie tej linijki kodu:

Results.Add(usedIndexes, Numbers);

Ona służy do wrzucenia na listę znalezionego wyniku. Poniżej zamieszczam jak ja zaimplementowałem tą metodę u siebie. Tu są użyte rzeczy typowe dla C#, ale przecież u siebie możesz to zrobić inaczej. Najważniejsza jest metoda FindNumbers.

public void Add(bool[] usedIndexes, T[] numbers)

{

    List firstList = new List();

    List secondList = new List();


    for (int i = 0; i < usedIndexes.Length; i++)

    {

        if (usedIndexes[i])

            firstList.Add(numbers[i]);

        else

            secondList.Add(numbers[i]);

    }


    bool add = true;

    foreach (IResultItem resultItem in this)

    {

        if (resultItem.FirstList.SequenceEqual(firstList)

            || resultItem.SecondList.SequenceEqual(firstList))

        {

            add = false;

            break;

        }

    }


    if (add)

        this.Add(new ResultItem(firstList, secondList));

}

#5

soldier34 , proszę zapoznaj się z tą stroną oraz tym tematem, a następnie popraw tytuł tematu, używając przycisku ac7a4cd89050aa6e.gif