Práce s dvourozměrnýmm polem. Formátovaný vstup dat



Procvičení načítání formátovaných dat, volání funkcí, předávání parametrů, 2D pole.



Zadání:

Napište program, který zobrazí data načtená ze souboru na disku. Jméno souboru s daty je předáno jako parametr příkazové řádky programu. Data se nacházejí v textovém souboru ascii1.out nebo ascii2.out. Na každém řádku souboru jsou data pro jeden znak, skládající se z pozice/polohy znaku a ASCII hodnoty zobrazovaného znaku. Jejich formát je následující:

(int_x_souřadnice_sloupce,int_y_souřadnice_řádku)=uchar_hexa_hodnota

Tyto data udávají souřadnice ve čtvercové síti (bod 0,0 je vlevo nahoře) a hodnotu, která na daných souřadnicích leží. Hodnoty na pozicích reprezentují ASCII hodnoty znaků. Na pozicích, které nejsou v souboru uvedeny je znak mezera. Předpokládá se zobrazení v rastru 80 sloupců a 60 řádků. Šířka 80 vychází z počtu znaků na jednom řádku konzolového výstupu. Jelikož se z pole bude většinou tisknout po řádcích, je vhodné, aby prvky, které jsou v řádcích byly v paměti vedle sebe. To platí pro poslední index pole. Proto pole bude mít rozměry: Pole[60][80].

Příklad:
(0,10)=0x41
V prvním (0-tém) sloupci a jedenáctém (10-tém) řádku je umístěn znak s hexadecimální hodnotou 41 tj. znak 'A'

Projekt vypracujte v jediném zdrojovém souboru mainascii.c.
Pokud by pro vás bylo vytváření algoritmů ve funkcích náročné, můžete zkusit psaní rozdělit na několik kroků. Např. nejprve kód z funkcí realizovat v main a následně přejmenovat proměnné a přesunout kód do funkcí.



0. krok: Založte si nový projekt.


1. krok: Parametrem programu (funkce main) je název souboru s daty. Proveďte kontrolu přítomnosti názvu souboru v parametrech funkce main, soubor otevřete (zkontrolujte zda k otevření došlo) a zavřete. Při následném rozšiřování programu o další funkce, by k uvolnění zdrojů (zavření souboru, odalokování paměti ...) mělo dojít co nejdříve.


2. krok: Ve funkci:
a) NactiData(FILE* fr, unsigned radku, unsigned sloupcu,unsigned char data[60][80]) pro překlad volbou VS,
b) NactiData(FILE* fr, unsigned radku,unsigned sloupcu, unsigned char data[radku][sloupcu]) pro překlad volbou Clang. Zde se používá možnosti lokálního pole s proměnnou délkou, která je nepovinnou součástí normy a proto nemusí být v překladači implementována (což se u VS děje). Implementaci signalizuje proměnná __STDC_NO_VLA__, která nastavená na 1 znamená, že pole s proměnnou délkou nejsou implementovány.

načtěte ze souboru data do dvourozměrného pole typu char, které bude nadefinováno ve funkci main a bude parametrem funkce. Předpokládejte, že maximální rozměr pole může být 60x80 znaku (řádky x sloupce). (Funkce bude mít jako parametry (otevřený) soubor, rozměry pole, vlastní pole). Použijte formátované načítání fscanf. Výsledné pole je obdélníkové s větším rozměrem sloupců než řádků. Funkce vrátí nulu v případě, že se dosáhlo bez chyby konce souboru, jinak vrátí hodnotu 1.


3. krok: Napište funkci, která načtená data vytiskne na obrazovku jako ASCII znaky, tak aby vznikl grafický obrazec daných rozměrů. Pole bude předáno jako parametr funkce, společně se svými rozměry. Zjistěte si, kolik znaků je možné vytisknout na řádek (pokud vytisknete znak na poslední místo v řádku monitoru, může dojít k automatickému pokračování na dalším řádku (nebo je tedy nutno tisknout o znak méně a přechod na nový řádek zajistit pomocí vyslaného kódu nový řádek).



4. krok: Dvourozměrné pole char Pole[60][80] nadefinované ve funkci main je uloženo na zásobníku a zabírá lineární paměťový prostor (i když se jedná o pole dvourozměrné, zabírá v paměti za sebou jdoucí byty tak, že data dalšího řádku následují ihned za předchozím).
Napište funkci, která bude provádět stejnou činnost jako funkce v kroku 3, ale funkce bude mít jako parametry rozměry pole a pole bude předáno pouze jako ukazatel na první prvek pole (tj. TYP *pole). K prvkům v dvourozměrném poli se tedy bude přistupovat pomocí jednoho indexu – pozice ve dvourozměrném poli se přepočítá na pozici v jednorozměrném poli, ve kterém budou řádky za sebou.



5. krok: založte a přidejte do projektu soubory asciitab.h a asciitab.c. Hlavičkový soubor ošetřete proti vícenásobnému načtení (dvojicí #ifndef X a #define X). Do hlavičkového souboru umístěte prototypy/deklarace vytvořených funkcí (bez main) – ve zdrojovém souboru by již neměly být. Do zdrojových souborů se deklarace dostanou tím, že do nich vložíme hlavičkový soubor – vložte tedy hlavičkový soubor do obou zdrojových souborů.
Přesuňte definice funkcí (hlavičky včetně těl) do souboru asciitab.c.





ASCII art ukázka









Poslední úpravy 2019-02-05