#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;
}