Advertisement
MartinSRB

[НРС] Вежбе 6 - Задатак 4

Mar 17th, 2023 (edited)
640
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.99 KB | Source Code | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6.  
  7. #pragma pack(4)
  8.  
  9. #define MAX_IME     12
  10. #define MAX_PREZIME 12
  11. #define MAX_JMBG    14
  12.  
  13. void ispisNajstariju(char*);
  14.  
  15. typedef struct { //adrese za pristup u pack(4)
  16. char ime[MAX_IME]; // 2 -> 13
  17. char prezime[MAX_PREZIME]; // 14 -> 25
  18. char pol; // 26 -> 27
  19. short danR, mesecR, godinaR; // 28 -> 29, 30 -> 31, 32 -> 33
  20. char JMBG[MAX_JMBG]; // 34 -> 47
  21. } Osoba;
  22.  
  23. int main(){
  24.     short n;
  25.     int i;
  26.     do{
  27.         printf("Unesite broj osoba koji zelite da unesete: ");
  28.         scanf("%hu", &n);
  29.     }while(n <= 0);
  30.     char* buffer = (char *)malloc(sizeof(short) + n * sizeof(Osoba));
  31.     *buffer = n;
  32.     for(i = sizeof(short); i < sizeof(short) + n * sizeof(Osoba); i += sizeof(Osoba)){
  33.         char tmp[14];
  34.         short danTmp;
  35.         printf("Unos imena %ld osobe: ", (i - sizeof(short)) / sizeof(Osoba));
  36.         scanf("%s", tmp);
  37.         strncpy(&buffer[i], tmp, MAX_IME);
  38.         printf("Unos prezimena %ld osobe: ", (i - sizeof(short))/sizeof(Osoba));
  39.         scanf("%s", tmp);
  40.         strncpy(&buffer[i + MAX_IME], tmp, MAX_PREZIME);
  41.         char tmpPol = 'M';
  42.         do{
  43.             getchar(); //resava bug iz c jezika gde se uzima \n sa bafera iz prethodnog unosa.
  44.             printf("Unesite pol (M/Z): ");
  45.             tmpPol = toupper(getchar());
  46.         }while(tmpPol != 'M' && tmpPol != 'Z');
  47.         buffer[i + MAX_IME + MAX_PREZIME] = toupper(tmp[0]);
  48.         printf("Uneti dan rodjenja: ");
  49.         scanf("%hi", &danTmp);
  50.         buffer[i + MAX_IME + MAX_PREZIME + 2*sizeof(char)] = danTmp;
  51.         printf("Uneti mesec rodjenja: ");
  52.         scanf("%hi", &danTmp);
  53.         buffer[i + MAX_IME + MAX_PREZIME + 2*sizeof(char) + sizeof(short)] = danTmp;
  54.         printf("Uneti godinu rodjenja: ");
  55.         scanf("%hi", &danTmp);
  56.         buffer[i + MAX_IME + MAX_PREZIME + 2*sizeof(char) + 2*sizeof(short)] = danTmp;
  57.         printf("Godina: %hi\n", (buffer[i + MAX_IME + MAX_PREZIME + 2*sizeof(char) + 2*sizeof(short)]));
  58.         printf("Uneti JMBG osobe: ");
  59.         scanf("%s", tmp);
  60.         strncpy(&buffer[i + MAX_IME + MAX_PREZIME + 2*sizeof(char) + 3*sizeof(short)], tmp, MAX_JMBG);
  61.  
  62.     }
  63.     ispisNajstariju(buffer);
  64.     free(buffer);
  65.     return EXIT_SUCCESS;
  66. }
  67.  
  68. void ispisNajstariju(char *buffer){
  69.     int i = sizeof(short),
  70.         n = *buffer;
  71.     printf("\n------ Najstarija osoba -------");
  72.     printf("\nIme najstarije osobe: %s", &buffer[i]);
  73.     i += MAX_IME;
  74.     printf("\nPrezime najstarije osobe: %s", &buffer[i]);
  75.     i += MAX_PREZIME;
  76.     printf("\nPol osobe je: %c", (char)(buffer[i]));
  77.     i += 2 * sizeof(char); // +2 jer je pack(4), inace bi bilo +1
  78.     printf("\nDatum rodjenja je %hi/", (short)(buffer[i]));
  79.     i += sizeof(short);
  80.     printf("%hi/", (short)(buffer[i]));
  81.     i += sizeof(short);
  82.     printf("%hi", (short)(buffer[i]));
  83.     i += sizeof(short);
  84.     printf("\nJMBG osobe je: %s", &buffer[i]);
  85.     printf("\n--------------------------------\n");
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement