Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27

    Problemi con la funzione pow

    Ciao,
    ho dei problemi con la funzione pow. se immetto i numeri 6 per la popolazione e 3 per il campione il risultato è giusto 216. mentre se immetto 10 e 2 mi da 99 come risultato. perchè ? non riesco a capire dove sbaglio.
    ecco il mio programma:

    codice:
    #include <time.h>
    #include <stdio.h>
    #include <math.h> 
    #include <stdlib.h>
    # include <string.h>
    char *data()
    {  
       time_t t;
       char *data;
       int i;
       
       t = time(&t);
       data = asctime(localtime(&t));
       data[strlen(data)-1]='\0'; 
       return(data);
    }
    void intestazioneFile(FILE *fp, int popolazione[], int cardinalita, int dimPop,char *nomeFile,int ampCamp)
    {    int i;
         fprintf(fp,"Anna Motta  matricola:701489 \n\n");
         fprintf(fp,"Esercizio 1 (%s)\n",data());
         fprintf(fp,"Output dell'algoritmo PrimaEsercitazione.c\n");
         fprintf(fp,"Nome file uscita: %s\n", nomeFile);
         fprintf(fp,"Genera lo spazio campionario che comprende i possibili campioni \n");
         fprintf(fp,"di dimensione n=%d con campionamento casuale semplice tratti\n", ampCamp);
         fprintf(fp,"da una popolazione  finita di numerosità N=%d \n", dimPop);
         fprintf(fp,"La popolazione di riferimento è: \n");
         for(i=1;i<=dimPop;i++)
            fprintf(fp,"%2d\t",popolazione[i-1]); 
         fprintf(fp,"\n Lo spazio campionario ha dimensione: %d\n", cardinalita);
         fprintf(fp,"\n\n i Possibili campioni sono: \n\n");
    }
    void gestioneRiporti(int cp[], int dimVt, int valUltimo)
    { int j;
      for(j=dimVt-1;j>0;j--)
        if(cp[j] == valUltimo+1)  
         {cp[j] = 1;
          cp[j-1]++;}
    }
    
    int main()
    {
     FILE *fUscita;
        char nomeFile[]="esercizio1.txt";
        int *popolazione, 
            *campione, 
            dimSpazioCamp,i,j, ampCamp,elemPop; 
        
        printf("inserisci la numerosità della popolazione: ");
        scanf("%d",&elemPop);
        popolazione=(int*)calloc(elemPop,sizeof(int));
            
       do{
            printf("ampiezza campione: ");
            scanf("%d",&ampCamp);
           } while(ampCamp<1 || ampCamp>elemPop); 
        campione = (int *)calloc(ampCamp, sizeof(int)); 
        for(i=1;i<=elemPop;i++)
          popolazione[i-1] = i;
        for(i=0;i<ampCamp;i++)
          campione[i] = 1;
        if ((fUscita=fopen(nomeFile,"w")) == NULL)
          {
            printf("errore apertura file %s!\n",nomeFile);
            exit(-1);
          }
        
        dimSpazioCamp = (int) pow(elemPop,ampCamp);
        intestazioneFile(fUscita,popolazione,dimSpazioCamp,elemPop,nomeFile,ampCamp);
          
              for(j=0; j<dimSpazioCamp; j++)
            {
        		fprintf(fUscita, "%4d: {", j+1); 
    		    for (i=0; i<ampCamp-1; i++)
    		 		fprintf(fUscita,"%d, ",popolazione[campione[i]-1]); 
    	  	    fprintf(fUscita,"%d}\n",popolazione[campione[i]-1]);            
             campione[ampCamp-1]++;
             gestioneRiporti(campione,ampCamp,elemPop);
             }
         fclose(fUscita);
        system("pause");
        return 0;  
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Ti riferisci alla riga

    Lo spazio campionario ha dimensione: x

    nel file di output? A me con 10 e 2 da come risultato 100, correttamente... che compilatore stai usando? La compilazione avviene senza warnings?

    In ogni caso fai una prova a castare a double gli argomenti di pow(), anche se non credo proprio che sia quello:

    dimSpazioCamp = (int) pow( (double) elemPop, (double) ampCamp );
    every day above ground is a good one

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27
    si mi riferisco al file in output nella riga lo spazio campionario: . Con il Dev c++ 4.9.9.2 mi da 99 mentre se lo eseguo con visul c++ express edition mi da 100 però con molti warnings. perchè?
    grazie.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Sì compilando con Dev ottengo lo stesso risultato... temo sia un problema della pow() di questo compilatore dovuto al fatto che la funzione pow() accetta in input argomenti di tipo double e restituisce un valore dello stesso tipo, mentre invece tu lavori con gli int... purtroppo il dev è universalmente riconosciuto come ambiente di sviluppo "da evitare"... Per risolvere la cosa comunque potresti o dichiarare dimSpazioCamp di tipo double e poi passarlo castato a int alla funzione intestazioleFile(), oppure potresti definire una tua funzione personale per l'elevamento a potenza che è semplice, visto che mi pare di capire che si tratti di potenze con esponente intero positivo... qualcosa come:

    codice:
    int my_pow(int base, int esp)
    {
       int potenza = base, i;
    
       if ( esp == 0 )
          return 1;
       if ( esp == 1 )
          return potenza;
    
       for ( i = 1; i < esp; i++ )
          potenza *= base;
    
       return potenza;
    }
    every day above ground is a good one

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27
    Grazie!

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303

    Moderazione

    Come espressamente indicato nel regolamento (che ti invito a leggere), il linguaggio va indicato obbligatoriamente nel titolo ed il codice va postato usando gli appositi tag.

    Modifico tutto io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.