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

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

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

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

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

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

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

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

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

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

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

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

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

Základy programování (IZP)

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

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

2 Datové typy v jazyce C

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

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

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

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

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

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

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

Základy programování (IZP)

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

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

Algoritmizace a programování

Funkce, intuitivní chápání složitosti

PROGRAMOVÁNÍ V C++ CVIČENÍ

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

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

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

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

Základy programování (IZP)

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

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Základy programování (IZP)

Prezentace a vysvětlení programového prostředí NXC

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

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

Více o konstruktorech a destruktorech

PROGRAMOVÁNÍ V SHELLU

Úvod do programování. Lekce 1

Základy programování (IZP)

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

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

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

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

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

Konstruktory a destruktory

Odvozené a strukturované typy dat

Základy programování (IZP)

PODPROGRAMY PROCEDURY A FUNKCE

VISUAL BASIC. Práce se soubory

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

Struktury a dynamická paměť

Základy algoritmizace a programování

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

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

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

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

ALGORITMIZACE A PROGRAMOVÁNÍ

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

Úvod do programování. Lekce 5

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

printf - formatovany vystup

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

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

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 -

Programování v jazyce C a C++

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

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

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

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

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

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

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

Programovací jazyk Pascal

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

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

Struktura programu v době běhu

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

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

Př. další použití pointerů

Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

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

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.

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

Mělká a hluboká kopie

Programování v jazyce JavaScript

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

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

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Základy programování (IZP)

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

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

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

Sada 1 - Základy programování

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

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

Transkript:

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

Funkce Program v jazyce C je strukturován do funkcí Příkazy jazyka C nelze nikdy uvádět mimo funkce Program začíná funkcí main(), z ní lze volat další funkce (a z nich zase další funkce) Definice funkce obsahuje: typ vracené hodnoty (int, float, char...), pokud funkce žádnou hodnotu nevrací uvedeme klíčové slovo void jméno funkce (bez mezer) definice proměnných předávaných funkci (tzv. parametry) uvedené v závorkách kód funkce (tj. příkazy) ve složených závorkách int myfunction(int n, float a) // Tady se uvedou prikazy funkce // Nasledujici funkce nevraci zadnou hodnotu a neprijima zadny argument void otherfunction() // Kod funkce 2

Návratová hodnota funkce, příkaz return Příkaz return slouží k okamžitému opuštění funkce a zároveň ke specifikaci návratové hodnoty funkce Navracená hodnota se uvádí bezprostředně za příkazem return (zpravidla jméno proměnné která tuto hodnotu obsahuje nebo aritmetický výraz nebo pod.) Voláme-li funkci která vrací hodnotu, můžeme vracenou hodnotu přiřadit vhodné proměnné nebo ji přímo použít jako součást aritmetického výrazu, podmínky, cyklu a pod. Příkaz return lze použít kdekoliv v těle funkce (v cyklu, podmínce...) int square(int n) return n*n; // Funkce vraci druhou mocninu n int main() int a = 0, b = 9, c = 12; a = square(b); printf("druha mocnina je: %i\n", a); if (square(c) > 20) printf("druha mocnina z %i je vetsi nez 20\n", c); return 0; 3

Návratová hodnota funkce main() Funkce main() vrací hodnotu typu int, tato hodnota je předána operačnímu systému po skončení programu (v shellu můžeme tuto hodnotu získat příkazem $? po vykonání příkazu) V Unixu je konvence, že při úspěšném průběhu vrací program hodnotu 0, při neúspěchu hodnotu různou od 0 int main() FILE *f = NULL; f = fopen("/home/martinp/testdata/test1.txt", "r"); if (f == NULL) printf("cannot open file!\n"); return 1; // Zde muze byt nejaky dalsi kod return 0; 4

Předání hodnot do funkce Typ a jména proměnných předávaných funkci uvádíme při definici funkce v závorce za jménem funkce, proměnné oddělujeme čárkami V jazyce C jsou proměnné předávány hodnotou, tj. předávané hodnoty jsou zkopírovány do nových proměnných, proto každá změna jejich hodnoty neovlivní hodnoty proměnných volající funkce (POZOR: vyjímkou jsou pole a tedy i řetězce!) // Vytvori se promenne a a b do kterych se zkopiruji predane hodnoty int sum(int a, int b) int c = 0; c = a + b; // Zmena hodnoty promenne a nijak neovlivni hodnotu // promenne i ktera byla predana jako argument a = 100; return c; int main() int i = 5, j = 7, k = 0; k = sum(i, j); // Hodnoty promennych i a j zustanou vzdy nezmeneny i pokud jsme // prirazovali jakekoliv hodnoty promennym a a b ve funkci sum() 5

Předání pole do funkce Pole (a tedy i řetězce) nejsou do funkce předávány hodnotou, tj. nedochází k vytvoření kopie daného pole, ale předané pole je pouze přístupné pod novým jménem proměnné, proto jakákoli změna hodnoty některého z prvků pole změní také hodnotu předaného pole #define MAX_VAL 5 void myfunction(int v[max_val]) v[0] = 10; // Zmeni hodnoty puvodniho pole values[] v[1] = 20; int main() int values[max_val] = 1, 2, 3, 4, 5; myfunction(values); // Nasledujici prikaz vypise hodnoty 10 a 20 // ktere byly do pole values[] prirazeny ve funkci myfunction() printf("prvni dve hodnoty pole: %i, %i", values[0], values[1]); return 0; 6

Předání řetězce funkci Řetězce jsou také pole, proto také nejsou předávány hodnotou Pokud velikost předávaného pole neznáme (např. u řetězců inicializovaných textem), neuvedeme v hranatých závorkách žádnou velikost #define STRING_SIZE 100 void print_strings(char s1[string_size], char s2[]) printf("retezce predane funkci: %s, %s\n", s1, s2); int main() char str[string_size] = ""; char file_name[] = "/var/logfile"; scanf("%s", str); print_strings(str, file_name); return 0; 7

Pořadí definice funkcí, deklarace funkce V okamžiku kdy je určitá funkce volána, musí mít překladač informaci o této funkci V praxi tedy definujeme nejdříve funkce které budou volány, teprve potom funkce z nichž jsou volány; funkce main() bude tedy poslední Alternativním přístupem je použití deklarace funkce, která je tvořena hlavičkou funkce zakončenou středníkem; uvádí se na začátku programu; samotná definice funkce se může nacházet kdekoliv dále int square(int n); // Deklarace funkce musi byt zakoncena strednikem int main() int a = 0, b = 9, c = 0, d = 20; // Protoze funkce square() jiz byla deklarovana na zacatku programu // prekladac ma o ni informaci a muzeme ji tedy zavolat // i kdyz definovana bude az pozdeji a = square(b); // Dale by byl nejaky dalsi kod int square(int n) return n*n; // Definice funkce 8

Globální a lokální proměnné Proměnné definované uvnitř funkce se nazývají lokální a mají platnost pouze v této funkci Globální proměnné se definují mimo definici funkce, zpravidla na začátku programu před definicí první funkce Globální proměnné jsou dostupné ve všech funkcích. Změna jejich hodnoty v jedné funkci se tedy projeví i ve všech ostatních. Globální proměnné jsou automaticky inicializovány hodnotou 0 // Globalni promenna: char filename[] = "/home/martinp/tmp/data.dat"; void read_file() FILE *f = NULL; // Lokalni promenna f = fopen(filename, "r"); // Zde by byl dalsi kod pro nacteni dat ze souboru int main() read_file(); return 0; 9

Struktury Struktury slouží k seskupení několika proměnných různých typů Strukturu definujeme následovně: typedef struct // definice proměnných struktury JMENO_STRUKTURY; Jména struktur zpravidla píšeme velkými písmeny Jméno struktury používáme podobně jako by se jednalo o jméno typu (int, float,...), tj. používáme ho k definici proměnných Hodnoty jednotlivých proměnných struktury můžeme inicializovat pomocí složených závorek // Definujeme strukturu VECTOR_2D pro 2 dimenzionalni vektor typedef struct float x; float y; VECTOR_2D; // Definice promenne vector a inicializace souradnic x a y // hodnotmi 1.1 a 2.5 VECTOR_2D vector = 1.1, 2.5; 10

Struktury K jednotlivým položkám (proměnným) struktury přistupujeme přes tečku: jméno_struktury.jméno_proměnné // Ukazka scitani dvou vektoru s vyuzitim struktur typedef struct float x; float y; VECTOR_2D; VECTOR_2D v1 = 0.0, 0.0; VECTOR_2D v2 = 0.0, 0.0; VECTOR_2D vsum = 0.0, 0.0; printf("zadejte souradnice prvniho vektoru"); scanf("%f %f", &v1.x, &v1.y); printf("zadejte souradnice druheho vektoru"); scanf("%f %f", &v2.x, &v2.y); vsum.x = v1.x + v2.x; vsum.y = v1.y + v2.y; printf("vysledny vektor: %f, %f\n", vsum.x, vsum.y); 11

Struktury Struktury mohou obsahovat různé typy proměných včetně např. řetězcových proměnných nebo polí Pro načítání a výpis hodnot platí stejná pravidla jako pro běžné proměnné, tj. u funkcí scanf() a fscanf() uvádíme před názvem proměnné znak & s výjimkou řetězcových proměnných // Ukazka slozitejsi struktury obsahujici retezcovou promennou // a ukazka nacitani hodnot ze vstupu a vypisu na vystup typedef struct char str[5]; float energy_exp; float energy_calc; ENERGY_ITEM; // Retezcovou promennou inicializujeme "", ostatni promenne 0.0 ENERGY_ITEM item = "", 0.0, 0.0; // Nacteme hodnoty ze vstupu, pred nazvy promennych davame & krome // retezcovych promennych scanf("%4s %f %f", item.str, &item.energy_exp, &item.energy_calc); // Vypiseme hodnoty printf("hodnoty: %s, %f, %f\n", item.str, item.energy1, item.energy2); 12

Pole struktur Je možné vytvářet pole struktur, postup je podobný jako při vytváření polí základních typů (int, float,...) Pole struktur obvykle inicializujeme tak, že inicializujeme první hodnotu první položky a překladač pak inicializuje všechny ostatní hodnotu nulou. U globálních proměnných není inicializace nutná, protože jsou vždy inicializovány 0. #define MAX_ITEMS 50 typedef struct char str[5]; float energy_exp; float energy_calc; ENERGY_ITEM; ENERGY_ITEM items[max_items] = 0; // Definujeme pole struktur 13

Pole struktur načítání dat ze souboru Pole struktur se často využívají pro načítání dat ze souboru #define MAX_ITEMS 50 typedef struct char str[5]; float energy_exp; float energy_calc; ENERGY_ITEM; ENERGY_ITEM items[max_items] = 0; // Definujeme pole struktur int count = 0; // Pocet nactenych polozek do pole items[] // Nacteni z esouboru: FILE *f = NULL; // Zde musi byt kod pro otevreni souboru pro cteni (s identif. f) while (feof(f) == 0) // Je li count >= MAX_ITEMS vypiseme hlasku a vyskocime z cyklu fscanf(f, "%4s %f %f", items[count].str, &items[count].energy_exp, &items[count].energy_calc); count++; // Zde se soubor uzavre 14

Dodržujte následující pravidla Při programování postupujte po malých krocích, pak vždy program přeložte a otestujte a dále pokračujte až po odstranění chyb. Např. v úloze 2 nejdříve program předělejte tak aby používal struktury (a zkompilujte a otestujte). Teprve potom ho rozdělte do funkcí. Dodržujte následující uspořádání programu: Vložení hlavičkových souborů pomocí #include Definice všech symbolických konstant pomocí #define Definice všech struktur (pomocí typedef struct) Definice všech globálních proměnných Deklarace funkcí (pokud je používáte) Kód funkcí ve vhodném pořadí (použijeme-li deklarace, na pořadí nezáleží) Uvnitř funkce uvádějte definice lokálních proměných vždy na začátku funkce a proměné inicializujte při jejich definici vhodnou hodnotou. Jako globální definujte pouze ty proměnné, jejichž hodnoty budou používány ve více než jedné funkci. Všechny ostatní proměnné definujte jako lokální (např. řídící proměnné cyklu, identifikátory souborů atd.). Velikost pole znaků pro řetězce zvolte tak aby se do něj vešly všechny načítané znaky + zakončovací znak \0 Při načítání řetězce funkcí fscanf() vždy specifikujte šířku tak aby nedošlo k překročení velikosti pole. Pro pojmenování funkcí nepoužívejte jména read() a write(), protože funkce 15 jsou již použity ve standardní knihovně jazyka C a došlo by ke kolizi názvů.

Úlohy část 1 1. Vytvořte program který který od uživatele vyžádá souřadnice dvou 3-dimenzionálních vektorů a spočítá jejich vektorový součin. Výsledek vypíše na obrazovku. Pro reprezentaci vektorů použijte struktury. 1 bod 16

Úlohy část 2 2. Upravte program z předchozího cvičení (úloha 2 ze cvičení 5) tak aby využíval struktury. Struktura bude obsahovat PDB kód komplexu a dvě hodnoty energií. Pro načítání hodnot ze souboru použijte pole těchto struktur. Do výstupního souboru bude zapsán PDB kód a hodnoty energií. Program navíc rozdělte do následujících samostatných funkcí: funkce pro otevření vstupního souboru a načtení hodnot funkce pro otevření výstupního souboru a zápisu hodnot energií funkce main() Řetězcové proměnné obsahující jména souborů definujte ve funkci main() jako lokální proměnné a předejte je příslušným funkcím jako parametry. Funkce pro čtení a zápis souboru budou vracet hodnotu typu int. V případě úspěchu vrátí 0 a při neúspěchu 1. Ve funkci main() pak bude testována návratová hodnota těchto funkcí a v případě že vrátí 1, bude program ukončen a vrátí hodnotu 1. 2 body 17

Úlohy část 3 3. Vytvořte program, který načte zjednodušený PDB soubor crambin_simple.pdb (nacházející se v adresáři /home/martinp/c2160/data/). Tento soubor obsahuje informace o molekule proteinu crambin. Potom program zapíše data do jiného souboru tak aby formát dat byl přibližně stejný jako v načítaném PDB souboru (nemusí být zcela stejný). Použijte podobný přístup jako v úloze 2. 3 body ATOM 748 CG TYR 44 11.895 12.742 14.274 C Každý řádek zjednodušeného PDB souboru ze skládá z následujících položek: 1. Název záznamu řetězec max. 6 znaků (zde ATOM) 2. Číslo atomu celé kladné číslo (zde 748) 3. Název atomu řetězec max. 4 znaky (zde CG) 4. Zkratka názvu residua (tj. aminokyseliny) řetězec max. 3 znaky (zde TYR) 5. Číslo residua celé kladné číslo (zde 44) 6. Kartézské souřadnice x, y a z udávající pozici atomu v prostoru v Angstromech tři desetinná čísla (zde 11.895 12.742 14.274) 7. Zkratka jména prvku řetězec max. 2 znaky (zde uhlík C) 18

Úlohy část 4 4. Do programu z úlohy 3 přidejte funkci, která vypíše celkový počet načtených atomů a potom spočítá a vypíše kolik se v souboru nachází atomů jednotlivých prvků (H, C, N, O, S). nepovinná, 2 body 19