Katedra Elektrotechniki Teoretycznej i Informatyki wykład 3 - sem.iii Dr inż. M. Czyżak
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 dwóch par 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 Język ANSI C funkcje Iloczyn 2.500000 * 3.500000 =8.750000 Aby kontynuować, naciśnij dowolny klawisz...
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 wartości szeregu (cz.1 ) i x x e = =0 i! #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 szeregu 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; %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 Podaj liczbe wyrazow szeregu:3 Język ANSI C funkcje Wynik działania programu ------------------------ 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
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ć umieszczona w jednym pliku).
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 definicji funkcji.
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 - //niepoprawne} // 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.
Instrukcja return (2) - Funkcja, która zwraca wartość, powinna mieć przynajmniej jedną instrukcję return w formie 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ę.
Język ANSI C wskaźniki Wskaźniki (1) - Wskaźniki to typ obiektów, przechowujących adresy innych obiektów np. zmiennych. - Adres to konkretna lokalizacja pewnego obiektu w pamięci. -Jeżeli pewien obiekt typu wskaźnikowego (np. zmienna) przechowuje adres innego obiektu, to mówimy, że wskazuje na ten obiekt. Wskazniki i dynamiczna alokacja ( link do materiału na temat wskaźników)
Język ANSI C wskaźniki int main() int x=5,y=23; int *px;// definicja zmiennej wskaźnikowej px=&x; } px y x 12FF88 23 5 zawartości 12FF80 12FF84 (1245056) (1245060) 12FF88 (1245064) adresy hex adresy dec Adresy te mogą się zmieniać przy kolejnych uruchomieniach programu, jednak w komórce px będzie zawsze adres zmiennej x.
Język ANSI C wskaźniki Przykład. Program obliczający adresy zmiennych i zawartość zmiennej wskaźnikowej. #include <stdio.h> int main(int argc, char *argv[]) int x,y; int *px; printf("\n Adres zmiennej x w hex = %p i w dec =%d\n", &x,&x); printf("\n Adres zmiennej y w hex = %p i w dec =%d\n", &y,&y); printf("\n Adres wskaznika px w hex =%p i w dec =%d\n",&px,&px); px=&x; printf("\n Zawartosc komorki px w hex =%x i w dec =%d\n", px,px); system("pause"); return 0; }