Informatică, întrebare adresată de ddana143, 8 ani în urmă

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

Răspuns de andrei750238
2

► 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.

Alte întrebări interesante