Consiglio urgente su Programma C [Pagerank]
  • In diretta da GamesVillage.it
    • News
    • -
    • In Evidenza
    • -
    • Recensioni
    • -
    • RetroGaming
    • -
    • Anteprime
    • -
    • Video
    • -
    • Cinema

Visualizzazione risultati da 1 a 2 di 2

Discussione: Consiglio urgente su Programma C [Pagerank]

Cambio titolo
  1. #1
    Utente L'avatar di ixigia
    Registrato il
    02-03
    Località
    cp_well
    Messaggi
    1.454

    Consiglio urgente su Programma C [Pagerank]

    Ciao, grazie a qualche frammento di codice trovato su internet e al manuale di C, sono riuscito a creare questo programmino che calcola il pagerank a partire da un file (grafo rappresentato con una matrice di adiacenza)...solo che dalle mie conoscenze teoriche la somma dei documenti dovrebbe essere pari a 1, e invece dal programma risulta in ogni caso maggiore di 1 ...potreste dare un'occhiata al programma e consigliarmi???? Grazie

    Questo è il file "Pagerank.c"
    Spoiler:
    #include <stdio.h>
    #include <stdlib.h>
    #include "PageRank.h"

    int main(){

    int** grafo;
    int* child;
    int dim,i;
    float d,complete_det;
    float somma=0;
    float* B;
    float** A;
    float** temp;
    char filemap[20]; /*limite di 20 caratteri al nome del file*/

    printf("\n Digita il nome del file dove risiede il grafo da analizzare: ");
    scanf("%s",filemap);
    system("CLS");

    dim=leggi_dim(filemap); /*legge la dimensione della matrice di adiacenza*/
    if(dim==0) system("EXIT");
    else{
    grafo=leggi_mat(grafo,dim,filemap); /*legge la matrice da file*/
    child=conta_child(grafo,dim); /*conta il numero di figli per ogni nodo*/
    d=imposta_d(); /*imposta il valore di d*/
    /*impostazione del sistema da risolvere -- A &#232; la matrice dei coefficienti, B
    &#232; il vettore dei termini noti*/
    A=coeff(grafo,child,dim,d);
    /*andrebbe fatto uncontrollo di allocazione di memoria*/
    B=t_noti(dim,d);
    /*andrebbe fatto uncontrollo di allocazione di memoria*/
    /*sistema impostato*/
    stampa_sistema(A,B,dim); /*stampa il sistema a video*/
    printf("\n Valore di d: %.3f\n\n\n ",d);
    system("PAUSE");
    /*calcolo delle soluzioni del sistema col metodo di Cramer*/
    stampa();
    complete_det=det(A,dim);
    if (complete_det==0.0){
    printf("\n Il sistema non e' risolvibile (matrice dei coefficienti singolare).\n ");
    system("PAUSE");
    system("EXIT");
    }
    else{
    temp=alloca_matfloat(dim);
    system("CLS");
    for (i=0; i<dim; i++){
    temp=mat_copy(temp,A,dim);
    temp=column_sub(temp,B,i,dim);
    printf("\n PageRank del nodo %d: %.3f\n",i+1,det(temp,dim)/complete_det);
    somma=somma+det(temp,dim)/complete_det;
    } /*chiusura for*/
    printf("\n\n PageRank totale: %.3f",somma);
    getchar();
    }/*chiusura primo else*/
    } /*chiusura secondo else*/
    }/*fine del main*/


    ....E questo &#232; il file "Pagerank.h"
    Spoiler:
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    /*dichiarazione di prototipi di funzione*/
    int leggi_dim(char[20]);
    int** leggi_mat(int**,int,char[20]);
    int** alloca_matint(int);
    int* alloca_vettint(int);
    float** alloca_matfloat(int);
    float* alloca_vettfloat(int);
    int* conta_child(int**,int);
    float imposta_d();
    float** coeff(int**,int*,int,float);
    float* t_noti(int,float);
    void stampa_sistema(float**,float*,int);
    float det(float**,int);
    float** sub_matrix(float**,float**,int,int,int);
    float** mat_copy(float**,float**,int);
    float** column_sub(float**,float*l,int,int);
    void stampa();

    int leggi_dim(char filemap[20]){

    int dim=0;
    FILE * sorgente;

    sorgente=fopen(filemap,"r"); /* apre il file sorgente */
    if( sorgente==NULL ){
    printf("\n Errore in apertura del file\n\n ");
    system("PAUSE");
    return 0;
    }
    else{
    rewind(sorgente); /* resetta l'offset del file */
    fscanf(sorgente,"%d\n",&dim); /* legge la dimensione dalla prima riga del file */

    if (dim==0){
    printf("\n errore\n\n ");
    return 0;
    }
    else
    return dim;
    }
    } /*fine funzione leggi_dimensione*/

    int** leggi_mat(int**mappa,int dim,char filemap[20]){

    int i,j,tmp,scarto;
    FILE * sorgente;

    sorgente=fopen(filemap,"r"); /* apre il file sorgente */

    rewind(sorgente); /* resetta l'offset del file */
    fscanf(sorgente,"%d\n",&scarto); /* scarta la prima riga del file */

    /* Allocazione matrice */

    mappa=alloca_matint(dim);

    /* inizializzazione matrice di adiacenza */
    for(i=0;i<dim;i++){
    for(j=0;j<dim;j++){
    fscanf(sorgente,"%d",&tmp);
    mappa[i][j]=tmp;
    }
    }

    /*visualizzazione matrice di adiacenza*/
    printf("\n\n Matrice di adiacenza del grafo selezionato\n\n");
    for(i=0;i<dim;i++){
    for(j=0;j<dim;j++){
    printf(" %d",mappa[i][j]);}
    printf("\n\n");}
    return mappa;
    } /*fine funzione leggi_matrice*/

    int* conta_child(int** matrix,int dim){
    int i,j;
    int* child;

    /*Allocazione vettore*/
    child=alloca_vettint(dim);

    for(i=0;i<dim;i++)
    child[i]=0; /*inizializza i figli di ogni nodo a 0*/

    for(i=0;i<dim;i++){ /*conta il numero di figli per ogni nodo del grafo*/
    for(j=0;j<dim;j++){
    if(matrix[i][j]==1)
    child[i]=child[i]+1;
    }
    }

    for(i=0;i<dim;i++)
    printf("\n Figli di X%d = %d",i+1,child[i]); /*stampa*/

    printf("\n\n ");
    return child;
    } /*fine funzione conta_child*/

    float imposta_d(){

    float d;

    while(1){
    printf("\n Impostare il valore di d ( es:0.5 ): ");
    scanf("%f",&d);
    printf("\n");
    if(d<=0 || d>=1)
    printf(" Valore non ammesso di d\n\n");
    else break;}
    return d;
    } /*fine funzione imposta_d*/

    float** coeff(int** matrice,int* child,int dim,float d){

    int i,j;
    float** A;

    /* Allocazione matrice */
    A=alloca_matfloat(dim);

    for(j=0;j<dim;j++){ /*composizione della matrice dei coefficenti*/
    for(i=0;i<dim;i++){
    if(matrice[j][i]==0)
    A[i][j]=0;
    else
    A[i][j]=-d/child[j];
    if(i==j)
    A[i][j]=1;
    }
    }
    return A;
    } /*fine funzione coeff*/

    float* t_noti(int dim,float d){

    int i;
    float* B;

    /*Allocazione vettore*/
    B=alloca_vettfloat(dim);

    for(i=0;i<dim;i++)
    B[i]=1-d; /*i termini noti di tutte le equazioni valgono (1-d)*/
    return B;
    } /*fine funzione t_noti*/

    void stampa(){

    int i;

    system("CLS");
    printf(" ");
    getchar();
    system("CLS");
    printf("\n\n\tGIANNI GAY");
    getchar();
    system("CLS");
    printf("\n\n\tJACK GAY");
    getchar();
    system("CLS");
    printf("\n\n\tTOSS GAY");
    getchar();
    system("CLS");
    printf("\n\n\tPASTORE SEI SEMPRE A PIANGE....");
    getchar();
    system("CLS");
    printf("\n\n\tE COMUNQUE SEI GAY ANCHE TE");
    getchar();
    system("CLS");
    printf("\n\n\tSTATE FREMENDO PRE AVERE I PAGE RANK FINALI???");
    getchar();
    system("CLS");
    printf("\n\n\tAH....ORA ME NE APPROFITTO QUANTO MI PARE");
    getchar();
    system("CLS");
    printf("\n\n\tTOSS NON SCLERARE");
    getchar();
    system("CLS");
    printf("\n\n\tBROWBROEBROW");
    getchar();
    system("CLS");
    printf("\n\n\tBASTA VIA....ORA VI DO LE SOLUZIONI");
    getchar();
    system("CLS");
    printf("\n\n\tESSE......");
    getchar();
    system("CLS");
    printf("\n\n\tGIANNI STA PENSANDO:<<MAIALA QUANTO SI CAPPOTTANO MALE ST'INFORMATICI DI MERDA>>");
    getchar();
    system("CLS");
    printf("\n\n\tAH....SE VA BENE STO PROGETTO VALE MINIMO");
    getchar();
    system("CLS");
    printf("\n\n\tE DICO MINIMO");
    getchar();
    system("CLS");
    printf("\n\n\tUNA CENA");
    getchar();
    system("CLS");
    printf("\n\n\tLO SAPETE CHE CON UN VOLGARE CICLO FOR MI POTREI CAPPOTTARE PER ALMENO ALTRI 20 MINUTI???");
    getchar();
    system("CLS");
    printf("\n\n\tVABBE' ECCO LE SOLUZIONI");
    getchar();
    system("CLS");
    printf("\n\n\tMI SONO CAPPOTATO ABBASTANZA");
    getchar();
    system("CLS");
    printf("\n\n\tORA ARRIVANO");
    getchar();
    system("CLS");
    printf("\n\n\tSTANNO PER ARRIVARE");
    getchar();
    system("CLS");
    printf("\n\n\tCI SIAMO QUASI.....");
    getchar();
    for(i=0;i<10;i++){
    system("CLS");
    printf("\n\n\t.........%d",i+1);
    getchar();}
    system("CLS");
    printf("\n\n\tQUESTO ERA UN CICLO FOR");
    getchar();
    system("CLS");
    printf("\n\n\tAHAHAHAHAHAHAH.....");
    getchar();
    system("CLS");
    printf("\n\n\tSALUTATEMI IL DILIGENTI");
    getchar();
    }

    void stampa_sistema(float** A,float* B,int dim){

    int i,j;

    system("CLS");
    printf("\n\n Matrici associate al sistema ( A x X = B )\n\n\n");
    /*visualizza le matrici corrispondenti al sistema*/
    for(i=0;i<dim;i++){
    for(j=0;j<dim;j++){
    if(A[i][j]>=0) printf(" ");
    printf(" %.3f",A[i][j]);}

    printf(" ");
    if(i==(int)dim/2) printf("x");
    else printf(" ");
    printf(" ");

    printf(" X%d",i+1);
    printf(" ");
    if(i==(int)dim/2) printf("=");
    else printf(" ");
    printf(" ");

    printf(" %.3f",B[i]);
    printf("\n\n\n");
    }
    } /*fine funzione stampa_sistema*/

    float det(float **matrix, int n){

    float determ=0;
    int i;
    if (n==1) return matrix[0][0];
    float ***minor_array=(float***)malloc(n*sizeof(float**));

    for(i=0; i<n; i++)
    determ+=matrix[0][i]*pow(-1, i)*det((minor_array[i]=sub_matrix(minor_array[i], matrix, n, 0, i)), n-1);
    return determ;
    }

    float** sub_matrix(float** matrix,float** source,int n,int row,int column){
    int i, j, new_i=0, new_j=0;

    matrix=alloca_matfloat(n-1);
    for (i=0; i<n; i++){
    if (i==row) continue;
    for (j=0; j<n; j++){
    if (j==column) continue;
    matrix[new_i][new_j++]=source[i][j];
    }
    new_j=0;
    new_i++;
    }
    return matrix;
    }

    int** alloca_matint(int n){
    int** matrix;
    int i;
    matrix=(int**)malloc(n* sizeof(int*));
    for (i=0; i<n; i++) matrix[i]=(int*)malloc(sizeof(int)*n);
    return matrix;
    }

    int* alloca_vettint(int n){
    int* vett;
    vett=(int*)malloc(n*sizeof(int));
    return vett;
    }

    float** alloca_matfloat(int n){
    float **matrix;
    int i;
    matrix=(float**)malloc(n* sizeof(float*));
    for (i=0; i<n; i++) matrix[i]=(float*)malloc(sizeof(float)*n);
    return matrix;
    }

    float* alloca_vettfloat(int n){
    float* vett;
    vett=(float*)malloc(n*sizeof(float));
    return vett;
    }

    float** mat_copy(float** dest,float** source,int n){
    int i, j;
    for (i=0; i<n; i++)
    for (j=0; j<n; j++) dest[i][j]=source[i][j];
    return dest;
    }

    float** column_sub(float** matrix,float* col,int n_col,int n){
    int i;
    for (i=0; i<n; i++) matrix[i][n_col]=col[i];
    return matrix;
    }
    Ultima modifica di ixigia; 4-07-2007 alle 18:55:22

  2. #2
    Utente L'avatar di ndakota
    Registrato il
    07-06
    Località
    Milano
    Messaggi
    3.253
    io non le ho ancora fatte queste cose quindi non posso aiutarti, ma temo non la far&#224; nessuno se non indenti almeno il codice

Regole di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •