Advertisement
Guest User

Untitled

a guest
May 28th, 2016
54
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.38 KB | None | 0 0
  1. /*Napisati program koji iz ulazne tekstualne datoteke čita dimenzije matrice susjednosti,
  2. a potom matricu susjednosti težinskog, usmjerenog grafa.
  3. Težine su definisane kao podaci sa pokretnim zarezom, pri čemu se garantuje da su težine pozitivne, te da je graf potpuno povezan.
  4. Informacioni sadržaj čvora je proizvoljan realni broj.
  5. Naziv ulazne datoteke kao i indeksi dva čvora unose se kao argumenti komandne linije.
  6. Na standardni izlaz ispisati vrijednosti funkcija informacionog sadržaja čvorova na najkraćoj putanji između čvorova čiji su indeksi uneseni
  7. kao argumenti komandne linije. Funkcije koje treba izračunati za svaki čvor su: sin(x), cos(x), x2, √x.
  8. Ispis uraditi tako da se funkcija za pronalaženje najkraćeg puta između data dva čvora poziva četiri puta,
  9. svaki put sa različitom funkcijom za ispis u argumentu (funkcija za pronalaženje najkraćeg puta prihvata funkciju za ispis kao argument).
  10. Napomena: za svaku od datih matematičkih funkcija, potrebno je napisati odvojenu funkciju sa prefiksom t_
  11. (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.
  12. Za njihovo pojedinačno realizovanje dozvoljeno je korištenje biblioteke math.h. */
  13.  
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. #include <math.h>
  17. #define MAX 10
  18.  
  19. typedef struct g{
  20. int n;
  21. double nodes[MAX];
  22. double ms[MAX][MAX];
  23. }GRAF;
  24.  
  25. double t_sin(double x){
  26. return sin(x);
  27. }
  28.  
  29. double t_cos(double x){
  30. return cos(x);
  31. }
  32.  
  33. double t_pow(double x){
  34. return pow(x,2);
  35. }
  36.  
  37. double t_sqrt(double x){
  38. return sqrt(x);
  39. }
  40.  
  41. void floyd(GRAF *g,double d[][MAX],int t[][MAX]){
  42. int i,j,k;
  43. for(k=0;k < g->n;k++)
  44. for(i=0;i < g->n;i++)
  45. for(j=0;j < g->n;j++)
  46. if(d[i][j] > d[i][k]+d[k][j]){
  47. d[i][j] = d[i][k]+d[k][j];
  48. t[i][j] = t[k][j];
  49. }
  50. }
  51.  
  52. void path(int i,int j,GRAF *g,int t[][MAX],double (*f)(duble)){
  53. if(i==j)
  54. printf("%.2lf ",(*f)(g->nodes[i]));
  55. else if (t[i][j]==-1)
  56. printf("Nema putanje.\n");
  57. else
  58. {
  59. path(i,t[i][j],g,t,f);
  60. printf("%.2lf ",(*f)(g->nodes[j]));
  61. }
  62. }
  63.  
  64. void init(GRAF *g,int t[][MAX]){
  65. int i,j;
  66. for(i=0;i<g->n;i++)
  67. for(j=0;j<g->n;j++)
  68. if(i==j || g->ms[i][j]==0)
  69. t[i][j]=-1;
  70. else
  71. t[i][j]=i;
  72. }
  73.  
  74.  
  75. int main(int argc,char **argv){
  76. FILE *dat;
  77. GRAF g;
  78. int i,j,t[MAX][MAX],c1,c2;
  79. double d[MAX][MAX];
  80. if(argc<3) return printf("Greska!\n"),1;
  81. if(dat=fopen(argv[1], "r")) {
  82. c1=atoi(argv[2]);
  83. c2=atoi(argv[3]);
  84. fscanf(dat,"%d",&g.n);
  85. for(i=0;i<g.n;i++){
  86. g.nodes[i]= 1.0 + i;
  87. for(j=0;j<g.n;j++){
  88. fscanf(dat,"%lf",&g.ms[i][j]);
  89. d[i][j]= i==j? 0:(g.ms[i][j] ? g.ms[i][j] : INFINITY);
  90. }
  91. }
  92. init(&g,t);
  93. floyd(&g,d,t);
  94. printf("\nPutanja od cvora %d do cvora %d: ",c1,c2);
  95. printf("\n sin(x): "); path(c1-1, c2-1, &g, t, t_sin);
  96. printf("\n cos(x): "); path(c1-1, c2-1, &g, t, t_cos);
  97. printf("\n pow(x): "); path(c1-1, c2-1, &g, t, t_pow);
  98. printf("\n sqrt(x): "); path(c1-1, c2-1, &g, t, t_sqrt);
  99. fclose(dat);
  100. }
  101. else printf("Greska kod otvaranja datoteke\n"); return 0;
  102. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement