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

  1. /*
  2.   69a__studenti.c
  3.   Uvodimo polja struktura i pokazivace na strukturu.
  4.   -----
  5.   Velicina varijable tipa struct=zbroj velicina svih njezinih elemenata.
  6.  
  7.   (kod unosa neka se 1. student ne zove Mirko i neka nema 5 iz C-a)
  8. */
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12.  
  13. struct __student {
  14. char ime[20], prezime[20], jmbag[14];
  15. int ocjena_iz_c_a;
  16. };
  17.  
  18. /* Naredba typedef sluzi za definiciju novog tipa. Obicno ju koristimo
  19.   kako bismo uveli pokratu za neki slozeni tip podatka.
  20.   Sintaksa: typedef slozeni_tip pokrata
  21.   U nasem slucaju: slozeni_tip=struct __student
  22.   pokrata=student
  23. */
  24. typedef struct __student student;
  25.  
  26. double prosjek (student polje[], int broj_studenata)
  27. {
  28. double rez=0;
  29. int i;
  30.  
  31. for (i=0; i<broj_studenata; i++)
  32. rez+=polje[i].ocjena_iz_c_a;
  33.  
  34. return rez/broj_studenata;
  35. }
  36.  
  37. void preimenuj (student *stud, char *novo_ime, int nova_ocjena)
  38. {
  39. /* ova funkcija mora promijeniti podatke o studentu -> mora kao
  40.   parametar imati pokazivac (tj. moramo joj poslati adresu) */
  41.  
  42. (*stud).ocjena_iz_c_a=nova_ocjena;
  43. /* operator * (dereferenciranje) ima manji prioritet od operatora .
  44.   (uzimanje elementa strukture), pa je nuzno navesti zagrade.
  45.   Alternativni (i kraci zapis):
  46.   stud->ocjena_iz_c_a=nova_ocjena; */
  47.  
  48. strcpy (stud->ime, novo_ime);
  49. }
  50.  
  51. int main ( void )
  52. {
  53. student polje[10];
  54. int broj_studenata, i;
  55.  
  56. /* ispisimo koliko memorije zauzimaju pojedina struktura i cijelo polje */
  57. printf ("[sizeof(student)=%d sizeof(polje[0])=%d sizeof(polje)=%d]\n\n",
  58. sizeof(student), sizeof(polje[0]), sizeof(polje));
  59.  
  60. /* ucitavamo redom podatke o studentima */
  61. printf ("Koliko ce biti studenata (<10): ");
  62. scanf ("%d", &broj_studenata);
  63.  
  64. for (i=0; i<broj_studenata; i++)
  65. {
  66. printf ("--- %d. student ---\n", i+1);
  67. printf ("Ime: ");
  68. scanf ("%s", polje[i].ime);
  69.  
  70. printf ("Prezime: ");
  71. scanf ("%s", polje[i].prezime);
  72.  
  73. printf ("JMBAG: ");
  74. scanf ("%s", polje[i].jmbag);
  75.  
  76. printf ("Ocjena iz C-a: ");
  77. scanf ("%d", &polje[i].ocjena_iz_c_a);
  78. }
  79.  
  80. /* kloniramo prvog studenta i promjenimo mu ime u Mirko i ocjenu u 5 */
  81. /* ova operacija ce iskopirati bit po bit sve iz polje[0] u
  82.   polje[broj_studenata] */
  83. polje[broj_studenata]=polje[0];
  84. preimenuj (&polje[broj_studenata], "Mirko", 5);
  85.  
  86. /* ispisemo podatke o svim studentima */
  87. printf ("\n");
  88. for (i=0; i<=broj_studenata; i++)
  89. printf ("%d. %s %s: JMBAG=%s, ocjena iz c-a=%d\n",
  90. i+1, polje[i].ime, polje[i].prezime,
  91. polje[i].jmbag, polje[i].ocjena_iz_c_a);
  92.  
  93. /* izracunamo prosjek ocjena iz C-a */
  94. printf ("\nProsjek ocjena iz C-a: %f\n", prosjek(polje, broj_studenata+1));
  95.  
  96. return 0;
  97. }
  98.