Subprogramul aranjare are doi parametri, a şi n, prin care primeşte un tablou
unidimensional cu maximum 100 de numere reale nenule şi, respectiv, numărul de
elemente din tablou. Subprogramul rearanjează elementele tabloului astfel încât toate
valorile negative să se afle pe primele poziţii, iar valorile pozitive în continuarea celor
negative. Ordinea în cadrul secvenţei de elemente pozitive, respectiv în cadrul secvenţei de
elemente negative, poate fi oricare.
Exemplu: dacă este transmis ca parametru un tablou unidimensional cu 6 elemente de forma
(12, -7.5, 6.5, -3, -8, 7.5), după apel, acesta ar putea fi: (-7.5, -3, -8, 12,
6.5, 7.5).
a) Scrieţi definiţia completă a subprogramului aranjare. (10p.)
b) Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤100) şi
apoi un şir de n numere reale nenule şi care, folosind apeluri utile ale subprogramului
aranjare, afişează pe ecran, separate prin spaţiu, mai întâi elementele pozitive din şir şi
apoi cele negative. Ordinea în cadrul secvenţei de elemente pozitive, respectiv în cadrul
secvenţei de elemente negative, poate fi oricare.
Exemplu: pentru n=5 şi pentru şirul 6,-16.3,8,-18,20.7 se poate afişa pe ecran soluţia
6 8 20.7 -18 -16.3
Răspunsuri la întrebare
► Varianta lunga :
#include <iostream>
using namespace std;
//Aranjare folosind bubblesort, comparare modificata, prima data elementele negative
void aranjare(double a[], int n) {
bool nesortat = 1;
while (nesortat) {
nesortat = 0;
for (int i = 0; i < n - 1; i++) {
//Daca primul element are semn +/0 (sau +) iar al doilea element are semn - (sau -/0) atunci interschimba
if (a[i] >= 0 && a[i + 1] < 0 || a[i]>0 && a[i + 1] <= 0) {
swap(a[i], a[i + 1]);
nesortat = 1;
}
}
}
}
int main() {
double a[100];
int n;
//Citire date
cout << "Introduceti numar elemente : ";
cin >> n;
cout << "Introduceti elemente : ";
for (int i = 0; i < n; i++) cin >> a[i];
//Aranjare negative->pozitive
aranjare(a, n);
//Intoarcere vector, aranjare pozitive->negative
for (int i = 0; i < n / 2; i++)
swap(a[i], a[n - i - 1]);
//Afisare solutie
cout << "Elemente aranjate : ";
for (int i = 0; i < n; i++) cout << a[i] << " ";
}
► Varianta scurta, practica
#include <iostream>
#include <algorithm>
using namespace std;
//Functie comparare
bool comp_less(double a, double b) {
if (a < 0 && b >= 0 || a <= 0 && b>0) return 1;
return 0;
}
//Functie aranjare elemente de la negative la pozitive
void aranjare(double a[], int n) {
sort(a, a + n, comp_less);
}
int main() {
double a[100];
int n;
//Citire date
cout << "Introduceti numar elemente : ";
cin >> n;
cout << "Introduceti elemente : ";
for (int i = 0; i < n; i++) cin >> a[i];
//Aranjare negative->pozitive
aranjare(a, n);
//Intoarcere vector, aranjare pozitive->negative
reverse(a, a + n);
//Afisare solutie
cout << "Elemente aranjate : ";
for (int i = 0; i < n; i++) cout << a[i] << " ";
}
► De retinut :
Putem folosi orice algoritm de sortare dorim pentru a aranja elementele intr-o anumita ordine cat timp modificam comparatorul/conditia de interschimbare/aranjare a elementelor.
Functia sort din algorithm primeste o functie de comparare care e folosita in locul operatorului "<". Aceasta functie de comparare are doi parametri (a si b) si returneaza 1 daca a este inaintea lui b sau 0 altfel.