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

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

OSNOVA: a) Úvod a klasifikace b) Funkce main() s argumenty c) Souborový vstup a výstup d) Programování WAV Jiří Šebesta Ústav radioelektroniky, FEKT VUT.

Podobné prezentace


Prezentace na téma: "OSNOVA: a) Úvod a klasifikace b) Funkce main() s argumenty c) Souborový vstup a výstup d) Programování WAV Jiří Šebesta Ústav radioelektroniky, FEKT VUT."— Transkript prezentace:

1 OSNOVA: a) Úvod a klasifikace b) Funkce main() s argumenty c) Souborový vstup a výstup d) Programování WAV Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 2 pro obor EST BPC2E PŘEDNÁŠKA 1

2 Web předmětu, kontakty odkaz v eLearningu (kurz BPC2E 14/15L) vyučující –Doc. Ing. Jiří Šebesta, Ph.D., (garant předmětu, přednášky, –Ing. Tobiáš Malach, konzultační hodiny na Portálu VUT Úvod a klasifikace (1/6)

3 Přednášky Organizace výuky, preprocesor, funkce main s argumenty. Souborový vstup a výstup, textové a binární soubory, práce s WAV Zpracování obrázků ve formátu BMP, programování seriového portu Úvod do objektového programování, C++, třídy a metody, zapouzdření Objektové programování, přetížení členských funkcí, polymorfismus, dědičnost, specifikace přístupu Vývojové prostředí MS Visual Studio a OOP C++ projekty Grafika ve Windows. Úvod a klasifikace (2/6)

4 Úvod do Matlabu, reprezentace matic a vektorů, 2D grafy Příkazy a standardní funkce Matlabu, 3D grafy STÁTNÍ SVÁTEK (Velikonoční pondělí). Práce se soubory v Matlabu (samustudium) Vlastní funkce v Matlabu, model komunikačního systému Uživatelské rozhraní v Matlabu Rozbor zápočtového testu Zápočtový test. Úvod a klasifikace (3/6)

5 Funkce main s argumenty, souborový vstup a výstup, generování BMP souboru (3 b.) Jednoduchá definice objektu s atributy a datovými položkami a metodami (3 b.) Objektové programování, vlastní třída, specifikace přístupu, polymorfismus, dědičnost (3 b.) Test 1 (5 b). Jednoduchý C++ projekt v MS Visual Studio (3 b.) Projekt s grafikou ve Windows (3 b.). Počítačová cvičení Úvod a klasifikace (4/6)

6 Reprezentace matic a vektorů v Matlabu, zobrazení závislostí ve 2D grafech (3 b.) Funkce Matlabu, zobrazení závislostí ve 3D grafech (3 b.) Práce se soubory v Matlabu, zpracování binárního souboru, 3D parametrické grafy (3 b.) Test 2 (5 b.). Modelování signálů a systémů v Matlabu (3 b.) Uživatelské rozhraní v Matlabu (3 b.) STÁTNÍ SVÁTEK STÁTNÍ SVÁTEK Max. jedna neomluvená neúčast !!! Úvod a klasifikace (5/6)

7 Klasifikace a bodové hodnocení Předmět je ukončen klasifikovaným zápočtem. Udělení zápočtu je přitom dáno následujícími podmínkami: –získání nejméně 50 bodů –odevzdání a obhájení zápočtového projektu v jazyce ANSI C Maximální bodové hodnocení jednotlivých forem výuky (celkem max. 100 bodů): –max. 30 bodů za hodnocení počítačových cvičení během semestru (10 hodnocených cvičení po 3 bodech) –max. 10 bodů za průběžné testy během semestru (5 + 5 bodů) –max. 20 bodů za zápočtový test na konci semestru –max. 40 bodů za zápočtový projekt v Matlabu Bodování vašich aktivit mají na starosti vaši cvičící, započet vedoucí projektu. Úvod a klasifikace (6/6)

8 Funkce main() s argumenty (1/6) Definicí argumentů (parametrů) u funkce main() můžeme definovat chování programu při spuštění. Program s parametry se spouští z příkazové řádky názvem programu (projektu) následovaný parametry oddělené mezerou, např. Muj_program 10 input.txt output.txt -x Hlavička funkce main() s argumenty int main(int argc, char *argv[ ]) - proměnné argc a argv jsou lokální proměnné funkce main(), (mohou mít i libovolné jiné názvy, typ musí být zachován) - argc udává počet zadaných parametrů při spuštění programu - argv je pole řetězců s jednotlivými zadanými argumenty

9 Funkce main() s argumenty (2/6) Po spuštění programu je do proměnné argc uložena hodnota odpovídající počtu řetězců uvedených na příkazovém řádku v okamžiku spuštění programu. Tento počet zahrnuje i vlastní název programu. Proměnná argv je dvourozměrné pole typu char (jednorozměrné pole řetězců). Do tohoto pole řetězců jsou uloženy všechny řetězce uvedené na příkazovém řádku, do argv[0] je tedy uložen název programu. Počet řetězců v poli odpovídá hodnotě uložen v proměnné argc. Délka jednotlivých řádků pole argv odpovídá délce vložených řetězců. Pokud je potřeba jako vstup programu číselná hodnota, musí se v těle funkce main() provést konverze na požadovaný číselný formát.

10 Funkce main() s argumenty (3/6) Příklad programu, který vypíše počet argumentů a všechny řetězce argumentů int main(int argc, char *argv[]) { int n; printf("Number of arguments: %d\n\n", argc); printf("List of arguments:\n"); for(n = 0; n < argc; n++) printf("argv[%d] = %s\n", n, argv[n]); return 0; } Příklad: BPC2E_Ex90.c

11 Funkce main() s argumenty (4/6) Příklad programu, který vypíše všechny násobky vstupního argumentu do 1000 včetně int main(int argc, char *argv[]) { int n, m; n = atoi(argv[1]); m = n; while(n <= 1000) { printf("%3d\n", n); n += m; } return 0; } Příklad: BPC2E_Ex91.c

12 Funkce main() s argumenty (5/6) Příklad kódovacího programu pro textové soubory, který prohodí nižší a vyšší čtveřici bytu znaku – šifra je symetrická int main(int argc, char *argv[]) { char c, a; FILE *ptrfi;// spec. type pointer to input file FILE *ptrfo;// spec. type pointer to output file ptrfi = fopen(argv[1],"r"); // file for reading ptrfo = fopen(argv[2],"w"); // a new file for writing if(ptrfi!=NULL && ptrfo!=NULL) // if both files are open { c = fgetc(ptrfi);

13 Funkce main() s argumenty (6/6) while(c != EOF) { a = c; c = c & 0x0F; c = c << 4; c = c & 0xF0; a = a & 0xF0; a = a >> 4; a = a & 0x0F; c = a | c; fputc(c, ptrfo); c = fgetc(ptrfi); } fclose(ptrfi); fclose(ptrfo); } return 0; } Příklad: BPC2E_Ex92.c

14 Souborový vstup a výstup (1/13) ANSI-C používá tzv. bufferovaný přístup k souborům pomocí proudu (stream) nebo-li ukazatele na strukturu typu FILE (definice v knihovně stdio.h ) V ANSI-C není rozdíl mezi souborem a zařízením (portem) – přistupuje se stejně Binární vs. textový soubor Binární soubor - překladač neprovádí žádnou úpravu čtených a zapisovaných dat - uspořádání dat v souboru je nezávislé a specifické pro dané využití

15 Souborový vstup a výstup (2/13) Textový soubor - uspořádán po řádcích, každý zakončen znakem \n - v některých OS se před \n vkládá \r (úpravu zajišťují funkce ze standardní knihovny stdio.h. - lze zobrazit libovolným editorem - přenositelnost binárních souborů mezi různými systémy může být omezena rozdílnou délkou základních typů v těchto různých systémech – nutno vždy vhodně ošetřit

16 Souborový vstup a výstup (3/13) Otevření souboru: FILE *fopen(char *file_name, char *mode) - mode reprezentuje řetězec pro režim otevření souboru (viz BPC1E), pro binární soubory je doplněn do řetězce znak b, např.: " rb " = otevření binárního souboru pro čtení " wb " = otevření prázdného binárního souboru pro zápis "ab" = otevření binárního souboru pro zápis na konec stávajícího souboru

17 Souborový vstup a výstup (4/13) Rozšířené režimy: "r+" = otevření existujícího souboru pro čtení a zápis, pokud soubor neexistuje vrací se NULL "w+" = otevření nového prázdného souboru pro zápis i čtení, pokud soubor existuje, je původní obsah smazán "a+" = otevření existujícího souboru pro zápis na konec a čtení kdekoli

19 Souborový vstup a výstup (6/13) Uzavření souboru: int *fclose(FILE *fptr) - v případě správného uzavření se vrací 0 - v případě neúspěšného uzavření se vrací EOF - podle ANSI-C se při správném ukončení programu otevřené soubory automaticky uzavřou, v případě havárie programu však není jednoznačně definováno, co se s otevřeným souborem stane

20 Souborový vstup a výstup (7/13) Formátované vstupy/výstupy: int fprintf(FILE *fptr, const char *form, …) = zápis řetězce form do souboru fptr, pokud je obsahem řetězce hodnota číselné proměnné, zapisuje se jeho vyjádření řetězcem int fscanf(FILE *fptr, const char *form, …) = čtení řetězce ze souboru fptr a uložení do řetězce form

21 Souborový vstup a výstup (8/13) Neformátované vstupy/výstupy: int fputc(int c, FILE *fptr ) = zápis znaku c do souboru fptr int fgetc(FILE *fptr) = čtení znaku ze souboru fptr jako návratová hodnota Možno použít i makra (význam stejný, jen rychlejší, ale může být větší program): int putc(int c, FILE *fptr) int getc(FILE *fptr)

22 Souborový vstup a výstup (9/13) Příklad: Kopírování binárního souboru in.bin do out.bin po bytech int main() { FILE *frptr, *fwptr; int ch; frptr = fopen("in.bin", "rb"); fwptr = fopen("out.bin", "wb"); while((ch = fgetc(frptr)) != EOF) fputc(ch, fwptr); fclose(frptr); fclose(fwptr); return 0; } Příklad: BPC2E_Ex93.c

23 Souborový vstup a výstup (10/13) Čtení/zápis celého řádku najednou (jen pro textové soubory): char *fgets(char *str, int max, FILE *fptr) = přečte celý řádek v textovém souboru fptr a uloží jej jako řetězec do str a to do maximálního počtu znaku max, pokud je řádek v souboru delší než max, zbytek řádku může být přečten následujícím čtením, vrací ukazatel na řetězec str, v případě dočtení posledního řádku souboru vrací NULL, do řetězce jsou ukládány i znaky \n. int fputs(char *str, FILE *fptr) = zápis řádku z řetězce str do souboru fptr

24 Souborový vstup a výstup (11/13) Příklad: Kopírování textového souboru in.txt do out.txt po řádcích #define LEN_OF_ROW 10 int main() { FILE *frptr, *fwptr; char txt[LEN_OF_ROW]; frptr = fopen("in.txt", "r"); fwptr = fopen("out.txt", "w"); while(fgets(txt, LEN_OF_ROW, frptr) != NULL) fputs(txt, fwptr); fclose(frptr); fclose(fwptr); return 0; } Příklad: BPC2E_Ex94.c

25 Souborový vstup a výstup (12/13) Čtení/zápis celého bloku najednou (pro binární soubory): size_t fread(void *ptr, size_t size, size_t cnt, FILE *fptr) = přečte celý blok položek o velikosti size v souboru fptr o celkovém počtu cnt a uloží jej jako pole elementů do pole v paměti referencovaného ukazatelem ptr, vrací se počet skutečně načtených položek

26 Souborový vstup a výstup (13/13) size_t fwrite(const void *ptr, size_t size, size_t cnt, FILE *fptr) = uloží celý blok položek definovaných jako pole elementů v paměti referencovaného ukazatelem ptr o velikosti size do souboru fptr o celkovém počtu cnt, vrací se počet skutečně úspěšně uložených položek

27 Programování WAV (1/8) Soubor typu WAV – bezkompresní audio Struktura souboru WAV (podmnožina RIFF):

28 Programování WAV (2/8) Příklad: Vygenerujte soubor typu WAV, který bude obsahovat jeden tón dané frekvence, amplitudy, doby trvání a jména cílového WAV souboru (argumenty při spouštění programu) #define TPI int fwrite_int(int val, char len, FILE *p) { char byte; while (len-- > 0) { byte = val & 0xFF; fwrite(&byte, 1, 1, p); val >>= 8; } return 0; } Pomocná funkce pro zápis různě dlouhých dat hlavičky do WAV souboru jako little endian

29 Programování WAV (3/8) int main(int argc, char *argv[]) { double ph, deltaph, tdur, ampl, freq; int numsa, srate; unsigned char sig; FILE *ptrf; if(argc == 5) { srate = 8000; // fixed sample rate 8 kHz freq = atof(argv[1]); // tone freq - 1. argument in Hz ampl = atof(argv[2]); // tone amplitude - 2. argument tdur = atof(argv[3]); // tone duration - 3. argument in s

30 Programování WAV (4/8) numsa = tdur*srate; // overall number of samples ph = 0; // initial phase 0 rad deltaph = TPI * freq /srate; // delta phase ptrf = fopen(argv[4], "wb"); fwrite("RIFF", 4, 1, ptrf); // chunk_id RIFF fwrite_int(36 + numsa, 4, ptrf); // chunk_size fwrite("WAVE", 4, 1, ptrf); // spec. RIFF form for WAV fwrite("fmt ", 4, 1, ptrf); // subchunk1id – format fwrite_int(16, 4, ptrf); // subchunk1size 16 for PCM fwrite_int(1, 2, ptrf); // audio_format, 1 = PCM fwrite_int(1, 2, ptrf); // channels, 1 = mono

31 Programování WAV (5/8) fwrite_int(srate, 4, ptrf); // sample rate fwrite_int(srate * 1 * 8 /8, 4, ptrf); // byte rate fwrite_int(1 * 8/8, 2, ptrf); // block align fwrite_int(8, 2, ptrf); // bits per sample, 8 bits fwrite("data", 4, 1, ptrf); // subchunk2id - data fwrite_int(numsa * 1 * 8 / 8, 4, ptrf); // subchunk2 size

32 Programování WAV (6/8) while(numsa-- > 0) { sig = 128*(ampl*sin(ph)+1); fwrite(&sig, 1, 1, ptrf); ph += deltaph; } fclose(ptrf); } else printf("Wrong number of arguments!!!!\n"); return 0; } Příklad: BPC2E_Ex95.c

33 Programování WAV (7/8) Příklad – domácí úloha: Vygenerujte soubor typu WAV, který bude měnit tón od zadané frekvence do zadané frekvence, s danou amplitudou, dobou trvání a jménem cílového WAV souboru (argumenty při spouštění programu). Příklad: BPC2E_Ex96.c – bude zveřejněn 16.2.

34 Programování WAV (8/8) 1209 Hz1336 Hz1477 Hz1633 Hz 697 Hz123A 770 Hz456B 852 Hz789C 941 Hz*0#D Příklad – domácí úloha: Sestavte program, který vygeneruje soubor typu WAV, který bude obsahovat DTMF signální volbu podle zadaného kódu. Kód a cílový soubor jsou argumenty při spouštění programu. V programu proveďte rovněž korekci možných znaků DTMF kód, nepovolené znaky vylučte. Jeden dvojtón trvá 50 ms následuje mezera 50 ms. Příklad: BPC2E_Ex97.c – bude zveřejněn 16.2.

35 Téma následující přednášky – Programování BMP – Práce se sériovým portem DĚKUJI ZA POZORNOST


Stáhnout ppt "OSNOVA: a) Úvod a klasifikace b) Funkce main() s argumenty c) Souborový vstup a výstup d) Programování WAV Jiří Šebesta Ústav radioelektroniky, FEKT VUT."

Podobné prezentace


Reklamy Google