jazykc  2013.3
upoljazykc
 All Classes Files Functions Variables Typedefs Macros Pages
studenti.c
Go to the documentation of this file.
1 
32 #include <stdio.h>
33 #include <stdlib.h>
34 
35 #include <string.h>//strcpy()
36 
37 struct Datum {
38  short rok;
39  char mesic;
40  char den;
41 };
42 typedef struct Datum Datum;
43 
44 #ifndef NAMELEN
45 #define NAMELEN 20
46 #endif
47 
48 struct Student {
49  char jmeno[NAMELEN+1]; //nebudeme pouzivat char*, malloc() se jeste 'neprobiral'
50  char prijmeni[NAMELEN+1];
51  Datum narozen;
52 };
53 typedef struct Student Student;
54 
55 int student_vypis (Student s) {
56  printf("%20s %20s, %02d.%02d.%d\n", s.jmeno, s.prijmeni, s.narozen.den, s.narozen.mesic, s.narozen.rok);
57 }
58 
66 int porovnej_vek (Datum d1, Datum d2) {
67  int diff;
68 //.rok .mesic a .den je si treba predstavit "stovky" "desitky" a "jednotky"
69 //ktere potrebujeme "spocitat",
70 //.den jsou jednotky
71 //.mesic jsou misto desitek dvestepadesatsestky
72 //.rok jsou 65536stky
73 //bitovy posun doleva je totez co nasobeni mocninou 2, tj. neco * 256 == neco << 8
74 //h0nza: udelam priklad do operatoru
75  diff = (d1.rok << 16 + d1.mesic << 8 + d1.den) - (d2.rok << 16 + d2.mesic << 8 + d2.den);
76 //note: dvakrat pouzit ternarni operator ?:
77  return diff < 0 ? -1 : diff ? 1 : 0;
78 }
79 
80 //pro inicializace vyuzijeme moznosti C99:
81 Student stary = {.jmeno="Pepa",.prijmeni="Starý", .narozen={.rok=1921,.mesic=10,.den=11}};
82 Student ascii = {.jmeno="Pepa",.prijmeni="Ascii", .narozen={.rok=1921,.mesic=12,.den=31}};
83 
84 #define STUDENTI_VEK(s1, s2) do { int diff=porovnej_vek((s1).narozen,(s2).narozen); printf("%s %s je %s %s %s.\n",\
85  (s1).jmeno,(s1).prijmeni, diff<0 ? "starší než" : diff ? "mladší než" : "stejně mladý jako", \
86  (s2).jmeno,(s2).prijmeni); } while(0)
87 
88 int main(void) {
89  Student lokalni ={.jmeno="František",.prijmeni="Lokální",.narozen={.den=1,.mesic=2,.rok=1933}};
90  Student lokalni2={.jmeno="František",.prijmeni="Lókální",.narozen={.den=2,.mesic=2,.rok=1922}};
91  Student lokal;
92 
93 //inicializace pomoci prirazeni:
94 //lokal.jmeno = "Jeníček";//takto to nejde!!!
95  strcpy(lokal.jmeno, "Jeníček");//musime takto!
96  strcpy(lokal.prijmeni, "Mařenka");
97  lokal.narozen.rok=1962;
98  lokal.narozen.mesic=5;
99  lokal.narozen.den=12;
100 //hmm, prostredi a zdrojak v UTF-8 => nefunguje %20s v printf?
101  printf(" 1 2 1 2\n");
102  printf("12345678901234567890 12345678901234567890\n");
103  student_vypis(ascii);
104  student_vypis(stary);
105  student_vypis(lokalni);
106  student_vypis(lokalni2);
107  student_vypis(lokal);
108 
109  STUDENTI_VEK(stary, lokalni);
110  STUDENTI_VEK(lokalni, stary);
111  STUDENTI_VEK(lokalni, lokalni);
112  STUDENTI_VEK(lokalni, lokal);
113  return EXIT_SUCCESS;
114 }
115 
int porovnej_vek(Datum d1, Datum d2)
Definition: studenti.c:66
Definition: studenti.c:37