• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Kopiowanie wartości z jednej tablicy jednowymiarowej do drugiej

Object Storage Arubacloud
0 głosów
552 wizyt
pytanie zadane 3 listopada 2022 w C# przez JoannS Początkujący (250 p.)

Cześć,

Mam za zadanie skopiować z danej tablicy liczb całkowitych tab1 do nowej tablicy tab2 wyłącznie wartości dodatnie. Obie tablice mają być jednowymiarowe o rozmiarze równym 10. Elementy pierwszej tablicy mają być zadeklarowane, więc zapisałam tak:

int[] tab1 = { -5, -4, -3, -2, -1, 0, 1, 2, 3};
int[] tab2 = new int[10];

Dalej próbowałam metody Array.Copy ale nie działa. Teraz wpisałam pętlę for,

for (int i = 0; i < tab1.Length; i++)
{
 tab2[i] = tab1[i];
}

ale nadal nie wiem jak zadeklarować to, żeby w tab2 były tylko wartości z tab1 ale większe od 0.

Mogę prosić o naprowadzenie jak ruszyć z tym dalej?

Dziękuję :)

 

komentarz 3 listopada 2022 przez Iei Obywatel (1,950 p.)
Dodać instrukcję warunkową if
komentarz 3 listopada 2022 przez JoannS Początkujący (250 p.)

wpisałam:

for (int i =1; i < tab1.Length; i++)
            {
                if (i > 0)
                {
                    Console.WriteLine(tab2[i]);
                }
            }

ale wychodzą same 0 :(

 

komentarz 3 listopada 2022 przez Iei Obywatel (1,950 p.)

W warunku pętli for sprawdzasz tab1, a później starasz się wypisać tab2. Zmieniłbym to na jakąś jednolitą wersję. Poza tym w warunku if powinno być np. 

if (tab2[i] > 0)

zamiast 

if (i > 0)

 

1 odpowiedź

+1 głos
odpowiedź 3 listopada 2022 przez VBService Ekspert (253,340 p.)
edycja 3 listopada 2022 przez VBService

Obie tablice mają być jednowymiarowe o rozmiarze równym 10

przedstawiona przez Ciebie tablica zawiera 9 elementów (czy tak ma być pomimo powyższej treści?)

//              1   2   3   4   5  6  7  8  9      
int[] tab1 = { -5, -4, -3, -2, -1, 0, 1, 2, 3 };
for (int i =1; i < tab1.Length; i++)
{
    if (i > 0)
    {
        Console.WriteLine(tab2[i]);
    }
 }

musisz sprawdzać wartość przypisaną w tablicy pod podanym indeksem

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

 

komentarz 3 listopada 2022 przez JoannS Początkujący (250 p.)

Dodałam 10 wartość, teraz jest:

int[] tab1 = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4};

i dopisałam sugerowaną pętlę, ale nadal nic nie wychodzi. Visual podkreśla część:

 int[] tab1 = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4};
            int[] tab2 = new int[10];
            for (int i =1; j=0; i<tab1.Length; i++)
            {
                if (tab1[i] > 0)
                {
                    tab2[j++] = tab1[i];
                
                }
            }

Jednak nie mam pojęcia jak to zrobić .. :(

komentarz 3 listopada 2022 przez VBService Ekspert (253,340 p.)
edycja 3 listopada 2022 przez VBService

Pętla działa, sprawdź: on-line.

Zera się pojawiają mimo wszystko w drugiej tablicy, bo gdy deklarujesz tablicę

int[] tab2 = new int[10];

z podaną wielkością, "automatycznie" do wszystkich jej elementów (indeksów) domyślnie jest wstawiana wartość 0 (w przypadku tablicy zawierającej intiger-y)

możesz pominąć te elementy tablicy, które mają wartość przypisaną 0

[ on-line ]

    for (int i=0; i<tab2.Length; i++)
    {
        if (tab2[i] == 0) continue;
        Console.Write(tab2[i] + " ");
    }

ale przy dużych tablicach to może okazać się nieefektywne.

komentarz 3 listopada 2022 przez JoannS Początkujący (250 p.)

Faktycznie, nie wpisałam wcześniej tej drugiej pętli for indecision

Dziękuję za pomoc!

komentarz 3 listopada 2022 przez VBService Ekspert (253,340 p.)
edycja 3 listopada 2022 przez VBService

Jako ciekawostkę, bez użycia pętli

[ on-line ]  (użycie System.Linq)

    int[] tab1 = { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4 };
    int[] tab2 = new int[10];

    tab2 = tab1.Where(e => e > 0).ToArray();
    Console.WriteLine(String.Join(" ", tab2));

[ on-line ]  (użycie Array.FindAll)

    tab2 = Array.FindAll(tab1, e => e > 0).ToArray();
    Console.WriteLine(String.Join(" ", tab2));

 

komentarz 3 listopada 2022 przez Wiciorny Ekspert (270,170 p.)
najlepiej posortować i zrobić odcięcie od pierwszej liczby dodatniej, w ten sposób ograniczamy się tylko do O(n) operacji + 1 operacja więc złożoność znacznie lepsza niż kwadratowa lub logarytmiczna.
Np malejąco i pozbywać się ogonka, lub normalnie jak wspomniałem z odcięciem ^^ też opcja.

Podobne pytania

+2 głosów
2 odpowiedzi 485 wizyt
pytanie zadane 4 listopada 2022 w C# przez JoannS Początkujący (250 p.)
0 głosów
1 odpowiedź 254 wizyt
pytanie zadane 25 października 2017 w Android, Swift, Symbian przez Howdy Początkujący (360 p.)
+1 głos
3 odpowiedzi 355 wizyt
pytanie zadane 25 sierpnia 2020 w SQL, bazy danych przez Rashi Nowicjusz (230 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...