Răspuns :
Salut!
Ai rezolvarea in C++ mai jos
#include <iostream>
using namespace std;
int main()
{
bool cresc = false, desc = false, nemo = false, primaCitire = true;
int curr, ant;
cin >> curr;
if (curr != 0)
{
ant = curr;
while (curr != 0)
{
cin >> curr;
//DACA DUPA PRIMUL NUMAR AVEM 0
if (curr == 0)
{
if (primaCitire)
{
nemo = true;
}
break;
}
//PRIMA CITIRE
if (curr < ant)
{
desc = true;
nemo = false;
}
if (curr > ant)
{
cresc = true;
nemo = false;
}
if (curr == ant && !cresc && !desc)
{
nemo = true;
}
//DACA NU E PRIMA CITIRE
if (curr < ant && cresc)
{
nemo = true;
cresc = false;
desc = false;
break;
}
if (curr > ant && desc)
{
nemo = true;
cresc = false;
desc = false;
break;
}
ant = curr;
primaCitire = false;
}
}
else
{
nemo = true;
}
if (nemo)
{
cout << "nemonoton";
}
if (cresc)
{
cout << "crescator";
}
if (desc)
{
cout << "descrescator";
}
return 0;
}
Explicatie:
Folosim 3 variabile booleane cresc, desc si nemo pentru a retine daca sirul este crescator, descrescator respectiv nemonoton (initializate cu false, ulterior le vom modifica pe parcursul programului). Citim primul element (pe care ulterior il verificam sa nu fie 0), iar apoi citim si al 2 lea element (la fel, verificat sa nu fie 0), in caz contrar afisam corespunzator. Mai departe citim urmatoarele elemente cate unul si verificam daca conditia initiala de cresc/desc se adevereste, daca nu intram in nemonoton si putem sa ii dam un break fortat, deoarece nu mai are rost sa verificam sirul mai departe.
In final, afisam rezultatul corespunzator.
- Ti-am lasat mai jos si fisierul sursa
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
inline bool comp_desc_unsigned(unsigned a, unsigned b) {
return b<a;
}
int main() {
vector<unsigned> munti;
unsigned curent;
while (true) {
cin >> curent;
if (curent) munti.push_back(curent);
else break;
}
char monotonie = 0; //0-nemonotom, 1-crescator, 2-descrescator
if (munti.size() < 2) monotonie = 0;
else if (is_sorted(munti.begin(), munti.end())) monotonie = 1;
else if (is_sorted(munti.begin(), munti.end(), comp_desc_unsigned)) monotonie = 2;
if (monotonie == 0) cout << "nemonoton";
else if (monotonie == 1) cout << "crescator";
else if (monotonie == 2) cout << "descrescator";
}
► Explicatie
Folosim container vector din STL si functia is_sorted din algorithm pentru a verifica daca vectorul e sortat.
Functia is_sorted primeste trei parametrii :
- Primul e pointer/iterator catre primul element din sir
- Al doilea este pointer/iterator catre finalul sirului
- Al treilea (optional) e un comparator care specifica cum se compara elementele. Un comaprator e 0 functie care primeste doua elemente a,b si returneaza 1 daca a si b sunt in ordinea corecta sau 0 altfel. Daca nu furnizam un comparator se va compara folosind relatia de ordine data de operatorul <.
Raspunsul primit de la Sergetec e foarte bun, dar iti propun si aceasta varianta orientata pe caracteristici mai interesante ale limbajului. Iti recomand citirea documentatiei pentru a afla mai multe despre ce avem la dispozitie in C++ si cum fac aceste chestii viata mai usoara.