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

Przypisanie elementu tablicy / Insertion Sort

Cloud VPS
0 głosów
540 wizyt
pytanie zadane 31 stycznia 2021 w C i C++ przez Pelo Użytkownik (520 p.)
edycja 31 stycznia 2021 przez Pelo

Dzień dobry, otrzymałem dziwny problem. Program nie przypisuje poprawnie wartości tablicy pod danym indeksem, jednak kiedy przypiszę do jakiejś zmiennej tę wartość i jej użyję wszystko działa poprawnie.

Dokładniej: 

1) tablica[index + 1] = tablica[badanyIndex];  // przypisuje niepoprawnie

2) int wstawianyElement = tablica[badanyIndex];

    tablica[index + 1] = wstawianyElement // wszystko działa poprawnie.

Z góry dziękuję za pomoc.

// program nie działający poprawnie:

#include <iostream>

using namespace std;

void insertionSort(int tablica[], int dlugoscTablicy) {

    for (int badanyIndex = 1; badanyIndex < dlugoscTablicy; badanyIndex++) {
            int index = badanyIndex - 1;

            while(tablica[index] > tablica[badanyIndex] && index >= 0) {
                tablica [index + 1] = tablica[index];
                index--;
            }
            
            tablica[index + 1] = tablica[badanyIndex];
    }
}

int main()
{
    int dlugoscTablicy = 6;
    int tablica[dlugoscTablicy] = {5, 4, 2, 3, 1, 3};

    for (int i = 0; i < dlugoscTablicy; i++) {
        cout << tablica[i] << " ";
    }

    cout << endl;

    insertionSort(tablica, dlugoscTablicy);

    for (int i = 0; i < dlugoscTablicy; i++) {
        cout << tablica[i] << " ";
    }

    return 0;
}
// kod działający poprawnie:

#include <iostream>

using namespace std;

void insertionSort(int tablica[], int dlugoscTablicy) {

    for (int badanyIndex = 1; badanyIndex < dlugoscTablicy; badanyIndex++) {
            int index = badanyIndex - 1;
            int wstawianyElement = tablica[badanyIndex];
            while(tablica[index] > wstawianyElement && index >= 0) {
                tablica [index + 1] = tablica[index];
                index--;
            }

            tablica[index + 1] = wstawianyElement;
    }
}

int main()
{
    int dlugoscTablicy = 6;
    int tablica[dlugoscTablicy] = {5, 4, 2, 3, 1, 3};

    for (int i = 0; i < dlugoscTablicy; i++) {
        cout << tablica[i] << " ";
    }

    cout << endl;

    insertionSort(tablica, dlugoscTablicy);

    for (int i = 0; i < dlugoscTablicy; i++) {
        cout << tablica[i] << " ";
    }

    return 0;
}

 

1 odpowiedź

+2 głosów
odpowiedź 31 stycznia 2021 przez Kabuuz Bywalec (2,820 p.)
wybrane 31 stycznia 2021 przez Pelo
 
Najlepsza
W pętli while nadpisujesz sobie na dzień dobry tablica[badanyindex] a potem chcesz go przypisać po pętli ale tam już nie ma tej wartości. Jak użyjesz zmiennej to ta wartość jest zapamiętana i możesz jej potem użyć.
komentarz 31 stycznia 2021 przez Pelo Użytkownik (520 p.)
Jeżeli mogę dopytać: dlaczego wykorzystanie zmiennej w pętli jako argument tablicy sprawia, że poza tą pętlą wartość zmiennej zanika?
1
komentarz 31 stycznia 2021 przez Kabuuz Bywalec (2,820 p.)

Nie jestem pewien czy dobrze zrozumiałem pytanie. Chodzi Ci o to czemu na przykład nie mogę zrobić tak?

for(int i=0; i<5; i++)
{
cout<<i;
}

cout<<i; //nie zadziała

To nie zadziała bo zmienna jest zadeklarowana w ciele pętli i wyskoczy błąd, że nie zadeklarowano zmiennej. Jak dochodzi do "}" to wszystkie zmienne są usuwane z zakresu określonego przez {}. Podobnie jest w funkcjach itp.

komentarz 31 stycznia 2021 przez Pelo Użytkownik (520 p.)
Dla przykładu, który podałeś wszystko jest jasne - nie mogę odwołać się do wartości, której nie mam udostępnionej. W przypadku kodu, który napisałem mam wrażenie, iż sytuacja jest inna. Tablica jest zadeklarowana jako argument funkcji insertionSort, a wartość badanyindex w pętli for. Pętla while zawiera się w funkcji for więc wykorzystywanie w niej (w pętli while) tablica[badanyIndex] nie powinno zmieniać wartości samej tablica[badanyIndex] (dla pętli for)- Przynajmniej takie mam wrażenie.
1
komentarz 31 stycznia 2021 przez Kabuuz Bywalec (2,820 p.)
Takie założenie działa jeśli przekażesz coś dalej przez wartość, ale też nie do końca w tym przypadku. Cała tablica została już przekazana przez wskaźnik do funkcji i możesz ją zmieniać w funkcji. Nie przekazujesz jej dalej do pętli for lub while i dlatego w nich też zmieniasz oryginał.

Podobne pytania

0 głosów
0 odpowiedzi 222 wizyt
pytanie zadane 19 marca 2017 w C i C++ przez MadMax Początkujący (260 p.)
0 głosów
1 odpowiedź 615 wizyt
0 głosów
1 odpowiedź 473 wizyt
pytanie zadane 5 kwietnia 2020 w JavaScript przez Bazzam Użytkownik (810 p.)

93,484 zapytań

142,417 odpowiedzi

322,763 komentarzy

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

Kursy INF.02 i INF.03
...