Katedra Elektrotechniki Teoretycznej i Informatyki sem. II - wykład 6 Dr hab. inż. M. Czyżak
Ogólna budowa programu w języku C W języku C program składa się z jednego lub większej liczby segmentów kodu zwanych funkcjami, z których jedna musi nazywać się main(). Wykonanie programu zaczyna się od funkcji main() i program powinien kończyć się wraz z zakończeniem działania funkcji main(). Program również może się zakończyć, gdy pojawi się sytuacja nienormalna - wyjątek, np. dzielenie przez zero, albo też gdy zostanie zakończony w sposób jawny ( ctrl-break, zamknięcie okna w systemie Windows), powodem zakończenia może być też wywołanie funkcji exit().
Powody stosowania funkcji w programach (1) 1. Korzystanie z bibliotek lub funkcji stworzonych przez innych programistów. 2. Podział zadania programistycznego na mniejsze, które mogą być opracowywane niezależnie( np. w różnym czasie lub równocześnie przez różnych programistów).
Powody stosowania funkcji w programach (2) 3. Ułatwienia w uruchamianiu dużych programów ( można niezależnie uruchamiać i testować poszczególne funkcje). 4. Program jest zbyt duży, by pisać go jako jedną funkcję main(). 5. Unikanie powtarzania w programie tego samego kodu, gdy pewne zadania trzeba wykonywać wielokrotnie.
Funkcje a struktura programu w języku C (1) Program w języku C może być programem jednoplikowym lub wieloplikowym. W programie jednoplikowym wszystkie funkcje znajdują się w jednym pliku źródłowym lub są do niego dołączane przy zastosowaniu dyrektywy #include. W programie wieloplikowym pliki są łączone w sposób zależny od środowiska (np. w środowisku Dev C++ opcja Projekt->Dodaj do projektu).
Funkcje a struktura programu w języku C (2) - Funkcje nie muszą występować w pliku źródłowym w określonym porządku ( pewne sposoby uporządkowania mogą wymagać dodatkowych deklaracji), jednak umieszczenie main() jako pierwszej funkcji w pliku ułatwia analizę programu. - Każda funkcja może wywoływać dowolną inną funkcję. - Nie jest dopuszczalne zagnieżdżanie funkcji, tzn. nie można jednej funkcji definiować wewnątrz innej funkcji. - W programie występuje tylko jedna funkcja main() i musi ona wystąpić niezależnie od liczby plików źródłowych.
Przykład. Prosty program stosujący funkcję kwadratdo obliczania kwadratu pewnej wartości. #include <stdio.h> // lub #include <cstdio> int kwadrat (int num){ int main() { int pom; // zmienna lokalna funkcji pom=num*num; return pom; } int kw, wartosc; // zmienna pom nie jest konieczna, //być return num*num; printf("\n Podaj wartosc :"); scanf("%d",&wartosc);
Wywołanie funkcji - (uruchomienie kodu funkcji) kw= kwadrat(wartosc); /* zmienna wartosc jest tzw. argumentem funkcji, zmienna wartość zawiera liczbę, która ma być podniesiona do kwadratu */ printf ("\n Kwadrat liczby %d wynosi :%d",wartosc, kw); system("pause"); return 0;} W momencie zakończenia działania, funkcja kwadrat przesyła do funkcji main() obliczoną wartość i wartość ta jest wstawiana w miejsce wywołania funkcji. W kolejnym etapie następuje wstawienie tej wartości do zmiennej kw.
#include <stdio.h> Język C funkcje Przykład. Zastosowanie deklaracji funkcji. int kwadrat (int); // deklaracja funkcji int main() { int kw, wartosc; printf("\n Podaj wartosc :"); scanf("%d",&wartosc); kw=kwadrat(wartosc); printf("\n Kwadrat liczby %d wynosi:%d \n", wartosc,kw); system ("PAUSE"); return 0;} int kwadrat (int num){ int pom; pom=num*num; return pom;}
Wynik działania programu ------------------------ Podaj wartosc :25 Kwadrat liczby 25 wynosi:625 Aby kontynuować, naciśnij dowolny klawisz...
Przykład. (do wykonania w trakcie wykładu) Napisać i wywołać w main() następujące funkcje: a) funkcję obliczającą sumę swoich argumentów typu int b) funkcję obliczającą różnicę swoich argumentów typu int c) funkcję obliczającą iloczyn swoich argumentów typu double Funkcje obliczające sumę i różnicę wywołać dla pary argumentów.
#include <stdio.h> int sum (int a, int b); // deklaracje funkcji int roznica (int a, int b); double iloczyn (double a, double b); int main() { int a,b,c,d,sum,roz; double e,f,ilo; printf("\n Podaj a :"); scanf("%d",&a); printf("\n Podaj b :"); scanf("%d",&b); sum=suma(a,b);// a,b to argumenty wywołania funkcji
cz 2. programu printf("\n Suma %d + %d =%d ", a,b,sum); printf("\n Podaj c :"); scanf("%d",&c); printf("\n Podaj d :"); scanf("%d",&d); sum=suma(c,d); printf("\n Suma %d + %d =%d ", c,d,sum); roz=roznica(a,b); printf("\n Roznica %d - %d =%d ", a,b,roz); roz=roznica(c,d); printf("\n Roznica %d - %d =%d \n", c,d,roz);
cz 3. programu printf("\n Podaj e :"); scanf("%lf",&e); printf("\n Podaj f :"); scanf("%lf",&f); ilo=iloczyn(e,f); printf("\n Iloczyn %f * %f =%f \n", e,f,ilo); system ("PAUSE"); return 0;}
cz 4. programu int suma (int a, int b){ int sum; sum=a+b; return sum;} int roznica (int a, int b){ int roz; roz=a-b; return roz;} double iloczyn (double a, double b){ double ilo; ilo=a*b; return ilo;}
Wynik działania programu --------------------------------- Podaj a :2 Podaj b :3 Suma 2 + 3 =5 Podaj c :4 Podaj d :5 Suma 4 + 5 =9 Roznica 2-3 =-1 Roznica 4-5 =-1 Podaj e :2.5 Podaj f :3.5 Iloczyn 2.500000 * 3.500000 =8.750000
Przykład. Napisać i zastosować w programie funkcję silnia. #include <stdio.h> int silnia (int n ){ int i, sil=1; if (n>0) for (i=1;i<=n;i++) sil=sil*i; return sil; } int main() { int l1=5, l2=6; int sil1,sil2; sil1=silnia (l1); sil2=silnia (l2); printf("\n % d! wynosi %d", l1,sil1); printf("\n % d! wynosi %d\n", l2,sil2); system("pause"); return 0;}
Przykład. Napisać i zastosować w programie funkcję silnia. Wynik działania programu 5! wynosi 120 6! wynosi 720 Aby kontynuować, naciśnij dowolny klawisz...
Przykład. Napisać i zastosować w programie funkcję wczytajd wczytującą zmienną typu double. #include <stdio.h> double wczytajd (void ){ int k; double x; do{ printf("\n Podaj zmienna :"); k=scanf("%lf",&x); if (k==0) printf("\n Niepoprawny format liczby!"); fflush(stdin); } while (k==0); // można też while (!k); return x;} int main() { double x1,x2; x1=wczytajd (); x2=wczytajd(); printf("\n x1 wynosi %f", x1); printf("\n x2 wynosi %f \n", x2); system("pause"); return 0;}
Wynik działania programu ------------------------ Podaj zmienna :12 Podaj zmienna :23 x1 wynosi 12.000000 x2 wynosi 23.000000 Aby kontynuować, naciśnij dowolny klawisz...
Przykład. Użycie funkcji silnia w obliczania sumy częściowej szeregu (cz.1 ) n-1 i x x e = i= 0 #include <stdio.h> #include <math.h> double silnia (int); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1)// wielokrotne wykonanie programu { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n); i!
Przykład. Użycie funkcji silnia w obliczania wartości szeregu (cz. 2) s=0; for ( i=0;i<n;i++) { xn=pow(x,i)/silnia(i); s=s+xn; } printf("\n Wartosc e_do_x z szeregu:%f",s); printf("\n Wartosc e do x: exp %f\n", exp(x));} // koniec while system("pause"); return 0; } double silnia (int n) { int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil;}
Wynik działania programu ------------------------ Podaj x: 2 Podaj liczbe wyrazow szeregu:6 Wartosc e_do_x z szeregu:7.266667 Wartosc e do x: exp 7.389056 Podaj x: 2 Podaj liczbe wyrazow szeregu: 7 Wartosc e_do_x z szeregu:7.355556 Wartosc e do x: exp 7.389056 Podaj x: 2 Podaj liczbe wyrazow szeregu:8 Wartosc e_do_x z szeregu:7.380952 Wartosc e do x: exp 7.389056
Przykład. Użycie funkcji silnia i funkcji szerege w obliczaniu wartości szeregu (cz. 1) #include <stdio.h> #include <math.h> double silnia (int); double szerege(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);
Przykład. Użycie funkcji silnia i funkcji szerege w obliczaniu wartości szeregu (cz. 1) #include <stdio.h> #include <math.h> double silnia (int); double szerege(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);
Przykład. Użycie funkcji silnia i funkcji szereg w obliczaniu wartości szeregu (cz. 2) s=szerege(x,n); printf("\n Wartosc e_do_x z szeregu:%f",s); printf("\n Wartosc e do x: exp %f\n", exp(x));} system("pause"); return 0;} double silnia (int n){ int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil; } double szerege (double x, int n){ int i; double s=0,xn; for ( i=0;i<n;i++){ xn=pow(x,i)/silnia(i); s=s+xn; } return s;}
Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości sumy częściowej dla funkcji sinus(cz. 1) sin x n 0 ( 1) i x (2i 2i 1 1)! #include <stdio.h> #include <math.h> double silnia (int); double szeregs(double x, int n); int main(int argc, char *argv[]) { int i,j,n; double xn,s,sil,x; while(1) { printf("\n Podaj x:"); scanf("%lf",&x); printf("\n Podaj liczbe wyrazow szeregu:"); scanf("%d",&n);
Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości szeregu dla funkcji sinus(cz. 2) s=szeregs(x,n); printf("\n Wartosc sin x z szeregu:%f",s); printf("\n Wartosc sin x: sin(x)); } } system("pause"); return 0; double silnia (int n) { } int i; double sil=1; for (i=1;i<=n;i++) sil=sil*i; return sil; Język C funkcje %f\n",
Przykład. Użycie funkcji silnia i funkcji szeregs w obliczaniu wartości szeregu dla funkcji sinus(cz. 3) double szeregs(double x, int n) { int i; double s=0,xn; int wsp=-1; for (i=0;i<n;i++) { wsp*=(-1); xn=pow(x,2*i+1)/silnia(2*i+1)*wsp; s=s+xn; } return s; }
Podaj x:1.85 Język C funkcje Wynik działania programu ------------------------ Podaj liczbe wyrazow szeregu: 3 Wartosc sin x z szeregu:0.975312 Wartosc sin x: 0.961275 Podaj x:1.85 Podaj liczbe wyrazow szeregu: 6 Wartosc sin x z szeregu: 0.961275 Wartosc sin x: 0.961275 Podaj x:
umieszczona w jednym pliku). Język C funkcje Ogólna budowa funkcji Definicja funkcji Typ_zwracanej_wartości nazwa_funkcji (deklaracja parametrów formalnych, jeśli występują) { } deklaracje instrukcje Definicje poszczególnych funkcji mogą się pojawić w jednym pliku lub większej liczbie plików źródłowych, przy czym żadna funkcja nie może być rozdzielona między plikami źródłowymi (definicja funkcji musi być
int kwadrat (int, int); int echo_line (void); // void oznacza tutaj, że funkcja nie //ma parametrów void print_hist ( int size);// void oznacza tutaj, że funkcja // nic nie zwraca void print_prompt( void); Deklaracja funkcji Deklaracja funkcji stanowi informację dla innych funkcji stosujących daną funkcję o typie zwracanej wartości, liczbie i typach parametrów funkcji. Deklaracja ma postać skróconego nagłówka funkcji zakończonego średnikiem. Przykład. Deklaracje funkcji. Nazwy po typach parametrów są opcjonalne i są ignorowane przez kompilator. Nazwy parametrów stosować można dla celów dokumentacji, pozwalają one zorientować się co do roli poszczególnych parametrów bez sięgania do
Definicja a deklaracja funkcji Definicja funkcji może występować jednokrotnie. 1. Deklaracja funkcji f może występować wewnątrz funkcji g, która wywołuje daną funkcję f lub też na zewnątrz wszystkich funkcji. 2. Deklaracja funkcji f wewnątrz funkcji g służy tylko funkcji g. 3. Deklaracja funkcji f na zewnątrz wszystkich funkcji służy wszystkim tym funkcjom, których definicje umieszczono po deklaracji funkcji f.
// funkcja g - definicja { // deklaracja funkcji f f(...); // wywołanie f } // funkcja h -definicja { f(...); // wywołanie f } // funkcja f - definicja { } // deklaracja funkcji f // funkcja g - definicja { f(...); // wywołanie f } // funkcja h -definicja { f(...); // wywołanie f } // funkcja f -definicja { }
Instrukcja return (1) Instrukcja return ( ang. powróć, zwróć) pełni dwie zasadnicze funkcje: 1. Zwraca sterowanie programem do miejsca wywołania funkcji ( do funkcji wywołującej). 2. Umożliwia przekazanie wartości obliczonej przez funkcję do funkcji wywołującej.
- Funkcja, która zwraca wartość, powinna mieć przynajmniej jedną instrukcję return w formie Instrukcja return (2) return (wyrażenie); lub return wyrażenie; gdzie wyrażenie jest jakimkolwiek legalnym wyrażeniem języka C. - Obie formy mają to samo znaczenie. - Do funkcji wywołującej zwracana (przekazywana) jest wartość wyrażenia. - Funkcja przy wywołaniu może zwrócić co najwyżej jedną wartość.
Instrukcja return (3) Przykład. Instrukcja return. a) return 25*5 + fun2(x); b) return (25*5+ fun2(x)); c) double modul ( double x) { return x>0? x : -x; } Niezależnie od tego czy wyrażenie po return jest skomplikowane, czy też nie, zwracana jest jedna wartość.
Instrukcja return (4) Funkcja może posiadać kilka instrukcji return, jednak w czasie danego wywołania funkcji może zostać wykonana tylko jedna instrukcja return. Nie powinno się stosować w funkcji kilku instrukcji return, gdyż funkcja staje się mniej zrozumiała oraz trudniejsza do testowania i modyfikacji. Instrukcja return nie jest konieczna w funkcji, która nie zwraca żadnej wartości, ale jeśli jest używana to w postaci return; Jeśli nie ma instrukcji return wykonywane są kolejne instrukcje w treści funkcji, aż do momentu dojścia do nawiasu zamykającego funkcję.