Wstęp do programowania 1 Struktury Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 12
Struktura dla dat - przykład #include <stdio.h> struct Date { int y; short m; short d; ; int main(void) { struct Date sylwek; sylwek.y = 2009; sylwek.m = 5; sylwek.d = 4; printf("%2hd-%2hd-%04d\n", sylwek.d, sylwek.m, sylwek.y); return 0; [bw@wozna w08]$./data 4-5-2009
Instrukcja typedef #include <stdio.h> typedef struct { int y; short m; short d; Date; int main(void) { Date nowyrok; nowyrok.y = 2009; nowyrok.m = 5; nowyrok.d = 4; printf("%2hd-%2hd-%4d\n", nowyrok.d, nowyrok.m, nowyrok.y); return 0;
Instrukcja typedef #include <stdio.h> typedef struct { int y; short m; short d; Date; int main(void) { Date sylwek = {2005, 12, 31; printf("%02hd-%02hd-%04d\n", sylwek.d, sylwek.m, sylwek.y); return 0;
Operator wyboru składowej #include <stdio.h> #include <stdlib.h> typedef struct { int y; short m; short d; Date; int main(void) { Date* sylwek = calloc(1, sizeof(date)); // *sylwek.y = 2009; niepoprawne (*sylwek).y = 2009; poprawne sylwek->y = 2009; sylwek->m = 5; sylwek->d = 4; printf("%02hd-%2hd-%4d\n", sylwek->d, sylwek->m, sylwek->y); free(sylwek); return 0;
Program 1 #include <stdio.h> typedef struct { int y; short m; short d; Date; void init(date* date, int y, int m, int d); void show(date date); int main(void) { Date sylwek; init(&sylwek, 2006, 12, 7); show(sylwek); return 0;
Program 1 void init(date* date, int y, int m, int d) { date->y = y; date->m = m; date->d = d; void show(date date) { printf("%02hd-%02hd-%4d\n", date.d, date.m, date.y);
Program 2 #include <stdio.h> #include <stdlib.h> typedef struct { int y; short m; short d; Date; void init(date* date, int y, int m, int d); void show(date date); int main(void) { Date* sylwek = calloc(1, sizeof(date)); init(sylwek, 2006, 12, 7); show(*sylwek); return 0;
Program 2 void init(date* date, int y, int m, int d) { date->y = y; // (*date).y=y; date->m = m; date->d = d; void show(date date) { printf("%02hd-%02hd-%4d\n", date.d, date.m, date.y);
Program 1 #include <stdio.h> typedef struct { int y; short m; short d; Date; #define MAX_LEN 32 typedef struct { char name[max_len]; Date birthday; Person; void showdate(date const* date); void showperson(person const* person); int main(void) { Person ms = {"Jan Kowalski", {1987, 4, 19; showperson(&ms); return 0;
Program 1 void showperson(person const* person) { printf("%s ", person->name); showdate(&person->birthday); void showdate(date const* date) { printf("%02hd-%02hd-%04d\n", date->d, date->m, date->y);
Program 2 #include <stdio.h> #include <string.h> typedef struct { int y; short m; short d; Date; #define MAX_LEN 32 typedef struct { char name[max_len]; Date birthday; Person; void initdate(date* date, int y, int m, int d); void showdate(date const* date); void initperson(person*, char* name, int y, int m, int d); void showperson(person const* person);
Program 2 void initdate(date* date, int y, int m, int d) { date->y = y; date->m = m; date->d = d; void showdate(date const* date) { printf("%02hd-%02hd-%04d\n", date->d, date->m, date->y); void showperson(person const* person) { printf("%s ", person->name); showdate(&person->birthday); void initperson(person* person, char* name, int y, int m, int d) { strncpy(person->name, name, MAX_LEN); person->name[max_len - 1] = \0 ; initdate(&person->birthday, y, m, d);
Program 2 int main(int) { Person ms; initperson(&ms, "Maria Sharapova", 1987, 4, 19); showperson(&ms); return 0;
Program 1 #include <stdio.h> #include <string.h> #include <ctype.h> typedef struct { char* word; int count; Key; Key keytab[] = { {"auto", 0, {"break", 0, {"case", 0, {"char", 0, {"const", 0, {"continue", 0, {"default", 0, {"do", 0, {"double", 0, {"else", 0, {"enum", 0, {"extern", 0, {"float", 0, {"for", 0, {"goto", 0, {"if", 0, {"int", 0, {"long", 0, {"register", 0, {"return", 0, {"short", 0, {"signed", 0, {"sizeof", 0, {"static", 0, {"struct", 0, {"switch", 0, {"typedef", 0, {"union", 0, {"unsigned", 0, {"void", 0, {"volatile", 0, {"while", 0 ; int getword(char*, int); int binsearch(key const*, char const*, int); #define MAXWORD 100
Program 1 int getword(char* word, int lim) { char* w = word; int c; while (isspace(c = getc(stdin))) { if (c!= EOF) { *w++ = c; if (!isalpha(c)) { *w = \0 ; return c; for (; --lim > 0; ++w) { if (!isalnum(*w = getc(stdin))) { ungetc(*w, stdin); break; *w = \0 ; return 0;
Program 1 int binsearch(key const* tab, char const* word, int n) { int left = 0, right = n - 1; while (left <= right) { int mid = (left + right) / 2; int cond = strcmp(word, tab[mid].word); if (cond < 0) { right = mid - 1; else if (cond > 0) { left = mid + 1; else { return mid; return -1;
Program 1 int main(void) { int n; char word[maxword]; int const nkeys = sizeof(keytab) / sizeof(keytab[0]); while (getword(word, MAXWORD)!= EOF) { if (isalpha(word[0])) { if ((n = binsearch(keytab, word, nkeys)) >= 0) { ++keytab[n].count; // ++*(keytab + n).count; for (n = 0; n < nkeys; ++n) { if (keytab[n].count > 0) printf("%4d %s\n", keytab[n].count, keytab[n].word); printf("\n"); return 0;
Definicja Unia (ang. union) jest typem, który pozwala przechowywać różne rodzaje danych w tym samym obszarze pamięci (ale nie równocześnie). Dzięki uniom można na przykład utworzyć tablice jednostek o jednakowej długości, z których każda może przechowywać dane innego typu. Definicja unii jest analogiczna do definicji struktury, z wyjatkiem tego, że stosowane jest słowo kluczowe union. Kompilator przydziela tyle miejsca dla unii, aby mogła ona przechowywać największa ze zmiennych będac a częścia szablonu unii.
Przyklady union magazyn { int cyfra; double l_rzeczywista; char znak; ; Trzy unie typu magazyn /*unia typu magazyn */ union magazyn a; /*tablica 10 unii typu magazyn */ union magazyn tab[10]; /* wskaźnik do unii typu magazyn */ union magazyn *wu;
Przyklady Rozmiary unii #include <stdio.h> #include <stdlib.h> union magazyn { int cyfra; double l_rzeczywista; char znak; ; int main(void) { system("clear"); union magazyn a; printf("union magazyn a: %ld bajtow \n", sizeof(a)); union magazyn tab[10]; printf("union magazyn tab[10]: %ld bajtow \n", sizeof(tab)); union magazyn *wu; printf("union magazyn *wu: %ld bajtow \n",sizeof(wu)); return 0;
Przyklady Wykonanie union magazyn a: 8 bajtow union magazyn tab[10]: 80 bajtow union magazyn *wu: 8 bajtow
Inicjalizacja Unie moga być inicjalizowane, ale zasady sa nieco inne niż w przypadku struktur. Istnieja dwie możliwości: nadanie unii wartości innej unii tego samego typu lub inicjalizacja pierwszego składnika unii. Pamiętanie o tym, jaki rodzaj informacji znajduje się w unii w każdym momencie, jest obowiazkem programisty. Dostęp do składowych unii odbywa sie w taki sam sposób jak w strukturach, czyli za pomoca operatora przynależności (kropki,.) lub operatora przynależności pośredniej (strzałki, >).
Inicjalizacja #include <stdio.h> #include <stdlib.h> union magazyn { int cyfra; double l_rzeczywista; char znak; ; void druk(const union magazyn); int main(void) { system("clear"); union magazyn a; a.znak = A ; union magazyn b=a; union magazyn c={777; puts("a: "); druk(a); puts("b: "); druk(b); puts("c: "); druk(c); union magazyn d = { znak : D ; puts("d: "); druk(d); return 0; void druk(const union magazyn a) { printf("[%d -- %lf -- %c] \n", a.cyfra, a.l_rzeczywista, a.znak);
Inicjalizacja Wykonanie a: [-974036927 -- 0.000000 -- A] b: [-974036927 -- 0.000000 -- A] c: [777 -- 0.000000 -- ] d: [68 -- 0.000000 -- D]
Inicjalizacja unia.c #include <stdio.h> #include <stdlib.h> union Test { int i; float f; ; int main(void) { system("clear"); union Test t; printf("union Test {\n int i;\n float f;\n;\n\n"); printf("union Test t;\n\n"); printf("rozmiar unii t = %ld bajty\n\n", sizeof(t)); printf("po przypisaniu wartosci 1024.0 do pola f\n"); t.f = 1024.0; printf("pole i = %d\tpole f = %f\n\n", t.i, t.f); t.i = 1234567890; printf("po przypisaniu wartosci 1234567890 do pola i\n"); printf("pole i = %d\tpole f = %f\n\n", t.i, t.f); return 0;
Inicjalizacja Wykonanie union Test { int i; float f; ; union Test t; Rozmiar unii t = 4 bajty Po przypisaniu wartosci 1024.0 do pola f Pole i = 1149239296 Pole f = 1024.000000 Po przypisaniu wartosci 1234567890 do pola i Pole i = 1234567890 Pole f = 1228890.250000
Struktury a unie, enum #include <stdio.h> #include <stdlib.h> enum symboltype {INT, DOUBLE, CHAR; union Data {int i; double d; char c;; struct TableEntry { char *name; enum symboltype type; union Data data; ; int main(void) { struct TableEntry symtab[] = { {"ch", CHAR, {c : @, {"counter", INT, {i : 0, {"pi", DOUBLE, {d : 3.1417, {"x", 5, {8 ; int size = sizeof(symtab) / sizeof(struct TableEntry); for (int k = 0; k < size; ++k) { printf("%s\t\t", symtab[k].name); switch (symtab[k].type) { case CHAR: printf("%c\n", symtab[k].data.c); break; case DOUBLE: printf("%f\n", symtab[k].data.d); break; case INT: printf("%d\n", symtab[k].data.i); break; default: printf("nieznany typ (%d), element %d\n", symtab[k].type, k); break; return 0;
Struktury a unie, enum Wykonanie ch @ counter 0 pi 3.141700 x Nieznany typ (5), element 3