PDA

Visualizza la versione completa : [C]problema in ordinamento?


andrea2014
24-05-2014, 12:45
Salve a tutti, ho un problemino nell'ordinamento in questo programma:

#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define MAX 5


typedef struct recDipendenti
{
char Cognome[MAX][10];
char Nome[MAX][10];
int Nascita;
char Pos_aziendale;
int Stipendio;
}t_Dipendenti;
t_Dipendenti dipendenti[MAX];
int j;
int i;


void visualmenu();
void scelta(int *N);
void gestione(int N);
void lettura_anagrafica();
void visualrecord();
void ordina_cognome();
void scambio();
void ordina_data();
void ordina_stipendio();


/*Programma Principale*/
int main()
{


int N;
do{
visualmenu();
scelta(&N);
gestione(N);
system("PAUSE");
system("cls");
}while(N!=5);
system("PAUSE");
return(0);
}


/*Procedure:*/


void visualmenu(){
printf("\t\t\t MENU \n\n\n");
printf("\t 1 - Lettura anagrafica \n");
printf("\t 2 - Ordinamento e visualizzazione per cognome \n");
printf("\t 3 - Ordinamento e visualizzazione per data di nascita \n");
printf("\t 4 - Ordinamento e visualizzazione per stipendio \n");
printf("\t 5 - Exit \n");
return;
}


void scelta(int *N){
printf("\n\tInserisci scelta: ");
scanf("%d",N);
return;
}


void gestione(int N){
switch(N){
case 1: lettura_anagrafica();
break;
case 2: ordina_cognome();
visualrecord();
break;
case 3: ordina_data();
visualrecord();
break;
case 4: ordina_stipendio();
visualrecord();
break;
}
return;
}


void lettura_anagrafica(){

for(i=0;i<MAX;i++){
printf("\t\t\tDipendente:%d \n\n",i+1);
printf("\n\tCognome dipendente: ");
scanf("%s",&dipendenti[i].Cognome);
printf("\n\tNome dipendente: ");
scanf("%s",&dipendenti[i].Nome);
printf("\n\tData di nascita dipendente: ");
scanf("%d",&dipendenti[i].Nascita);
printf("\n\tPosizione aziendale dipendente: ");
scanf("%s",&dipendenti[i].Pos_aziendale);
printf("\n\tStipendio dipendente: ");
scanf("%d",&dipendenti[i].Stipendio);
fflush(stdin);
system("cls");
}
return;
}


void visualrecord(){
for(i=0;i<MAX;i++){
printf("\n\n\t\tDipendente: %d ",i+1);
printf("\n\tCognome dipendente: %s",dipendenti[i].Cognome);
printf("\n\tNome dipendente: %s",dipendenti[i].Nome);
printf("\n\tData di nascita: %d",dipendenti[i].Nascita);
printf("\n\tPosizione aziendale: %s",dipendenti[i].Pos_aziendale);
printf("\n\tStipendio dipendente: %d",dipendenti[i].Stipendio);
}
return;
}


void ordina_cognome(){
for(i=0;i<=MAX;i++)
{
for(j=0;j<=MAX-1;j++)
if(dipendenti[j].Cognome[0][0]>dipendenti[j+1].Cognome[0][0])
{
scambio();
}
}
return;
}


void scambio(){
char string[10];
int app;

strcpy(string,dipendenti[j].Cognome);
strcpy(dipendenti[j].Cognome,dipendenti[j+1].Cognome);
strcpy(dipendenti[j+1].Cognome,string);

strcpy(string,dipendenti[j].Nome);
strcpy(dipendenti[j].Nome,dipendenti[j+1].Nome);
strcpy(dipendenti[j+1].Nome,string);

app = dipendenti[j].Nascita;
dipendendi[j].Nascita = dipendenti[j+1].Nascita;
dipendenti[j+1].Nascita = app;

app = dipendenti[j].Stipendio;
dipendendi[j].Stipendio = dipendenti[j+1].Stipendio;
dipendenti[j+1].Stipendio = app;

strcpy(string,dipendenti[j].Pos_aziendale);
strcpy(dipendenti[j].Pos_aziendale,dipendenti[j+1].Pos_aziendale);
strcpy(dipendenti[j+1].Pos_aziendale,string);

return;
}

void ordina_data(){
for(i=0;i<=MAX;i++)
{
for(j=0;j<=MAX-1;j++)
if(dipendenti[j].Nascita>dipendenti[j+1].Nascita)
{
scambio();
}
}
return;
}


void ordina_stipendio(){

for(i=0;i<=MAX;i++)
{
for(j=0;j<=MAX-1;j++)
if(dipendenti[j].Stipendio>dipendenti[j+1].Stipendio)
{
scambio();
}
}
return;
}
un programma che gestisce i dipendenti di una azienda..
riscontro dei problemi del tipo:
cannot convert `char (*)[10]' to `char*' for argument `1' to `char* strcpy(char*, const char*)
invalid conversion from `char' to `char*'
initializing argument 1 of `char* strcpy(char*, const char*)'
nella procedura scambio
non ho usato il passaggio di parametri dei record

oregon
24-05-2014, 13:36
Pos_aziendale un semplice char ... non devi utilizzare la strcpy

M.A.W. 1968
24-05-2014, 13:45
Pos_aziendale un semplice char ... non devi utilizzare la strcpy
Assolutamente corretto.

Inoltre, posto che nel real world un simile problema si gestisce efficientemente ed efficacemente solo scambiando puntatori a strutture (il che probabilmente proibito all'OP per esigenze didattiche e/o parziale attuazione del programma), resta il fatto che sarebbe almeno pi razionale copiare di volta in volta l'intera struttura con una memcpy() o equivalente.

andrea2014
24-05-2014, 15:25
Assolutamente corretto.

Inoltre, posto che nel real world un simile problema si gestisce efficientemente ed efficacemente solo scambiando puntatori a strutture (il che probabilmente proibito all'OP per esigenze didattiche e/o parziale attuazione del programma), resta il fatto che sarebbe almeno pi razionale copiare di volta in volta l'intera struttura con una memcpy() o equivalente.
quindi al posto della strcopy devo usare la memcpy? la sintassi sempre la stessa?

oregon
24-05-2014, 15:34
No, la questione diversa.

Sarebbe meglio usare la memcpy al posto di tutte le strcpy e scambi che hai fatto ma il suo uso non adatto alla "didattica" di quello che un primo esercizio di ordinamento. E poi, non hai studiato il suo funzionamento e sarebbe strano tu la usassi. Quindi lascia perdere la memcpy e concentrati sul fatto che stai trattando un semplice char.

Come nel caso dell'intero (int) che hai trattato prima, puoi usare un char temporaneo.

Al massimo, al posto di tutto quello che utilizzi per gli scambi potresti utilizzare solamente una variabile struttura temporanea.

andrea2014
24-05-2014, 15:46
string = dipendenti[j].Cognome;
dipendenti[j].Cognome = dipendenti[j+1].Cognome;
dipendenti[j+1].Cognome = string;
quindi cos?
cos come ho fatto comunque mi da degli errori ...

oregon
24-05-2014, 16:03
No, non ti ho detto cos. Ovvio che hai degli errori.

Ti ho indicato una "variabile struttura" non una parte della struttura.

Come mai nella struttura (che dovrebbe individuare un singolo dipendente) usi 5 cognomi e 5 nomi?

andrea2014
24-05-2014, 16:21
Quello un vettore di record, in quel vettore ci sono 5 record, ogni record caratterizza ogni singolo dipendente

oregon
24-05-2014, 16:26
No ... stai sbagliando. Il vettore di record (meglio, vettore di strutture)

dipendenti[MAX];

Quello che non si capisce il MAX usato per il Cognome e il Nome come se ogni dipendente avesse MAX Cognomi e Nomi.

La struttura dovrebbe essere qualcosa del genere



typedef struct recDipendente
{
char Cognome[30];
char Nome[30];
int Nascita;
char Pos_aziendale;
int Stipendio;
} t_Dipendente;


e il vettore

t_Dipendente dipendenti[MAX];

E' infatti meglio chiamare al singolare la struttura (dato che identifica un dipendente) e usare una trentina di caratteri per il Cognome e il Nome. Inoltre non chiaro

int Nascita;

perch non comodo per una data e

int Stipendio;

in quanto non puoi indicare i centesimi.

andrea2014
24-05-2014, 17:03
Si hai ragione, infatti ho modificato... per la data di nascita dovrei utilizzare un altro record, che ha come campi: giorno mese anno
mentre per lo stipendio ho messo int per potrei mettere float

Loading