Salut! Va rog mult sa ma ajutati cu niste explicatii la fiecare linie de cod c++ la aceasta problema de pe pbinfo (#1883), ca sa o pot intelege.
Atasez aici programul c++:
#include
using namespace std;
int main()
{
int n,i,v[1001],j,maxi,sol[1001];
cin>>n;
for(i=1; i<=n; i++)
cin>>v[i];
for(i=1; i<=n; i++)
{
if(v[i] maxi)
{
maxi=v[j];
break;
}
}
if(maxi==v[i])
sol[i]=-1;
else
sol[i]=maxi;
}
}
sol[n]=-1;
for(i=1; i<=n; i++)
cout <
return 0;
}
Răspunsuri la întrebare
Răspuns:
#include <iostream>
#include <vector>
int
cautaNumarMaiMare(const std::vector<int>& vectorNumere, int pozitieNumar);
int
main()
{
/* dimensiuneVector (în ea salvăm câte numere citim de la tastatură) */
int dimensiuneVector{}, numarCitit;
std::vector<int> vectorNumere;
std::cout << "Introdu cate numere vrei sa citesti >> ";
std::cin >> dimensiuneVector;
/* setăm de la început capacitatea vectorului la câte numere citim pentru a evita viitoare realocări de memorie */
vectorNumere.reserve(dimensiuneVector);
/* citim numărul de la tastatură și-l adăugăm în vector */
for (int i{}; i < dimensiuneVector; ++i) {
std::cout << "vectorNumere[" << i << "] = ";
std::cin >> numarCitit;
vectorNumere.push_back(numarCitit);
}
/* pentru fiecare număr mai apoi îi căutăm următoarea cifră mai mare decât el însuși */
for (int i{}; i < dimensiuneVector; i++) {
int cifraGasita{ cautaNumarMaiMare(vectorNumere, i) };
/* și o afișăm */
std::cout << cifraGasita << " ";
}
return 0;
}
int
cautaNumarMaiMare(const std::vector<int>& vectorNumere, int pozitieNumar)
{
/* numărul inițial este numărul cu care vom compara următoarele */
/* de exemplu pentru vectorul [3, 4, 3, 5, 1] la a 2-a iterație (a for-ului din main(...)) numărul inițial va fi 4, la a 5-a 1 etc... */
/* numărGăsit va avea valoarea -1, ea se va schimba doar dacă găsim un număr mai mare decât numărul inițial */
int numarInitial{ vectorNumere.at(pozitieNumar) }, numarGasit{ -1 };
/* pozitieNumar e i-ul din for-ul din main(...) ca să începem căutarea de la numărul curent ci nu de la început de fiecare dată (sper că are sens) */
/* cât timp valoarea din pozitieNumar e diferită de ultimul index al vectorului o incrementăm (că dacă am incrementa valoarea când aceasta e egală cu ultimul index din vector am accesa memorie din afara vectorului și asta ar putea duce la niște erori nasoale :)), sper că e clar */
if (pozitieNumar != vectorNumere.size() - 1) {
pozitieNumar++;
}
/* no, dacă găsim în lista de numere de după numărul inițial o valoare mai mare o actualizăm și ieșim din for, altfel ea rămâne -1, valoarea găsită e mai apoi returnată și afișată mai sus în main(...) */
/* de exemplu să zicem că pozitieNumar la noi e 1 (deci suntem la prima iterație când căutăm număr mai mare decât 3) din prima vedem că vectornumere.at(i[1]) este 4 care e mai mare decât numărInitial(3) deci setăm numărGăsit la 4 și ieșim returnăm valoarea lui ș.a.m.d. */
for (int i{ pozitieNumar }; i < vectorNumere.size(); i++) {
if (vectorNumere.at(i) > numarInitial) {
numarGasit = vectorNumere.at(i);
break;
}
}
return numarGasit;
}
Na, am făcut-o eu de la 0 că, codul de l-ai dat tu are erori și cel puțin așa mi se pare mai simpluț. Dacă nu înțelegi ceva, scrie-mi. Bineînțeles că nu ești nevoit să folosești std::vector<> doar că-ți faci viața mai ușoară :)) poți liniștit adapta și la un array de int-uri (chit că nu văd rostul din moment ce ai STL în C++).
using namespace std;
int main()
{
int n,i,v[1001],j,maxi,sol[1001];
cin>>n;
for(i=1; i<=n; i++)
cin>>v[i];
for(i=1; i<=n; i++)
{
if(v[i] sol[i]=v[i+1];
else
{
maxi=v[i];
for(j=i+1; j<=n; j++)
{
if(v[j]>maxi)
{
maxi=v[j];
break;
}
}
if(maxi==v[i])
sol[i]=-1;
else
sol[i]=maxi;
}
}
sol[n]=-1;
for(i=1; i<=n; i++)
cout < return 0;
}