PDA

Visualizza la versione completa : [C++] Puntatori ed ordinamento array


bubino91
04-01-2011, 16:20
Un saluto a tutti i forumisti!!! :unz:
Ho bisogno del vostro aiuto. Sono alle prese con il c++ per un esame di fondamenti il 10 p.v.
Ho scritto un programma su richiesta dell'esercizio che prevede la lettura degli elementi di un array contenente i dipendenti di un'azienda (naturalmente organizzato in struct) che, fortunatamente, fino a questa fase funziona!
Successivamente deve creare un altro array contenente tutti i dipendenti iscritti in un certo intervallo di anni, quindi ordinare i risultati per la loro matricola.
La ricerca funziona e(spero)anche la copia nel nuovo array ma c'è qualche cosa nell'ordinamento dei risultati che infrange la mia felicità: nella restituzione dell'array infatti il primo elemento che viene restituito tramite cout è un dato non appartentente all'array che ho creato. :dhò: So per certo che si tratta di un indirizzo riservato dal SO perchè in primis contiene dati "a cavolo" che io non ho mai inserito (simboli e cose varie), poi perchè il S.O. abortisce il programma come se stesse accedendo a dati appartenenti ad altri programmi.

Uso Netbeans con MinGW e MySYS sotto Windows 7. Fino ad oggi non mi ha mai dato problemi. Posto qui il codice nella speranza che qualche buon'anima tra di voi mi possa aiutare!!!


#include <iostream>
#include <cstring>
using namespace std;
struct dipendente{char cognome[20]; char nome[20]; char reparto[16]; int annass; int matr;
};

void leggielenco(dipendente *p, int n){
for (int i=1; i<=n; i++){
cout<<endl<<"DATI DIPENDENTE N."<<i<<endl<<"-------------------------"<<endl;
cout<<"Cognome: "; cin>>p->cognome;
cout<<"Nome: "; cin>>p->nome;
cout<<"Reparto (amministrazione, ricerca, produzione, marketing): "; cin>>p->reparto;
cout<<"Anno di assunzione: "; cin>>p->annass;
cout<<"Matricola: "; cin>>p->matr;
p++;
}
}
int contadipendenti(dipendente *p, int n, int ainizio, int afine){
int numdip=0;
for (int i=1; i<=n; i++){
if (p->annass>=ainizio && p->annass<=afine)
numdip++;
cout<<"Sono stati trovati "<<numdip<<" dipendenti"<<endl;
p++;
}
return numdip;
}
void copiadipendenti(dipendente *psorg, dipendente *pdest, int n, int ainizio, int afine){
for (int i=1; i<=n; i++){
if(psorg->annass>=ainizio && psorg->annass<=afine){
strcpy(pdest->cognome, psorg->cognome);
strcpy(pdest->nome, psorg->nome);
strcpy(pdest->reparto, psorg->reparto);
pdest->annass=psorg->annass;
pdest->matr=psorg->matr;
pdest++;
}
psorg++;
}
return;
}
dipendente* cercaposmin(dipendente *pos, dipendente *posfin){
dipendente *posmin;
posmin=pos;
while (pos<=posfin){
if(posmin->matr>=pos->matr)
posmin=pos;
pos++;
}
return posmin;
}
void ordinadipendenti(dipendente *p, int n){
dipendente *indpart, *indfin, *posmin;
indpart=p; indfin=p+n;
for (int i=0; i<n-1; i++){
posmin=(indpart, indfin);
if (posmin!=indpart)
swap(*posmin,*indpart);
indpart++;
}
}

void restituiscielenco(dipendente *p, int n){
for (int i=1; i<=n; i++){
cout<<endl<<"DATI DIPENDENTE N."<<i<<endl<<"-------------------------";
cout<<endl<<"Cognome: "<<p->cognome[0];
cout<<endl<<"Nome: " <<p->nome[0];
cout<<endl<<"Reparto (amministrazione, ricerca, produzione, marketing): "<<p->reparto;
cout<<endl<<"Anno di assunzione: "<<p->annass;
cout<<endl<<"Matricola: "<<p->matr;
p++;
}
}

int main(int argc, char** argv) {
int n,a1,a2,k;

cout<<"Quanti dipendenti? ";
cin>>n;
dipendente *p_elenco, *p_nuovoelenco;
p_elenco=new dipendente[n];
leggielenco(p_elenco, n);

cout<<endl<<"Anno 1:";
cin>>a1;
cout<<"Anno 2:";
cin>>a2;
if (a1>a2)
swap(a1,a2);

k=contadipendenti(p_elenco, n, a1, a2);
cout<<endl;
if (k!=0){
p_nuovoelenco=new dipendente[k];
copiadipendenti(p_elenco, p_nuovoelenco, k, a1, a2);
ordinadipendenti(p_nuovoelenco, k);

restituiscielenco(p_nuovoelenco, k);
}else
cout<<"Nessun dipendente e' stato assunto nell'intervallo"<<a1<<"-"<<a2<<"."<<endl;
return 0;
}



PS: Se c'è qualche altro consiglio sull'ordine ecc.. sono tutti ben accetti :fiore:

Grazie in anticipo!

bubino91
04-01-2011, 21:10
Aggiungo qualche altra informazione...
La stessa cosa mi è capitata con questo codice: è un sottoprogramma che ordina un array di cartelle cliniche di un ospedale. Come sempre alla stampa mi viene dato fuori un elemento che no c'entra nulla con il mio array.. insomma mi stampa simboli ecc.. La funzione di stampa funziona correttamente perchè è la stessa che uso per vireificare i dati inseriti ancor prima dell'ordinamento!

Sapreste aiutarmi?



cartella *cercaposmin(cartella *p_start, cartella *p_end){
cartella *p;
p=p_start;
while(p_start<=p_end){
if(p_start->cod<p->cod)
p=p_start;
p_start++;
}
}
void ordinaelenco(cartella *p, int n){
cartella *pin, *pfin;
pfin=p+n; pin=p;
cartella* posmin;
for(int i=0; i<n-1; i++){
posmin=cercaposmin(pin,pfin);
if (posmin!=pin){}
swap(pin->nome,posmin->nome);
swap(pin->cognome,posmin->cognome);
swap(pin->reparto,posmin->reparto);
swap(pin->cod,posmin->cod);
pin++;
}
}

Loading