Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- typedef enum error_e
- {
- SUCCESS=0,
- NULL_POINTER_ERROR,
- ALLOC_FAILURE_ERROR,
- OUT_OF_RANGE_ERROR,
- DIMENSION_MISMATCH_ERROR
- }error_t;
- typedef struct vector_s
- {
- double *values;
- long dim;
- }vector_t;
- error_t vector_allocate(vector_t *vec, long dim){
- if(dim<0) return DIMENSION_MISMATCH_ERROR;
- double *newvector;
- if((newvector = calloc(dim, sizeof(double)))==0)
- return ALLOC_FAILURE_ERROR;
- vec->values = newvector;
- vec->dim = dim;
- return SUCCESS;
- }
- error_t vector_clear(vector_t *vec){
- if(!(vec -> values)) return NULL_POINTER_ERROR;
- else{
- free(vec->values);
- vec ->values = 0;
- vec-> dim = 0;
- }
- return SUCCESS;
- }
- error_t vector_fill(vector_t *vec, double value, long index ){
- if(!(vec->values)) return NULL_POINTER_ERROR;
- if(index > vec->dim || index < 0) return OUT_OF_RANGE_ERROR;
- vec->values[index] = value;
- return SUCCESS;
- }
- error_t vector_print(vector_t *vec){
- long n;
- printf("[");
- for(n=0; n<(vec->dim); n++ ){
- if(n==(vec->dim)-1) printf("%.1f" , vec->values[n]);
- else printf("%.1f, " , vec->values[n]);
- }
- printf("]");
- return SUCCESS ;
- }
- error_t vector_change_dim(vector_t *vec, long new_dim){
- double *novevrijednosti;
- double dimenzija_stara, dimenzija_nova;
- dimenzija_stara = vec->dim;
- dimenzija_nova = new_dim;
- if((novevrijednosti = realloc((vec->values), ((new_dim)*sizeof(double))))) {
- vec->values = novevrijednosti;
- vec->dim = dimenzija_nova;
- for(; dimenzija_nova>dimenzija_stara; dimenzija_nova--){
- novevrijednosti[(int)dimenzija_nova]=0;
- }
- return SUCCESS;
- }
- return ALLOC_FAILURE_ERROR;
- }
- error_t vector_inner_product(vector_t *vec_a, vector_t *vec_b, double *result){
- if((vec_a -> dim) != (vec_b -> dim)) return DIMENSION_MISMATCH_ERROR;
- double summe = 0;
- long n;
- for(n=0; n<vec_a->dim; n++){
- summe= summe + ((vec_a->values[(int)n]) * (vec_b->values[(int)n]));
- }
- *result=summe;
- return SUCCESS;
- }
- error_t vector_norm(vector_t *vec, double *result){
- if(vec->values == NULL) return NULL_POINTER_ERROR;
- double norm=0;
- double podkorijena_suma=0;
- double n;
- for(n=0; n<vec->dim; n++){
- podkorijena_suma= podkorijena_suma + (vec->values[(int)n] * vec->values[(int)n]);
- }
- norm = sqrt(podkorijena_suma);
- *result = norm;
- return SUCCESS;
- }
- error_t vector_scalar_mult(vector_t *vec, long a, vector_t *result){
- double n;
- if(vec->dim != result->dim){
- vector_change_dim(result, vec->dim );
- }
- for(n=0; n<vec->dim; n++){
- result->values[(int)n] = a*(vec->values[(int)n]);
- }
- return SUCCESS;
- }
- error_t vector_append(vector_t *vec_a, vector_t *vec_b){
- double n;
- long dimenzija;
- long stara;
- stara=vec_a->dim;
- dimenzija = vec_a->dim + vec_b->dim;
- vector_change_dim(vec_a, dimenzija);
- for(n=1; n<= vec_b->dim; n++){
- vec_a->values[(int)((stara)+(n-1))] = vec_b->values[(int)(n-1)];
- }
- return SUCCESS;
- }
- int main() {
- vector_t vec1={NULL, 0};
- vector_t vec2={NULL, 0};
- //vector_t vec3={NULL, 0};
- long i;
- long dimenzija;
- double vrijednost;
- int povratak;
- int pov2=0;
- int pov3=0;
- int pov4;
- int pov5=0;
- int pov6;
- double result;
- double result2;
- //za prvi vektor
- printf("Koliko brojeva zelis unijeti? ");
- scanf("%ld", &dimenzija);
- povratak = vector_allocate(&vec1, dimenzija); //provjeravam jel alokacija ok
- printf("%d\n", povratak);
- for(i=0; i<dimenzija; i++){
- printf("Koji broj zelis unijeti na %ld mjesto ? ", i+1);
- scanf("%lf", &vrijednost);
- pov2 =pov2 + vector_fill(&vec1, vrijednost, i);
- }
- printf("%d\n", pov2); //provjeravam jel popunjavanje vektora ok
- vector_print(&vec1);
- pov3=vector_change_dim( &vec1, (long)5);
- printf("\n%d\n", pov3);
- vector_print(&vec1);
- //za drugi vektor
- printf("\nKoliko brojeva zelis unijeti? ");
- scanf("%ld", &dimenzija);
- povratak = vector_allocate(&vec2, dimenzija); //provjeravam jel alokacija ok
- printf("%d\n", povratak);
- for(i=0; i<dimenzija; i++){
- printf("Koji broj zelis unijeti na %ld mjesto ? ", i+1);
- scanf("%lf", &vrijednost);
- pov5 =pov5 + vector_fill(&vec2, vrijednost, i);
- }
- printf("%d\n", pov5); //provjeravam jel popunjavanje vektora ok
- vector_print(&vec2);
- printf("Append hehe \n");
- vector_append(&vec1, &vec2);
- vector_print(&vec1);
- vector_print(&vec2);
- pov4 = vector_inner_product(&vec1, &vec2, &result );
- printf("\n%d\n", pov4);
- printf("%.1f\n", result);
- pov6 = vector_norm(&vec2, &result2);
- printf("\n%d\n", pov6);
- printf("%.1f\n", result2);
- vector_clear(&vec1);
- vector_clear(&vec2);
- printf("SUPER "); //provjeravam jel stigne do kraja
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment