Annuncio

Collapse
No announcement yet.

Altro esercizio in c

Collapse
X
 
  • Filter
  • Ora
  • Show
Clear All
new posts

    Altro esercizio in c

    Ragazzi devo fare questo esercizio ho fatto tutto il listato ma mi dice il debug errore di segmentazione.
    Praticamente ho 2 file risultati1.txt e risultati2.txt
    risultati1.txt è organizzato in questo modo cognome e voto relativo al primo esonero.
    Risultati2.txt invece il numero progressivo di ogni studente assegnato in ordine alfabetico crescente , il nome dello studente e il risultato del secondo esonero.
    devo creare un terzo file con ordine alfabetico crescente cognome nome media fra gli esoneri.

    Vi metto i file

    risultati1.txt
    Rossi 20
    Bianchi 27
    Neri 18
    Gialli 15
    Verdi 30

    risultati2.txt
    3 Piero 20
    4 Gianni 24
    2 Aldo 18
    1 Giuseppe 18
    5 Giacomo 24

    alla fine devo ottenere nel file :
    1 Bianchi Giuseppe ammesso con voto 22.500
    2 Gialli Aldo non ammesso con voto 16.500
    3 Neri Piero ammesso con voto 19.000
    4 Rossi Gianni ammesso con voto 22.000
    5 Verdi Giacomo ammesso con voto 27.000
    Codice:
    #include <stdio.h>
    #include <string.h>
    #include <conio.h>
    
    struct stud {int ordine;char cognome[20];char nome[20];int voto;float media;};
    
    int acquisisci1(FILE*,struct stud*);
    void ordina(int, struct stud*);
    void acquisisci2(FILE*,struct stud*,int);
    void scambia(struct stud*,struct stud*);
    void scrivi (int,struct stud*,FILE*);
    
    main()
    
    {
          FILE *fpi;
          int n;
          struct stud presenti [20]={0};
          n=acquisisci1(fpi,presenti);
          ordina(n,presenti);
          acquisisci2(fpi,presenti,n);
          scrivi(n,presenti,fpi);
          getch();
    }
    int acquisisci1 (FILE *A,struct stud *B)
    {
        int i=0;
        A=fopen("risultati1.txt","r");
        if(A==NULL)
            printf("il file non esiste\n");
        else
            {
                   printf("\n*COGNOME VOTO\n\n");
                   while(fscanf(A,"%s %d",B[i].cognome,&B[i].voto)!=EOF) 
                   {
                       printf("%s %d\n",B[i].cognome,B[i].voto);
                       i++;
                    }
            }
        fclose(A);
        return i;
    }     
    
    void ordina (int A,struct stud *B)
    {
         int i,j,imin;
         for(i=0;i<A-1;i++)
            {
                   imin=i;
                   for(j=i+1;j<A;j++)
                   {
                      if(strcmp(B[j].cognome,B[imin].cognome)<0)
                      imin=j;
                   }
                   scambia(&B[imin],&B[i]);
            }
            for(i=0;i<A;i++)
            printf("%s %d\n",B[i].cognome,B[i].voto);
    }
    
    void scambia (struct stud *A,struct stud *B)
    {    
         struct stud temp;
         temp=*A;
         *A=*B;
         *B=temp;
    }
    
    void acquisisci2 (FILE *A,struct stud *B, int C)
    {
        int i=0;
        A=fopen("risultati2.txt","r");
        if(A==NULL)
        printf("il file non esiste \n");
        else
            {      
                   printf("\n\n*ORDINE NOME VOTO SECONDO ESONERO\n\n");
                   while(fscanf(A,"%d %s %d",B[C+1].ordine,B[C+1].nome,&B[C+1].voto)!=EOF) 
                   {
                   printf("%d %s %d",B[C+1].ordine,B[C+1].nome,B[C+1].voto);
                   for(i=0;i<C;i++)
                   if(i==(B[C+1].ordine)-1)
                      {
                      strcpy(B[i].nome,B[C+1].nome);
                      B[i].media=(B[i].voto+B[C+1].voto)/2;
                      i=C;
                      }
                   }
                  
            }
    }
    
    void scrivi (int A,struct stud *B,FILE *C)
    {
         int i ;
         C=fopen("risultati_fin.txt","w");
         if(C==NULL)
         printf("non posso creare il file \n");
         else
         {
             printf("\n*ORDINE COGNOME NOME MEDIA \n\n");
             for(i=0;i<A;i++)
             {  
                if(B[i].voto >= 18)
                {
                printf("%d %s %s ammesso con voto %.3f \n",B[i].ordine,B[i].cognome,B[i].nome,B[i].voto);
                fprintf(C,"%d %s %s ammesso con voto %.3f \n",B[i].ordine,B[i].cognome,B[i].nome,B[i].voto);
                }
                else
                {
                printf("%d %s %s non ammesso con voto %.3f \n",B[i].ordine,B[i].cognome,B[i].nome,B[i].voto);
                fprintf(C,"%d %s %s nonn ammesso con voto %.3f \n",B[i].ordine,B[i].cognome,B[i].nome,B[i].voto);
                }  
             }
         fclose(C);
         }
    }
    edit ho risolto
    Last edited by Sam Fisher; 02-02-2009, 16:34:38.
    Pillola rossa o pillola blu ????

    La risposta è dentro te.

    #2
    Ragazzi chi mi spiega questa stranezza del c ?

    #include<stdio.h>
    #include<conio.h>

    main()
    {
    int a,b;
    float c;

    a=3.0;
    b=4.0;
    c=(a+b)/2;
    printf("%f",c);
    getch();



    }
    Il risultato corretto sarebbe3.5 ,ma nonostante il float ho 3. Come mai ??
    Se metto anche a e b cm float il problema non sorge.
    Pillola rossa o pillola blu ????

    La risposta è dentro te.

    Commenta


      #3
      c = (a+b)/2
      a = 3
      b=4

      a e b sono interi giusto? allora a+b è intero.......lui fa la divisione fra interi e il risultato è 3. poi lo converte in float e lo assegna a c che è ancora 3.0.......non è che un 3 possa diventare 3.5 solo perchè convertito in float

      se avessi scritto c = (a+b)/2.0 il risultato sarebbe stato invece 3.5 perchè lui avrebbe eseguito l'operazione di divisione fra float......l'operatore / subisce una sorta di "overloading" a seconda del tipo degli operandi...

      Commenta


        #4
        altrimenti potresti castare una delle due variabili:

        c = ( (float)a + b ) / 2

        il risultato sarebbe 3.5 lo stesso

        Commenta


          #5
          Originariamente Scritto da laplace Visualizza Messaggio
          altrimenti potresti castare una delle due variabili:

          c = ( (float)a + b ) / 2

          il risultato sarebbe 3.5 lo stesso
          ecco il concetto del cast potresti spiegarmelo meglio che anche su libro non ne parlava tanto.
          Pillola rossa o pillola blu ????

          La risposta è dentro te.

          Commenta


            #6
            il 'cast' è un concetto molto importante in programmazione. nei libri e all'università non ci si soffermano molto ma nei programmi più professionali nasce spesso l'esigenza di compiere questa operazione.

            'castare' una variabile significa cambiarne il tipo rispetto a quello originale con cui è stata dichiarata. in realtà viene castata solo una copia....perciò la variabile orginaria rimane di quel tipo.

            se scrivi infatti c = (float)a a c viene assegnato il cast di a ma a resta di tipo intero.

            i cast sono di due tipi: impliciti ed espliciti

            i cast impliciti sono quelli che avvengono automaticamente all'interno del programma in fase di compilazione...e qui bisogna conoscere le regole del c

            i cast espliciti sono quelli che forzi tu tramite espressioni del tipo (int)a (double)a e cosi simili....

            Commenta


              #7
              ma che libro stai usando?

              Commenta


                #8
                Originariamente Scritto da laplace Visualizza Messaggio
                ma che libro stai usando?
                ho sia il deitel che il bellini guidi.
                Pillola rossa o pillola blu ????

                La risposta è dentro te.

                Commenta


                  #9
                  Originariamente Scritto da Sam Fisher Visualizza Messaggio
                  ho sia il deitel che il bellini guidi.
                  non sono certamente i migliori libri che potessi usare...
                  se ti interessa approfondire la questione (non ricordo cosa studi di preciso)
                  i migliori testi sono:

                  kelley-pohl (didattica e programmazion)
                  kernighan-ritchie (il linguaggio c)
                  schildt (c guida completa)

                  il secondo forse non adattissimo per imparare ma sempre molto autorevole...il primo piu adatto per il principiante...il terzo un po mattone ma sempre valido


                  capito il discorso del cast?

                  Commenta


                    #10
                    Originariamente Scritto da laplace Visualizza Messaggio
                    non sono certamente i migliori libri che potessi usare...
                    se ti interessa approfondire la questione (non ricordo cosa studi di preciso)
                    i migliori testi sono:

                    kelley-pohl (didattica e programmazion)
                    kernighan-ritchie (il linguaggio c)
                    schildt (c guida completa)

                    il secondo forse non adattissimo per imparare ma sempre molto autorevole...il primo piu adatto per il principiante...il terzo un po mattone ma sempre valido


                    capito il discorso del cast?
                    si grazie dell'aiuto.Sai se questi libri si trovano sul mulo in ita ?Perchè il kerninghan e schildt li ho trovati ma sn sono in inglese.
                    Pillola rossa o pillola blu ????

                    La risposta è dentro te.

                    Commenta


                      #11
                      io li ho comprati tutti in italiano, non sono costosissimi ed è una spesa che resta per sempre...non certo soldi buttati. cmq nel tuo caso vedo meglio il kelley-pohl, che contiene anche spunti sulle strutture dati un po piu avanzate, scarsamente trattate negli altri.

                      Commenta


                        #12
                        Originariamente Scritto da laplace Visualizza Messaggio
                        io li ho comprati tutti in italiano, non sono costosissimi ed è una spesa che resta per sempre...non certo soldi buttati. cmq nel tuo caso vedo meglio il kelley-pohl, che contiene anche spunti sulle strutture dati un po piu avanzate, scarsamente trattate negli altri.
                        Vedrò di reperirlo grazie dell'aiuto !!!
                        Pillola rossa o pillola blu ????

                        La risposta è dentro te.

                        Commenta


                          #13
                          di nulla..quando vuoi

                          Commenta

                          Working...
                          X
                          😀
                          🥰
                          🤢
                          😎
                          😡
                          👍
                          👎