Advertisement
100rads

polinomi

Oct 30th, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.04 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <stdbool.h>
  6. #include <string.h>
  7.  
  8. #define MAX_POLINOM_SIZE (1024)
  9.  
  10. typedef struct _cvor * Position;
  11. typedef struct _cvor
  12. {
  13.     int eksponent;
  14.     int koeficijent;
  15.     Position next;
  16. }cvor;
  17.  
  18. int ProcitajDatoteke(char *imeDatoteke, Position pp, Position dp);
  19. int UcitajPolinomIzStringa(char *ulazniString, Position trenutniCvor);
  20. int DodajUListuSortirano(Position trenutniCvor, int koeficijent, int eksponent);
  21. int KreirajCvorIDodajIzaTrenutnog(Position trenutniCvor, int koeficijent, int eksponent);
  22. int DodajIzaTrenutnog(Position noviCvor, Position trenutniCvor);
  23. void IspisiPolinom(char *opis, Position trenutniCvor);
  24. int ZbrojiPolinome(Position pp, Position dp, Position sumaPolinoma);
  25. int PomnoziPolinome(Position pp, Position dp, Position umnozakPolinoma);
  26. void DealocirajMemoriju(Position trenutniCvor);
  27.  
  28.  
  29. int main(int argc, char *argv[])
  30. {
  31.     cvor pp, dp;
  32.     cvor sumaPolinoma, umnozakPolinoma;
  33.     pp.next = NULL;
  34.     dp.next = NULL;
  35.     sumaPolinoma.next = NULL;
  36.     umnozakPolinoma.next = NULL;
  37.  
  38.     ProcitajDatoteke("polinomi.txt", &pp, &dp);
  39.     IspisiPolinom("Prvi polinom", pp.next);
  40.     IspisiPolinom("Drugi polinom", dp.next);
  41.  
  42.     ZbrojiPolinome(&pp, &dp, &sumaPolinoma);
  43.     IspisiPolinom("Zbroj polinoma", sumaPolinoma.next);
  44.     PomnoziPolinome(&pp, &dp, &sumaPolinoma);
  45.     IspisiPolinom("Umnozak polinoma", sumaPolinoma.next);
  46.  
  47.     DealocirajMemoriju(&pp);
  48.     DealocirajMemoriju(&dp);
  49.     DealocirajMemoriju(&sumaPolinoma);
  50.     DealocirajMemoriju(&umnozakPolinoma);
  51.     return 0;
  52.  
  53. }
  54.  
  55. int ProcitajDatoteke(char *imeDatoteke, Position prviPolinom, Position drugiPolinom)
  56. {
  57.     FILE *f;
  58.  
  59.     f = fopen(imeDatoteke, "r");
  60.     char buffer[50];
  61.  
  62.     fgets(buffer, 50, f);
  63.     UcitajPolinomIzStringa(buffer, prviPolinom);
  64.  
  65.     fgets(buffer, 50, f);
  66.     UcitajPolinomIzStringa(buffer, drugiPolinom);
  67.  
  68.     return 0;
  69. }
  70. int UcitajPolinomIzStringa(char *string, Position position)
  71. {
  72.     int koef, pot, offset;
  73.  
  74.     while(sscanf(string, " %d %d %n", &koef, &pot, &offset)!=EOF)
  75.     {
  76.         DodajUListuSortirano(position, koef, pot);
  77.         string += offset;
  78.     }
  79.  
  80.     return 0;
  81. }
  82. int DodajUListuSortirano(Position position, int koeficijent, int eksponent)
  83. {
  84.     while(position->next!=NULL && position->next->eksponent > eksponent)
  85.         position = position->next;
  86.  
  87.     if(position->next != NULL && position->next->eksponent == eksponent)
  88.         position->next->koeficijent += koeficijent;
  89.     else
  90.         KreirajCvorIDodajIzaTrenutnog(position, koeficijent, eksponent);
  91.  
  92.     return 0;
  93. }
  94. int KreirajCvorIDodajIzaTrenutnog(Position currentPosition, int koeficijent, int eksponent)
  95. {
  96.     Position q;
  97.  
  98.     q = (Position)malloc(sizeof(cvor));
  99.     q->eksponent = eksponent;
  100.     q->koeficijent = koeficijent;
  101.  
  102.     DodajIzaTrenutnog(q, currentPosition);
  103.  
  104.     return 0;
  105. }
  106. int DodajIzaTrenutnog(Position noviCvor, Position currentPosition)
  107. {
  108.     noviCvor->next = currentPosition->next;
  109.     currentPosition->next = noviCvor;
  110.  
  111.     return 0;
  112. }
  113. void IspisiPolinom(char *title, Position currentPosition)
  114. {
  115.     bool first = true;
  116.     printf("%s=", title);
  117.     while (currentPosition != NULL)
  118.     {
  119.         if (first == true)
  120.         {
  121.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent == 0)
  122.                 printf("1");
  123.             if (currentPosition->koeficijent == -1 && currentPosition->eksponent == 0)
  124.                 printf("- 1");
  125.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent > 0)
  126.                 printf("x^%d", currentPosition->eksponent);
  127.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent < 0)
  128.                 printf("x^(%d)", currentPosition->eksponent);
  129.             if (currentPosition->koeficijent > 0 && currentPosition->koeficijent != 1 && currentPosition->eksponent > 0)
  130.                 printf("%dx^%d", currentPosition->koeficijent, currentPosition->eksponent);
  131.             if (currentPosition->koeficijent < 0 && currentPosition->koeficijent != -1 && currentPosition->eksponent > 0)
  132.                 printf("-%dx^%d", (-1) * currentPosition->koeficijent, currentPosition->eksponent);
  133.             if (currentPosition->koeficijent > 0 && currentPosition->koeficijent != 1 && currentPosition->eksponent < 0)
  134.                 printf("%dx^(%d)", currentPosition->koeficijent, currentPosition->eksponent);
  135.             if (currentPosition->koeficijent < 0 && currentPosition->koeficijent != -1 && currentPosition->eksponent < 0)
  136.                 printf("-%dx^(%d)", (-1) * currentPosition->koeficijent, currentPosition->eksponent);
  137.  
  138.             first = false;
  139.         }
  140.         else
  141.         {
  142.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent == 0)
  143.                 printf(" + 1");
  144.             if (currentPosition->koeficijent == -1 && currentPosition->eksponent == 0)
  145.                 printf(" - 1");
  146.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent > 0)
  147.                 printf(" + x^%d", currentPosition->eksponent);
  148.             if (currentPosition->koeficijent == 1 && currentPosition->eksponent < 0)
  149.                 printf(" + x^(%d)", currentPosition->eksponent);
  150.             if (currentPosition->koeficijent > 0 && currentPosition->eksponent > 0)
  151.                 printf(" + %dx^%d", currentPosition->koeficijent, currentPosition->eksponent);
  152.             if (currentPosition->koeficijent < 0 && currentPosition->eksponent > 0)
  153.                 printf(" - %dx^%d", (-1) * currentPosition->koeficijent, currentPosition->eksponent);
  154.             if (currentPosition->koeficijent > 0 && currentPosition->eksponent < 0)
  155.                 printf(" + %dx^(%d)", currentPosition->koeficijent, currentPosition->eksponent);
  156.             if (currentPosition->koeficijent < 0 && currentPosition->eksponent < 0)
  157.                 printf(" - %dx^(%d)", (-1) * currentPosition->koeficijent, currentPosition->eksponent);
  158.         }
  159.  
  160.         currentPosition = currentPosition->next;
  161.     }
  162.     printf("\r\n");
  163. }
  164. int ZbrojiPolinome(Position pp, Position dp, Position sumaPolinoma)
  165. {
  166.     Position temp;
  167.     pp = pp->next;
  168.     dp = dp->next;
  169.  
  170.     while(pp != NULL && dp != NULL)
  171.     {
  172.         if(pp->eksponent > dp->eksponent)
  173.         {
  174.             DodajUListuSortirano(sumaPolinoma, pp->koeficijent, pp->eksponent);
  175.             pp = pp->next;
  176.         }
  177.         else if(pp->eksponent < dp->eksponent)
  178.         {
  179.             DodajUListuSortirano(sumaPolinoma, dp->koeficijent, dp->eksponent);
  180.             dp = dp->next;
  181.         }
  182.         else
  183.         {
  184.             DodajUListuSortirano(sumaPolinoma, pp->koeficijent + dp->koeficijent, dp->eksponent);
  185.             pp = pp->next;
  186.             dp = dp->next;
  187.         }
  188.  
  189.     }
  190.  
  191.     if(pp == NULL)
  192.         temp = dp;
  193.     else
  194.         temp = pp;
  195.  
  196.     while(temp != NULL)
  197.     {
  198.         DodajUListuSortirano(sumaPolinoma, temp->koeficijent, temp->eksponent);
  199.         temp = temp->next;
  200.     }
  201.     return 0;
  202.  
  203. }
  204. int PomnoziPolinome(Position pp, Position dp, Position umnozakPolinoma)
  205. {
  206.     Position pocetakD = dp->next;
  207.     pp = pp->next;
  208.     dp = dp->next;
  209.  
  210.     while (pp != NULL)
  211.     {
  212.         while (dp != NULL)
  213.         {
  214.             DodajUListuSortirano(umnozakPolinoma, pp->koeficijent*dp->koeficijent, pp->eksponent+dp->eksponent);
  215.             dp = dp->next;
  216.         }
  217.         pp = pp->next;
  218.         dp = pocetakD;
  219.     }
  220.  
  221.     return 0;
  222. }
  223. void DealocirajMemoriju(Position trenutniCvor)
  224. {
  225.     free(trenutniCvor);
  226. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement