Struktury a dynamická paměť

Podobné dokumenty
Programování v jazyce C a C++

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Programování v jazyce C a C++

Práce se soubory. Úvod do programování 2 Tomáš Kühr

Formátová specifikace má tvar (některé sekce nemají smysl pro načítání) %

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Práce se soubory. Základy programování 2 Tomáš Kühr

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Programování v C++ 1, 1. cvičení

Algoritmizace a programování

Lekce 9 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Práce se soubory. Úvod do programování 2 Tomáš Kühr

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

Základy programování (IZP)

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. December 7, 2016

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

vstup a výstupv jazyce C

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

IUJCE 07/08 Přednáška č. 6

10 Práce s řetězci - pokračování

Úvod do programování. Lekce 5

Základy programování (IZP)

7. Cvičení Tisk rozsáhlých tabulek

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Práce s binárními soubory. Základy programování 2 Tomáš Kühr

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Programování v C++, 2. cvičení

Spojová implementace lineárních datových struktur

Mělká a hluboká kopie

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

Operační systémy. Cvičení 3: Programování v C pod Unixem

Základy programování (IZP)

vstup a výstupy jazyce C

8 Třídy, objekty, metody, předávání argumentů metod

Základy programování (IZP)

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Konstruktory a destruktory

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Jazyk C++, některá rozšíření oproti C

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Používejte jen ty konstrukty jazyka C/C++, které jsme doposud probírali (nepoužívejte STL apod.)

přetížení operátorů (o)

Programování v jazyce C pro chemiky (C2160) 6. Funkce, struktury

Martin Flusser. December 15, 2016

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Projektč.3dopředmětuIZP. Maticové operace

- jak udělat konstantu long int: L long velka = 78L;

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Objektové programování

NPRG030 Programování I, 2015/16 1 / :25:32

Vstup a výstup datové proudy v C

Iterační výpočty. Dokumentace k projektu č. 2 do IZP. 24. listopadu 2004

Odvozené a strukturované typy dat

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Základy C++ I. Jan Hnilica Počítačové modelování 18

Algoritmizace, základy programování, VY_32_INOVACE_PRG_ALGO_01

přetížení operátorů (o)

Více o konstruktorech a destruktorech

Úvod do programování. Lekce 1

Dynamická alokace paměti

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Jazyk C práce se soubory. Jan Hnilica Počítačové modelování 16

2. úkol MI-PAA. Jan Jůna (junajan)

17. Projekt Trojúhelníky

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

Programování ve Windows Dynamické knihovny. Andrea Číková Martin Osovský

1 Tabulky Příklad 3 Access 2010

Programy na PODMÍNĚNÝ příkaz IF a CASE

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

Ukazatele, dynamická alokace

Velmi stručný návod jak dostat data z Terminálu Bloomberg do R

II. Úlohy na vložené cykly a podprogramy

Standardní vstup a výstup

Algoritmizace a programování

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

Zápis programu v jazyce C#

Parametrické modelování těles. Autodesk INVENTOR. Ing. Richard Strnka, 2012

Výukový materiál pro projekt Perspektiva 2010 reg. č. CZ.1.07/1.3.05/ EXCEL příklad. Ing. Jaromír Bravanský, 2010, 6 stran

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

Přejmenování listu Dvakrát klepněte na pojmenování listu, napište nový název a potvrďte klávesu ENTER.

Operační systémy. Cvičení 4: Programování v C pod Unixem

Opakování programování

Práce s pamětí a předávání parametrů. Úvod do programování 1

WORD. 4. Texty vyskytují se v dokumentu 3x mají zelenou barvu

PB071 Programování v jazyce C Jaro 2013

Aktualizace firmwaru pro fotoaparáty mirrorless, objektivy NIKKOR Z a kompatibilní příslušenství

Algoritmizace a programování

Cvičení č. 2. Komunikace mezi procesy Program Hodiny. 4 body

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Algoritmizace a programování. Terminálový vstup a výstup

Funkce pokročilé možnosti. Úvod do programování 2 Tomáš Kühr

PROGRAMOVÁNÍ V JAZYCE C V PŘÍKLADECH 11 Dynamické datové struktury 11.1 Spojové struktury Příklad PROG_

- transpozice (odlišuje se od překlopení pro komplexní čísla) - překlopení matice pole podle hlavní diagonály, např.: A.' ans =

Transkript:

Struktury a dynamická paměť Petyovský, Macho, Richter (bpc2a_cv12), ver. 2017.2 Definujte strukturu TVector pro dynamické pole dat typu double. Definujete strukturu TMatrix, která bude obsahovat dynamické pole struktur TVector. Struktury TVector, budou nést pole dat, která si můžeme představit jako řádky matice, která však nemusí mít řádky stejně dlouhé. Jelikož je počet prvků struktury TMatrix dynamický, je možné měnit i počet řádků. Pomocí těchto struktur realizujte program, který načte řádky ze souboru a vytvoří jejich součet. Výsledný pohled: jedna struktura TMatrix obsahuje pole struktur TVector, které obsahují pole dat typu double. V každé struktuře je proměnná icount, která nese informaci o počtu prvků ve struktuře (viz interaktivní odkaz).

Pozn.: Při realizaci můžete samostatně postupovat podle následujících bodů, nebo si stáhnout projekt, kde jsou již některé počáteční body zadání vyřešeny. 0 Založte projekt a v něm vytvořte dva zdrojové soubory: (main.c, TVector.c) a hlavičkový soubor (TVector.h). V prvním zdrojovém souboru bude funkce main, ve druhém budou funkce pracující se strukturou. Pro kontrolu správnosti práce se soubory a pamětí použijte knihovnu check. 1 V hlavičkovém souboru proveďte deklaraci struktury TVector, která obsahuje proměnnou idata typu ukazatel na double. Tento ukazatel bude obsahovat počáteční adresu pole které může mít libovolnou délku (dynamicky alokované). Pro délku pole nadefinujte proměnnou size_t icount. 2 Do souboru s funkcí main vložte příkaz pro načtení hlavičkového souboru TVector.h a ve funkci main nadefinujte proměnnou vect typu TVector a inicializujte její vnitřní proměnné na nulové hodnoty. 3 Napište funkci VectorCreate(struct TVector *avector, size_t acount), která alokuje data pro acount hodnot typu double a nastaví vnitřní proměnné struktury na kterou ukazuje avector. Ve funkci main pomocí volání funkce VectorCreate(struct TVector *avector, size_t acount)

připravte proměnnou vect na uložení deseti hodnot. Hodnoty pole v proměnné vect nastavte p od nuly do devíti (nejprve přímo pomocí operátoru indexace pole a následně pomocí funkce VectorSetAt). 4 Napište funkci pro tisk hodnot struktury TVector. Funkce bude mít prototyp: enum TErrCode VectorStore(const struct TVector* const avector, FILE *aoutp) a vytiskne hodnoty dat struktury TVector ve formátu: pocet: Hodnota0 Hodnota1 HodnotaN Pro tisk počtu prvku vektoru využijte ("%zu:"), hodnoty tiskněte formátovaně na dvě desetinná místa pomocí: (" %.2lf"). Pro testování využijte na místě druhého parametru stream pro konzolu stdout. 5 Pomocí funkce VectorStore vytiskněte strukturu z bodu 3 na konzolu. 6 Napište funkci VectorDestroy(struct TVector *avector), která odalokuje data ve struktuře a nastaví proměnné tak, aby signalizovaly, že ve struktuře nejsou platná data: {.icount=0,.idata=null} Strukturu z předchozích bodů uvolněte pomocí funkce VectorDestroy(struct TVector *avector); 7 Ve funkci main otevřete textový soubor pro čtení (data.in).

V souboru pro čtení budou vstupní data ve formátu: počet řádků dat počet hodnot na řádku: hodnota hodnota hodnota počet hodnot na řádku: hodnota hodnota hodnota Např.: 4 3: 3.15 21 546 6: 33.5 5.15 21 54 6-3 4: 3.15 221 46-15 6: 33.5 5.15 21 54 6-3 8 Struktura TVector bude sloužit k uložení jednoho pole, tj. jednoho řádku ze souboru. Napište funkci VectorLoad(struct TVector *avector, FILE *ainput), která načte jeden řádek souboru do struktury TVector. Funkce bude mít jako parametr otevřený vstupní soubor FILE *ainput a ukazatel na proměnnou reprezentující vektor struct TVector *avector. Funkce načte první hodnotu na řádku, naalokuje pole pro data. V případě úspěšného přečtení dat ze souboru uloží funkce do struktury nový počet prvků i adresu počátku nově alokovaného pole (zajistěte korektní dealokaci předchozí alokované paměti). Návratové hodnoty: 0 v pořádku 1 špatně vstupní parametr (NULL) 2 nepodařilo se naalokovat 3 chyba v souboru (formát vstupních dat)

9 Nyní budeme pracovat v souborech (TMatrix.h, TMatrix.c). Napište strukturu TMatrix, která bude obsahovat ukazatel na pole struktur TVector a počet prvků pole. Struktura bude obsahovat proměnnou idata reprezentující ukazatel na pole struktur struct TVector a hodnotu icount udávající počet prvků pole (typ size_t). 10 Ve funkci main vytvořte proměnnou s názvem mat typu struct TMatrix. Vytvořenou proměnnou inicializujte na literálovou hodnotu: {.icount=0,.idata=null} 11 Napište funkci MatrixLoad(struct TMatrix *amatrix, FILE *ainput), která načte postupně řádky souboru do struktury TMatrix. Funkce načte první řádek souboru, kde je hodnota udávající počet řádků v souboru tj. i počet hodnot/řádků ve struktuře. V předané struktuře naalokuje datové prvky pro načítání řádků a nastaví proměnnou pro počet hodnot ve struktuře. Pomocí funkce VectorLoad postupně načte hodnoty/pole řádků. Návratové hodnoty: 0 v pořádku 1 špatně vstupní parametr (NULL) 2 nepodařilo se naalokovat 3 chyba v souboru (formát vstupních dat)

12 Napište funkci MatrixStore(const struct TMatrix* const amatrix, FILE *aoutp), která vytiskne do souboru data ze struktury TMatrix. Na první řádek vytiskne hodnotu počtu řádků a následně data pro jednotlivé řádky pomocí funkce VectorStore. Pro tisk se použije stejný formát jako je ve vstupním souboru. 13 Napište funkci MatrixSummarize(struct TMatrix* const amatrix), která přidá do struktury TMatrix jeden řádek na poslední pozici (o délce nejdelšího pole ze stávajících struktur) a do něj uloží součet polí z ostatních struktur/řádků. Pokud nejsou v poli hodnoty (je kratší), potom se tyto hodnoty nepřičítají (považují se za nulové). 14 Následně ji naplňte ze vstupního otevřeného souboru pomocí funkce MatrixLoad. Strukturu zobrazte pomocí MatrixStore na stdout. Pomocí volání funkce MatrixSummarize přidejte na poslední řádek struktury součet ostatních řádků. Výslednou strukturu z bodu 13 vytiskněte na stdout pomocí funkce MatrixStore. 15 Napište funkci MatrixDestroy, která korektně uvolní paměť struktury TMatrix. a proměnné struktury nastaví do nulových hodnot.

16 Korektně ukončete funkci main a vraťte hodnotu 0. V případě, že během vykonávání funkce main dojde k chybě, program korektně ukončete a vraťte hodnotu 1.