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

Minimum i maksimum na przedziałach (tablica)

Object Storage Arubacloud
0 głosów
726 wizyt
pytanie zadane 1 grudnia 2020 w C i C++ przez CheF123 Początkujący (450 p.)
otwarte ponownie 2 grudnia 2020 przez CheF123

Witam,

mam problem ze zrozumieniem pewnego zadania mianowicie w zadaniu chodzi o to,że: Znalezienie minimum i maksimum liczb na tablicy. Dla utrudnienia, musisz wypisać minimum i maksimum na przedziałach [1,1], [1,2], [1,3], ..., [1,n].

Wejście

W pierwszej linii wejścia dana jest liczba n - liczba liczb w tablicy (1 ≤ n ≤ 105). W kolejnej linii dane jest n liczb - liczby w tablicy (ich wartość bezwzględna jest nie większa niż 1000).

Wyjście

W pierwszej linii wyjścia należy wypisać n liczb - ma to być minimum w przedziałach [1,1], [1,2], [1,3], ..., [1,n]. W drugiej linii wyjścia należy wypisać maksimum w podobnym formacie.

Przykład

Dla danych wejściowych

5
0 -1 1 -1 0

 

poprawną odpowiedzią jest

0 -1 -1 -1 -1
0 0 1 1 1

Program na maximum i minimum z tablicy mam i wygląda on tak:

#include <iostream>
using namespace std;
int main()
{
    int n,m,mx,q=1; cin>>n;
    int tab[n];
    for(int i=0;i<n;i++)
    {
        cin>>tab[i];
    }
    m=tab[0];
    for(int o=0;o<n;o++)
    {
        if(tab[o]<m) m=tab[o];
    }
    cout<<m<<"\n";
    mx=tab[0];
    for(int p=0;p<n;p++)
    {
        if(tab[p]>mx) mx=tab[p];
    }
    cout<<mx<<"\n";

    return 0;
}

Z góry dzięki za odpowiedź!!!

2 odpowiedzi

0 głosów
odpowiedź 1 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
wybrane 2 grudnia 2020 przez CheF123
 
Najlepsza

Dobra, chwilę mi zajęło zrozumienie o co chodzi. Ktoś tu spaprał treść ewidentnie, bo chodzi mu o minimum i maksimum dla danych indeksów tablicy, a nie przedziały na osi liczbowej laugh

U Ciebie błędów jest kilka. Pominę najważniejszy, którym jest złamanie regulaminu i nie pisanie w bloczku kodu ;)
Zacznijmy od tego, że kod
 

int n;
cin >> n;
int tab[n];

jest niepoprawny. Alokacja pamięci na tablicę odbywa się bodajże już przy wejściu do funkcji main, o ile mnie pamięć nie myli (oczywiście pamięci automatycznej). Wobec tego Twoja tablica nie będzie miała rozmiaru takiego, jak Ty podasz, a jakiś losowy, zależny od tego, jaka wartość siedzi pod adresem zmiennej 'n'. 
Ogółem Ty wypisujesz tylko jedną wartość minimum/maksimum, a powinieneś to robić dla każdego przedziału, tak więc to będzie złe. Ja bym to robił w pętli, która modyfikuje minimum/maksimum. 

 

Swoją drogą, co to za zmienna 'q'? Jest zbędna. W dodatku taka mała uwaga - jak robisz nowe pętle, to możesz korzystać z tej samej zmiennej iteracyjnej, powiedzmy 'i'. Po wykonaniu pętli zmienna i tak będzie zwalniana, więc nic się nie stanie, jak użyjesz jej w oddzielnej pętli. Byleby nie były one zagnieżdżone, bo dopiero wtedy będzie niespodzianka laugh

1
komentarz 1 grudnia 2020 przez TOM_CPP Pasjonat (22,640 p.)

Twoja tablica nie będzie miała rozmiaru takiego, jak Ty podasz, a jakiś losowy, zależny od tego, jaka wartość siedzi pod adresem zmiennej 'n'. 

Akurat w tym przypadku wartość n jest wczytywana  ze strumienia cin, więc będzie taka  jaką wpisze użytkownik. W standardzie języku C++ nie ma tablic typu VLA , więc zapis

int tab[n];

nie jest poprawny. Ale żeby było śmieszniej, prawie każdy kompilator potraktuje to jako standard języka C (C99) i skompiluje to bez problemu, co może spowodować różne efekty uboczne zobacz

 

komentarz 1 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)
Fajnie, dzięki za naprostowanie tematu :)
komentarz 1 grudnia 2020 przez CheF123 Początkujący (450 p.)

@Whiskey_Taster,

Witam po jakimś czasie coś takiego wyszło:

#include <iostream>
using namespace std;
int main()
{
    int mi,ma,z;
    int n;
    cin>>n;
    int tab[n];
    for (int i=0; i<n; i++)
    {
        cin >> tab[i];
    }
    int min[n];
    int max[n];
    for(int i=0; i<n; i++)
    {
        z=0;
        ma=tab[0];
        while (z<=i)
        {
            if (tab[z]>ma) ma=tab[z];
            z++;
        }
        max[i]=ma;
        z=0;
        mi=tab[0];
        while (z<=i)
        {
            if (tab[z]<mi) mi=tab[z];
            z++;
        }
        min[i]=mi;
   }
    for (int t=0; t<n; t++)
    {
        cout << min[t]<<" ";
    }
    cout<<"\n";
    for (int x=0; x<n; x++)
    {
        cout<<max[x]<<" ";
    }


    return 0;
}



Lecz nie zalicza mi tego. Wiedział byś może dlaczego?

Z góry dzięki za odpowiedź!

komentarz 1 grudnia 2020 przez Whiskey_Taster Pasjonat (15,610 p.)

Pewnie przekraczasz limit czasu. Po co w ogóle te pętle while? Po co tak kombinować? Już przy tym pierwszym byłeś bliżej lepszego rozwiązania, niż teraz jesteś. Na ten moment robisz masę niepotrzebnych rzeczy, między innymi takie jak sprawdzanie wiele razy tych samych wartości. 
Wklejam tu kod, napisałem na szybko, prościej się chyba nie da, bez żadnych czarów: 
 

#include <iostream>

int main()
{
    int min, max;
    int n;
    std::cin >> n;
    int* tab = new int[n];

    for (int i = 0; i < n; i++)
        std::cin>> tab[i];
    min = max = tab[0];

    for (int i = 0; i < n; i++)
    {
        if (tab[i] < min)
            min = tab[i];
        std::cout << min << " ";
    }
    std::cout << std::endl;

    for (int i = 0; i < n; i++)
    {
        if (tab[i] > max)
            max = tab[i];
        std::cout << max << " ";
    }
    delete tab;
    return 0;
}

 

komentarz 2 grudnia 2020 przez CheF123 Początkujący (450 p.)
przywrócone 2 grudnia 2020 przez CheF123
Dzięki wielkie!!!
0 głosów
odpowiedź 1 grudnia 2020 przez TOM_CPP Pasjonat (22,640 p.)

Zobacz jak można to zrobić używając iteratorów i posiłkując się funkcją wyliczającą min i max element ( wymaga C++17 )

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

using namespace std;

int main()
{
     vector<int> test_data {4,3,-82,0,74,-2,-3,30,229,899,-987,-992,900};

     auto itend = cbegin(test_data);
     cout << "przedzial" << setw(8) << "min"  << setw(10) << "max" << endl;
     cout << "============================" << endl;
     while( ++itend-1 != cend(test_data) )
     {
         auto [ min , max ] = minmax_element( cbegin(test_data) , itend );
         cout << "[1," << setw(2) << itend-cbegin(test_data) << "]" << setw(10) << *min << setw(10) << *max << endl;
     }
}

https://godbolt.org/z/rMGeGo

Podobne pytania

0 głosów
0 odpowiedzi 692 wizyt
pytanie zadane 25 listopada 2019 w C i C++ przez Plusik Nowicjusz (120 p.)
0 głosów
1 odpowiedź 194 wizyt
pytanie zadane 13 stycznia 2023 w C i C++ przez Janchess Początkujący (480 p.)
0 głosów
1 odpowiedź 2,750 wizyt
pytanie zadane 29 października 2017 w C i C++ przez foruminfa Początkujący (310 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 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!

...