Ciele cvičeniaCvičenie je zamerané na prácu so smerníkmi, ktoré sú v programovaní C veľmi silným a užitočným nástrojom. Po osvojení si problematiky študent dokáže efektívne adresovať údaje v pamäti. Rozlišuje medzi adresou premennej a jej obsahom.
|
Odporúčaná literatúra a dôležité odkazy[1] KPI-FEI-TUKE: Prednáška č. 1 [2] KPI-FEI-TUKE: Cvičenie č. 4 [3] Horovčák P.: Úvod do programovania v jazyku C- Smerníky [4] Základy práce s knižnicou STDIO.H [6] Argumenty príkazového riadku [7] CodeWithC.com: Understanding C Pointers: A Beginner’s Guide |
Na ZAP sme sa naučili, že výsledok vykonania ľubovoľnej funkcie môže byť vrátený pomocou jej návratovej hodnoty. K tomuto účelu slúži príkaz return, ktorý je spravidla posledným príkazom vykonaným volanou funkciou. Mnoho funkcií ale je typu void, teda bez návratovej hodnoty a stále dokážu "vrátiť" výsledok, napr. tak ako už spomínaná funkcia scanf.
Funkciu bez návratovej hodnoty, ktorej výsledky potrebujeme ďalej používať musí teda pracovať s premennými v pamäti presne tam, kde ich používa aj funkcia (napr. main), ktorá danú funkciu zavolala. Toto zabezpečíme tak, že vstupnými argumentom funkcie bude priamo adresa premennej, do ktorej sa má výsledok uložiť.
V nasledujúcom príklade si ukážeme jednoduchú funkciu, ktorá vynásobí číslo, ktoré jej bude zaslané hodnotou "-1". Teda v prípade kladného čísla dostaneme číslo záporné a naopak v prípade záporného čísla zasa vo výsledku dostaneme číslo kladné. Takúto funkciu si ukážeme v dvoch prevedeniach - s návratovou hodnotou a bez nej.
Funkcia invertovania s návratovou hodnotou
#include <stdio.h> int invert(int cislo); // funkcia s návratovou hodnotou int a vstup. argumentom int int main() { int a = 5; int b = invert(a); // Do b je uložená návratová hodnota funkcie. printf(" >> b = -1 x a = -1 x %d = %d\n", a, b); return 0; } int invert(int cislo) { return -1*cislo; } |
Funkcia invertovania bez návratovej hodnoty (s použitím smerníka)
#include <stdio.h> void invert(int* cislo); // funkcia bez návratovej hodnoty a // so vstup. argumentom smerník na int int main() { int a = 5; int b = a; // Do b je skopírovaná hodnota z premennej a invert(&b); // Funkcii invert sa pošle iba adresa premennej b printf(" >> b = -1 x a = -1 x %d = %d\n", a, b); return 0; } void invert(int* cislo) { *cislo = *cislo * (-1); // Cez * pred premenou cislo sa dostaneme na obsah, // ktorý sa nachádza na adrese, ktorú funkcia dostala. } |
V oboch prípadoch bude po spustení programu výsledok rovnaký:
ab123cd@zapfei:CV1$ gcc invert.c -o INV ab123cd@zapfei:CV1$ ./INV >> b = -1 x a = -1 x 5 = -5 |
Napíšte program (aritmetika.c) pre výpočet základných aritmetických operácií "+", "-", "*" a "/"
ab123cd@zapfei:CV1$ gcc aritmetika.c -o ARITMETIKA ab123cd@zapfei:CV1$ ./ARITMETIKA + >> Zadaj čslo a = 5 >> Zadaj čislo b = 3 >> c = a + b = 5 + 3 = 8 |
#include <stdio.h> #include <string.h> // Tu sú deklarácie funkcii void sucet(int* cislo1, int* cislo2, int* ans); void rozdiel(int* cislo1, int* cislo2, int* ans); void sucin(int* cislo1, int* cislo2, int* ans); void podiel(int* cislo1, int* cislo2, int* ans); int main(int argc, char *argv[]) { // Nezabudnúť na overenie toho či používateľ zadal správny počet argumentov // Nezabudnuť na deklarácie premenných // Tu bude kód pre zadávanie hodnoty vstupných premenných if( strcmp(argv[1],"+") == 0 ) { sucet(&a, &b, &c); printf("\n >> c = a + b = %d + %d = %d\n", a,b,c); } // ... tu budú ďalšie možnosti return 0; } // Tu by mali byť definície funkcií |
Vytvorte vlastnú funkciu pre porovnávanie dvoch reťazcov.
#include <stdio.h> int StrCmp(char*, char*); int main() { char Retazec1[10], Retazec2[10]; // tu bude rutina pre zadávanie vstupných reťazcov printf("\n>> Vstupny retazec --> %s\n",Retazec); int ans = StrCmp(Retazec1,Retazec2) // tu bude vyhodnotenie a opoznamenia použivateľa o výsledku } // Tu by mala byť definícia funkcie |