Stáhnout prezentaci
Prezentace se nahrává, počkejte prosím
1
Přednáška 11 Jiří Šebesta
Počítače a programování 1 Přednáška 11 Jiří Šebesta
2
TÉMA – práce s dynamickými proměnnými
Vazby dynamických proměnných 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é 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 comp je pojmenování struktury t_comp je pojmenování typu
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
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)
if(cmd=='S' || cmd=='s') show(); printf("\nA: Add, S: Show, Q: Quit"); scanf("%c", &cmd); fflush(stdin); } return 0; Příklad: Ex71.c
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 Doplnění funkce add() 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->next = NULL; // last points to null address
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 void add(char *cname, char *ccountry, int cjump) { t_comp *ccomp, *prevcomp, *nextcomp; ... Společné doprogramování funkce
20
Dynamická databáze - příklad (5/5)
Uvolňování záznamů z paměti Vyřešená aplikace bude na webu k dispozici od jako Ex73sol.c Příklad: Ex73.c
21
TÉMA NÁSLEDUJÍCÍ PŘEDNÁŠKY
Pokročilé algoritmy v C DĚKUJI ZA POZORNOST
Podobné prezentace
© 2024 SlidePlayer.cz Inc.
All rights reserved.