EldiraSesto

ue1/AiB

Oct 19th, 2019
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.92 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. typedef enum error_e
  6. {
  7.  SUCCESS=0,
  8.  NULL_POINTER_ERROR,
  9.  ALLOC_FAILURE_ERROR,
  10.  OUT_OF_RANGE_ERROR,
  11.  DIMENSION_MISMATCH_ERROR
  12.    
  13. }error_t;
  14.  
  15. typedef struct vector_s
  16. {
  17.     double *values;
  18.     long dim;
  19. }vector_t;
  20.  
  21. error_t vector_allocate(vector_t *vec, long dim){
  22.    
  23.     if(dim<0) return DIMENSION_MISMATCH_ERROR;
  24.     double *newvector;
  25.    
  26.     if((newvector = calloc(dim, sizeof(double)))==0)
  27.     return ALLOC_FAILURE_ERROR;
  28.    
  29.        
  30.     vec->values = newvector;
  31.     vec->dim = dim;
  32.    
  33.     return SUCCESS;
  34.    
  35. }
  36.  
  37. error_t vector_clear(vector_t *vec){
  38.     if(!(vec -> values)) return NULL_POINTER_ERROR;
  39.     else{
  40.     free(vec->values);
  41.     vec ->values = 0;
  42.     vec-> dim = 0;
  43.     }
  44.    
  45.     return SUCCESS;
  46.    
  47. }
  48.  
  49. error_t vector_fill(vector_t *vec, double value, long index ){
  50.     if(!(vec->values)) return NULL_POINTER_ERROR;
  51.     if(index > vec->dim || index < 0) return OUT_OF_RANGE_ERROR;
  52.    
  53.     vec->values[index] = value;
  54.     return SUCCESS;
  55.    
  56. }
  57.  
  58.  
  59. error_t vector_print(vector_t *vec){
  60.     long n;
  61.         printf("[");
  62.     for(n=0; n<(vec->dim); n++ ){
  63.         if(n==(vec->dim)-1)     printf("%.1f" , vec->values[n]);
  64.         else printf("%.1f, " , vec->values[n]);
  65.        
  66.     }
  67.     printf("]");
  68.     return SUCCESS ;
  69.    
  70.     }
  71.  
  72.  
  73. error_t vector_change_dim(vector_t *vec, long new_dim){
  74.     double *novevrijednosti;
  75.     double dimenzija_stara, dimenzija_nova;
  76.     dimenzija_stara = vec->dim;
  77.     dimenzija_nova = new_dim;
  78.     if((novevrijednosti = realloc((vec->values), ((new_dim)*sizeof(double))))) {
  79.     vec->values = novevrijednosti;
  80.     vec->dim = dimenzija_nova;
  81.     for(; dimenzija_nova>dimenzija_stara; dimenzija_nova--){
  82.         novevrijednosti[(int)dimenzija_nova]=0;
  83.     }
  84.     return SUCCESS;
  85.     }
  86.    
  87.    
  88.     return ALLOC_FAILURE_ERROR;
  89.    
  90.     }
  91.    
  92.     error_t vector_inner_product(vector_t *vec_a, vector_t *vec_b, double *result){
  93.         if((vec_a -> dim) != (vec_b -> dim)) return DIMENSION_MISMATCH_ERROR;
  94.         double summe = 0;
  95.         long n;
  96.         for(n=0; n<vec_a->dim; n++){
  97.             summe= summe + ((vec_a->values[(int)n]) * (vec_b->values[(int)n]));
  98.             }
  99.            
  100.             *result=summe;
  101.            
  102.             return SUCCESS;
  103.            
  104.             }
  105.            
  106.     error_t vector_norm(vector_t *vec, double *result){
  107.         if(vec->values == NULL) return NULL_POINTER_ERROR;
  108.         double norm=0;
  109.         double podkorijena_suma=0;
  110.         double n;
  111.         for(n=0; n<vec->dim; n++){
  112.             podkorijena_suma= podkorijena_suma + (vec->values[(int)n] * vec->values[(int)n]);
  113.            
  114.         }
  115.          norm = sqrt(podkorijena_suma);
  116.          *result = norm;
  117.        
  118.    
  119.     return SUCCESS;
  120.     }
  121.    
  122.     error_t vector_scalar_mult(vector_t *vec, long a, vector_t *result){
  123.         double n;
  124.         if(vec->dim != result->dim){
  125.             vector_change_dim(result, vec->dim );
  126.         }
  127.        
  128.         for(n=0; n<vec->dim; n++){
  129.             result->values[(int)n] = a*(vec->values[(int)n]);
  130.            
  131.         }
  132.        
  133.         return SUCCESS;
  134.     }
  135.    
  136.     error_t vector_append(vector_t *vec_a, vector_t *vec_b){
  137.         double n;
  138.         long dimenzija;
  139.         long stara;
  140.         stara=vec_a->dim;
  141.         dimenzija = vec_a->dim + vec_b->dim;
  142.         vector_change_dim(vec_a, dimenzija);
  143.         for(n=1; n<= vec_b->dim; n++){
  144.             vec_a->values[(int)((stara)+(n-1))] = vec_b->values[(int)(n-1)];
  145.            
  146.         }
  147.        
  148.         return SUCCESS;
  149.        
  150.         }
  151.    
  152.        
  153.        
  154.        
  155.        
  156.        
  157.    
  158.  
  159.  
  160.  
  161.  
  162. int main() {
  163.  
  164.   vector_t vec1={NULL, 0};
  165.   vector_t vec2={NULL, 0};
  166.   //vector_t vec3={NULL, 0};
  167.  
  168.   long i;
  169.   long dimenzija;
  170.   double vrijednost;
  171.   int povratak;
  172.   int pov2=0;
  173.   int pov3=0;
  174.   int pov4;
  175.   int pov5=0;
  176.   int pov6;
  177.   double result;
  178.   double result2;
  179.   //za prvi vektor
  180.   printf("Koliko brojeva zelis unijeti? ");
  181.   scanf("%ld", &dimenzija);
  182.   povratak = vector_allocate(&vec1, dimenzija); //provjeravam jel alokacija ok
  183.   printf("%d\n", povratak);
  184.    for(i=0; i<dimenzija; i++){
  185.    printf("Koji broj zelis unijeti na %ld mjesto ? ", i+1);
  186.     scanf("%lf", &vrijednost);
  187.     pov2 =pov2 + vector_fill(&vec1, vrijednost, i);
  188.     }
  189.      printf("%d\n", pov2); //provjeravam jel popunjavanje vektora ok
  190.    
  191.     vector_print(&vec1);
  192.     pov3=vector_change_dim( &vec1, (long)5);
  193.      printf("\n%d\n", pov3);
  194.      
  195.      vector_print(&vec1);
  196.      
  197.      //za drugi vektor
  198.      printf("\nKoliko brojeva zelis unijeti? ");
  199.   scanf("%ld", &dimenzija);
  200.   povratak = vector_allocate(&vec2, dimenzija); //provjeravam jel alokacija ok
  201.   printf("%d\n", povratak);
  202.    for(i=0; i<dimenzija; i++){
  203.    printf("Koji broj zelis unijeti na %ld mjesto ? ", i+1);
  204.     scanf("%lf", &vrijednost);
  205.     pov5 =pov5 + vector_fill(&vec2, vrijednost, i);
  206.     }
  207.      printf("%d\n", pov5); //provjeravam jel popunjavanje vektora ok
  208.    
  209.     vector_print(&vec2);
  210.      
  211.      printf("Append hehe \n");
  212.      vector_append(&vec1, &vec2);
  213.      vector_print(&vec1);
  214.      vector_print(&vec2);
  215.      
  216.      
  217.      
  218.      pov4 = vector_inner_product(&vec1, &vec2, &result );
  219.      printf("\n%d\n", pov4);
  220.      printf("%.1f\n", result);
  221.    
  222.     pov6 = vector_norm(&vec2, &result2);
  223.     printf("\n%d\n", pov6);
  224.     printf("%.1f\n", result2);
  225.    
  226.     vector_clear(&vec1);
  227.     vector_clear(&vec2);
  228.     printf("SUPER "); //provjeravam jel stigne do kraja
  229.    
  230.    
  231.    
  232.     return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment