• 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

VPS Starter Arubacloud
0 głosów
680 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ź 684 wizyt
pytanie zadane 26 października 2020 w C i C++ przez komboboost0 Użytkownik (570 p.)
0 głosów
1 odpowiedź 716 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez CurryMan Nowicjusz (170 p.)
0 głosów
1 odpowiedź 536 wizyt
pytanie zadane 14 marca 2019 w C i C++ przez Curiosis Użytkownik (540 p.)

93,025 zapytań

141,990 odpowiedzi

321,293 komentarzy

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

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...