Mnie ten kod wygląda na "uceplusplusowiony" kod C. ;)
Po pierwsze, dlaczego nie ma tu w ogóle wcięć? Zdajesz sobie sprawę z tego, że wcięcia pomagają uniknąć kilku oczywistych (i irytujących początkujących programistów) błędów? Poza tym kod staje się o wiele bardziej czytelny. Porządne IDE sformatuje kod za Ciebie.
W komentarzach zawarłem parę uwag odnośnie kodu:
#include <iostream>
#include <cstdlib>
#include <ctime> // ->[3]
using namespace std;
// - Zobacz: http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
// aby poczytać dlaczego using namespace std; niekoniecznie jest złe, ale nie jest
// również najlepszym z pomysłów.
int i;
// - Dlaczego właściwie używasz globalnej zmiennej? Nie widzę powodu...
// Poczytaj o zmiennych globalnych http://c2.com/cgi/wiki?GlobalVariablesAreBad
void usun(int *tab, int n);
// - Nazwa tej funkcji jest myląca i zbyt ogólna, usuwasz czyli dealokujesz pamięć?
// Takie właśnie skojarzenie pojawi się komuś kto ten kod przegląda.
// Kod źródłowy powinien być swoją własną dokumentacją, o ile to możliwe...
// Ta funkcja zaś nie usuwa tak naprawdę niczego z podanej tablicy, nie zwraca
// nowej z "usuniętymi" elementami, więc... czemu "usun"?
int main() {
int n, *tablica;
// - Deklarowanie zmiennych w jednej linii w ten sposób, bywa uznawane za złą
// praktykę, szczególnie, jeżeli mieszasz to ze wskaźnikami.
// - "n" to kiepska nazwa dla zmiennej, jeżeli wyjęta jest z kontekstu.
// spójrz na: http://everything2.com/title/Use+meaningful+variable+names
// i: http://everything2.com/title/%2522i%2522+is+a+meaningful+variable+name
// - [1] To nie C, nie musisz deklarować zmiennych na początku programu.
cin >> n;
cout << endl;
// - std::endl nie tylko wypluwa "\n" ale także wywołuje metodę flush()
// co ma pewne konsekwencje, lepiej użyć po prostu "\n".
tablica = new int[n];
// - alokujesz tablicę, ale... -> [2]
// - ->[1] - mogłeś napisać po prostu:
// int* tablica = new int[n];
srand(time(NULL));
// - error: 'time' was not declared in this scope
// - [3] funkcja "time()" jest w nagłówku ctime, bez niego nie istnieje...
for (i = 0; i < n; i++) {
// - [4] w pętli for możesz zadeklarować nową zmienną lokalną:
// for (int i = 0; i < n; ++i) {
// - [5] ++i różni się od i++ - chociaż niemal na pewno zostanie to w tym
// przypadku zoptymalizowane przez kompilator. ;)
tablica[i] = rand() % 100 - 50;
cout << tablica[i] << endl;
}
usun(tablica, n);
// [2] - ...nie sprzątasz po sobie. Gdzie się podziało:
// delete [] tablica;
// ?
return 0;
}
void usun(int *tab, int n) {
int licznik = 0, a = 0, *tabela;
// ->[1]
for (i = 0; i < n; i++)
// ->[4]
if (tab[i] > 0) licznik++;
if (licznik == 0) cout << "tablica pusta";
else {
tabela = new int[licznik];
// ->[1]
// mogłeś napisać po prostu:
// int* tabela = new int[licznik]
for (i = 0; i < n; i++)
// ->[4]
if (tab[i] > 0) {
tabela[a] = tab[i];
a++;
// ->[5]
}
for (i = 0; i < a; i++)
// ->[4]
cout << tabela[i] << " ";
cout << &tabela << " " << licznik << endl;
// ->[2]
// wyciek pamięci.
}
}