• 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
564 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 (254,570 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 (254,570 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 (254,570 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 (272,330 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 511 wizyt
pytanie zadane 4 listopada 2022 w C# przez JoannS Początkujący (250 p.)
0 głosów
1 odpowiedź 260 wizyt
pytanie zadane 25 października 2017 w Android, Swift, Symbian przez Howdy Początkujący (360 p.)
+1 głos
3 odpowiedzi 375 wizyt
pytanie zadane 25 sierpnia 2020 w SQL, bazy danych przez Rashi Nowicjusz (230 p.)

92,687 zapytań

141,598 odpowiedzi

320,087 komentarzy

62,047 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

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!

...