ANSI C 7

ANSI C 7



6 STRUKTURY_

struct rect {

struct point pt1; struct point pt2;

};

Struktura rect zawiera dwie struktury point. Jeśli zadeklarujemy screen (ekran) jaki

struct rect screen;

to konstrukcja screen.pt1.x

odnosi się do współrzędnej x punktu pt1, który jest składową zmiennej screen.


Struktury i funkcje

Dozwolonymi operacjami dla struktury są: przypisanie jej innej struktury w całośc; skopiowanie jej w całości na inną strukturę, pobranie jej adresu za pomocą operator-& oraz odwołania do jej składowych. Przez kopiowanie i przypisanie rozumie się także przesyłanie argumentów funkcjom i zwracanie przez funkcje wartości. Struktur nie można natomiast porównywać. Strukturę można zainicjować listą stałych wartości początkowych jej składowych; automatyczną strukturę można też zainicjować za pomocą przypisania.

Spróbujemy zbadać właściwości struktur, pisząc kilka funkcji manipulujących punktami i prostokątami. Istnieją co najmniej trzy sposoby podejścia do zagadnienia: prze kazywanie składników oddzielnie, przekazywanie całej struktury lub przekazywani; wskaźnika do tej struktury. Każdy z nich ma swoje wady i zalety.

Pierwsza funkcja, makepoint, z podanych dwóch wartości całkowitych buduje i zwraca strukturę typu point:

/* makepoint: utwórz punkt ze współrzędnych x i y */ struct point makepoint(int x, int y)

{    I

struct point temp;

temp.x = x; temp.y = y; return temp;

}    8

Zwróć uwagę na to, że nie ma konfliktu między nazwami argumentów i składowych struktury; ponowne użycie tych samych nazw faktycznie jeszcze bardziej uwypukla wzajemny związek między nimi.

funkcję makepoint można teraz stosować do dynamicznego inicjowania dowolnej struktury lub do budowania strukturowych argumentów funkcji:

struct rect screen;

struct point middle;

struct point makepoint(int, int);

screen.pt1 = makepoint(0, 0);

screen.pt2 = makep/oint(XMAX, YMAX);

middle = makepoint((screen.pt1.x + screen.pt2.x)/2,

(screen.pt1 ,y + screen.pt2.y)/2);

Teraz zbudujemy kilka funkcji realizujących arytmetykę na punktach. Na przykład

I* addpoint: dodaj dwa punkty */

struct point addpoint(struct point pi, struct point p2)

{

p1.x += p2.x;

P1 .y 4- p2.y; return pi;

Tutaj oba argumenty i zwracana wartość są strukturami. Zamiast tworzyć zmienną tymczasową, zwiększyliśmy składowe w strukturze p1 po to, by podkreślić, że struktury są tak samo przekazywane funkcji przez wartość, jak wszystkie inne argumenty.

Innym przykładem jest funkcja ptinrect, w której sprawdza się, czy punkt leży wewnątrz prostokąta. Przyjęliśmy tu konwencję, że prostokąt zawiera swoje krawędzie lewą i dolną, ale nie zawiera krawędzi górnej i prawej:

/* ptinrect: zwróć 1 jeśli p należy do r, 0 jeśli nie należy */ int ptinrect(struct point p, struct rect r)

{

return p.x >= r.pt1.x && p.x < r.pt2.x && p.y >= r.ptt.y && p.y < r.pt2.y;

}

177


Język ANSI C

12


Wyszukiwarka

Podobne podstrony:
ANSI C 7 6 STRUKTURY______ Ćwiczenie 6.5. Napisz funkcję undef, która usuwa nazwę i jej definicję
ANSI C 6 6 STRUKTURY X Obie współrzędne można zadeklarować jako składowe struktury, na przykład ta
ANSI C 0 6 STRUKTURY int getword(char *t int); int binsearch(char *, struct key *, int); /* zlicz
ANSI C 7 4 FUNKCJE I STRUKTURA PROGRAMU _________ Rozróżnienie deklaracji zmiennej zewnętrznej i j
17 2. Struktura pamięci mikrokontrolera 172.4. Zewnętrzna pamięć RAM mikrokontrolera Zewnętrzna pam
ANSI C 7 1 ELEMENTARZ Model wprowadzania i wyprowadzania danych, realizowany przez funkcje z bibli
ANSI C 7 1 ELEMENTARZ dopiero w chwili wywołania funkcji i znika po zakończeniu jej działania. Z t
ANSI C 7 2 TYPY, OPERATORY I WYRAŻENIA możemy zapisać w bardziej zwartej postaci if (c != ’

ANSI C 7 3 STEROWANIE3.7    
ANSI C 7 5 WSKAŹNIKI I TABLICE Ćwiczenie 5.1. Tak jak została napisana, funkcja getint traktuje zn
ANSI C 7 5 WSKAŹNIKI I TABLICE oba zapisy a[3][4] i b[31[4] są poprawnymi odwołaniami do pojedyncz
ANSI C 8 6 STRUKTURY_______ Ta funkcja zakłada, że prostokąt jest reprezentowany w standardowej po
ANSI C 9 6 STRUKTURY 6 STRUKTURYTablice struktur Napiszmy program zliczający wystąpienia każdego s
ANSI C 1 6 STRUKTURY /* getword: weź następne słowo lub znak z wejścia */ int getword(char *word,
ANSI C 2 6 STRUKTURY Warto tutaj omówić kilka spraw. Po pierwsze, deklaracja funkcji binsearch mus
ANSI C 3 6 STRUKTURY Żaden węzeł nie może mieć więcej niż dwóch potomków; może natomiast mieć jedn
ANSI C 4 6 STRUKTURY Funkcja addtree jest rekurencyjna. Funkcja main wprowadza wczytane słowo na n
ANSI C 5 6 STRUKTURY-----------— postępowanie polega najpierw na zadeklarowaniu malloc jako funkcj

więcej podobnych podstron