File: Stare vježbe/vjezbe11/69c__studenti.c

  1. /*
  2.   69c__studenti.c
  3.   -----
  4.   Ispravljena verzija programa 69b__studenti.c -- kopiranje
  5.   sada radimo u zasebnoj funkciji koja ime i prezime prekopira sa
  6.   strcpy, za razliku od proslog programa koji je samo kopirao adrese.
  7.  
  8.   (kod unosa neka se 1. student ne zove Mirko i neka nema 5 iz C-a)
  9. */
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <malloc.h>
  14. #include <string.h>
  15.  
  16. struct __student {
  17. char *ime, *prezime, jmbag[11];
  18. int ocjena_iz_c_a;
  19. };
  20.  
  21. typedef struct __student student;
  22.  
  23. double prosjek (student polje[], int broj_studenata)
  24. {
  25. double rez=0;
  26. int i;
  27.  
  28. for (i=0; i<broj_studenata; i++)
  29. rez+=polje[i].ocjena_iz_c_a;
  30.  
  31. return rez/broj_studenata;
  32. }
  33.  
  34. void preimenuj (student *stud, char *novo_ime, int nova_ocjena)
  35. {
  36. stud->ocjena_iz_c_a=nova_ocjena;
  37.  
  38. if ((stud->ime=realloc(stud->ime, strlen(novo_ime)+1))==NULL)
  39. {
  40. printf ("Greska prilikom alokacije memorije.\n");
  41. exit(1);
  42. }
  43. strcpy (stud->ime, novo_ime);
  44. }
  45.  
  46. void copy (student *kuda, student *sto)
  47. {
  48. /* ako je novo ime dulje/krace, treba realocirati memoriju tako da se
  49.   opet trosi tocno onoliko koliko je potrebno */
  50. if ((kuda->ime=realloc (kuda->ime, strlen(sto->ime)+1))==NULL)
  51. {
  52. printf ("Greska prilikom alokacije memorije.\n");
  53. exit(1);
  54. }
  55. strcpy (kuda->ime, sto->ime);
  56.  
  57. if ((kuda->prezime=realloc (kuda->prezime, strlen(sto->prezime)+1))==NULL)
  58. {
  59. printf ("Greska prilikom alokacije memorije.\n");
  60. exit(1);
  61. }
  62. strcpy (kuda->prezime, sto->prezime);
  63.  
  64. strcpy (kuda->jmbag, sto->jmbag);
  65. kuda->ocjena_iz_c_a=sto->ocjena_iz_c_a;
  66. }
  67.  
  68. int main ( void )
  69. {
  70. student *polje;
  71. int broj_studenata, i;
  72.  
  73. /* ispisimo koliko sad memorije zauzima struktura */
  74. printf ("[sizeof(student)=%d]\n\n", sizeof(student));
  75.  
  76. printf ("Koliko ce biti studenata: ");
  77. scanf ("%d", &broj_studenata);
  78.  
  79. /* alociramo memoriju za podatke -- uzet cemo mjesta za 1 studenta vise */
  80. if ((polje=(student *) malloc ((broj_studenata+1)*sizeof(student)))==NULL)
  81. {
  82. printf ("Greska prilikom alokacije memorije.\n");
  83. exit(1);
  84. }
  85.  
  86. /* inicijaliziramo polje (tj. elemente strukture koji su pokazivaci) */
  87. for (i=0; i<broj_studenata+1; i++)
  88. polje[i].ime=polje[i].prezime=NULL;
  89.  
  90. /* ucitavamo redom podatke o studentima */
  91. for (i=0; i<broj_studenata; i++)
  92. {
  93. char s[100];
  94.  
  95. printf ("--- %d. student ---\n", i+1);
  96. printf ("Ime: ");
  97. scanf ("%s", s);
  98. /* alociramo tocno onoliko memorije koliko treba da se spremi ime */
  99. /* (uocimo strlen(s)+1 zbog dodatnog znaka '\0') */
  100. if ((polje[i].ime=(char *) malloc ((strlen(s)+1)*sizeof(char)))==NULL)
  101. {
  102. printf ("Greska prilikom alokacije memorije.\n");
  103. exit(1);
  104. }
  105. strcpy (polje[i].ime, s);
  106.  
  107. printf ("Prezime: ");
  108. scanf ("%s", s);
  109. if ((polje[i].prezime=(char *) malloc ((strlen(s)+1)*sizeof(char)))
  110. ==NULL)
  111. {
  112. printf ("Greska prilikom alokacije memorije.\n");
  113. exit(1);
  114. }
  115. strcpy (polje[i].prezime, s);
  116.  
  117. printf ("JMBAG: ");
  118. scanf ("%s", &polje[i].jmbag); /* jmbag ima 10 znakova */
  119.  
  120. printf ("Ocjena iz C-a: ");
  121. scanf ("%d", &polje[i].ocjena_iz_c_a);
  122. }
  123.  
  124. /* kloniramo prvog studenta i promjenimo mu ime u Mirko i ocjenu u 5
  125.   pomocu funkcije copy koja pazljivo kopira elemente strukture */
  126. copy (&polje[broj_studenata], &polje[0]);
  127. preimenuj (&polje[broj_studenata], "Mirko", 5);
  128.  
  129. /* sada je preimenovan samo zadnji student */
  130.  
  131. /* ispisemo podatke o svim studentima */
  132. printf ("\n\n");
  133. for (i=0; i<=broj_studenata; i++)
  134. printf ("%d. %s %s: JMBAG=%s, ocjena iz c-a=%d\n",
  135. i+1, polje[i].ime, polje[i].prezime,
  136. polje[i].jmbag, polje[i].ocjena_iz_c_a);
  137.  
  138. /* izracunamo prosjek ocjena iz C-a */
  139. printf ("Prosjek ocjena iz C-a: %f\n", prosjek(polje, broj_studenata+1));
  140.  
  141. /* oslobadjamo memoriju: prvo za sve stringove */
  142. for (i=0; i<=broj_studenata; i++)
  143. free(polje[i].ime), free(polje[i].prezime);
  144.  
  145. /* pa onda i za samo polje */
  146. free (polje);
  147.  
  148. return 0;
  149. }
  150.