Wątek przeniesiony 2020-11-23 16:36 z C/C++ przez kq.

Zwracanie tablicy, c#, pętle

0

Stwórz funkcję double[] Ujemne(double[] tab) , która zwraca tablicę zawierającą tylko te liczby z tablicy tab, które są mniejsze od 0. Rozmiar zwracanej tablicy ma być równy liczbie znalezionych liczb spełniających warunki w tablicy tab.

Mam kilka problemów z tym zadaniem, nie wiem jak mam zwrócić tą tablicę a tym bardziej jak ją wywołać, żeby się wyświetliła w konsoli. Kod trochę też jest dla mnie problemem :D.
na razie mi się udało tyle wymyśleć:

static double[] Ujemne(double[] tab)
        {
            int rozmiar = 0;
            for (int i = 0; i < tab.Length; i++)
            {
                if (tab[i] < 0)
                {
                    rozmiar += 1;
                }
            }
            double[] liczby = new double[rozmiar];
            return liczby;
        }
1

Jeszcze musisz sobie zadeklarować jakąś listę, do której będziesz dodawał znalezione liczby, które chcesz wpisać do tablicy.
Tablice zwracasz do konsoli tak samo jak ją tutaj czytałeś - w pętli;
natomiast wywołanie to w metodzie main wywołujesz normalnie funkcje Ujemne()

0

@Sandra: Właśnie jak zdeklarować tą listę ? jak na razie w tej tablicy pojawiają mi się same 0, a chciałbym żeby to były inne, poprawne wartości

0

W ten sposób, zanim zwrócisz nową tablicę, musisz jeszcze raz przeiterować po tablicy wejściowej i dodać wszystkie ujemne do liczby.

0

@Matfizf: zwraca zera bo nic nie dodajesz. Tylko tworzysz rozmiar.
listę zadeklarować możesz np. tak
List<double> lista = new List<double>();
lista.Add(tab[i]);

0

a jak to mogę zrobić bo nie bardzo rozumiem ?

0

List jeszcze nie miałem i chyba nie mogę z tego korzystać, a już na pewno nie z metody .Add :/

0

A mallock miałeś?
metoda .Add to najprostsza wbudowana domyślnie rzecz dla list :p nie ma co wymyślać koła na nowo

0

niestety nie :/

0

No to jak ani tak ani tak to tak baaaaardzo na piechotę to wypadałoby jedną pętlą - tą co masz - policzyć rozmiar nowej tablicy, drugą pętlą jeszcze raz przeiterować tablicę szukając elementów mniejszych niż 0 i wpisywać je do tej nowej tablicy. Ale to jest długi sposób

0

Niestety chyba tak to muszę zrobić :D a mam jeszcze pytanie jak te elementy mniejsze od 0 wpisać do nowej tablicy?

1

liczby[i] = tab[i]

2
Matfizf napisał(a):

Niestety chyba tak to muszę zrobić :D a mam jeszcze pytanie jak te elementy mniejsze od 0 wpisać do nowej tablicy?

Moze pora coś przeczytać, nie sądzisz?
Powołałeś pierdyliard wątków o tablicach, jakoś to nie pomogło na wiedzę ...

0

w sumie pomogło bo inne zadania udało się ogarnąć ale tutaj nie wiem jak dodać te wartości do tablicy a tym bardziej jak ją wywołać, gdzie mogę o czymś takim poczytać?

0

Odbiegając od tematu - myślę, że prowadzący nie obrazi się za użycie czegoś "ponad program" co uczyni ten kod ładniejszym

Edit. wpisz w google "wywoływanie funkcji C#" oraz "Zapisywanie danych do tablicy c#" ew. "call function in c#" oraz "add value to an array in c#"

0

@Sandra: niestety może nie uznać

0
Matfizf napisał(a):

w sumie pomogło bo inne zadania udało się ogarnąć ale tutaj nie wiem jak dodać te wartości do tablicy a tym bardziej jak ją wywołać, gdzie mogę o czymś takim poczytać?

"ogarnąłeś zadania" ale widzę niczego nie nauczyły. To jest ten problem z "wybłaganiem" albo "wymęczeniem" zadania przez forum

0

wystarczy mi jakaś mała podpowiedź jak mogę dodać te wartości do tablicy i tyle :D

0
Matfizf napisał(a):

wystarczy mi jakaś mała podpowiedź jak mogę dodać te wartości do tablicy i tyle :D

Jedna pomocna literka to 'i' ... druga warta uwagi, to 'f'

2

W if dać liczby[rozmiar++] = tab[i];, a na końcu Array.Resize(ref liczby, rozmiar);

I wystarczy jedna pętla. :)

0

@Matfizf: co to kuźwa za szkoła, że tak kaleko każe wam te zadania robić

1

@Sandra: Nie tak nerwowo, po prostu, na tym etapie, nie mogą używać dynamicznych ds.

2
static double[] Ujemne(double[] tab)
        {
            int rozmiar = 0;
            for (int i = 0; i < tab.Length; i++)
            {
                if (tab[i] < 0)
                {
                    rozmiar += 1;
                }
            }
            double[] liczby = new double[rozmiar];
            int currentTabIndex = 0;
            for (int i = 0; i < tab.Length; i++)
            {
                if (tab[i] < 0)
                {
                    liczby[currentTabIndex] = tab[i];
                    ++currentTabIndex;
                }
            }
            return liczby;
        }

No niby możesz tak ,ale jest to tak dziadowskie rozwiązanie ,że nawet mi się nie chce nazw poprawiać. A normalnie zrobił bym to tak:

        static double[] Negative(double[] tab)
        {
            return tab.Where(x => x < 0).ToArray();
        }
0

@Botek: właśnie kończę robić to zadanie i niestety to chyba musi tak wyglądać, ale dzięki za szybszą metodę, która jest u mnie nielegalna :D

0

Mam jeszcze jeszcze jedno pytanie, dlaczego jak chcę wywołać tą funkcję w konsoli:

Console.WriteLine(Ujemne(new double[] { -4, 6, 1, 7, 8, -2, -9 }));

to wyświetla mi się w konsoli: System.Double[] ? Co to w ogóle znaczy ?

2

Zrób na przykład tak:

var ujemne = Ujemne(new double[] { -4, 6, 1, 7, 8, -2, -9 });

for (int i = 0; i < ujemne.Length; i++)
    Console.WriteLine(ujemne[i]);

Console.WriteLine nie "umie" wyświetlić tablicy i wykonuje domyślną operacją, jaką jest wyświetlenie typu - dlatego dostajesz System.Double[], bo to jest typ twojej tablicy.

2
Ktos napisał(a):

Zrób na przykład tak:

var ujemne = Ujemne(new double[] { -4, 6, 1, 7, 8, -2, -9 });

for (int i = 0; i < ujemne.Length; i++)
    Console.WriteLine(ujemne[i]);

Console.WriteLine nie "umie" wyświetlić tablicy i wykonuje domyślną operacją, jaką jest wyświetlenie typu - dlatego dostajesz System.Double[], bo to jest typ twojej tablicy.

Spróbujmy powiedzieć to precyzyjniej. Nie ma gotowca go takiego wyświetlenia, więc z argumentu bierze ToString(), a ten jest nazwą typu.

2
Sandra napisał(a):

@Matfizf: co to kuźwa za szkoła, że tak kaleko każe wam te zadania robić

Myślę, że normalna. Raczej trudno uczyć o algorytmach i strukturach danych nie pokazując ich działania.

Botek napisał(a):
>             int currentTabIndex = 0;
>             for (int i = 0; i < tab.Length; i++)
>             {
>                 if (tab[i] < 0)
>                 {
>                     liczby[currentTabIndex] = tab[i];
>                     ++currentTabIndex;
>                 }
> ```

Kod z pętlami i ifami nigdy nie będzie ładny, ale to nie powód, aby go jeszcze obrzydzać deklaracjami i instrukcjami w dziwnych miejscach.

```csharp
for (int i = 0, j = 0; i < tab.Length; i++)
{
    if (tab[i] < 0)
    {
        liczby[j++] = tab[i];
    }
}
0

@Botek:

        static double[] Negativ(double[] tab)
        {
            return tab.Where(x => x < 0).ToArray();
        }

Brakuje czasownika w nazwie metody + literówka - negative.

Tu moje pomysły jak obejść nieużywanie linq i jednocześnie nie używać dwóch pętli:

        double[] GetNegativeNumbers(double[] numbers)
        {
            IEnumerable<double> getNegativeNumbers()
            {
                foreach (var number in numbers)
                {
                    if (number < 0)
                        yield return number;
                }
            }
            return getNegativeNumbers().ToArray();
        }

To samo, tylko generycznie:

        static T[] GetNegativeNumbers<T>(IEnumerable<T> numbers) where T : IComparable<T>
        {
            IEnumerable<T> getNegativeNumbers()
            {
                foreach (var number in numbers)
                {
                    if (number.CompareTo(default) == -1)
                        yield return number;
                }
            }
            return getNegativeNumbers().ToArray();
        }

...

        static double[] GetNegativeNumbers(double[] numbers)
        {
            var result = new List<double>();
            foreach (var number in numbers)
            {
                if (number < 0)
                    result.Add(number);
            }
            return result.ToArray();
        }

...

        static double[] GetNegativeNumbers(double[] numbers)
        {
            var negativeNumbers = new double[numbers.Length];
            var indexForCurrentElement = 0;
            foreach (var number in numbers)
            {
                if (number < 0)
                    negativeNumbers[indexForCurrentElement++] = number;
            }

            var result = new double[indexForCurrentElement];
            Array.Copy(negativeNumbers, result, result.Length);
            return result;
        }

1 użytkowników online, w tym zalogowanych: 0, gości: 1