Zaraz dokładnie zajrzę, ale taki zapis:
int tab[n];
Jest niezgodny ze standardem języka C++ (n nie jest stałą, lecz zmienną, a rozmiar tablicy musi być znany w czasie kompilacji). Jeżeli chcesz, możesz użyć dynamicznej alokacji pamięci (dla przykładu użyłem jej, chociaż wiem, że nie jest to też dobry pomysł). Najlepiej używać kontenerów typu std::vector, std::array, ewentualnie zamiast zwykłych wskaźników użyć smart pointerów, ale jeśli dopiero się uczysz, to przyjdzie na to jeszcze czas, bez pośpiechu.
W każdym razie wspomnianego wcześniej std::vector na twoim miejscu bym się nauczył, nie jest to trudne, a wygodniejsze w obsłudze (std::array podobnie).
Kolejna sprawa:
naj_m = tab[0];
naj_w = tab[0];
W momencie gdy odwołujesz się do tab[0], ten element tablicy (w ogóle, każdy) ma nieokreśloną wartość. Możesz odwoływać się do nich dopiero po wczytaniu danych do tablicy.
Miałeś jeszcze źle drugiego ifa w pętli. Popraw go na taki:
if(tab[i] > naj_w)
naj_w = tab[i];
Wcześniej porównywałeś, czy naj_w jest mniejsze od naj_w, co jest oczywiście totalnym absurdem.
Kod teraz powinien wyglądać tak:
#include <iostream>
using namespace std;
int naj_w,naj_m,n;
int main()
{
cin >> n;
int* tab = new int[n];
for(int i = 0; i < n; i++)
cin >> tab[i];
naj_w = tab[0];
naj_m = tab[0];
for(int i = 0; i < n; i++)
{
if(tab[i] < naj_m)
naj_m = tab[i];
if(tab[i] > naj_w)
naj_w = tab[i];
}
cout << "Najwieksza jest " << naj_w << endl << "Najmniejsza jest "<< naj_m;
delete [] tab;
return 0;
}