• 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

0 głosów
73 wizyt
pytanie zadane 29 stycznia w C i C++ przez Giero112 Nowicjusz (120 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 przez Criss Mędrzec (169,500 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ź 89 wizyt
pytanie zadane 17 marca 2018 w C i C++ przez CurryMan Nowicjusz (170 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 21 grudnia 2017 w C i C++ przez k3ybo4rd Obywatel (1,180 p.)
0 głosów
1 odpowiedź 47 wizyt
pytanie zadane 14 marca w C i C++ przez Curiosis Początkujący (420 p.)
Porady nie od parady
Pytania na temat serwisu SPOJ należy zadawać z odpowiednią kategorią dotyczącą tej strony.SPOJ

63,144 zapytań

109,387 odpowiedzi

228,533 komentarzy

42,575 pasjonatów

Przeglądających: 202
Pasjonatów: 14 Gości: 188

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...