MartinSRB

[НРС] Вежбе 9 (Припрема) - зад 1

Apr 2nd, 2023 (edited)
1,076
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.15 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "list.h"
  4.  
  5. #pragma pack(4)
  6.  
  7. char *napraviNiz(int);
  8. void izracunaj(char *);
  9. void ispisiNiz(char *);
  10. node *izdvoj(char *);
  11. void copyLEToBE(int, void *);
  12. void ispisiListu(node *);
  13.  
  14. int main()
  15. {
  16.     int n;
  17.     char *buffer;
  18.     node *l;
  19.     printf("Unesite ukupan broj izraza: ");
  20.     scanf("%d", &n);
  21.     buffer = napraviNiz(n);
  22.     izracunaj(buffer);
  23.     ispisiNiz(buffer);
  24.     l = izdvoj(buffer);
  25.     ispisiListu(l);
  26.     free(l);
  27.     free(buffer);
  28.     return EXIT_SUCCESS;
  29. }
  30.  
  31. char *napraviNiz(int n)
  32. {
  33.     char *buffer = (char *)malloc(sizeof(int) + n * sizeof(Izraz));
  34.     int i;
  35.     *buffer = n;
  36.     for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
  37.     {
  38.         int index = ((i - sizeof(int)) / sizeof(Izraz) * sizeof(Izraz));
  39.         printf("Unesite broj 1 za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
  40.         scanf("%hd", buffer + sizeof(int) + index);
  41.         printf("Unesite operaciju za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
  42.         fflush(stdin);
  43.         scanf("%c", buffer + sizeof(int) + sizeof(short) + index);
  44.         printf("Unesite broj 2 za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
  45.         scanf("%hd", buffer + sizeof(int) + sizeof(short) + 2 * sizeof(char) + index);
  46.     }
  47.     return buffer;
  48. }
  49.  
  50. void izracunaj(char *buffer)
  51. {
  52.     int n = *buffer,
  53.         i;
  54.     for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
  55.     {
  56.         int index = ((i - sizeof(int)) / sizeof(Izraz)) * sizeof(Izraz);
  57.         short br1 = *((short *)&buffer[sizeof(int) + index]),
  58.               br2 = *((short *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + index]);
  59.         char op = *(buffer + sizeof(int) + sizeof(short) + index);
  60.         switch (op)
  61.         {
  62.         case '+':
  63.             *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 + br2;
  64.             break;
  65.         case '-':
  66.             *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 - br2;
  67.             break;
  68.         case '*':
  69.             *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 * br2;
  70.             break;
  71.         case '/':
  72.             *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 / br2;
  73.             break;
  74.         }
  75.     }
  76. }
  77.  
  78. void ispisiNiz(char *buffer)
  79. {
  80.     int n = *buffer,
  81.         i;
  82.     for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
  83.     {
  84.         int index = ((i - sizeof(int)) / sizeof(Izraz)) * sizeof(Izraz);
  85.         printf("--- Izraz broj: %lld ---\n", index / sizeof(Izraz));
  86.         printf("%hd %c %hd = %d\n", *((short *)&buffer[sizeof(int) + index]),
  87.                buffer[sizeof(int) + sizeof(short) + index],
  88.                *((short *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + index]),
  89.                *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]));
  90.     }
  91. }
  92.  
  93. node *izdvoj(char *buffer)
  94. {
  95.     node *l;
  96.     int n = *buffer,
  97.         i;
  98.     init(&l);
  99.     for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
  100.     {
  101.  
  102.         int rez = *((int *)&buffer[i + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char)]);
  103.         copyLEToBE(rez, &buffer[i + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char)]);
  104.         addEnd(&l, *((Izraz *)&buffer[i]));
  105.     }
  106.     return l;
  107. }
  108.  
  109. void copyLEToBE(int x, void *copy)
  110. {
  111.     int i;
  112.     for (i = 0; i < sizeof(x); i++)
  113.     {
  114.         *((char *)copy + i) = *((char *)&x + sizeof(x) - 1 - i);
  115.     }
  116. }
  117.  
  118. void ispisiListu(node *l)
  119. {
  120.     node *t = l->next;
  121.     int inx = 0;
  122.     while (t != l)
  123.     {
  124.         printf("\n--- Ispis iteracije %d ---\n", inx++);
  125.         printf("%hd %c %hd = %d", t->data.broj1,
  126.                t->data.op,
  127.                t->data.broj2,
  128.                t->data.rezultat);
  129.         t = t->next;
  130.     }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment