Największy i najmniejszy element tablicy.

0

Witam mam problem mianowicie mój program ma wypisać największy i najmniejszy element tablicy ale za każdym razem jak najmniejszy element tablicy wypisuje 0 i nie wiem czemu tak się dzieje. Proszę o wyjaśnienie.

#include<iostream>
using namespace std;

int main()
{
    int tablica [10], MAX, MIN;
    MIN = MAX = tablica[0];


    cout << "Wyswietlam najmniejszy i najwiekszy element wprowadzony do tablicy." << endl;
    for(int i = 0; i < 10; i++)
    {
        cout << "Podaj liczbe nr: " << i + 1  << endl;
        cin >> tablica[i];
    }

    for( int i = 0; i < 10; i++ )
    {

         if(tablica[i] > MAX)
         MAX = tablica[i];

         if(tablica[i] < MIN)
         MIN = tablica[i];
    }

    cout << "Najwiekszy element tablicy wynosi " << MAX << endl;
    cout << "Najmniejszy element tablicy wynosi " << MIN << endl;

    return 0;

}
7
Wikt0r napisał(a):
     MIN = MAX = tablica[0]; 

W tym momencie odczytujesz zerową komórkę tablicy, która owszem istnieje (to duży plus w stosunku do połowy pytań tutaj), ale jej wartość jest nieokreślona
to by BYŁO CIEKAWE PRZYPISANIE po wczytaniu, a pętlę od następnego, komórki 1, o ile istnieje.
Oprócz tego, to już pierwsza aktywna instrukcja, a nie deklaracja, dałbym enter niżej, w łączności z kodem a oddzielone od deklaracji

1 Uwaga formalna: w C tradycyjnie wielkimi literami się pisze stałe (const i makra), a zmiennych nie pisze się całymi wielkimi
2 Ja bym zainicjował

int min = INT_MAX;
int max = INT_MIN ; (tak, wygląda paradoksalnie, ala tak miało być)

i pętlą tak jak łatwiej od 0

3

MIN = MAX = tablica[0];

To tak właściwie - jaką wartość podstawiasz do tych zmiennych? Bo OK - odwołujesz się do elementu tablicy, który wprawdzie istnieje, ale jego wartość jest przypadkowa/niezdefiniowana.

Po drugie - skoro szukasz liczb mniejszych od MIN, to przy pierwszym przebiegu NA PEWNO wartość z tablicy musi być mniejsza, niż zmienna MIN. Czyli - na starcie, musisz ją ustawić jakoś bardzo wysoko.
Analogicznie - zmienną MAX musisz zainicjować na wartość małą (zero, albo coś ujemnego - w zależności, jakie dane wejściowe przyjmujesz) - żeby pierwsze porównanie wskazało, że wartość z tablicy jest większa, a następnie porównuj kolejne elementy.

EDIT widzę, że @ZrobieDobrze napisał to samo chwilę wcześniej :/

0

Super bardzo dziękuję za wyjaśnienie, teraz wiem gdzie popełniłem błąd.

0

Niekoniecznie musi dołączać do projektu plik nagłówkowy <limits.h> lub <climits>
i korzystać z makr INT_MAX, INT_MIN. Może tablice zainicjalizować zerem int tab[10] = {0};

int arr[6]{0}, minValue, maxValue;
minValue = maxValue = arr[0];

żeby skrócić program , zabierz to co masz w 2 pętli i umieść w 1 pętli pod cin

1
reich napisał(a):

Niekoniecznie musi dołączać do projektu plik nagłówkowy <limits.h> lub <climits>
...
żeby skrócić program , zabierz to co masz w 2 pętli i umieść w 1 pętli pod cin

Miałeś racje ale zmieniłeś zdanie :)

#include <iostream>
using namespace std;

int main()
{
    int current,max=0,min=0;
    cout<<"Wyswietlam najmniejszy i najwiekszy element wprowadzony do tablicy, koniec - <Ctrl-Z>: ";
    for(int i=0;(i<10)&&(cin>>current);++i) // można usunąć warunek (i<10)
    {
        if(!i) max=min=current;
        else if(min>current) min=current;
        else if(max<current) max=current;
    }
    cout<<"Najwiekszy element tablicy wynosi "<<max<<endl;
    cout<<"Najmniejszy element tablicy wynosi "<<min<<endl;
    return 0;
}
6

Nie rozumiem dlaczego wszyscy inicjalizujecie min=max (=0), przecież to nie ma prawa się udać jeśli wartości podane przed użytkownika będą wyłącznie większe/mniejsze.

jeśli użytkownik poda -1 ... -10, to min będzie -10, a max 0
jeśli użytkownik poda 1 ... 10, to min będzie 0, a max 10

Albo inicjalzujemy je pierwszą podaną przez użytkownika liczbą albo INT_MAX/INT_MIN odpowiednio.

0

Proszę o sprawdzenie
dla sizeTab = 3; {-1, 3,-10} max=3 min=-10
dla sizeTab = 2; {-1, -10} max=-1 min=-10
dla sizeTab = 2; {1, 10} max=10 min=1
dla sizeTab = 3; {1, 3,10} max=10 min=1

#include <iostream>

using namespace std;

int main()
{
    int sizeTab = 3;
    int tab[sizeTab]{0}, minValue{0}, maxValue{0}, counter{0};

    for(const auto & val: tab )
    {
        cout<<"Enter value: ";cin>>tab[counter];
        if(!counter) maxValue = minValue = tab[counter];
        else if(tab[counter] > maxValue)maxValue = tab[counter];
        else if(tab[counter] < minValue)minValue = tab[counter];
        ++counter;
    }

    //print array for test
    cout << '\n';
    for(const auto & val: tab ) cout << val << " ";

    cout << '\n';
    cout << "minValue: " << minValue << " maxValue " << maxValue << '\n';

    cout << '\n';
    return 0;
}

0

@reich:

Tyle ze twój przykład efektywnie nie używa inicjowania zerami. Więc po co ono jest? Dla zmyłki?

ps. i to przehakerskie !counter - zadowolony pewnie jesteś?

3
reich napisał(a):

Proszę o sprawdzenie

    int sizeTab = 3;
    int tab[sizeTab]{0}, minValue{0}, maxValue{0}, counter{0};

Używasz dwa sposoby inicjalizacji, dla zmyłki?
Rozmiarem tablicy musi być stała znana w czasie kompilacji więc musi być constexpr lub przynajmniej const

    for(const auto & val: tab )
    {
        cout<<"Enter value: ";cin>>tab[counter];
        if(!counter) maxValue = minValue = tab[counter];

Pomiędzy dwoma instrukcjami nie masz spacji, zaś wewnątrz jednej wstawiasz, dla zmyłki?
Używasz forech zaś wewnątrz i tak używasz iteratora, WTF?

for(auto &val:tab)
    {
        cout<<"Enter value: ";
        cin>>val;
        if(&val==tab) maxValue=minValue=val;
0

nie dawało mi spokoju co napisał @kq

jeśli użytkownik poda -1 ... -10, to min będzie -10, a max 0
jeśli użytkownik poda 1 ... 10, to min będzie 0, a max 10

faktyczni jest tak, jeżeli ustalimy rozmiar tablicy np. na 6 elementów, wprowadzimy tylko 2 elementy i przerwiemy pętle to będzie tak jak pisze @qk
ale, można zrobić żeby tak nie było

Listing 1

#include <iostream>
#include <algorithm>

using namespace std;

int main()
{
    constexpr int sizeTab = 6;
    int tab[sizeTab]{0}, minValue{0}, maxValue{0}, counter{0};

    for(const auto & val: tab ) cout << val << " ";
    cout << '\n';

    for(auto &val:tab)
    {
        cout<<"Enter value: ";
        cin>>val;
        if(cin.good())
        {
            if(&val==tab) maxValue=minValue=val;
            else if(tab[counter] > maxValue)maxValue = tab[counter];
            else if(tab[counter] < minValue)minValue = tab[counter];
            ++counter;
        }else break;
    }

    cout << '\n';
    for(int i = 0; i < counter; ++i) cout << tab[i] << " ";

    //wyniki jak najbardziej poprawne
    cout << '\n';
    cout << "minValue: " << minValue << " maxValue " << maxValue << '\n';

    //to ponizej pokazuje to o czym pisze @qk
    cout << "\n\n";
    std::pair<int*, int*> minmax = std::minmax_element(std::begin(tab), std::end(tab));

    std::cout << "The min element is " << *(minmax.first) << std::endl;
    std::cout << "The max element is " << *(minmax.second) << std::endl;

    cout << '\n';
    return 0;
}

Listing 2

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    vector<int>v(6,0);
    int counter{0};
    //v.resize(6);
    //int val = 0;
    //fill(v.begin(), v.end(), val);
    cout<<"v.size() = "<<v.size()<<"\n";
    for(const auto &val: v)cout<<val<<" ";
    cout<<"\n";
    for(auto &val: v){
        cout<<"Enter val: ";
        cin>>val;
        if(cin.good())++counter;else break;
    }
    cout<<"counter " << counter<<"\n";
    v.erase(v.begin() + counter, v.end());
    //v.shrink_to_fit();

    cout<<"\nv.size() = "<<v.size()<<"\n";
    cout<<"\n";
    for(const auto &val: v)cout<<val<<" ";
    cout<<"\n";
    auto minmaxValue = std::minmax_element(v.begin(), v.end());

    cout<<"minValue "<<*(minmaxValue.first)<<"\n";
    cout<<"maxvalue "<<*(minmaxValue.second)<<"\n";

    return 0;
}

0

Tylko teraz zamiast jednokrotnej inicjalizacji dodajesz ją n razy, sprawdzając za każdym razem czy jesteś na pierwszym elemencie tablicy, i nim (drugi raz) inicjalizuąc:

            if(&val==tab) maxValue=minValue=val;

A o inicjalizacji pierwszym elementem już pisałem, że jest ok.

3
kq napisał(a):

A o inicjalizacji pierwszym elementem już pisałem, że jest ok.

Typowy błąd początkujących, którzy nie są w stanie sobie wyobrazić pustej tablicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1