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

question-closed Najmniejszy i największy element w c++

Object Storage Arubacloud
0 głosów
2,276 wizyt
pytanie zadane 24 listopada 2017 w C i C++ przez niezalogowany
zamknięte 24 listopada 2017 przez Eryk Andrzejewski

Witam!

Chciałem napisać program który znajdzie najmniejszą i największą liczbę.

#include <iostream>

using namespace std;


int naj_w,naj_m,n;

int main()
{
	cin >> n;
	int tab[n];
	naj_m = tab[0];
	naj_w = tab[0];
	for(int i = 0; i < n; i++)
		cin >> tab[i];
	for(int i = 0; i < n; i++)
	{
		if(tab[i] < naj_m)
			naj_m = tab[i];
		if(naj_w < naj_w)
			naj_w = tab[i];
	}
	
	cout << "Najwieksza jest " << naj_w << endl << "Najmniejsza jest "<< naj_m;
	
	return 0;
}

Kiedy podam liczby 1 2 3 4 program wyrzuca że najmniejsza jest 1 a największa 8. Gdzie w moim kodzie jest błąd?

komentarz zamknięcia: Rozwiązane

1 odpowiedź

+2 głosów
odpowiedź 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
edycja 24 listopada 2017 przez Eryk Andrzejewski
 
Najlepsza

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. smiley

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. wink

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;
}

 

komentarz 24 listopada 2017 przez niezalogowany

Ok dzięki działa teraz.

Co oznacza:

    int* tab = new int[n];

 

komentarz 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Jak mówiłem, jest to dynamiczna alokacja pamięci. Tworzysz wskaźnik tab, któremu przypisujesz adres do nowo zaalokowanej pamięci. Z wskaźnika możesz później korzystać tak samo jak z tablicy.

Jeżeli nie chcesz jeszcze zaprzątać sobie głowy czymś takim, możesz zrobić to w trochę inny sposób: utworzyć sobie tablicę o z góry określonym rozmiarze (np. 1000 elementów, 10000 elementów). Będzie to trochę marnotrawstwo pamięci, ale zawsze to jakiś sposób na początek.
komentarz 24 listopada 2017 przez draghan VIP (106,230 p.)
Halo halo, a gdzie dealokacja się podziała? ;)
komentarz 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)
  1. Po części właśnie dlatego lepiej nie używać gołych wskaźników wink
  2. Z tego co mi wiadomo to już system sam zadba o dealokację. Inny przypadek, gdybym alokował dane dynamicznie w jakiejś pętli - tu już by się sprawa trochę komplikowała smiley
komentarz 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Ale jak coś to poprawiłem. wink

komentarz 24 listopada 2017 przez draghan VIP (106,230 p.)

Z tego co mi wiadomo to już system sam zadba o dealokację

A co, jeśli takiego systemu nie ma? :)

komentarz 24 listopada 2017 przez Eryk Andrzejewski Mędrzec (164,260 p.)

Jak mówiłem wcześniej, należy używać inteligentnych wskaźników, lub kontenerów z STL.

No chyba, że się pisze swój system i nie zdążymy ich zaimplementować, to trzeba najpierw zaimplementować sobie zarządzanie pamięcią, a potem jechać na malloc()/new i free()/delete laugh

Podobne pytania

0 głosów
2 odpowiedzi 1,421 wizyt
0 głosów
2 odpowiedzi 537 wizyt
pytanie zadane 2 listopada 2018 w C i C++ przez gorgonkowa Obywatel (1,810 p.)
+3 głosów
6 odpowiedzi 1,776 wizyt
pytanie zadane 4 lipca 2016 w HTML i CSS przez jankiel89 Początkujący (450 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...