Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Napisati program koji iz ulazne tekstualne datoteke čita dimenzije matrice susjednosti,
- a potom matricu susjednosti težinskog, usmjerenog grafa.
- Težine su definisane kao podaci sa pokretnim zarezom, pri čemu se garantuje da su težine pozitivne, te da je graf potpuno povezan.
- Informacioni sadržaj čvora je proizvoljan realni broj.
- Naziv ulazne datoteke kao i indeksi dva čvora unose se kao argumenti komandne linije.
- Na standardni izlaz ispisati vrijednosti funkcija informacionog sadržaja čvorova na najkraćoj putanji između čvorova čiji su indeksi uneseni
- kao argumenti komandne linije. Funkcije koje treba izračunati za svaki čvor su: sin(x), cos(x), x2, √x.
- Ispis uraditi tako da se funkcija za pronalaženje najkraćeg puta između data dva čvora poziva četiri puta,
- svaki put sa različitom funkcijom za ispis u argumentu (funkcija za pronalaženje najkraćeg puta prihvata funkciju za ispis kao argument).
- Napomena: za svaku od datih matematičkih funkcija, potrebno je napisati odvojenu funkciju sa prefiksom t_
- (t_sin za sin, t_cos za cos, t_pow2 za pow i t_sqrt za sqrt) kako bi funkcije koje se prosljeđuju kao argumenti imale isto zaglavlje.
- Za njihovo pojedinačno realizovanje dozvoljeno je korištenje biblioteke math.h. */
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define MAX 10
- typedef struct g{
- int n;
- double nodes[MAX];
- double ms[MAX][MAX];
- }GRAF;
- double t_sin(double x){
- return sin(x);
- }
- double t_cos(double x){
- return cos(x);
- }
- double t_pow(double x){
- return pow(x,2);
- }
- double t_sqrt(double x){
- return sqrt(x);
- }
- void floyd(GRAF *g,double d[][MAX],int t[][MAX]){
- int i,j,k;
- for(k=0;k < g->n;k++)
- for(i=0;i < g->n;i++)
- for(j=0;j < g->n;j++)
- if(d[i][j] > d[i][k]+d[k][j]){
- d[i][j] = d[i][k]+d[k][j];
- t[i][j] = t[k][j];
- }
- }
- void path(int i,int j,GRAF *g,int t[][MAX],double (*f)(duble)){
- if(i==j)
- printf("%.2lf ",(*f)(g->nodes[i]));
- else if (t[i][j]==-1)
- printf("Nema putanje.\n");
- else
- {
- path(i,t[i][j],g,t,f);
- printf("%.2lf ",(*f)(g->nodes[j]));
- }
- }
- void init(GRAF *g,int t[][MAX]){
- int i,j;
- for(i=0;i<g->n;i++)
- for(j=0;j<g->n;j++)
- if(i==j || g->ms[i][j]==0)
- t[i][j]=-1;
- else
- t[i][j]=i;
- }
- int main(int argc,char **argv){
- FILE *dat;
- GRAF g;
- int i,j,t[MAX][MAX],c1,c2;
- double d[MAX][MAX];
- if(argc<3) return printf("Greska!\n"),1;
- if(dat=fopen(argv[1], "r")) {
- c1=atoi(argv[2]);
- c2=atoi(argv[3]);
- fscanf(dat,"%d",&g.n);
- for(i=0;i<g.n;i++){
- g.nodes[i]= 1.0 + i;
- for(j=0;j<g.n;j++){
- fscanf(dat,"%lf",&g.ms[i][j]);
- d[i][j]= i==j? 0:(g.ms[i][j] ? g.ms[i][j] : INFINITY);
- }
- }
- init(&g,t);
- floyd(&g,d,t);
- printf("\nPutanja od cvora %d do cvora %d: ",c1,c2);
- printf("\n sin(x): "); path(c1-1, c2-1, &g, t, t_sin);
- printf("\n cos(x): "); path(c1-1, c2-1, &g, t, t_cos);
- printf("\n pow(x): "); path(c1-1, c2-1, &g, t, t_pow);
- printf("\n sqrt(x): "); path(c1-1, c2-1, &g, t, t_sqrt);
- fclose(dat);
- }
- else printf("Greska kod otvaranja datoteke\n"); return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement