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

przesuwanie elementów w tablicy

VPS Starter Arubacloud
0 głosów
1,134 wizyt
pytanie zadane 3 stycznia 2019 w C i C++ przez Michał Wojtaś Obywatel (1,080 p.)
edycja 3 stycznia 2019 przez Michał Wojtaś



#include <iostream>

using namespace std;

int main(int argc, char** argv) 
{
	int tab[8];
	for(int i=0;i<8;i++)
	{
		cin>>tab[i];
	}
	for(int i=7;i>0;i--)
	{
		
		tab[i]=tab[i-1];
		cout<<tab[i];
	}
	return 0;
}

Witam 

chciałbym przesunąć każdy element z tablicy w lewą stronę lecz mój pomysł jest błędny w czym tkwi błąd ?

 

3 odpowiedzi

+1 głos
odpowiedź 4 stycznia 2019 przez coderCpp93 Gaduła (4,200 p.)
Po pierwsze w pętli masz błąd. Zmienna i=7 i ma się dekrementować dopuki i>0, czyli 7 razy, a nie 8.  Zmień na i>-1. Do tego musisz napisać warunek, który ma na celu przerzucić element tablicy o indeksie 0 na indeks 7.
komentarz 4 stycznia 2019 przez niezalogowany
Dopóki i>=0 też jest ok.
komentarz 4 stycznia 2019 przez coderCpp93 Gaduła (4,200 p.)
Albo zamiast powtarzać sprawdzanie warunku w każdej iteracji, to odrazu przerzucić element indeksu 0 na indeks 7. Dlatego ponieważ taka sytuacja zachodzi tylko raz.
0 głosów
odpowiedź 4 stycznia 2019 przez VirtualMember Pasjonat (15,790 p.)
debugger twoim przyjacielem
komentarz 4 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Testy twoim przyjacielem. debugger w ostateczności.
komentarz 4 stycznia 2019 przez VirtualMember Pasjonat (15,790 p.)
faktycznie jest sens pisać testy do programu zaliczeniowego(pracy domowej), którego treść mieści się w 10 linijkach
komentarz 4 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

Jest. Zawsze jest sens tylko nie zawsze jest czas (w projekcie). I raczej nad tym należy ubolewać. Póki jest czas warto pisać zawsze.

Debugger można porównać do chirurgii w medycynie. Pacjenta otwierasz jak nie masz innego wyjścia.

komentarz 4 stycznia 2019 przez VirtualMember Pasjonat (15,790 p.)
Zauważ, że kolega już wie, że projekt się wysypał. Testy może pisać dla wprawy i dobrego nawyku ale teraz już wie, że jego funkcjonalność przesuwania się wywaliła - teraz musi znaleźć błąd. Czasami mam wrażenie, że się popisujesz wiedzą, zaś najlepiej by było by uczniowie po drugiej lekcji programowania operowali wzorcami projektowymi, bo Ty znasz je od paru lat i stosowanie ich w projektach wydaje się oczywiste więc "wzorce projektowe twoim przyjacielem synu". Tutaj chłopak błąd znajdzie najszybciej debuggerem - albo kartką + myślenie - a nie pisaniem testów jednostkowych, nie załamuj mnie, testy napisze sobie później.
komentarz 4 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Nie wiem co lepsze. Wiedzieć co się mówi czy mówić co się wie i to bez względu na to kto ma jakie "wrażenie". Wolę to pierwsze. Masz prawo się nie zgodzić. Konsekwencjami emocjonalnymi Twojego "załamania" mnie nie obarczaj.
komentarz 4 stycznia 2019 przez VirtualMember Pasjonat (15,790 p.)
Sposób wyjaśnianie danego problemu dostosowuje się do osoby potrzebującej pomocy. Często w swoich odpowiedziach nawet i masz rację, jednak już niejednokrotnie się spotkałem, że osobie początkującej wypalasz z armaty. Zniechęcasz ludzi do nauki prezentując natłok informacji. Wolisz pierwsze, operujesz drugim. Twoje odpowiedzi zahaczają o metody erystyczne, co jest toksyczne dla dalszego poziomu dyskusji.
komentarz 4 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)

Kolego @VirtualMember, możesz się nie zgadzać z czyimś zdaniem ale dokonujesz uogólnień i równasz ludzi do niesprecyzowanych wyobrażeń. Nie prosiłem Ciebie o informację zwrotną ani co do tego co jest a co nie jest skuteczne w przekazywaniu wiedzy. Odniosłem się jedynie do błędnego w moim przekonaniu i doświadczeniu mniemania że debugger powinien być domyślnie wybieranym narzędziem do znajdowania błędów. Na tym poprzestanę i nie odniosę się do uwag nie związanych z pytaniem. Także skończę tę dyskusję bo tacę czas a wolę go spożytkować na odpowiedź techniczną a nie przekonywanie Ciebie do jakichkolwiek racji czy prawd. Masz swoje przekonania i osobiście "mi to pasuje". Ja mam także swoje i pewne doświadczenie ... i także "mi to pasuje". A jak mi nie będzie "pasowała argumentacja" którą przedstawiasz pozwól że o tym napiszę już bez "wycieczek" do propedeutyki nauczania.

0 głosów
odpowiedź 4 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
edycja 4 stycznia 2019 przez mokrowski

Proponuję byś zrobił proste testy.

Na początek Twój kod wyłącznie z poprawkami formatującymi. IMHO lepiej się to czyta. Oczywiście w swoim środowisku programowania masz skrót klawiszowy do formatowania kodu. Dowiedz się jak to się robi bo nie wiem w czym pracujesz.

#include <iostream>
 
using namespace std;
 
int main(int argc, char** argv) 
{
    int tab[8];
    for(int i = 0; i < 8; i++)
    {
        cin >> tab[i];
    }
    for(int i = 7; i > 0; i--)
    {
         
        tab[i] = tab[i-1];
        cout << tab[i];
    }
    return 0;
}

Teraz wydzielasz problematyczny kod oraz kod który da Ci informację zwrotną czy osiągasz efekt czy nie. Na razie Twoim celem będzie poprawne wprowadzenie danych i pokazanie jakie są. Taki plan minimum:

#include <iostream>
#include <cstddef> // To dla size_t

using namespace std;

void wczytaj_tablice(int * tab, size_t ile)
{
    cout << "Wprowadź " << ile << " liczb, oddzielając je spacją lub enterem: ";
    for(int i = 0; i < ile; i++)
    {
        cin >> tab[i];
    }
}

void pokaz_tablice(int * tab, size_t ile)
{
    cout << "Zawartość tablicy to: ";
    for(int i = 0; i < ile; i++)
    {
	cout << tab[i] << ' ';
    }
    cout << '\n';
}

int main(int argc, char** argv) 
{
    int tab[8];
    wczytaj_tablice(tab, 8);
    pokaz_tablice(tab, 8);
    /* Tu jest przesunięcie któe będziesz testował */
    /*
    for(int i = 7; i > 0;i--)
    {
         
        tab[i] = tab[i-1];
        cout << tab[i];
    }
    */
    return 0;
}

Na razie proste i nic specjalnego się nie dzieje :)

Teraz problematyczna funkcja przesunięcia:

#include <iostream>
#include <cstddef>

using namespace std;

void wczytaj_tablice(int * tab, size_t ile)
{
    cout << "Wprowadź " << ile << " liczb, oddzielając je spacją lub enterem: ";
    for(int i = 0; i < ile; i++)
    {
        cin >> tab[i];
    }
}

void pokaz_tablice(int * tab, size_t ile)
{
    cout << "Zawartość tablicy to: ";
    for(int i = 0; i < ile; i++)
    {
	    cout << tab[i] << ' ';
    }
    std::cout << '\n';
}

void przesun_dane(int * tab, size_t ile)
{
    for(int i = 7; i > 0; i--)
    {
        tab[i] = tab[i-1];
    }
}
 
int main(int argc, char** argv) 
{
    int tab[8];
    wczytaj_tablice(tab, 8);
    przesun_dane(tab, 1);
    pokaz_tablice(tab, 8);
    return 0;
}

Po tym etapie możesz już wyciągać wnioski.

Awansem dodałem do funkcji przesun_dane(...) parametr ile który jeszcze nie jest użyty bo umieściłem prawie dokładnie Twój kod z usuniętą prezentacją danych bo robi to oddzielna funkcja.

Tu masz proste użycie strategii "dziel i rządź". Problematyczny kod wydzielasz tak by go kontrolować.

No to zaczynamy. Po pierwsze funkcja przesun_dane(...), powinna nazywać się przesun_dane_w_lewo(...), wtedy będzie wiadomo dlaczego przekazując wartość dodatnią ile, będziesz oczekiwał przesunięcia.

No dobrze ale od którego indeksu zacząć jeśli ile wynosi np. 1? Ano od 1 przepisując dane "o jeden wcześniej". A jaka ma być długość tej tablicy (wcześniej "wbita na stałe" 7-8)? No trzeba ją przesłać do funkcji:

#include <iostream>
#include <cstddef>

using namespace std;

void wczytaj_tablice(int * tab, size_t ile)
{
    cout << "Wprowadź " << ile << " liczb, oddzielając je spacją lub enterem: ";
    for(int i = 0; i < ile; i++)
    {
        cin >> tab[i];
    }
}

void pokaz_tablice(int * tab, size_t ile)
{
    cout << "Zawartość tablicy to: ";
    for(int i = 0; i < ile; i++)
    {
	    cout << tab[i] << ' ';
    }
    cout << '\n';
}

void przesun_dane_w_lewo(int * tab, size_t rozmiar, size_t ile)
{
    for(int i = ile; i < rozmiar; i++)
    {
        tab[i - ile] = tab[i];
    }
}
 
int main(int argc, char** argv) 
{
    int tab[8];
    wczytaj_tablice(tab, 8);
    przesun_dane_w_lewo(tab, 8, 1);
    pokaz_tablice(tab, 8);
    return 0;
}

Ok. Działa.. ale powstaje pytanie co ma się stać z liczbami które pozostały w tablicy? Mają tam zostać czy trzeba coś z nimi zrobić ("wyzerować czy coś... " :) ). Na to pytanie nie mam odpowiedzi. Przy tym podejściu możesz jednak coś założyć i ... przetestować.

Innym pytaniem jest co zrobić jeśli wartość przesunięcia jest równa wielkości tablicy? Nic nie robić czy może zerować? Tu także nie wiem. Ale możesz to także przetestować. Testując pozostajesz w kręgu pojęć języka i bardzo szybko dostajesz informację zwrotną.

Co nie znaczy oczywiście że masz traktować debug po macoszemu. Jednak uruchamiaj go w 2 kolejności jak już zawiodą takie proste testy.

PS. Jeszcze trochę niezręczności pozostało. Tu jednak nie o to chodzi by się czepiać szczegółów :)

komentarz 6 stycznia 2019 przez Michał Wojtaś Obywatel (1,080 p.)
Dziękuje bardzo :) powinien Pan zostać nauczycielem :P przy takim poziomie wiedzy plus daru tłumaczenia średnia dobrze wykształconych ludzi w tym kraju by wzrosła :P
komentarz 6 stycznia 2019 przez mokrowski Mędrzec (155,460 p.)
Bardzo mi miło :) I proszę bardzo :)

Podobne pytania

+1 głos
2 odpowiedzi 348 wizyt
pytanie zadane 30 października 2021 w C i C++ przez Osiolek_buridana Nowicjusz (220 p.)
0 głosów
2 odpowiedzi 3,104 wizyt
pytanie zadane 28 lutego 2017 w C i C++ przez Kasztan Dyskutant (8,080 p.)
0 głosów
1 odpowiedź 8,202 wizyt
pytanie zadane 4 grudnia 2016 w C i C++ przez Akiro Bywalec (2,910 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...