Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include "list.h"
- #pragma pack(4)
- char *napraviNiz(int);
- void izracunaj(char *);
- void ispisiNiz(char *);
- node *izdvoj(char *);
- void copyLEToBE(int, void *);
- void ispisiListu(node *);
- int main()
- {
- int n;
- char *buffer;
- node *l;
- printf("Unesite ukupan broj izraza: ");
- scanf("%d", &n);
- buffer = napraviNiz(n);
- izracunaj(buffer);
- ispisiNiz(buffer);
- l = izdvoj(buffer);
- ispisiListu(l);
- free(l);
- free(buffer);
- return EXIT_SUCCESS;
- }
- char *napraviNiz(int n)
- {
- char *buffer = (char *)malloc(sizeof(int) + n * sizeof(Izraz));
- int i;
- *buffer = n;
- for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
- {
- int index = ((i - sizeof(int)) / sizeof(Izraz) * sizeof(Izraz));
- printf("Unesite broj 1 za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
- scanf("%hd", buffer + sizeof(int) + index);
- printf("Unesite operaciju za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
- fflush(stdin);
- scanf("%c", buffer + sizeof(int) + sizeof(short) + index);
- printf("Unesite broj 2 za %lld iteraciju: ", (i - sizeof(int)) / sizeof(Izraz));
- scanf("%hd", buffer + sizeof(int) + sizeof(short) + 2 * sizeof(char) + index);
- }
- return buffer;
- }
- void izracunaj(char *buffer)
- {
- int n = *buffer,
- i;
- for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
- {
- int index = ((i - sizeof(int)) / sizeof(Izraz)) * sizeof(Izraz);
- short br1 = *((short *)&buffer[sizeof(int) + index]),
- br2 = *((short *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + index]);
- char op = *(buffer + sizeof(int) + sizeof(short) + index);
- switch (op)
- {
- case '+':
- *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 + br2;
- break;
- case '-':
- *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 - br2;
- break;
- case '*':
- *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 * br2;
- break;
- case '/':
- *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]) = br1 / br2;
- break;
- }
- }
- }
- void ispisiNiz(char *buffer)
- {
- int n = *buffer,
- i;
- for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
- {
- int index = ((i - sizeof(int)) / sizeof(Izraz)) * sizeof(Izraz);
- printf("--- Izraz broj: %lld ---\n", index / sizeof(Izraz));
- printf("%hd %c %hd = %d\n", *((short *)&buffer[sizeof(int) + index]),
- buffer[sizeof(int) + sizeof(short) + index],
- *((short *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + index]),
- *((int *)&buffer[sizeof(int) + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char) + index]));
- }
- }
- node *izdvoj(char *buffer)
- {
- node *l;
- int n = *buffer,
- i;
- init(&l);
- for (i = sizeof(int); i < sizeof(int) + n * sizeof(Izraz); i += sizeof(Izraz))
- {
- int rez = *((int *)&buffer[i + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char)]);
- copyLEToBE(rez, &buffer[i + sizeof(short) + 2 * sizeof(char) + sizeof(short) + 2 * sizeof(char)]);
- addEnd(&l, *((Izraz *)&buffer[i]));
- }
- return l;
- }
- void copyLEToBE(int x, void *copy)
- {
- int i;
- for (i = 0; i < sizeof(x); i++)
- {
- *((char *)copy + i) = *((char *)&x + sizeof(x) - 1 - i);
- }
- }
- void ispisiListu(node *l)
- {
- node *t = l->next;
- int inx = 0;
- while (t != l)
- {
- printf("\n--- Ispis iteracije %d ---\n", inx++);
- printf("%hd %c %hd = %d", t->data.broj1,
- t->data.op,
- t->data.broj2,
- t->data.rezultat);
- t = t->next;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment