Tak jak pisał użytkownik egoon problem jest taki że w przypadku powyższego kodu masz zbyt małą tablicę. To czy program się wywali podczas pracy czy nie zależy czy nastąpi próba odwołania się do niedozwolonego miejsca pamięci.
Postaram się to prościej wyjaśnić:
Chodzi o to że każdy program ma przydzieloną jakąś pamięć w pamięci ram. Ty tworząc tablicę np 5 elementową mówisz systemowi operacyjnemu że chcesz dostać pamięć na te pare elementów i on Ci ją przydziela. I takie jakby klocki pamięci dostają wszystkie programy. Normalnie jeśli spróbujesz dostać się do pamięci z poza tego co przydzielił Ci system operacyjny program przestanie działać (tak zwana próba dostania się do pamięci chronionej). Tutaj niestety jest mały haczyk ponieważ system może przydzielić Ci tą pamięć w różnym miejscu pamięci ram oraz może też przydzielić więcej niż potrzebujesz. Może więc zdarzyć się tak że pamięć z poza tablicy do której próbujesz się dostaćnadal będzie w ramach pamięci przydzielonej Twojemu programowi i wtedy program będzie wydawał sięże działa prawidłowo.
Troche ciężko mi to wyjaśnić więc spróbuje jeszcze podać przykład obrazkowy:
+++-+--++XXXXX+*++++
Na powyższym obrazku XXXXX jest tablicą którą stworzyłeś a pozostałe znaki to inne rzeczy w pamięci. Jeśli spróbujesz np zapisać coś do tablica[7] to okazałoby się że próbujesz zapisać coś do tej * na obrazku powyżej. Jeśli ta gwiazdka należy do programu to wtedy działąnie programu nie zostanie przerwane ale jeśli nie to zostanie. Dodatkowo jeśli należy do programu to może sie zdarzyć tak że nadpiszesz jakąś inną zmienną programu. Aby to ostatnie zobrazować powiedzmy że pisząc grę trzymamy ekwipunek gracza w tablicy. Jeśli podczas modyfikacji tego ekwipunku wyjdziemy poza rozmiar tej tablicy może się okazać że przypadkowo zamiast np dodać przedmiot danemu graczowi to zmieniliśmy HP jakiegoś bossa na 5 punktów życia.
Korzystanie ze wskaźników/tablic w C++ pozwala na bardzo dużo ale może powodować problemy więc należy uważać na takie rzeczy jak wychodzenie poza zakres tablicy i podobne ;)
Mam nadzieje że było to w miarę zrozumiałe.
Jeśli chodzi o sam problem to możesz zrobić tak że w drugiej pętli dodatkowo zwiększasz także zmienną 'i' oraz sprawdzasz czy nie jest większa od 'ile'. Wtedy musiałbyś z pierwszej pętli dodatkowo jeszcze usunąć zwiększanie i. Przy takim podejściu powinno działać tak jak chcesz.
Czyli ta pętla po modyfikacjach wyglądałaby tak:
for (int i = 0; i < ile;)
{
licznik++;
for (k = 1; k <= licznik; k++)
{
tablica[licznik_tab] = k;
licznik_tab++;
++i;
if (i >= ile)
break;
}
}
Ale można także zrobić inaczej pozbywając się drugiej pętli:
#include <iostream>
using namespace std;
int main()
{
int ile = 0, maksymalnaWartosc = 1, aktualnaWartosc = 1;
cout << "Podaj n: ";
cin >> ile;
int *tablica = new int[ile];
for (int i = 0; i < ile; ++i)
{
tablica[i] = aktualnaWartosc;
if (aktualnaWartosc == maksymalnaWartosc)
{
++maksymalnaWartosc;
aktualnaWartosc = 1;
}
else
++aktualnaWartosc;
}
for (int i = 0; i < ile; i++)
{
cout << tablica[i] << " ";
}
delete[] tablica;
return 0;
}