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 :)