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

Podobné dokumenty
Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

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

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

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

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

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

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

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

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

Standardní vstup a výstup

C2110 Operační systém UNIX a základy programování

printf - formatovany vystup

vstup a výstupv jazyce C

E+034 = ; = e E+034

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.

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

Programování v jazyce C pro chemiky (C2160) 8. Načítání a zápis PDB souboru

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

vstup a výstupy jazyce C

Základy programování (IZP)

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

Formátové specifikace formátovací řetězce

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

Základy jazyka C. Základy programování 1 Tomáš Kühr

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Programování v jazyce C pro chemiky (C2160) 7. Ukazatele, Funkce pro práci s řetězci

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

VISUAL BASIC. Práce se soubory

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

Vstup a výstup datové proudy v C

C2110 Operační systém UNIX a základy programování

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

Algoritmizace a programování

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

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

Základy programování (IZP)

Základy programování (IZP)

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

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

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

11b Další příklady operací vstupu a výstupu (úvod viz 10)

Školní kolo soutěže Baltík 2009, kategorie C

ŘÍDÍCÍ STRUKTURY - PODMÍNKY

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

Základy programování (IZP)

Úvod do programování. Lekce 1

8. Načítání a zápis PDB souboru

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

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

Algoritmizace a programování

Struktury a dynamická paměť

X36UNX 16. Numerické výpočty v sh příkazy expr, bc, dc. Zdeněk Sojka

DUM 06 téma: Tvorba makra pomocí VBA

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

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Základní příkazy OS UNIX

Stručný návod k programu Octave

Programování v jazyce JavaScript

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

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

Programování v jazyce C pro chemiky (C2160) 9. Práce s PDB soubory

Znak Slovy Popis Zdroj Výsledek Formátova cí řetězec v CZ verzi Excelu

2. cvičení z ZI1 - Excel

PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory

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

Cvičení č. 3. Sdílené prostředky a synchronizace Program Banka. 4 body

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

5 Přehled operátorů, příkazy, přetypování

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

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

pi Ludolfovo číslo π = 3,14159 e Eulerovo číslo e = 2,71828 (lze spočítat jako exp(1)), např. je v Octave, v MATLABu tato konstanta e není

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

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

Proměnná a její uložení v paměti

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

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

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. November 16, 2017

3 Makra Příklad 4 Access Ve vytvořené databázi potřebuje sekretářka společnosti Naše zahrada zautomatizovat některé úkony pomocí maker.

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

17. Projekt Trojúhelníky

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

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

Systém je citlivý na velikost písmen CASE SENSITIVE rozeznává malá velká písmena, např. PROM=1; PROm=1; PRom=1; Prom=1; prom=1; - 5 různých proměnných

Registrační číslo projektu: CZ.1.07/1.5.00/ Elektronická podpora zkvalitnění výuky CZ.1.07 Vzděláním pro konkurenceschopnost

Implementace LL(1) překladů

Datové typy pro reálná čísla

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: Ukončí program. Nula znamená, že vše proběhlo bez chyby.

Základní vzorce a funkce v tabulkovém procesoru

PROGRAMOVÁNÍ V SHELLU

Zadání: TÉMA: Zápis algoritmu, čtení textového souboru, porovnání řetězců.

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

Konstruktory a destruktory

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

Druhy souborů. textové. binární. nestrukturované txt strukturované - ini, xml, csv. veřejné bmp, jpg, wav proprietární docx, cdr, psd

Základy programování (IZP)

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

Konvertor diakritiky 3. Instalace

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

Microsoft Excel kopírování vzorců, adresování, podmíněný formát. Mgr. Jan Veverka Střední odborná škola sociální Evangelická akademie

Transkript:

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

Textové řetězce V jazyce C neexistuje typ proměnné, který by byl určen výhradně pro ukládání textu V jazyce C používáme pro práci s texty pole znaků, tj. pole typu char, v praxi mluvíme o tzv. řetězcích (jsou to řetězce znaků) Posledním znakem řetězce je vždy zakončovací znak '\0' který indikuje konec řetězce Při definici pole musíme jeho velikost zvolit tak, aby zbylo místo na zakončovací znak '\0' Příklad: char str[5] = {'A', 'H', 'O', 'J', '\0'}; Počet platných znaků řetězce může být menší než je velikost pole; za platné znaky jsou považovány pouze ty, které předchází zakončovacímu znaku '\0' Příklad: char str[10] = {'A', 'H', 'O', 'J', '\0'}; velikost pole je 10 prvků A H O J \0 0 1 2 3 4 5 6 7 8 9 platné znaky zakončovací znak neplatné znaky 2

Inicializace řetězce Při definici můžeme řetězec inicializovat jednoduše uvedením textu v uvozovkách Velikost pole v tomto případě nemusíme uvádět (ale můžeme), překladač automaticky nastaví velikost pole a naplní pole specifikovaným textem včetně zakončovacího '\0' Pokud nechceme řetězec inicializovat žádným textem, inicializujeme ho jako vždy alespoň jako prázdný řetězec (tj. uvedeme prázdné uvozovky) char str[] = "AHOJ"; // Pri inicializaci tohoto retezce // prekladac automaticky alokuje pole // potrebne velikosti a na jeho // konec vlozi znak '\0' char text[10] = ""; // Inicializace prazdnym retezcem Tento postup lze použít pouze při definici řetězce, nelze ho použít pro kopírování znaků do jiného řetězce. Pro zkopírování obsahu jednoho řetězce do jiného musíme kopírovat postupně jednotlivé znaky z jednoho řetězce do druhého char str[] = "AHOJ"; // Nasledujici vec nebude fungovat!!! str = "NAZDAR"; 3

Výpis textového řetězce pomocí printf() Pro výpis řetězce ve funkci printf() používáme formátovací prvek %s Funkce printf() vypisuje všechny znaky dokud nenarazí na zakončovací znak '\0' char str[] = "AHOJ"; printf("text retezce je: %s\n", str); 4

Zkrácení řetězce Obsah řetězce můžeme kdykoliv změnit, tj. zapsat do něj jiný řetězec, počet nově zapsaných znaků však nesmí překročit velikost pole (včetně znaku '\0') Počet platných znaků řetězce může být menší než je velikost pole; funkce které s řetězci pracují (např. printf()) poznají počet platných znaků podle umístění zakončovacího znaku '\0' Změnou polohy znaku '\0' lze řetězec zkrátit A H O J \0 0 1 2 3 4 5 6 7 8 9 char s[20] = "AHOJ"; printf("text retezce je: %s\n", s); // Vypise se AHOJ // Retezec zkratime tak ze znak '\0' umistime o pozici drive s[3] = '\0'; printf("text retezce je: %s\n", s); // Vypise se AHO s[2] = '\0'; printf("text retezce je: %s\n", s); // Vypise se AH 5

Výpis řetězce od jiného než prvního znaku Chceme-li ve funkcích (např. printf()) pracovat s řetězcem tak aby se začínalo jiným než prvním znakem, přičteme ke jménu předávané řetězcové proměnné číslo odpovídající počtu znaků o které se má začátek posunout char s[20] = "AHOJ"; printf("text retezce je: %s\n", s); printf("text retezce je: %s\n", s+1); printf("text retezce je: %s\n", s+2); printf("text retezce je: %s\n", s+3); printf("text retezce je: %s\n", s+4); // Vypise se AHOJ // Vypise se HOJ // Vypise se OJ // Vypise se J // Nevypise se nic 6

Načtení textového řetězce ze vstupu Pro načtení řetězce ze vstupu (zpravidla z klávesnice) používáme funkci scanf(), formátovací prvek je %s Jméno řetězcové proměnné předávané funkci scanf() uvádíme bez hranatých závorek a bez & Abychom zajistili, že při načítání nebude překročena velikost pole, uvedeme maximální počet načítaných znaků mezi % a s. Musí zůstat jedno volné místo na zakončovací znak '\0', proto uvedeme velikost o jedničku menší než je velikost pole Funkce scanf() načítá text ze vstupu dokud nenarazí na mezeru, pak načítání ukončí => načítají se slova oddělená mezerou Funkce scanf() automaticky přidává znak '\0' na konec řetězce char string[20] = ""; // Inicializujeme prazdnym retezcem scanf("%19s", string); // Nacte max. 19 znaku do string + '\0' printf("text retezce s je: %s\n", string); char s1[20] = "", s2[20] = ""; scanf("%19s %19s", s1, s2); // Nacte dve slova (oddelena mezerou) printf("prvni slovo: %s, druhe slovo: %s\n", s1, s2); 7

Zápis dat do souboru Proměnná typu FILE slouží k identifikaci souboru. Soubor otevřeme voláním funkce fopen() Pokud bylo otevření souboru úspěšné, bude v f hodnota různá od NULL. FILE *f = NULL; f = fopen("/home/martinp/testdata/data1.txt", "w"); if (f == NULL) { } printf("cannot open file!\n"); return 1; Název a cesta k souboru fprintf(f, "Tento text se zapise do souboru\n"); Režim otevření souboru "w" vytvoří nový soubor a otevře ho pro zápis. fclose(f); f = NULL; Pro zápis do souboru používáme funkci fprintf(). Můžeme použít formátovací prvky podobně jako u funkce printf(). Po ukončení používání souboru jej uzavřeme funkcí fclose(). Prvním parametrem funkce fprintf() je proměnná typu FILE identifikující daný soubor. 8

Zápis dat do souboru Proměnná identifikující soubor je typu FILE * Funkce fopen(cesta a jméno souboru, režim přístupu) otevře soubor a vrací identifikátor, který je v případě úspěšného otevření různý od NULL Možné režimy přístupu: "r" otevře existující soubor pro čtení "w" vytvoří nový soubor pro zápis (popř. přepíše existující) "r+", "w+", "a", "a+" - viz "man fopen" Funkce fprintf(identifikátor souboru, formátovací řetězec, proměnné...) se používá podobně jako printf(), prvním argumentem je však identifikátor souboru (typu FILE *) Funkce fclose(identifikátor souboru) slouží k uzavření souboru FILE *f = NULL; int i = 10; float a = 2.3; char c = 'R'; // Funkci fprintf() lze pouzivat stejne jako printf() // avsak jako prvni argument musime uvest identifikator souboru fprintf(f, "Promenne: %i, %f, %c\n", i, a, c); 9

Formátovaný výstup Funkce printf() a fprintf() používají pro výpis hodnot proměnných formátovací prvky (%i, %f, %c, %s atd.) Formátovací prvky specifikují typ vypisované proměnné (int, float, char), kromě toho umožňují specifikovat formát výpisu např. počet desetinných míst, zarovnávání doleva nebo doprava a pod. Obecný zápis formátovacích prvků: %[příznaky][šířka][.přesnost][modifikátor]konverze Význam volitelných parametrů se může lišit pro různé typy vypisovaných hodnot Příklad: %+#12.5Lf příznaky přesnost šířka konverze (typ hodnoty) modifikátor 10

Výstup celých čísel konverze %i Pro výstup celých čísel (typ int) slouží konverze %i Šířka nastavuje minimální počet vypisovaných znaků; je-li vypisované číslo kratší než šířka, doplní ze zleva mezery Přesnost nastavuje minimální počet vypisovaných znaků (funguje tedy podobně jako šířka), je-li je číslo kratší jsou zleva doplněny nuly Příznaky: - výsledek se zarovnává doleva (namísto implicitního doprava) + číslo bude vždy vytištěno se znaménkem + nebo - (standardně se znaménko vypisuje jen u záporných čísel) mezera kladná čísla jsou vypisována s mezerou na začátku (záporná čísla budou mít místo mezery znaménko- ) Příklad výpisu čísla 47 (tečka představuje mezeru): %i 47 standardní výpis %5i 47 min. 5 znaků, zleva mezery %.5i 00047 min. 5 znaků, zleva nuly % 5i 47 min. 5 znaků, zarovnání doleva (mezery zprava) %+5i +47 min. 5 znaků, bude vytištěno znaménko + nebo - % i 47 kladná čísla budou mít na začátku mezeru % 5i 47 min. 5 znaků, zarovnání doleva, mezera před 11 kladným číslem

Výstup desetinných čísel - konverze %f Pro výstup desetinných čísel (typ float) slouží konverze %f Šířka nastavuje minimální počet vypisovaných znaků (vč. desetinné tečky a znaménka); bude-li vypisované číslo kratší než šířka, doplní ze zleva mezery Přesnost specifikuje počet cifer za desetinnou tečkou (v případě potřeby je číslo zaokrouhleno podle standardních pravidel) Příznaky jsou stejné jako u konverze %i Příklad výpisu čísla 45.375 (tečka představuje mezeru): %f 45.375000 standardní výpis (implicitní přesnost je 6) %11f 45.375000 min. 11 znaků, zleva mezery %.2f 45.38 přesnost je 2 znaky, číslo je zaokrouhleno %.5f 45.37500 přesnost je 5 znaků (tj. 5 deset. míst) %10.5f 45.37500 min. 10 znaků, přesnost je 5 % 10.5f 45.37500 jako předchozí, ale zarovnání doleva %+10.5f +45.37500 bude vytištěno znaménko + nebo - % +10.5f +45.37500 jako předchozí, ale zarovnání doleva % f 45.375000 kladná čísla budou mít na začátku mezeru 12

Výstup znaku - konverze %c Pro výstup znaku (typu char) slouží konverze %c Šířka nastavuje minimální počet vypisovaných znaků; podle potřeby se doplní zleva mezery Přesnost nemá žádný efekt u této konverze Příznaky: - výsledek se zarovnává doleva (namísto implicitního doprava) Chceme-li vypsat znak % použijeme formátování %% nebo \% Příklad výpisu znaku 'A' (tečka představuje mezeru): %c A standardní výpis znaku %6c A min. 6 znaků, zleva mezery % 6c A jako předchozí ale zarovnání doleva 13

Výstup řetězce - konverze %s Konverze %s slouží pro výstup řetězce (tj. řetězcové proměnné typu char [] obsahující zakončovací znak \0) Šířka nastavuje minimální počet vypisovaných znaků; bude-li řetězec kratší než šířka, doplní ze zleva mezery Přesnost nastavuje maximální počet vypisovaných znaků řetězce (což nemusí odpovídat celkovému počtu znaků, protože ten může být nastaven hodnotou šířky a v takovém případě se podle potřeby doplňují mezery - viz. příklad níže) Příznaky: - výpis řetězce zarovnává doleva (namísto implicitního doprava) Příklad výpisu řetězce "AHOJ" (tečka představuje mezeru): %s AHOJ standardní výpis řetězce %6s AHOJ min. 6 znaků, zarovnání doprava(zleva mezery) % 6s AHOJ jako předchozí, ale zarovnání doleva %.2s AH vypíše max. 2 znaky řetězce %6.2s AH vypíše max. 2 znaky řetězce, ale dohromady minimálně 6 znaků (zleva mezery) % 6.2s AH jako předchozí, ale zarovnání doleva 14

Vykonání systémového příkazu Funkce system(jméno příkazu) slouží k vyvolání příkazu systému, který je interpretován shellem systému Funkce slouží převážně k jednoduchému spouštění externích programů Příkaz se zapisuje stejně jako bychom ho uvedli na příkazovém řádku terminálu Běh programu je pozastaven do té doby, než je příkaz vykonán Při použití funkce system() je třeba na začátek programu vložit #include <stdlib.h> // Nasledujici program vypise obsah aktualniho adresare po sloupcich int main() { system("ls C /bin"); } return 0; 15

Dodržujte následující pravidla Všechny řetězce inicializujte vhodným textem nebo prázdným řetězcem. Na začátku každého programu uveďte stručný komentář vysvětlující účel programu. Dbejte na správné odsazování textu. 16

Úlohy část 1 1. Vytvořte program, který načte od uživatele text (jedno slovo bez mezer). Program potom vypíše na obrazovku počet znaků v načteném řetězci. Potom vypíše část zadaného textu počínaje 6. znakem. Řetězec potom zkraťte na 5 znaků a vypište na obrazovku. (Příklad: "kockopes", vypíše se počet znaků 8, potom "pes" a nakonec "kocko"). 1 bod 2. Vytvořte program který načte od uživatele jedno slovo na obrazovku vypíše toto slovo pozpátku. (Příklad: uživatel zadá "kockopes" a vypíše se "sepokcok"). 1 bod 3. Vytvořte program který od uživatele načte dvě slova, každé do jiné řetězcové proměnné. Dále v programu definujte třetí řetězcovou proměnnou do které zkopírujete první a pak druhé načtené slovo oddělené mezerou (tj. bude obsahovat spojené první dva řetězce). Řetězec vypište na obrazovku. Dále přehoďte pořadí znaků v tomto výsledném řetězci stejně jako v úloze 2 a výsledný řetězec vypište na obrazovku. (Příklad: uživatel zadá "dobry" "den" a vypíše se "dobry den" a potom "ned yrbod"). nepovinná, 1 bod 17

Úlohy část 2 4. Vytvořte program který vytvoří soubor a zapíše do něj seznam čísel -5 až 10 a odpovídající hodnoty (viz. níže). Na každém řádku bude číslo a za ním postupně příslušné hodnoty. Formátování bude odpovídat obrázku níže, na prvních 3 řádcích souboru bude níže uvedený komentář. Program doplňte o zavolání editoru kate ve kterém se automaticky otevře vytvořený soubor. 1 bod 5. Vytvořte program který do souboru zapíše seznam čísel 1 až 20 a jejich druhé mocniny tak, že na každém řádku bude číslo a za ním jeho druhá mocnina (oddělené mezerou). Program dále vytvoří soubor s příkazy pro gnuplot, tak aby obsahoval příkazy pro zobrazení souboru s mocninami. Zavolejte z programu program gnuplot tak aby došlo k zobrazení grafu mocnin. (Pozn.: pro vypsání uvozovek ve funkci fprintf() použijte \"). 1 bod Ukázka souboru s příkazy pro gnuplot (data budou v souboru mocniny.dat): plot "mocniny.dat" using 1:2 pause 1 "Hit return" Bude-li se soubor s příkazy jmenovat např. gnuplot.cmd spustíme gnuplot příkazem: gnuplot gnuplot.cmd 18

Úloha 4 ukázka 01234567890123456789012345678901234567890123456789 Seznam cisel a jejich matematickych hodnot i i*i i*i*i exp(i) sin(i) cos(i) 5 25 125 0.007 0.958924 +0.2837 4 16 64 0.018 0.756802 0.6536 3 9 27 0.050 0.141120 0.9900 2 4 8 0.135 0.909297 0.4161 1 1 1 0.368 0.841471 +0.5403 0 0 +0 1.000 0.000000 +1.0000 1 1 +1 2.718 0.841471 +0.5403 2 4 +8 7.389 0.909297 0.4161 3 9 +27 20.086 0.141120 0.9900 4 16 +64 54.598 0.756802 0.6536 5 25 +125 148.413 0.958924 +0.2837 6 36 +216 403.429 0.279415 +0.9602 7 49 +343 1096.633 0.656987 +0.7539 8 64 +512 2980.958 0.989358 0.1455 9 81 +729 8103.084 0.412118 0.9111 10 100 +1000 22026.466 0.544021 0.8391 19

Úlohy část 3 6. Program z úlohy č. 5 upravte tak, že do souboru zapíše seznam prvních 20 prvočísel tak, že na každém řádku bude pořadí prvočísla a za ním prvočíslo. Nakonec zobrazí příslušný graf v gnuplot podobně jako v úloze 5. nepovinná, 1 bod 20