Cum să așez o lista de studenti in ordine alfabetica..
#include <iostream>
using namespace std;
int
main ()
{
struct Data
{
int Ziua;
int Luna;
int Anul;
};
struct Student
{
char Numele[20];
char Prenumele[30];
};
struct Persoana
{
Student NumelePrenumele;
Data DataNasterii;
string Se*ul;
int Notele;
};
Persoana LP[99];
int i;
int e;
int n;
cout « "Cati studenti sunt ?" « endl;
cin » n;
cout « "Cate examene au intr-o sesiune ?" « endl;
cin » e;
for (i = 1; i <= n; i++)
{
cout «"Scrieti numele si prenumele fiecarui student aparte in format (Nume Prenume): "
« endl;
cin » LP[i].NumelePrenumele.Numele » LP[i].NumelePrenumele.Prenumele;
cout «
"Scrieti data nasterii acestui student in format ( ziua luna anul):"
« endl;
cin » LP[i].DataNasterii.Ziua » LP[i].DataNasterii.Luna » LP[i].
DataNasterii.Anul;
cout « "Scrieti nota studentului la o sesiune in format ( 8/9/10 )" «
endl;
cin » LP[i].Notele;
cout « "Scrieti de ce s*x este studentul in format ( Masculin/Femenin)"
« endl;
cin » LP[i].Se*ul;
}
cout « "Lista alfabetica este :" « endl;
// cum sa fac ca mai departe sa se aseze studentii in ordine alfabetica??
return 0;
}
Răspunsuri la întrebare
Răspuns:
Pas 1: la început de fișier incluzi biblioteca de rutine cstring:
#include <cstring>
Pas 2: înlocuiești comentariul „cum sa fac…” cu următorul cod:
for (i = 1; i <= n - 1; i++) {
int min = i;
for (int j = i + 1; j <= n; j++) {
if ((strcasecmp(LP[min].NumelePrenumele.Numele, LP[j].NumelePrenumele.Numele) ?: strcasecmp(LP[min].NumelePrenumele.Prenumele, LP[j].NumelePrenumele.Prenumele)) > 0) {
min = j;
}
}
if (min > i) {
Persoana temp = LP[min];
LP[min] = LP[i];
LP[i] = temp;
}
}
Explicație:
În stdlib există o funcţie dedicată qsort(), dar n-am reușit să-l folosesc că la terminarea programului crăpa cu „free(): invalid pointer”. Dacă cineva furnizează rezolvarea cu qsort(), folosește-l pe ăla. Între timp și ăsta ar trebui să-și facă treaba.