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

sprawdzanie monotoniczności w c++

Object Storage Arubacloud
0 głosów
4,210 wizyt
pytanie zadane 26 października 2017 w C i C++ przez bartekzbartek Nowicjusz (140 p.)
W jaki sposób w C++ sprawdzić czy wpisany przez nas ciąg jest uporzadkowany, rosnacy lub malejacy nie uzywajac tablic?

1 odpowiedź

+1 głos
odpowiedź 26 października 2017 przez draghan VIP (106,230 p.)
Jeśli masz nie używać tablic (rozumiem, że chodzi tutaj o szeroko pojęte kontenery, nie tylko "surowe" tablice), to musisz dokonywać operacji na bieżąco przy pobieraniu danych. W przypadku monotoniczności wystarczy sprawdzać wartość aktualną i poprzednią oraz jedna flaga.
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
Przepraszam ale czy mógłbyś dokładniej wytłumaczyć? To są moje początki z programowaniem.
komentarz 26 października 2017 przez draghan VIP (106,230 p.)
Masz już napisany jakiś kod? :) Wczytywanie ciągu na przykład.
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
#include <iostream>
using namespace std;
int x,z,n;
int main()
{
cout<<"Podaj dlugosc ciagu: ";<<endl;
cin>>n;
cin>>x;
cin>>z;
for(int i=0;i<n; i++)
{
    
}
    

}

 

Mam tyle. Nie wiem czy dobrze. Coś mi sie kojarzy z tym zeby podstawic x za z i porownywac ale nie wiem jak to zrobic

 

komentarz 26 października 2017 przez Sic Dyskutant (8,510 p.)
Kod w tej postaci to podanie wartości 3 zmienny n,z,x oraz pętla z warunkiem aby powtarzała się tyle razy co wartości n nie posiadającej żadnej instrukcji.
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
bo nie wiem jak zapisac instrukcje?
komentarz 26 października 2017 przez Sic Dyskutant (8,510 p.)
Jednak oznaczenie funkcji w programowaniu jest inny niż w matematyce. W programowaniu oznacza fragment kodu, który może być powtarzany aż do spełnienia warunku.
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
wiem o tym
komentarz 26 października 2017 przez draghan VIP (106,230 p.)
#include <iostream>
using namespace std;

int main()
{
    /*
     * Żeby przejść do nowej linii wystarczy podać
     * do strumienia znak \n:
     */
    cout<<"Podaj dlugosc ciagu: \n";

    /*
     * Nie używaj zmiennych globalnych. Staraj się
     * zawsze ograniczać zasięg zmiennej do niezbędnego minimum.
     * Tutaj przeniosłem zmienne do funkcji main(), bo w niej
     * chcesz ich użyć.
     * Tak naprawdę w tak trywialnym programie to nie ma
     * znaczenia, ale ani się obejrzysz, a natkniesz się na problem
     * spowodowany tym, że zbyt wiele kodu będzie
     * miało dostęp do zmiennych globalnych.
     */

    /*
     * Zmienne nazywaj odpowiednio do tego, co robią.
     * Nie: z, x, c, n, k, l, y, tylko: length, current_number, previous number...
     * Dzięki temu zwiększysz czytelność programu.
     */
    int length;
    cin>>length;

    double number = 0;
    double previous_number = 0;

    /*
     * Zbiór stałych, które możesz przypisać do
     * zmiennej i będziesz wiedział dzięki temu,
     * jaki jest ów ciąg.
     * Być może jakiejś wartości tutaj brakuje...? ;)
     */
    const int increasing_series = 0;
    const int decreasing_series = 1;
    const int unknown_series = 2;

    /*
     * Zmienna, do której możesz przypisać powyższe stałe.
     * Na początku programu ciąg jest nie wiadomo jak uporządkowany.
     */
    int series = unknown_series;

    for(int i = 0; i < length; ++i)
    {
        /*
         * Wczytanie liczby:
         */
        cin>>number;

        /*
         * Na podstawie relacji aktualnej liczby do poprzedniej
         * sprawdzasz, czy dany dwuelementowy fragment ciągu jest
         * rosnący / malejący / stały.
         */
        if(number > previous_number)
        {
            series = increasing_series;
        }
        // ... dalsze warunki sprawdzające pozostałe warianty...
        // ...

        /*
         * Tutaj przypisanie wartości dla zmiennej previous_number:
         */
        // ...

        /*
         * Możesz sobie testowo wypisać, jaki jest badany fragment ciągu:
         */
        if(series == increasing_series)
        {
            cout << "increasing\n";
        }
        else if(series == /* ... */)
        {
            /* ... */
        }
    }
}

Napisałem jakiś tam szkielet programu - do uzupełnienia. ;) Jeśli uzupełnisz brakujące fragmenty, pozostanie w nim do zrobienia jeszcze jedna rzecz - całościowe sprawdzenie ciągu.

W razie kłopotów - pisz. Ja na razie uciekam od kompa - wrócę za jakieś pół godziny lub godzinę. Powodzenia!

komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
w jakis sposób przypisać wartość dla previous_number? previous_number=number?
komentarz 26 października 2017 przez draghan VIP (106,230 p.)
Dokładnie tak. W następnej iteracji pętli zmieni się wartość zmiennej number na tę podaną przez użytkownika, zaś previous_number będzie miało wartość z poprzedniego obiegu.
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
#include <iostream>
using namespace std;
int main()
{
    cout<<"Podaj dlugosc ciag\n";
    int dlugosc;
cin>>dlugosc;
int liczba=0;
int poprzednia_liczba=0;
const int rosnacy = 0;
const int malejacy = 1;
const int unknown_series = 2;
int ciag = unknown_series;
for(int i=0;i<dlugosc;i++)
    {
      cin>>liczba;
      if(liczba>poprzednia_liczba)
      {
          ciag=malejacy;
      }
      if(liczba<poprzednia_liczba)
      {
          ciag=rosnacy;
      }
    poprzednia_liczba=liczba;


    }
 if(ciag=rosnacy)
    {
        cout<<"ciag rosnacy";
    }
    else if(ciag=malejacy)
    {
        cout<< "ciag malejacy";

    }



}



Dlaczego za kazdym razem wypisuje mi ze ciag jest malejacy?

komentarz 26 października 2017 przez draghan VIP (106,230 p.)

Po pierwsze - nie jest to jeszcze sprawdzenie całego ciągu - na razie sprawdzasz tylko bieżący element i poprzedni. Jest to ważny krok w określeniu monotoniczności całego ciągu. Do sprawdzenia całego ciągu brakuje fragmentu, w którym będziesz porównywać bieżącą flagę z poprzednią.

Po drugie - sprawdzenia wartości dokonuje się operatorem ==, zaś przypisanie to pojedynczy znak równości. Czyli powinno być:

 if(ciag == rosnacy) // "podwójne" =
// ...

Po trzecie - nie wiem czy celowo czy nie, ale wypisywanie "ciag rosnacy", "ciag malejacy" wyrzuciłeś poza ciało pętli.

komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
w jaki sposób porownac biezaca flage z poprzednia?
komentarz 26 października 2017 przez draghan VIP (106,230 p.)
W taki sam sposób, jak porównujesz bieżącą wartość z poprzednią: musisz mieć dwie zmienne i je odpowiednio przepisywać. :)
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
szczerze to nie wiem jak
komentarz 26 października 2017 przez draghan VIP (106,230 p.)
Pokaż, co do tej pory masz.:)
komentarz 26 października 2017 przez bartekzbartek Nowicjusz (140 p.)
#include <iostream>
using namespace std;
int main()
{
    cout<<"Podaj dlugosc ciag\n";
    int dlugosc;
cin>>dlugosc;
int liczba=0;
int poprzednia_liczba=0;
const int rosnacy = 0;
const int malejacy = 1;
const int unknown_series = 2;
int ciag = unknown_series;
for(int i=0;i<dlugosc;i++)
    {
      cin>>liczba;
      if(liczba>poprzednia_liczba)
      {
          ciag=malejacy;
      }
      if(liczba<poprzednia_liczba)
      {
          ciag=rosnacy;
      }
    poprzednia_liczba=liczba;
if(ciag==rosnacy)
    {
        cout<<"ciag rosnacy";
    }
    else if(ciag==malejacy)
    {
        cout<< "ciag malejacy";


    }

    }



}


mam tyle co i wczesniej

komentarz 27 października 2017 przez draghan VIP (106,230 p.)

No to teraz sprawdzenie, czy monotoniczność aktualnie sprawdzanego fragmentu jest zgodna z monotonicznością wcześniej sprawdzanego fragmentu:

#include <iostream>
using namespace std;
int main()
{
    cout<<"Podaj dlugosc ciag\n";
    int dlugosc;
    cin>>dlugosc;
    int liczba=0;
    int poprzednia_liczba=0;

    const int rosnacy = 0;
    const int malejacy = 1;
    const int niezdefiniowany = 2; // tutaj brakuje jednego stanu!

    int ciag = niezdefiniowany;
    int poprzedni_ciag = niezdefiniowany;
    
    for(int i=0;i<dlugosc;i++)
    {
      cin>>liczba;
      if(liczba>poprzednia_liczba)
      {
          ciag=malejacy;
      }
      if(liczba<poprzednia_liczba)
      {
          ciag=rosnacy;
      }

    
    /*
        Jeśli poprzednio sprawdzony fragment ciągu jest inaczej monotoniczny
        niż aktualny, to znaczy że cały ciąg jest nieuporządkowany.
        Należy wykryć tutaj sytuację, kiedy mamy początek pętli i 
        poprzedni_ciag będzie zawierał "niezdefiniowany", a ciag będzie już jakoś
        określony.
    */
     if(poprzedni_ciag != ciag && poprzedni_ciag != niezdefiniowany)
     {
        cout << "ciag nieuporzadkowany!\n";
     }

     poprzedni_ciag = ciag;     
     poprzednia_liczba=liczba;
    }

    if(ciag==rosnacy)
    {
        cout<<"ciag rosnacy";
    }
    else if(ciag==malejacy)
    {
        cout<< "ciag malejacy"; 
    } 
}

 

Podobne pytania

0 głosów
2 odpowiedzi 774 wizyt
0 głosów
0 odpowiedzi 431 wizyt
pytanie zadane 15 września 2022 w C i C++ przez SUOTR Początkujący (410 p.)
0 głosów
1 odpowiedź 628 wizyt
pytanie zadane 3 kwietnia 2021 w C i C++ przez Dawidziu Bywalec (2,610 p.)

92,634 zapytań

141,505 odpowiedzi

319,883 komentarzy

62,015 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!

...