Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

Počítače a programování 1 Přednáška 11 Jiří Šebesta.

Podobné prezentace


Prezentace na téma: "Počítače a programování 1 Přednáška 11 Jiří Šebesta."— Transkript prezentace:

1 Počítače a programování 1 Přednáška 11 Jiří Šebesta

2 TÉMA – práce s dynamickými proměnnými 1.Vazby dynamických proměnných 2.Dynamická databáze - příklad

3 Vazby dynamických proměnných (1/13) Přístup s polem ukazatelů Alokováno statické pole ukazatelů na dynamic- kou proměnnou (strukturu) – max. počet struktur je předem pevně definován

4 Vazby dynamických proměnných (2/13) Přístup s využitím lineárního seznamu Alokován jen první statický ukazatel na dynamickou strukturu. Každá struktura však má položku ukazatele na následující dyn. strukturu – max. počet je omezen jen kapacitou paměti.

5 Vazby dynamických proměnných (3/13) Přístup s využitím lineárního seznamu Pro jednodušší implementaci dva statické ukazatele na první a poslední dynamickou strukturu.

6 Vazby dynamických proměnných (4/13) Lineární seznam příklad – vkládání neznámého počtu závodníků (skokanů do dálky) do seznamu včetně dosaženého výsledku (délky skoku) Struktura a globální proměnné comp je pojmenování struktury t_comp je pojmenování typu typedef struct comp// competitor record { char name[10]; int jump; struct comp *next; }t_comp; t_comp *first;// ptr to the first comp. - global t_comp *last;// ptr to the last comp. - global int cnt = 0;// the number of recorded comp. - global

7 Vazby dynamických proměnných (5/13) Funkce pro přidání závodníka a jeho skoku do lineárního seznamu void add(char *cname, int cjump)// add comp. record { t_comp *ccomp; // ptr to a comp ccomp = (t_comp*)malloc(sizeof(t_comp)); strcpy(ccomp->name, cname); // record filling ccomp->jump = cjump; cnt++;// the number of records plus one if(cnt == 1) {first = ccomp;// add the first record last = ccomp; } else {last->next = ccomp;// add next record last = ccomp; }

8 Vazby dynamických proměnných (6/13) Výpis seznamu závodníků s výkony v pořadí podle zadávání (od prvního záznamu k poslednímu) void show(void) { t_comp *scomp; int acnt=cnt; scomp = first; do { printf("%s: %d cm\n", scomp->name, scomp->jump); scomp=scomp->next; } while (--acnt > 0); }

9 Vazby dynamických proměnných (7/13) main() funkce programu s ovládáním int main(void) { char cmd, aname[10]; int ajump; printf("\nA: Add, S: Show, Q: Quit\n"); scanf("%c", &cmd); fflush(stdin); while(!(cmd == 'Q' || cmd == 'q')) { if(cmd=='A' || cmd=='a') { printf("\nName: "); scanf("%s", &aname); fflush(stdin); printf("\nJump [cm]: "); scanf("%d", &ajump); fflush(stdin); add(aname, ajump); }

10 Vazby dynamických proměnných (8/13) Příklad: Ex71.c if(cmd=='S' || cmd=='s') show(); printf("\nA: Add, S: Show, Q: Quit"); scanf("%c", &cmd); fflush(stdin); } return 0; }

11 Vazby dynamických proměnných (9/13) Doplnění předchozího příkladu o nalezení prvního závodníka s nejdelším skokem void add(char *cname, int cjump)// add comp. record { // the same as in the example 71 if(cnt == 1) {first = ccomp;// add the first record last = ccomp; } else {last->next = ccomp;// add next record last = ccomp; } last->next = NULL; // last points to null address } Doplnění funkce add()

12 Vazby dynamických proměnných (10/13) void results(void) { t_comp *scomp, *gold; int mjump = first->jump; gold = first; scomp = first->next; do { if(scomp->jump > mjump) { gold = scomp; mjump = gold->jump; } scomp = scomp->next; } while(scomp != NULL); printf("\nWin %s (%d cm)\n", gold->name, gold->jump); } Příklad: Ex72.c

13 Vazby dynamických proměnných (11/13) Přístup s využitím zásobníku Jeden statický ukazatel na vrchol zásobníku – systém LIFO (last in – first out).

14 Vazby dynamických proměnných (12/13) Přístup s využitím stromu

15 Vazby dynamických proměnných (13/13) Složitější vazba struktur - rodokmen strcpy(me->p_sists[0]-> Name, ”Jana”); me->p_sists[0]-> p_mother = me-> p_mother; //uncles: me->p_mother-> p_brths[x] me->p_father-> p_brths[x]

16 Dynamická databáze - příklad (1/5) Zadání: Vytvořte program, který bude dynamicky generovat databázi závodníků - skokanů do dálky. Každá struktura bude obsahovat jméno, zemi závodníka, dosažený skok a ukazatel na dalšího závodníka. Napište funkci pro přidání závodníka včetně skoku a funkci pro zobrazení závodníků s jejich výkony. Přidávání modifikujte tak, že do lineárního seznamu budou závodníci vkládáni podle dosaženého skoku (seznam bude vždy setříděn podle dálky skoku) Všechny funkce musejí být nezávislé na platformě (fungují pro konzolu i Windows)

17 Dynamická databáze - příklad (2/5) Lineární uspořádaný seznam

18 Dynamická databáze - příklad (3/5) Lineární seznam příklad – vkládání neznámého počtu závodníků (skokanů do dálky) do seznamu včetně dosaženého výsledku (délky skoku) Struktura a globální proměnné typedef struct t_comp// competitor record { char name[10]; char country[10]; int jump; t_comp *next; }; t_comp *first;// ptr to the first comp. - global t_comp *last;// ptr to the last comp. - global int count = 0;// the number of recorded comp. - global

19 Dynamická databáze - příklad (4/5) Upravená funkce pro přidání závodníka a jeho skoku do lineárního seznamu s automatickým tříděním podle dálky skoku Společné doprogramování funkce void add(char *cname, char *ccountry, int cjump) { t_comp *ccomp, *prevcomp, *nextcomp;...

20 Dynamická databáze - příklad (5/5) Příklad: Ex73.c Vyřešená aplikace bude na webu k dispozici od jako Ex73sol.c Uvolňování záznamů z paměti

21 TÉMA NÁSLEDUJÍCÍ PŘEDNÁŠKY 1.Pokročilé algoritmy v C DĚKUJI ZA POZORNOST


Stáhnout ppt "Počítače a programování 1 Přednáška 11 Jiří Šebesta."

Podobné prezentace


Reklamy Google