Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C]problema in ordinamento?

    Salve a tutti, ho un problemino nell'ordinamento in questo programma:
    codice:
    #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

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Pos_aziendale è un semplice char ... non devi utilizzare la strcpy
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Quote Originariamente inviata da oregon Visualizza il messaggio
    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.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  4. #4
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    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?

  5. #5
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  6. #6
    codice:
    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 ...
    Ultima modifica di andrea2014; 24-05-2014 a 15:51

  7. #7
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  8. #8
    Quello è un vettore di record, in quel vettore ci sono 5 record, ogni record caratterizza ogni singolo dipendente

  9. #9
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    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

    codice:
    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.
    Ultima modifica di oregon; 24-05-2014 a 16:29
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  10. #10
    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

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.