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



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

KRY. Projekt č. 2. Kamil Dudka xdudka00

Zdroj:

ALGORITMIZACE A PROGRAMOVÁNÍ

3. úloha - problém batohu metodami branch & bound, dynamické programování, heuristika s testem

Princip funkce počítače

Programování v jazyce C a C++

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

Úvod do programování - Java. Cvičení č.4

Testování prvočíselnosti

1 Nejkratší cesta grafem

Data v počítači. Informační data. Logické hodnoty. Znakové hodnoty

Časová a prostorová složitost algoritmů

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

Šifrování/Dešifrování s použitím hesla

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

Pole a kolekce. v C#, Javě a C++

Dokumentace k projektu pro předměty IZP a IUS

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

Struktura programu v době běhu

Základy programování (IZP)

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

Binární soubory (datové, typované)

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

Stručný návod k programu Octave

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

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

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

Sada 1 - Základy programování

Struktury a dynamická paměť

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Prohledávání do šířky = algoritmus vlny

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

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

PDF Split and Merge. Průvodce programem pro práci s PDF

Transformace digitalizovaného obrazu

Iterační výpočty Projekt č. 2

Trénování sítě pomocí učení s učitelem

Dynamické datové struktury III.

Dynamické programování

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Profilová část maturitní zkoušky 2017/2018

Architektury počítačů a procesorů

Popis programu EnicomD

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

Pohled do nitra mikroprocesoru Josef Horálek

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

Téma 12: Správa diskových jednotek a system souborů. Téma 12: Správa diskových jednotek a systémů souborů

Úvod do programování 10. hodina

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

Algoritmizace řazení Bubble Sort

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

A U T O R : I N G. J A N N O Ž I Č K A S O Š A S O U Č E S K Á L Í P A V Y _ 3 2 _ I N O V A C E _ _ C N C P R O G R A M O V Á N Í _ P W P

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

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

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

ČÁST 1. Základy 32bitového programování ve Windows

Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

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

Lineární algebra Operace s vektory a maticemi

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

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

PODPROGRAMY PROCEDURY A FUNKCE

X37SGS Signály a systémy

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

PŘETĚŽOVÁNÍ OPERÁTORŮ

Algoritmizace a programování

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

TÉMATICKÝ OKRUH Softwarové inženýrství

Strojový kód. Instrukce počítače

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

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

Příklad 1/23. Pro rostoucí spojité fukce f(x), g(x) platí f(x) Ω(g(x)). Z toho plyne, že: a) f(x) Ο(g(x)) b) f(x) Θ(g(x)) d) g(x) Ω(f(x))

Základy programování (IZP)

Iterační výpočty. Dokumentace k projektu pro předměty IZP a IUS. projekt č listopadu 2008

Základní způsoby: -Statické (přidělění paměti v čase překladu) -Dynamické (přiděleno v run time) v zásobníku na haldě

Da D to t v o é v ty t py IB111: Datové typy

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

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Paměť počítače. alg2 1

Programování v jazyce C a C++

IV. Základní pojmy matematické analýzy IV.1. Rozšíření množiny reálných čísel

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

Úvod do programování. Lekce 1

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Poslední nenulová číslice faktoriálu

Pointery II. Jan Hnilica Počítačové modelování 17

Lineární datové struktury

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

cyklus s daným počtem opakování cyklus s podmínkou na začátku (cyklus bez udání počtu opakování)

PROGRAMOVÁNÍ V C++ CVIČENÍ. Michal Brabec

Program pro tvorbu technických výpočtů. VIKLAN - Výpočty. Uživatelská příručka. pro seznámení se základními možnostmi programu. Ing.

Zadání druhého zápočtového projektu Základy algoritmizace, 2005

VISUAL BASIC. Přehled témat

Algoritmy I, složitost

Transkript:

Projektč.3dopředmětuIZP Maticové operace 17. prosince 2006 Kamil Dudka, xdudka00@stud.fit.vutbr.cz Fakulta informačních technologií Vysoké Učení Technické v Brně

Obsah 1 Úvod 1 2 Analýza problému 1 2.1 Zadáníproblému....... 1 2.2 Vstupníavýstupnídata... 1 2.3 Nárokynapaměť....... 2 2.4 Datovéstruktury....... 2 3 Návrh řešení problému 3 3.1 Sčítánímatic......... 3 3.2 Násobenímatic........ 3 3.3 Testmonotónosti....... 3 3.4 Spirála... 4 3.5 Terč... 4 3.6 Žížala............. 4 4 Specifikace testů 5 4.1 Sčítánímatic......... 5 4.2 Násobenímatic........ 6 4.3 Testmonotónosti....... 6 4.4 Spirála... 6 4.5 Terč... 6 4.6 Žížala............. 7 5 Popis řešení 7 5.1 Ovládáníprogramu...... 7 5.2 Vlastníimplementace..... 8 6 Závěr 8 A Metriky kódu 9

1 Úvod Tato dokumentace popisuje návrh a implementaci programu, který provádí různé operace s maticemi. V kapitole 2 se nachází stručná charakteristika rešeného problému, jeho analýza a z ní vyplývající možná řešení. Zvolené řešení je představeno v kapitole 3. Výsledky provedených testů jsou zachyceny v kapitole 4. Implementace(kapitola 5) přímo vyplývá z provedené analýzy a návrhu řešení. Celkové řešení programu je zhodnoceno v závěru(kapitola 6). Dokumentace je vysázena systémeml A TEX. 2 Analýza problému 2.1 Zadání problému Bylo požadováno vytvoření programu v jazyce C, který bude provádět s maticemi následující operace: Sčítání matic Součin matic Test monotónosti Spirála vypsáníprvkůmaticepospirále Terč spočítáníaritmetickéhoprůměruprvkůna kružnicíchterče Žížala cyklicképosunutíprvkůmaticedanýmzpůsobem Program musí být schopen načíst zdrojové matice ze souboru v zadaném formátu(pracuje se s maticemi obecných rozměrů). Výstupní data mají být směrovány na stdout. 2.2 Vstupní a výstupní data Ze zadání vyplývá, že program musí být schopen provádět různé operace. Tyto operace je vhodné si rozdělit z hlediska vstupních dat na dvě skupiny: Binární operace s maticemi sčítání a násobení matic Operace s jednou maticí test monotónosti, spirála, terč, žížala 1

Vzhledemktomu,žeprobinárníoperacesmaticemijepotřebanačístzesouboru postupně dvě matice, je užitečné vytvořit si obecný algoritmus pro načítání matice ze souboru do paměti. Podobně je potřeba vytvořit obecný algoritmus pro tisk matice na stdout. Dále je vhodné vytvořit si podprogramy pro tisk chybových hlášek a výpis nápovědy. Vzhledem k požadované efektivitě se budou vlastní operace s maticemi provádět pouze v paměti. 2.3 Nároky na paměť Pracuje se s maticemi obecných rozměrů, zadané matice mohou být obrovské. Je tedy důležité zvolit algoritmy, které potřebují pro svou činnost minimum paměti. Dynamická alokace paměti pro matice je samozřejmostí. Ideální je případ, kdy podprogram alokuje paměť pouze pro vstupní matice. V tomto paměťovém prostoru se pak provádí veškeré elementární operace s prvky matice. Na konci podprogramu zůstane v tomto prostoru pouze výsledek operace. Tento algoritmus se dá bohužel jednoduše použít jen pro operace, jejichž výsledkem je matice stejných rozměrů jako matice zdrojová. 2.4 Datové struktury Z předchozí kapitoly vyplývá, že je potřeba vytvořit obraz matice v paměti. Ukládání matice do paměti v podobě textového řetězce by bylo značně neefektivní. Jako datový typ pro uložení prvků matice bylo zvoleno jednorozměrné pole typu int. Druhou variantou je dvojrozměrné pole typu int, které se při zápise programu v jazyce C přehledněji indexuje, ale má jisté nevýhody: Náročnějsí algoritmy pro operace se sekvenčním přístupem (načítání prvků matice ze souboru, výpis prvků matice a sčítání,...) Náročnějsí algoritmy alokace a uvolňování paměti Problémysfragmentacíalokovanépaměti 1 Bylo tedy zvoleno pole jendorozměrné, které se indexuje pomocí ukazatelové aritmetiky. Pro binární operace(viz. 2.2) je potřeba uložit do paměti více matic najednoou. Je tedy vhodné vytvořit datový typ, který bude matici 1 Tytoproblémyseprojevízejména,pokudjepaměťalokovánanastránkovacímsouboru na pevném disku. 2

charakterizovat. Každá matice je v tomto případě určena rozměrem a adresouvpaměti.tytopoložkyjsemvložildostruktury.aprokaždoumatici jsem vytvořil jednu instanci této struktury. 3 Návrh řešení problému V této kapitole je vysvětleno řešení daných operací na úrovni algoritmu. Matematické definice a jejich vysvětlení se vymyká rozsahu a zaměření této dokumentace. 3.1 Sčítání matic Pro sčítání matic je potřeba načíst ze souboru dvě matice. Tyto matice musí mít stejný rozměr, jinak není operace sčítání definována. Algoritmus bude procházet prvky matice 1 a ke každému prvku bude postupně přičítat odpovídající prvek z matice 2. Po skončení podprogramu bude tedy výsledek operace v paměťovém prostoru matice 1, čímž jsou eliminovány nároky na paměť. 3.2 Násobení matic Pro násobení matic je nutno opět načíst dvě matice. Aby byla operace násobení matic definována, musí mít první matice stejný počet sloupců jako druhářádků.výslednámaticebudemítstejnýpočetřádkůjakomatice1a stejný počet sloupců jako matice 2. To znamená, že výsledná matice bude mít stejné rozměry pouze v případě čtvercových matic. Je tedy nutné alokovat prostor pro výslednou matici. Podprogram nejprve(na základě rozměrů zdrojových matic) alokuje paměť pro výslednou matici. Potom prochází prvky výsledné matice a ukládá do nich odpovídající čísla. Každý prvek výsledné matice je vypočítán jako skalární součin řádkového vektoru matice 1 a sloupcového vektoru matice 2. 3.3 Test monotónosti Test monotónosti naopak vyžaduje načtení pouze jedné matice a je definován pro jakoukoliv matici. Podprogram nealokuje žádnou paměť pro matice ani vstupní matici nijak nemění. Prochází nejprve její řádky a potom sloupce. Porovnává vždy dva sousední prvky, přičemž si nastavuje příznak, je-li posloupnost neklesajíci, nerostoucí, popř. obojí. 3

Jakmile program narazí na první neshodu, vyhodnotí matici jako nemonotóní a další prvky matice už neprochází, čímž je eliminována časová složitost algoritmu. Naopak, projde-li cyklus až na konec a přitom na neshodu nenarazí, prohlásí matici za monotónní. Časová složitost algoritmu je tedy nejvyšší pro matice, které jsou monotónní. 3.4 Spirála Požadovaný výsledek operace spirála je zřejmý ze zadání úlohy. Algoritmus je založen na principu obecného průchodu maticí. K aktuální pozici(dané řádkem a sloupcem aktuálního prvku) je přičítán vektor udávající směr pohybumaticí.vtomtopřípaděsejednáovektorjednotkovýajehosměrse periodicky mění. V prvním závitu spirály je změna směru podmíněna dosažením okraje matice.sdalšímizávitysetentookrajpostupně ořezává oprvky,které již byly vypsány. Tím se poloměr otáčení stále zmenšuje a aktuální pozice se přibližuje ke středu spirály. Jakmile jsou vypsány všechny prvky matice, cyklussepřeruší. 2 3.5 Terč Algoritmus terče je podobný jako u spirály. Opět využívá principu obecného průchodu maticí.rozdíljevtom,žejakoprvnísenačteprvek vlevémhornímrohumatice.podosažení okraje sesměrperiodickymění. Jakmilejsounačtenyvšechnyprvky kružnice danéhopoloměru,spočításe jejichprůměravypíšesenastdout. Přitomtoprůchodujeprvníprveknačtendvakrátajetedynutnéjej z množiny načtených prvků vyřadit. Načtené prvky se ve skutečnosti nikam neukládají, ale zaznamenává se pouze jejich suma a počet. Pro matici lichého rozměruskončícyklusdříve,nežsevypíšeprůměrnaposledynačtených prvků. Tento průměr je tedy potřeba vypsat dodatečně po skončení cyklu. 3.6 Žížala Operace žížala je mírně komplikovanější než předcházející operace. Počet posunutí a jejich směr závisí na hodnotě prvního prvku zdrojové matice. To znamená, že tyto hodnoty nejsou známy v době překladu, což zvyšuje nároky 2 Samotnápodmínkajesamozřejměsložitější tojedánotím,žeprogramsinikam neukládá, které prvky už vypsal a které ne, resp. ani nepočítá vypsané prvky. 4

na obecnost algoritmu. Tetno komplexní problém jsem si rozdělil na dva podproblémy, resp. podprogramy. První podprogram zajišťuje výpočet potřebného počtu posunutí a jeho směr. Dále obsahuje jeden cyklus typu FOR, který opakovaně volá druhý podprogram, tolikrát, kolikrát je potřeba elementární posunutí provést. Při posunutí se musí projít všechny prvky matice, což je časově náročná operace. Jetedyzřejmé,žepočettěchtoposunůmusíbýtomezennaminimum.Toho sedosáhnetím,žeseodpočtuposunutíodečtecelýpočetnásobkůpočtu prvkůmatice. 3 Posunutí ve tvaru žížaly o jeden prvek daným směrem provádí druhý podprogram. Je využit podobný algoritmus jako pro spirálu nebo terč. Při průchodu se vždy vymnění obsah aktuálního prvku s obsahem pomocné proměnné tmp. Tělo cyklu, provádějícího posunutí, je stejné pro oba směry. Liší se pouze inicializace tohoto cyklu. Pro směr vpřed se prvky prochází shora dolů. Pro směr vzad se prvky prochází zdola nahoru. 4 Specifikace testů Vzhledem k rozsahu této dokumentace jsou uvedeny pro každou operaci pouze jedny testovací data. Ve skutečnosti bylo testů provedeno mnohem více. Rozpoznání parametrů, předaných z příkazové řádky, bylo v tomto programu triviální. Testy rozpoznávání parametrů proto rovněž nejsou zahrnuty do dokumentace. 4.1 Sčítání matic 1 2 3 4 5 5 1 2 3 4 4 5 1 2 3 3 4 5 1 2 + 5 4 3 2 1 0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 = 3 Ikdyžzníprincipoptimalizacesložitě,jednáseotriviálníoperaci. 6 6 6 6 6 5 1 2 3 4 5 6 2 3 4 1 2 3 1 0 5

4.2 Násobení matic 1 2 3 4 4 3 2 1 1 1 1 1 2 1 0 1 1 0 1 2 1 0 1 1 1 1 0 1 0 0 0 1 = 1 5 1 1 5 6 0 2 1 1 1 4 1 1 3 4.3 Test monotónosti Uvedu příklady dvou matic jedna je monotóní(a) a druhá nemonotóní(b): A= 4.4 Spirála 10 9 8 7 11 16 15 6 12 13 14 5 1 2 3 4 5 4 3 2 1 6 5 4 3 2 7 6 5 4 3 7 7 6 5 4 4.5 Terč 1 18 17 16 15 2 1 2 3 14 3 10 1 4 13 4 9 2 5 12 5 8 7 6 11 6 7 8 9 10, B= 0 1 3 4 5 0 1 3 2 3 2 2 2 2 2 3 2 2 1 0 12345678910111213141516 9.50000 5.50000 1.50000 6

4.6 Žížala 2 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 5 Popis řešení 5.1 Ovládání programu 12 11 2 0 5 6 2 1 4 3 7 8 13 14 10 9 Program je řešen jako konzolová aplikace, má tedy pouze textové ovládání. Je volán s jedním parametrem, který specifikuje prováděnou operaci. Za tímto parametrem následují názvy souborů matic. Kolik názvů je nutné zadat, záleží na konkrétní operaci(viz. 2.2). Varianty prvního parametru jsou uvedeny vtabulce1. Parametr Provedená operace -h Vypíše nápovědu -add Sečte matice -mult Vynásobí matice(v pořadí, jak jsou zadány) -mono Provede test monotónosti -spiral Vypíše prvky matice ve tvaru spirály -dartboard Spočítáaritmetickýprůměrprvkůna kružnicích terče -worm Provede žížalí transformacimatice Tabulka 1: Varianty prvního parametru Názvy souborů matic musí být platné názvy souborů podle pravidel operačního systému, ve kterém je program spuštěn. Matice budou uloženy v textových souborech v přesně zadaném formátu. Na prvním řádku je vždy dvojice čísel, udávající rozměr matice(v pořadí řádky, sloupce). Následují vlastní prvky matice, které jsou od sebe odděleny bílými znaky. Program nijak nerozlišuje,jakjsoučíslarozdělenanařádcíchsouboru. 4 Rozměry matice jsou načítány jako unsigned int. Rozsah hodnot tohoto typu záleží na platformě. Aby se však matice úspěšně načetla, musí být k dispozici dostatek paměti pro všechny její prvky. Vlastní prvky matice jsou 4 Proručnívytvářenísouborujesamozřejměvhodnézapisovatřádkymaticenasamostatné řádky souboru. Zápis je potom mnohem názornější. 7

typuint,hodnotyprvkůmohoubýttedyizáporné.zaplatnýjepovažován soubor, který obsahuje nejméně tolik prvků, kolik udává rozměr matice. Pokud se vyskytne chyba při rozpoznávání parametrů, nebo během načítání matice, je vypsána chybová hláška na stderr. Během výpočtu nejsou vypisovány žádné informace, ani chybové hlášky. Pokud operace není pro zadanématicedefinovánavytisknese#nastdout. 5 Pokud je výsledkem operace matice, je vypsána na stdout ve stejném tvaru, jako je požadován pro vstupní matice. Při testu monotónosti se vytiskne 1, pokud je matice monotónní nebo#, pokud matice není monotónní. Výsledkem operací spirála a terč je posloupnost čísel, která je rovněž vypsána na stdout. 5.2 Vlastní implementace Aby byl hlavní program přehlednější, uložil jsem funkce pro výpis nápovědy a chybových hlášek do samostatného souboru proj3.h. Rozpoznání prvního parametru, kontrola počtu parametrů a obsluha chybových stavů jsou implementovány ve funkci main, ze které jsou přímo nebo nepřímo volány všechny ostatní funkce. Na konci funkce main(po zveřejnění výsledku operace) se provededealokacedynamickyalokovanépamětipromatice. 6 Funkce ctimatici zajišťuje načtení matice ze souboru do paměti, přičemž si sama alokuje potřebný prostor. Funkce tisknimatici tiskne matici uloženou v paměti na stdout v požadovaném tvaru. Ostatní funkce zajišťují požadované operace s maticemi. Vzhledem k tomu, že během výpočtu nemají být vypisovány žádné hlášky, není při výpočtech nijak kontrolováno přetečení datového typu int. 6 Závěr Program byl otestován se všemi navrženými testovacími hodnotami všechny testy proběhly bez problémů. Požadavky na formát vstupních a výstupních dat byly přesně dodrženy, takže může být program bezproblémově používán spolu s dalšími programy ve skriptech nebo jiných programech. Hlavním cílem tohoto programu bylo, naučit se pracovat s maticemi v jazyce C. Přesto nejsou implementované oprarace s maticemi zcela samoúčelné naleznou upaltnění např. v kartografii nebo počítačové grafice. 5 Křížeksetakévytiskne,pokudsepřinásobenímaticnepodaříalokovatpaměťprovýslednou matici. 6 Pokuddojdekchyběběhemnačítánívstupníchdat,taksedealokaceprovedeokamžitě a program se ukončí. 8

A Metriky kódu Počet souborů: 2 soubory Počet řádků zdrdojového textu: 686 + 60 řádků Velikost statických dat: 6603 bytů Velikost spustitelného souboru: 13780 bytů(linux; bez ladících informací) 9