Struktura – komplexní čísla
Komplexní číslo patří ke složitějšímu datovému typu – skládá se ze dvou složek : Imaginární a Reálné (lze použít i dvojici amplituda a úhel, přístup k programování je zde stejný). Pro práci s proměnnými, které se skládají z více proměnných slouží datový typ struktura. Definicí struktury „vznikne“ nový datový typ jeho název je „struct Jmeno“ (to znamená, že stejně jako jsme používali typ int nyní můžeme (na místo int) psát „struct Jmeno“).
Vytvořte projekt se soubory testkomplex.c (zde naprogramujte funkci main), komplex.c a komplex.h. Soubor komplex.h ošetřete proti vícenásobnému načtení (podmíněný překlad) a hlavičkový soubor vložte do obou zdrojových souborů (*.c).
Pozn.: dále můžete postupovat tak, že si prvek vyzkoušíte v main nebo v souboru s main, následně ho přesunete do správného souboru (komplex.h nebo komplex.c). V souboru komplex.h bude vše co při kompilaci nevytváří přímý kód (prototyp struktury, funkcí, …) v souboru komplex.c bude to co tvoří kód (funkce s tělem).
Navrhněte a naprogramujte strukturu TKomplex, která má dvě složky – iReal, iImag (zvolte vhodný datový typ: void, char, unsigned, int, double). Popis struktury umístěte do hlavičkového souboru. Ve funkci main nadefinujte dvě proměnné typu TKomplex (s názvy a, b) a dva ukazatele na tento typ (s názvy pa, pb).
První z nadefinovaných proměnných TKomplex inicializujte v definici na hodnotu (1.1, 2.2). Druhou proměnnou nastavte pomocí přiřazení (musí se provést přiřazení pomocí operátoru = pro jednotlivé složky struktury, kromě definice a předávání není možné pracovat se strukturou jako celkem, je nutné pracovat samostatně s jednotlivými položkami) na hodnotu (3.3, 4.4). První z ukazatelů nastavte tak, aby ukazoval na druhou proměnnou.
Ve funkci main vytiskněte první proměnnou ve formátu “(Real, Imag)“. Vytiskněte i druhou proměnnou, ale tentokrát pomocí ukazatele (z předchozího bodu), který na ni ukazuje.
Napište funkci Print
pro tisk (struktury) komplexního čísla ve formátu z minulého bodu.
Proměnnou předejte hodnotou, tj. struct
TKomplex.
Předání
hodnotou je sice správné, ale jelikož je struktura „paměťově
rozsáhlý“ typ, je zvykem ji předávat pomocí ukazatele (předání
hodnotou zabírá místo na zásobníku a čas na vytvoření kopie
proměnné, zatímco režie s předáním ukazatele je minimální a
nezávislá na velikosti proměnné). Přepište funkci pro tisk tak, aby
byl parametrem ukazatel tj. struct
TKomplex*.
Jelikož funkce pro tisk nemění proměnnou (a ani
by ji z podstaty chápání tisku měnit neměla), je vhodné toto
naznačit pomocí modifikátoru const
před typem předávané proměnné: const
struct TKomplex* (pokud chceme konstantní pouze hodnotu na
kterou ukazujeme. Pokud chceme aby byl neměnný i ukazatel, použijeme
const struct TKomplex* const).
Uvedení const má význam pro uživatele, že proměnná se nemění, a také
pro překladač, který toto kontroluje a v případě pokusu o změnu
proměnné zahlásí chybu.
Pomocí této funkce dále tiskněte
proměnné se kterými voláte funkce a výsledky z těchto funkcí.
Funkci
můžete ještě rozšířit o parametr řetězec, který se vytiskne předtím,
než se vytiskne číslo (v tomto řetězci může být například komentář
“soucet cisel je: “). Pozor na bezpečnost kódu,
ochrana proti útokům buffer overrun.
Napište funkci SwapParts(const struct TKomplex *src, struct TKomplex* dst), která bude mít dva parametry typu struct TKomplex* (ukazatele) a která do druhého parametru (dst) uloží první proměnnou tak, že její složky budou vyměněny Imag<=>Real oproti původní proměnné. Zkuste volání se stejnou proměnnou pro oba parametry tj. SwapParts(&a, &a) – v čem může být problém?
Napište funkci Add, která sečte dvě komplexní proměnné a výsledek vrátí jako návratovou hodnotu. Musí vracet hodnotu, protože vzniká nová proměnná.
Ve funkci main nadefinujte pole komplexních čísel (délka může
být libovolná, prvky naplňte hodnotami Real = (i-5)*(i-5); Imag =
i;). Napište funkci, která seřadí pole komplexních čísel na základě
jejich absolutní hodnoty (absolutní hodnota je definovaná jako
odmocnina ze součtu kvadrátů složek). Místo pro výsledné pole
naalokujte a předejte jako návratovou hodnotu. Kterou z
následujících hlaviček funkce můžete použít?
struct
TKomplex* Sort(const struct TKomplex *pole, int delka);
struct
TKomplex* Sort(const struct TKomplex pole[], int delka);
struct
TKomplex Sort(const struct TKomplex *pole, int delka);
struct
TKomplex Sort(const struct TKomplex pole[], int delka);
int
Sort(const struct TKomplex *pole, int delka, struct TKomplex
*vysledek);
int Sort(const struct TKomplex pole[], int delka,
struct TKomplex vysledek[]);
Obě pole vytiskněte a
proveďte odalokování naalokované paměti.
Poslední změna 2014-04-28