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

Wskaźniki C++ problem z zadaniem

Object Storage Arubacloud
0 głosów
526 wizyt
pytanie zadane 29 stycznia 2019 w C i C++ przez Giero112 Nowicjusz (170 p.)

Witam mam ogromy problem ze zrozumieniem zadania i bardzo proszę o pomoc, naprowadzenie na dobry trop.

Napisz funkcję która otrzymując w parametrach dwa wskaźniki do liczb całkowitych(początek i koniec tablicy) tworzy dynamicznie tablicę liczb całkowitych i umieszcza w niej liczby nieparzyste z tablicy wejściowej. Wynikiem funkcji jest adres nowo utworzonej tablicy a rozmiar tej tablicy należy zwrócić przez dodatkowy parametr funkcji. Jeśli brak jest liczb spełniających warunek to tablica wynikowa nie jest tworzona i zwracany jest NULL.

Sam początek wydaje mi się prosty

int * newTab(int *p,int *k, int rozmiar){
int * nieparzysta = new int[k-p];
    int rozmiar = 0;
    while(p <= k){
        for(int i = 0; i<k-p; i++){
            if(*p%2 != 0){
                nieparzysta[i] = *p;
                nieparzysta++;
                rozmiar++;
            }
            p++;
        }

    }
    if(rozmiar == 0){
        delete [] nieparzysta;
        return NULL;
    }

    else return rozmiar;
}

 

1 odpowiedź

0 głosów
odpowiedź 29 stycznia 2019 przez criss Mędrzec (172,590 p.)

Coś bardzo dziwnego zrobiłeś z wtymi pętlami (while i zagnieżdzony for). Nie wiem po co to jest, ale aktualnie wygląda to tak:
dla każdego elementu tablicy p, jeśli ten element jest nieparzysty, zapełniasz nim całą tablice wynikową.

Powinno być tak:
 

i=0
j=0
dla i-tego elementu tablicy oryginalnej:
   jeśli i-ty element jest nieparzysty:
     wpisz go do j-tego elementu tablicy wynikowej
     j++
   i++ 

Teoretycznie możesz zrobić tak jak teraz jeśli chodzi o alokacje tablicy wynikowej - tzn. tworzysz tablicę która na pewno zmieści wszystkie liczby nieparzyste [1]. Ale możesz też najpierw policzyć ilość elementów parzystych, a potem alokuj tablicę wynikową i (kolejna pętla) wpisuj do tablicy wynikowej. Jeśli okaże się, że już po policzeniu wychodzi, że nie ma elementów nieparzystych, to zwracasz NULL/nullptr.

[1] - skoro zakładamy, że `k` wskazuje na ostatni element tablicy (a nie za tablice) (a widzę, ze tak jest bo masz warunek while(p<=k)), to ilość wszystkich liczb wynosi k-p+1. W C++ jednak przyjmuje się, że koniec/end oznacza "za tablicą" a nie "ostatni element". Ja tylko mówię, że obecnie źle liczysz rozmiar.

Podpowiedź: zanim bawić się w inkrementowanie tego wskaźnika p, policz sobie rozmiar tej tablicy i do kolejnych elementów dostawaj się za pomocą operatora [ ]. Przejrzyściej i prościej ;)

const int sz = k-p+1; // +1 zakladajac ze k wskazuje na ostatni element a nie za niego
for (int i = 0; i < sz; ++i)
   std::cout << p[i]; // cos tam sobie robisz z tą tablicą

Odnośnie

Wynikiem funkcji jest adres nowo utworzonej tablicy a rozmiar tej tablicy należy zwrócić przez dodatkowy parametr funkcji.

Powinno to wyglądać tak:

int* newTab(const int *p, const int *k, int *rozmiar)
{
   //...
   //...
   *rozmiar = r; // r przechowuje rozmiar tablicy wynikowej obliczony wewnątrz funkcji. Obecnie masz parameter i zmienną lokalną nazwaną identycznie - rozmiar
   return nieparzysta;
}

 Dodatkowo `p` oraz `k` zmieniłem typ na `const int*`. Tzn., że nie można modyfikować pamięci na którą wskazuje. IMO powinienes tak zrobić, żeby pokazać, że funkcja na pewno nie modyfikuje danych wejściowych.

Podobne pytania

0 głosów
1 odpowiedź 532 wizyt
pytanie zadane 26 października 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
0 głosów
1 odpowiedź 611 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez CurryMan Nowicjusz (170 p.)
0 głosów
1 odpowiedź 513 wizyt
pytanie zadane 14 marca 2019 w C i C++ przez Curiosis Użytkownik (540 p.)

92,568 zapytań

141,420 odpowiedzi

319,622 komentarzy

61,954 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!

...