Cerinţa
Se citește un vector cu n elemente, numere naturale distincte. Să se afișeze elementele cuprinse între elementul cu valoarea minimă și cel cu valoare maximă din vector, inclusiv acestea.
Date de intrare
Programul citește de la tastatură numărul n, iar apoi n numere naturale, reprezentând elementele vectorului.
Date de ieşire
Programul afișează pe ecran elementele cerute, separate prin exact un spațiu.
Restricţii şi precizări
1 ≤ n ≤ 1000
elementele vectorului vor fi mai mici decât 100.000
Exemplu
Intrare
5
7 9 6 2 8
Ieșire
9 6 2
Salut! Va rog mult sa ma ajutati si pe mine la aceasta problema. Am incercat sa o fac dar nu reusesc sa o fac de 100 de puncte. Este vorba de problema #490 de pe pbinfo. As dorii si explicatii la fiecare linie de cod.
Răspunsuri la întrebare
Răspuns:
#include <iostream>
int* creareVector(const size_t& dimensiuneVector);
void afisareVector(const std::pair<size_t, size_t>& perecheIndexi, int vectorNumere[]);
std::pair<size_t, size_t> calculareIndexi(int vectorNumere[], const size_t& dimensiuneVector);
int main()
{
size_t dimensiuneVector;
std::cout << "Introdu dimensiunea vectorului >> ";
std::cin >> dimensiuneVector; // citim dimensiunea vectorului
if (!dimensiuneVector > 0) {
exit(EXIT_FAILURE);
}
int* vectorNumere = creareVector(dimensiuneVector); // creăm vectorul cu dimensiunea dată
// gasim indexii minimului si maximului din vector
std::pair<size_t, size_t> perecheIndexi{ calculareIndexi(vectorNumere, dimensiuneVector) };
// afișăm valorile dintre cei doi indexi
afisareVector(perecheIndexi, vectorNumere);
delete[] vectorNumere; // la final eliberăm memoria alocată mai sus
return 0;
}
int* creareVector(const size_t& dimensiuneVector)
{
int* vectorNumere = new int[dimensiuneVector];
// după ce am alocat memoria citim numerele
for (size_t i{}; i < dimensiuneVector; ++i) {
std::cout << "vectorNumere[" << i << "] = ";
std::cin >> vectorNumere[i];
}
return vectorNumere;
}
void afisareVector(const std::pair<size_t, size_t>& perecheIndexi, int vectorNumere[])
{
for (size_t i{ perecheIndexi.first }; i <= perecheIndexi.second; ++i) {
std::cout << vectorNumere[i] << (i != perecheIndexi.second ? " " : "");
}
}
std::pair<size_t, size_t> calculareIndexi(int vectorNumere[], const size_t& dimensiuneVector) {
int valMaxima{ INT_MIN }, valMinima{ INT_MAX };
size_t minIndex{}, maxIndex{};
// parcurgem vectorul
for (size_t i{}; i < dimensiuneVector; ++i) {
// dacă numărul curent este mai mic decât valoarea minimă
if (vectorNumere[i] < valMinima) {
valMinima = vectorNumere[i]; // actualizăm valoarea minimă
minIndex = i; // și-i salvăm index-ul
}
// la fel și aici, dacă numărul curent e mai mare decât valoarea maximă facem aceași chestie
if (vectorNumere[i] > valMaxima) {
valMaxima = vectorNumere[i];
maxIndex = i;
}
}
// la final avem grijă ca pe prima poziție să fie index-ul cel mai mic (pentru a putea afișa cum trebuie-n for)
// am folosit std::pair pentru a returna cei doi indexi deodată într-o pereche (altfel trebuiau 2 funcții separate / pasați prin referință)
return minIndex < maxIndex ? std::make_pair(minIndex, maxIndex) : std::make_pair(maxIndex, minIndex);
}