MartinSRB

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

Apr 2nd, 2023 (edited)
1,616
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.14 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <stdbool.h>
  6. #include <math.h>
  7. #include "ispit.h"
  8.  
  9. #pragma pack(4)
  10.  
  11. typedef bool polozeno(char);
  12.  
  13. char *createBuffer(int, int);
  14. bool validateHex(char *);
  15. int convertHexToBin(char *);
  16. int prebroj(char *, polozeno *);
  17. bool isPassed(char);
  18.  
  19. int main()
  20. {
  21.     int n,
  22.         m;
  23.     char *buffer;
  24.     printf("Unesite broj studenata: ");
  25.     scanf("%d", &n);
  26.     printf("Unesite broj predmeta studenata: ");
  27.     scanf("%d", &m);
  28.     buffer = createBuffer(n, m);
  29.     printf("\nUkupno polozenih ispita: %d.", prebroj(buffer, isPassed));
  30.     free(buffer);
  31.     return EXIT_SUCCESS;
  32. }
  33.  
  34. char *createBuffer(int n, int m)
  35. {
  36.     char *buffer = NULL;
  37.     if (n > 0 && m > 0)
  38.     {
  39.         int i,
  40.             j;
  41.         char hexNum[33];
  42.         buffer = (char *)malloc(2 * sizeof(int) + n * m * sizeof(ispit));
  43.         *buffer = n;
  44.         *(buffer + sizeof(int)) = m;
  45.         for (i = 0; i < n; i++)
  46.         {
  47.             printf("Unos podataka o ispitima za %d. studenta: \n", i + 1);
  48.             for (j = 0; j < m; j++)
  49.             {
  50.                 fflush(stdin);
  51.                 int skip = 2 * sizeof(int) + i * m * sizeof(ispit) + j * sizeof(ispit);
  52.                 printf("Unos dana ispita broj %d: ", j + 1);
  53.                 scanf("%hd", (short *)&buffer[skip]);
  54.                 printf("Unos meseca ispita broj %d: ", j + 1);
  55.                 scanf("%hd", (short *)&buffer[skip + sizeof(short)]);
  56.                 printf("Unos godine ispita broj %d: ", j + 1);
  57.                 scanf("%hd", (short *)&buffer[skip + 2 * sizeof(short)]);
  58.                 printf("Unos ocene ispita broj %d: ", j + 1);
  59.                 fflush(stdin);
  60.                 scanf("%i", buffer + skip + 3 * sizeof(short));
  61.                 do
  62.                 {
  63.                     fflush(stdin);
  64.                     printf("Unos sifre ispitnog roka za ispit broj %d u HEX formatu: 0x", j + 1);
  65.                     scanf("%s", hexNum);
  66.                 } while (!validateHex(hexNum));
  67.                 *((int *)&buffer[skip + 3 * sizeof(short) + 2 * sizeof(char)]) = convertHexToBin(hexNum);
  68.                 printf("Unos imena profesora za ispit broj %d: ", j + 1);
  69.                 scanf("%s", buffer + skip + 3 * sizeof(short) + 2 * sizeof(char) + sizeof(int));
  70.             }
  71.         }
  72.         return buffer;
  73.     }
  74. }
  75.  
  76. bool validateHex(char *hex)
  77. {
  78.     int i;
  79.     for (i = 0; i < strlen(hex); i++)
  80.     {
  81.         hex[i] = toupper(hex[i]);
  82.         if ((hex[i] < '0' || hex[i] > '9') && (hex[i] < 'A' || hex[i] > 'F'))
  83.         {
  84.             return false;
  85.         }
  86.     }
  87.     return true;
  88. }
  89.  
  90. int convertHexToBin(char *hex)
  91. {
  92.     int ret = 0,
  93.         i;
  94.     float powIndex = 0;
  95.     for (i = strlen(hex) - 1; i >= 0; i--, powIndex++)
  96.     {
  97.         int tmp;
  98.         if (hex[i] > '0' && hex[i] < '9')
  99.         {
  100.             tmp = hex[i] - '0';
  101.         }
  102.         else
  103.         {
  104.             switch (hex[i])
  105.             {
  106.             case 'A': // znamo da ce sva slova biti velika jer smo ih izmenili u validate funkciji
  107.                 tmp = 10;
  108.                 break;
  109.             case 'B':
  110.                 tmp = 11;
  111.                 break;
  112.             case 'C':
  113.                 tmp = 12;
  114.                 break;
  115.             case 'D':
  116.                 tmp = 13;
  117.                 break;
  118.             case 'E':
  119.                 tmp = 14;
  120.                 break;
  121.             case 'F':
  122.                 tmp = 15;
  123.                 break;
  124.             }
  125.         }
  126.         ret += tmp * pow(16, powIndex);
  127.     }
  128.     return ret;
  129. }
  130.  
  131. int prebroj(char *buffer, polozeno *function)
  132. {
  133.     int n = *buffer,
  134.         m = *(buffer + sizeof(int)),
  135.         counter = 0,
  136.         i,
  137.         j;
  138.     for (i = 0; i < n; i++)
  139.     {
  140.         for (j = 0; j < m; j++)
  141.         {
  142.             int skip = 2 * sizeof(int) + i * m * sizeof(ispit) + j * sizeof(ispit);
  143.             if (function(*((char *)&buffer[skip + 3 * sizeof(short)])))
  144.             {
  145.                 counter++;
  146.             }
  147.         }
  148.     }
  149.     return counter;
  150. }
  151.  
  152. bool isPassed(char ocena)
  153. {
  154.     return ocena > 6 ? true : false;
  155. }
Advertisement
Add Comment
Please, Sign In to add comment