Programmatori di C a me

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts
  • Tristan
    Papəete Beach
    • Oct 2007
    • 16642
    • 547
    • 588
    • AS Roma
    • Send PM

    #46
    Originariamente Scritto da laplace Visualizza Messaggio
    per passare da ordinamento crescente a decrescente puoi definire una nuova funzione nella quale scambi i segni > e <, oppure definisci un'unica funzione di questo tipo

    ordina (...., type)
    {
    if( type == 'c' ) //metti tutto il codice con il segno <
    if( type == 'd' ) //metti tutto il codice con il segno >

    }

    e poi chiami a seconda dei casi ordina(...'c') e ordina(...'d')
    il bello della generalizzazione

    più le cose sono astratte(e specializzate) e meglio sono...

    Commenta

    • laplace
      Bodyweb Advanced
      • Dec 2005
      • 7982
      • 960
      • 1,370
      • Send PM

      #47
      Originariamente Scritto da Tristan Visualizza Messaggio
      il bello della generalizzazione

      più le cose sono astratte(e specializzate) e meglio sono...
      appunto prima avevo detto di definirne due di funzioni...una per ord crescente e una per ord decrescente...questa era la soluz piu spartana

      Commenta

      • Sam Fisher
        Bodyweb Advanced
        • Jan 2006
        • 4257
        • 576
        • 583
        • Ministero della Pubblica Istruzione
        • Send PM

        #48
        Raga ho provato ad aggiungere la parte per il riconoscimento dei maschi e delle femmine e la scrittura su file , nella compilazione non ci sono errori ma non mi scrive i file.
        Questo è il listato
        Codice:
        #include<stdio.h>
        #include<conio.h>
        
        struct studente { char cognome[20];char sesso[2];int voto;};
        /*il penultimo ; puoi anche toglierlo ma ti da un warning*/
        int acquisisci(FILE*,struct studente*);
        void ordina (int,struct studente*);
        void maschi (int, struct studente*);
        
        main()
        {
              FILE *fpi;
              
              int N;
              struct studente classe [20];
              fpi=fopen("studenti.txt","r");
              if(fpi==NULL)
              printf("Il file non esiste");
              else
              {
              printf("*ELENCO DEGLI STUDENTI ACQUISITO DA FILE* \n\n\n\n");
              N=acquisisci(fpi,classe);
              ordina(N,classe); 
              maschi(N,classe);
              }
              getch();
        }
        
        int acquisisci(FILE *A,struct studente *B)
        
        {
            int i=0;
            while(fscanf(A,"%s%s%d",B[i].cognome,B[i].sesso,&B[i].voto)!=EOF)
            {    
                 printf("cognome= %s sesso= %s voto= %d \n\n" ,B[i].cognome,B[i].sesso,B[i].voto);
                 i++;
            }
            fclose(A);
            return i;
            
        }
        
        void ordina (int A,struct studente *B)
        {
             int i,j,imin; 
             struct studente temp; 
             
        /*devo dichiarare temp di tipo struct perchè al suo interno ha B[i] 
        che è di quel tipo */
             
             for (i=0;i<A-1;i++)
             {    imin=i;
                 for(j=i+1;j<A;j++)
                 {  
                    if(B[j].voto<B[imin].voto)
                    imin=j;
                 }
        
        /*dopo aver ordinato le componenti per voto crescente sposto anche tutte le altre 
        conponenti delllo struct studente quindi uso B[i] e non B[i].voto*/
             
             temp=B[i];
             B[i]=B[imin];
             B[imin]=temp;
             }
        
        /*l'eventuale stampa a video sempre fuori il primo ciclo di for cioè 
        for (i=0;i<A-1;i++) */
             
             printf("\n\n\n*ORDINAMENTO DEGLI STUDENTI PER VOTO* \n\n\n\n");
             for(i=0;i<A;i++)
             printf("cognome= %s sesso= %s voto= %d \n\n",B[i].cognome,B[i].sesso,B[i].voto);
        
        }
        
        
        void maschi(int C, struct studente *D)
        {    
             FILE *fpm,*fpf;
             int i,j,k;
             struct studente maschio[j],femmina[k];
             
             i=j=k=0;
             
             for(i=0;i<C;i++)
             {
                 if(D[i].sesso=='M')
                 {
                    D[i]=maschio[j];
                    j++;
                 }
                 
                 else
                 {
                    D[i]=femmina[k];
                    k++;
                 } 
             }
                 
             fpm=fopen("maschio.txt","w");
             if(fpm==NULL)
             printf("Non riesco a scrivere il file");
             else
                 {
                    for(i=0;i<j;i++)
                    fprintf(fpm,"%s %s %d \n",maschio[i].cognome,maschio[i].sesso,maschio[i].voto);
                 }
                 fclose(fpm);
             
             fpf=fopen("femmina.txt","w");
             if(fpf==NULL)
             printf("Non riesco a scrivere il file");
             else
                 {
                    for(i=k;i=0;i--)
                    fprintf(fpf,"%s %s %d \n",femmina[i].cognome,femmina[i].sesso,femmina[i].voto);
                 }
                 fclose(fpf);
        }
        Pillola rossa o pillola blu ????

        La risposta è dentro te.

        Commenta

        • XVII
          Bodyweb Advanced
          • Nov 2007
          • 595
          • 48
          • 75
          • Send PM

          #49
          e ci credo, nell'ultimo for c'è un i=0, sostituiscilo con un i!=0 e dovrebbe andare
          what?

          Commenta

          • Sam Fisher
            Bodyweb Advanced
            • Jan 2006
            • 4257
            • 576
            • 583
            • Ministero della Pubblica Istruzione
            • Send PM

            #50
            Originariamente Scritto da XVII Visualizza Messaggio
            e ci credo, nell'ultimo for c'è un i=0, sostituiscilo con un i!=0 e dovrebbe andare
            aspe ma quello è un ciclo for a decremento parte dal valore di k fino ad arrivare a zero.
            Pillola rossa o pillola blu ????

            La risposta è dentro te.

            Commenta

            • XVII
              Bodyweb Advanced
              • Nov 2007
              • 595
              • 48
              • 75
              • Send PM

              #51
              Originariamente Scritto da Sam Fisher Visualizza Messaggio
              aspe ma quello è un ciclo for a decremento parte dal valore di k fino ad arrivare a zero.
              appunto, noi inizializziamo i a 10 per esempio, ed iteriamo il ciclo finché i non si annulla (e diventa uguale a 0), quindi for(i=k; i != 0; i--)
              what?

              Commenta

              • Sam Fisher
                Bodyweb Advanced
                • Jan 2006
                • 4257
                • 576
                • 583
                • Ministero della Pubblica Istruzione
                • Send PM

                #52
                Originariamente Scritto da XVII Visualizza Messaggio
                appunto, noi inizializziamo i a 10 per esempio, ed iteriamo il ciclo finché i non si annulla (e diventa uguale a 0), quindi for(i=k; i != 0; i--)
                ho provato adesso cn la correzione ma da ancora errore e non crea il file.
                Pillola rossa o pillola blu ????

                La risposta è dentro te.

                Commenta

                • XVII
                  Bodyweb Advanced
                  • Nov 2007
                  • 595
                  • 48
                  • 75
                  • Send PM

                  #53
                  dove ti da errore di preciso? Ah, io nella dichiarazione delle variabili scriverei FILE* fpm,fpf;
                  what?

                  Commenta

                  • Sam Fisher
                    Bodyweb Advanced
                    • Jan 2006
                    • 4257
                    • 576
                    • 583
                    • Ministero della Pubblica Istruzione
                    • Send PM

                    #54
                    Originariamente Scritto da XVII Visualizza Messaggio
                    dove ti da errore di preciso? Ah, io nella dichiarazione delle variabili scriverei FILE* fpm,fpf;
                    no la dichiarazione dei puntatori a file va bene l'ho usata nella funzione di sopra cn successo.
                    Per quanto riguarda l'errore esce nel momento in cui va a ricercare se il d contiene M .
                    Pillola rossa o pillola blu ????

                    La risposta è dentro te.

                    Commenta

                    • XVII
                      Bodyweb Advanced
                      • Nov 2007
                      • 595
                      • 48
                      • 75
                      • Send PM

                      #55
                      int i,j,k;
                      struct studente maschio[j],femmina[k];

                      se fai una dichiarazione del genere il compilatore non sa quanta memoria allocare per maschio[j] e femmina[k]...
                      what?

                      Commenta

                      • Sam Fisher
                        Bodyweb Advanced
                        • Jan 2006
                        • 4257
                        • 576
                        • 583
                        • Ministero della Pubblica Istruzione
                        • Send PM

                        #56
                        Originariamente Scritto da XVII Visualizza Messaggio
                        int i,j,k;
                        struct studente maschio[j],femmina[k];

                        se fai una dichiarazione del genere il compilatore non sa quanta memoria allocare per maschio[j] e femmina[k]...
                        mi sa che è questo l'errore, vedo cm ovviare al problema.
                        Pillola rossa o pillola blu ????

                        La risposta è dentro te.

                        Commenta

                        • XVII
                          Bodyweb Advanced
                          • Nov 2007
                          • 595
                          • 48
                          • 75
                          • Send PM

                          #57
                          Originariamente Scritto da Sam Fisher Visualizza Messaggio
                          mi sa che è questo l'errore, vedo cm ovviare al problema.
                          o che prima conti tutti i maschi e le femmine e allochi dinamicamente due vettori con la malloc oppure li fai della grandezza del vettore sorgente fregandotene della corrispondenza tra dimensione fisica e logica del vettore (io userei la malloc)
                          what?

                          Commenta

                          • XVII
                            Bodyweb Advanced
                            • Nov 2007
                            • 595
                            • 48
                            • 75
                            • Send PM

                            #58
                            Già che ci sono scrivo il codice
                            Codice:
                            #include <stdlib.h>
                            ...
                            struct studente* maschio, femmina;
                            ...
                              for(i=0;i<C;i++)
                                 {
                                     if(D[i].sesso=='M')
                                     {
                                        j++;
                                     }
                                     
                                     else
                                     {
                                        k++;
                                     } 
                                 }
                            maschio = (studente*) malloc(sizeof(studente)*j);
                            femmina = (studente*) malloc(sizeof(studente)*k);
                            k=j=0;  
                            for(i=0;i<C;i++)
                                 {
                                     if(D[i].sesso=='M')
                                     {
                                        D[i]=maschio[j];
                                        j++;
                                     }
                                     
                                     else
                                     {
                                        D[i]=femmina[k];
                                        k++;
                                     } 
                                 }
                            ...
                            ecco
                            what?

                            Commenta

                            • Sam Fisher
                              Bodyweb Advanced
                              • Jan 2006
                              • 4257
                              • 576
                              • 583
                              • Ministero della Pubblica Istruzione
                              • Send PM

                              #59
                              Originariamente Scritto da XVII Visualizza Messaggio
                              o che prima conti tutti i maschi e le femmine e allochi dinamicamente due vettori con la malloc oppure li fai della grandezza del vettore sorgente fregandotene della corrispondenza tra dimensione fisica e logica del vettore (io userei la malloc)
                              io malloc ancora non lo ho fatta quindi devo trovare un altra maniera
                              Pillola rossa o pillola blu ????

                              La risposta è dentro te.

                              Commenta

                              • Sam Fisher
                                Bodyweb Advanced
                                • Jan 2006
                                • 4257
                                • 576
                                • 583
                                • Ministero della Pubblica Istruzione
                                • Send PM

                                #60
                                Adesso ho scoperto un 'altra cosa fantastica che non mi riconosce iol carattere M nel file acquisito.
                                In pratica considera tutte femmine infatti facendo questa prova mi escono che ha contato tutte femmine.
                                Codice:
                                void maschi(int C, struct studente *D)
                                {    
                                     FILE *fpm,*fpf;
                                     int i,j,k;
                                     struct studente maschio[20],femmina[20];
                                     
                                     j=k=0;
                                     
                                     for(i=0;i<C;i++)
                                     {
                                     printf("%s \n",D[i].sesso);
                                     if(D[i].sesso=='M')
                                         {
                                            D[i]=maschio[j];
                                            j++;
                                         }
                                         
                                         else
                                         {
                                            D[i]=femmina[k];
                                            k++;
                                         } 
                                     
                                     }
                                     printf("%d %d\n",j,k);
                                Pillola rossa o pillola blu ????

                                La risposta è dentro te.

                                Commenta

                                Working...
                                X