[C#] Podanie index'u elementu z tablicy

Ostatnio miałem do stworzenia program, który będzie znajdował największy element w tablicy, a później ukazywał jego index z tej tablicy.

Mój program wygląda podobnie do tego:

http://www.algorytm.org/dla-poczatkujacych/szukanie-elementu-minimalnego-maksymalnego/element-min-max-cs.html

Gdyby ktoś był tak miły i pokazał mi jak mogę wypisać index największego elementu byłbym wdzięczny. Wiem że istnieje metoda Indexof() ale nie wiem jak jej użyć.

Ja bym to zrobił tak:

int index=0;

for(int i=1;i
  if(tab[i]>tab[index])

    index=i;

Po przejściu pętli zmienna index będzie miała numer największego elementu :slight_smile:

Zmieniłem tab[0] na 0 na skutek błędu mego :slight_smile:

Niestety przy pierwszej linii twojego kodu od razu otrzymuję błąd: The name ‘index’ does not exist in the current context

I twój zapis wygląda na C++, oczywiście sobie przeprawiłem, ale nie zmienia faktu, iż chyba nie tędy droga

@drobok

Wynikiem powinna być tablica indeksów.

@IamNotHouse

Jesteś pewien, że dobrze skopiowałeś kod? Poza tym sugeruję zakupić jakąś książkę, przerobić jakiś tutorial, cokolwiek :slight_smile:

64df476daa2d.png

Muszę to zrobić i na tym zakończę

Ten kod nie ma sensu *tab, to wartość pod adresem tab a nie index jeśli już to int index = 0, nie zmienia to faktu błędu kompilacji, której być nie powinno jeśli to są integery, może podaj kod to ci poprawimy, bo cięzko tak stwierdzić bawiąc sie w kalambury.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {


            int i, index;


    int[] tablica = new int[10] ;

    tablica[0] = 1305 ;

    tablica[1] = 12 ;

    tablica[2] = -3 ;

    tablica[3] = 788 ;

    tablica[4] = 2 ;

    tablica[5] = 788 ;

    tablica[6] = -10 ;

    tablica[7] = 0 ;

    tablica[8] = 9 ;

    tablica[9] = -55 ;


    index=tablica[0];

for (i=1;i<11;i++)

  if(tablica[i]>tablica[index])

    index=i;


    Console.WriteLine(index);

        }

    }

}

Teraz już taki, z elementami na sztywno, bo nie chce mi się kombinować z wczytywaniem elementów skoro nie mogę przejść przez proste wypisanie

Wiem, wiem index powinien być 0 :slight_smile: Namieszałem trochę, za późno dla mnie :slight_smile:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;


namespace ConsoleApplication1

{

    class Program

    {

        private static int[] tab={10,20,1,3,5,6,7,4,20,51};

        static void Main(string[] args)

        {

            int index=0;

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

                if (tab[i] > tab[index])

                    index = i;

            Console.WriteLine(index);

        }

    }

}

Nie zmienia to faktu, że pytający mógłby przepisywać ze zrozumieniem

index=tablica[0];

to jakbyś wpisał

index=1305;

nic dziwnego ze nie moze znaleźc takiego indeksu, swoja droga nigdy nie pisałem w c# ale w javie to by było jakieś bardziej intuicyjne: Array Index Out Of Bounds Exception :stuck_out_tongue_winking_eye:

@drobok

Ten kod jest niepełny. Co jeśli będzie kilka elementów osiągających maksymalną wartość? To jest niepotrzebne:

using System.Collections.Generic;

using System.Linq;

using System.Text;

@kostek135

Autor tematu musiał źle skopiować kod (nie miał deklaracji zmiennej). W .NET w sytuacji, którą opisujesz, wyrzucany jest wyjątek IndexOutOfRangeException.

@Matzu,

Wszystko zależy od przestrzeni w których rozpatrujemy dane, oraz założeń tego czy np. nie wystarczy nam pierwszy znaleziony index.

Możliwe, jak stwierdziłem, nie pisałem w c#.

Czy więc ktoś mógłby mi jasno wyjaśnić jak pokonać ten problem ?

Ale co jeszcze chcesz wyjaśniać drobok napisał ci co masz poprawić zamiast index = tablica[0] -> index = 0; Chyba, że chcesz rozwiązać problem z wieloma powtórzeniami, wtedy możesz albo zrobić to w dwóch iteracjach, przejść całość znajdując największy, a następnie drugi raz wypisując te indeksy, które zawierają wartość największy, albo użyć dodatkowej pamięci i zrobić to w jednym przejściu, pesymistycznie potrzeba wtedy 2x rozmiar elementów.

Wybacz matzu nie przeczytałem twojego pierwszego postu. Z wieloma powtórzeniami proponuję zrobić listę index’ów np tak:

using System;

using System.Collections.Generic;


namespace ConsoleApplication1

{

    class Program

    {

        private static int[] tab={10,51,1,3,5,6,7,4,20,51};

        static void Main(string[] args)

        {

            List index = new List();

            index.Add(0);

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

                if (tab[i] >= tab[index[index.Count - 1]])

                    if (tab[i] == tab[index[index.Count - 1]])

                        index.Add(i);

                    else

                    {

                        index.Clear();

                        index.Add(i);

                    }

            for(int i=0;i
            Console.WriteLine(index[i]);

            System.Console.ReadKey();

        }

    }

}

Niestety z list nigdy nie korzystałem, więc gwarancji poprawności kodu nie dam :slight_smile:

@drobok

W tym natłoku postów sam się gubię :slight_smile: Można też tak:

using System;

using System.Collections.Generic;

using System.Linq;


namespace ConsoleApplication2

{

    class Program

    {

        static void Main(string[] args)

        {

            int[] input = new int[] { 1305, 12, -3, 788, 2, 788, -10, 0, 9, -55, 1305 };

            List output = new List();


            int max = input.Max(); // Funkcja Max zdefiniowana jest w obrębie System.Linq

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

                if (input[i] == max)

                    output.Add(i);


            foreach (int i in output)

                Console.WriteLine(i);

        }

    }

}