PDA

Visualizza la versione completa : [C++] Fondere due array di strutture


corallo
30-12-2011, 19:51
Spero di non essere bloccato dal moderatore e spero che ho inviato bene la domanda.
Ragazzi lo scopo dell esercizio e'...anzi forse faccio prima a scrivere la traccia:

Si scriva un programma che utilizzi la struttura dati più adatta per gestire un elenco di aziende, in cui il generico elemento deve contenere le seguenti informazioni:

nome dell'azienda
tipologia ("meccanica", "tessile", "elettronica", "farmaceutica")
numero di dipendenti
capitale sociale (in migliaia di euro, valore reale)

Il programma deve prevedere inizialmente la lettura di due elenchi di questo tipo con tutti i dati per un numero, rispettivamente, N1 e N2 di aziende specificato dall'utente e quindi porre in ordine alfabetico i due elenchi secondo il nome dell'azienda. Il programma deve quindi fondere i due elenchi in uno solo inserendo gli elementi del secondo nel primo con la modalità seguente: se il generico elemento del secondo elenco ha un corrispettivo nel primo elenco (stesso nome e stessa tipologia) è sufficiente aggiornare i campi numerici con la somma dei valori corrispondenti; in caso contrario, l'elemento va inserito (conservando l'ordinamento) nel primo elenco.
Il programma deve infine stampare l'elenco così ottenuto, fornendo in output, per ciascuna azienda, tutti i dati prodotti.

Ragazzi la difficolta' principale è nel fondere i due elenchi visto che non mi spiego la presenza di errori visto che controllando e ricontrollando non riesco a venirne a capo. Ripeto, secondo me la mia difficoltà è nel modifica_elenco, ma per integrezza vi pubblico tutto l'algoritmo sperando in un anima pia che mi indichi l'errore principale dov'e...vi ringrazio ragazzi.



#include <cstdlib>
#include <iostream>
#include <cstring>

using namespace std;

struct elenco{
char nome_azienda[32];
char tipologia[32];
int num_dipendenti;
int cap_sociale;
};
/*
*
*/
void leggi_elenco(elenco azienda[],int n);
void ordina(elenco azienda[],int n);
void stampa(elenco azienda[],int n);
void fondi_elenco(elenco listain[],int &nin,elenco listaout[],int nout);

int main(int argc, char** argv) {

elenco aziende1[50],aziende2[50];
int num1,num2;

cout<<"Quante aziende del primo elenco da leggere?";
cin>>num1;
leggi_elenco(aziende1,num1);
ordina(aziende1,num1);

cout<<"Quante aziende del secondo elenco da leggere?";
cin>>num2;
leggi_elenco(aziende2,num2);
ordina(aziende2,num2);

fondi_elenco(aziende1,num1,aziende2,num2);

stampa(aziende1,num1);
return 0;
}

void leggi_elenco(elenco azienda[],int n){
bool corretto;

for(int i=0;i<n;i++){
cout<<"Nome dell'azienda :";
cin.ignore();
cin.getline(azienda[i].nome_azienda,32);
do {
corretto=false;
cout<<"Tipologia dell'azienda:";
cin.getline(azienda[i].tipologia,32);

if((strcmp(azienda[i].tipologia,"tessile")==0)||
(strcmp(azienda[i].tipologia,"elettonica")==0)||
(strcmp(azienda[i].tipologia,"farmaceutica")==0)||
(strcmp(azienda[i].tipologia,"meccanica")==0))
corretto=true;
}while(!corretto);

cout<<"Numero dipendenti :";
cin>>azienda[i].num_dipendenti;
cout<<"Capitale sociale :";
cin>>azienda[i].cap_sociale;
cout<<endl;
}
}
void ordina(elenco azienda[],int n){
bool fattoswap;
int end,last=0;

do{
fattoswap=false;
end=last;
for(int i=n-1;i>end;i--){
if(strcmp(azienda[i].tipologia,azienda[i-1].tipologia)<0){
swap(azienda[i],azienda[i-1]);
last=i;
fattoswap=true;
}
}

}while(fattoswap);
}
void stampa(elenco azienda[],int n){
cout<<"L'elenco ordinato e':"<<endl;

for(int i=0;i<n;i++){
cout<<"Nome dell'azienda :";
cout<<azienda[i].nome_azienda<<endl;
cout<<"Tipologia dell'azienda:";
cout<<azienda[i].tipologia<<endl;
cout<<"Numero dipendenti :";
cout<<azienda[i].num_dipendenti<<endl;
cout<<"Capitale sociale :";
cout<<azienda[i].cap_sociale;
cout<<endl;
}
cout<<endl;
}
void fondi_elenco(elenco listain[],int &nin,elenco listaout[],int nout){

int i=0;

while(i<nout){
/*questo for e immesso per poter fare un ciclo completo
* del primo elenco potendo andare a verificare le condizioni seguenti
* con un valore della j i fissato per poi incrementarlo e fare di nuovo le verifiche
* */
for(int j=0;j<nin;j++){
if(strcmp(listaout[i].tipologia,listain[j].tipologia)==0 &&
strcmp(listaout[i].nome_azienda,listain[j].nome_azienda)==0){
listain[j].num_dipendenti= listain[j].num_dipendenti+listaout[i].num_dipendenti;
listain[j].cap_sociale=listain[j].cap_sociale+listaout[i].cap_sociale;



}
/*sembra che in questa parte io abbia piu problemi
* sembra infatti che il mio nin aumenti ogni volta e non
* solo quando richiesto; eppure a me sembra giusto! mah..
*/
else if(strcmp(listaout[i].nome_azienda,listain[j].nome_azienda)<0){
/*faccio spazio per immettere il l azienda del secondo elenco nel primo
nella posizione giusta*/

for(int t=j;t<nin;t++){
listain[t+1]=listain[t];
}

listain[j]=listaout[i];
nin++;
}


}
/*prima della chiusura del while incremento i per passare a studiare l'azienda
successiva del secondo elenco*/
i++;
}


}


Help!!

oregon
30-12-2011, 19:58
Se non leggi e rispetti il regolamento, un moderatore te lo farà notare sicuramente.

Manca il linguaggio, non usi i tag CODE per rendere leggibile il codice e, cosa molto più importante, al di là della traccia, non fornisci indicazioni più precise su cosa non va, cosa hai fatto per capire tu il problema ...

Non funziona non è sufficiente.

corallo
30-12-2011, 23:23
Ragazzi come si fa??

alka
02-01-2012, 10:51
Originariamente inviato da corallo
Ragazzi come si fa??

Si riporta il codice tra i tag [CODE] e [/ CODE] (senza lo spazio che ho inserito io nel tag).

Ho corretto io il messaggio di apertura: in futuro, ricordati di formattare il codice come suggerito e di aggiungere il linguaggio nel titolo come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887), che se non lo ricordi bene puoi sempre rileggerlo quante volte vuoi.

Loading