• 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

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
859 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 Bywalec (2,010 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 Bywalec (2,010 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 (256,320 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 (256,320 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 (256,320 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 (278,610 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 641 wizyt
pytanie zadane 4 listopada 2022 w C# przez JoannS Początkujący (250 p.)
0 głosów
1 odpowiedź 281 wizyt
pytanie zadane 25 października 2017 w Android, Swift, Symbian przez Howdy Początkujący (360 p.)
+1 głos
3 odpowiedzi 470 wizyt
pytanie zadane 25 sierpnia 2020 w SQL, bazy danych przez Rashi Nowicjusz (230 p.)

93,173 zapytań

142,184 odpowiedzi

321,968 komentarzy

62,502 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1157p. - dia-Chann
  2. 1139p. - Łukasz Piwowar
  3. 1131p. - CC PL
  4. 1126p. - Łukasz Eckert
  5. 1118p. - Tomasz Bielak
  6. 1104p. - Michal Drewniak
  7. 1083p. - Marcin Putra
  8. 1078p. - rucin93
  9. 1071p. - rafalszastok
  10. 1054p. - Adrian Wieprzkowicz
  11. 1047p. - Piotr Aleksandrowicz
  12. 1037p. - Michał Telesz
  13. 1017p. - Mikbac
  14. 1005p. - ssynowiec
  15. 992p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...