Termin Egzaminu (Język C): !!! >> CZWARTEK, 7 LUTEGO << GODZ

Podobne dokumenty
Podstawy Programowania C++

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

1 Podstawy c++ w pigułce.

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

Pętla for. Wynik działania programu:

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

1 Podstawy c++ w pigułce.

Poprzedni wykład: - Elementarz formatowanego wejścia/wyjścia (podstawowe. - Sterowanie: instrukcje i bloki; instrukcja warunkowa (decyzje

Podstawy Programowania Podstawowa składnia języka C++

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Podstawy programowania skrót z wykładów:

Instrukcje sterujące

Język C, instrukcje sterujące (laboratorium)

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

7. Pętle for. Przykłady

4. Funkcje. Przykłady

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Stuck in the loop. Sterowanie. Marcin Makowski. 29 października Zak lad Chemii Teoretycznej UJ

Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Instrukcje sterujące. Programowanie Proceduralne 1

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Wstęp do Programowania, laboratorium 02

Programowanie - instrukcje sterujące

Pętle. Dodał Administrator niedziela, 14 marzec :27

Język C zajęcia nr 5

Kontrola przebiegu programu

System operacyjny Linux

Wprowadzenie do programowania w języku C

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Zmienne, stałe i operatory

Wstęp do informatyki- wykład 9 Funkcje

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy Programowania. Składnia wyrażeń i instrukcji, złożoności obliczeniowej, operacje wejścia i wyjścia, definicja

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Programowanie Obiektowe i C++

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Część 4 życie programu

Struktura pliku projektu Console Application

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Wstęp do informatyki- wykład 11 Funkcje

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

KURS C/C++ WYKŁAD 1. Pierwszy program

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

dr inż. Jarosław Forenc

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

Języki skryptowe w programie Plans

Wstęp do programowania

Ćwiczenie 1. Wprowadzenie do programu Octave

Języki programowania - podstawy

Informacja o języku. Osadzanie skryptów. Instrukcje, komentarze, zmienne, typy, stałe. Operatory. Struktury kontrolne. Tablice.

Zapis algorytmów: schematy blokowe i pseudokod 1

Programowanie - wykład 4

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Język C zajęcia nr 11. Funkcje

Programowanie strukturalne i obiektowe. Funkcje

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:

LABORATORIUM 3 ALGORYTMY OBLICZENIOWE W ELEKTRONICE I TELEKOMUNIKACJI. Wprowadzenie do środowiska Matlab

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Programowanie strukturalne i obiektowe

Język C, tablice i funkcje (laboratorium, EE1-DI)

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Opis: Instrukcja warunkowa Składnia: IF [NOT] warunek [AND [NOT] warunek] [OR [NOT] warunek].

Podstawy algorytmiki i programowania - wykład 4 C-struktury

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Podstawy programowania (1)

Język C, tablice i funkcje (laboratorium)

Programowanie komputerowe. Zajęcia 1

Programowanie w języku C++ Grażyna Koba

Podstawy programowania - 1

Podstawy Programowania

Podstawy programowania w języku C

Podstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

Podstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.

Języki i metodyka programowania. Wprowadzenie do języka C

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Podstawy programowania C. dr. Krystyna Łapin

Transkrypt:

Termin Egzaminu (Język C): >> CZWARTEK, 7 LUTEGO << GODZ. 11.00!!! Forma zaliczenia kursu: Egzamin pisemny (test wyboru) * ** * Warunkiem przystąpienia do egzaminu jest zaliczenie ćwiczeń (w uzasadnionych przypadkach: zgoda prowadzącego ćwiczenia) ** Ocena 5.0 (bdb) z ćwiczeń zwalnia z pisemnej części egzaminu [ OCENA KOŃCOWA: 0.5*ocena z ćwiczeń + 0.5*wynik egzaminu ] Adam Rycerz [ wyklad04.pdf ] Strona 1 z 31

Poprzedni wykład: - Co to jest algorytm? ( Przykłady ) - Przekształcenia typów i rzutowanie - Operatory zwiększania (++) i zmniejszania (--) - Operatory bitowe - Operatory przypisania ( += -= *= /= %= <<= >>= ) - Operator?: Adam Rycerz [ wyklad04.pdf ] Strona 2 z 31

Elementarz formatowanego wejścia/wyjścia Używając funkcji printf do wypisywania wartości zmiennych, np. fahr = 32 + (9.0/5) * celc; printf( %3.0f %6.1f\n, celc, fahr); podajemy tzw. specyfikacje przekształcenia, w tym wypadku: %3.0f oznacza, że liczba zmiennopozycyjna (celc) zostanie wypisana w postaci co najmniej 3 znaków, bez kropki dziesiętnej i części ułamkowej; zaś %6.1f oznacza, że kolejna taka liczba (fahr) ma zająć co najmniej 6 znaków i zawierać 1 cyfrę po kropce. Wyniki: 0 32.0 10 50.0 Adam Rycerz [ wyklad04.pdf ] Strona 3 z 31

Przykładowo, dla następujących specyfikacji przekształcenia, argument zostanie wypisany jako: %d liczba całkowita w zapisie dziesiętnym; %6d j.w., co najmniej 6 znaków; %o liczba całkowita w zapisie ósemkowym; %x liczba całkowita w zapisie szesnastkowym; %f liczba zmiennopozycyjna; %.2f %6.2f liczba zmiennopozycyjna z 2 miejscami po kropce; liczba zmiennopozycyjna z 2 miejscami po kropce, zajmująca co najmniej 6 znaków; %12.6e liczba zmiennopozycyjna w zapisie wykładniczym, co najmniej 12 znaków, 6 cyfr po kropce. Ponadto: %c jeden znak, %s napis, zaś %% wypisze znak %. Adam Rycerz [ wyklad04.pdf ] Strona 4 z 31

Sterowanie Instrukcje i bloki. Wyrażenie, np. i=0 czy i++ albo printf( ) staje się instrukcją, jeśli jest zakończone średnikiem: i = 0; i++; printf( ); średnik w C to ogranicznik instrukcji ( nie separator! ); w C istnieje zatem instrukcja pusta: ; Nawiasy klamrowe { oraz } są używane do grupowania deklaracji i instrukcji w bloki; blok to inaczej instrukcja złożona, składniowo równoważna jednej instrukcji. Zmienne (automatyczne!) można deklarować wewnątrz dowolnego bloku. [ Po nawiasie zamykającym blok } nie piszemy średnika! ] Adam Rycerz [ wyklad04.pdf ] Strona 5 z 31

Instrukcja warunkowa (if-else) Instrukcja if-else służy podejmowaniu decyzji: if (wyrażenie) instrukcja1 else instrukcja2 /* można też: if (wyrażenie!= 0) */ Część else jest opcjonalna, a w razie niejednoznaczności: if (n > 0) if (a > b) z = a; else z = b; => else jest automatycznie przyporządkowane najbliższej instrukcji if niezawierającej else (!) [ Za dużo { } nie przeszkadza ] Adam Rycerz [ wyklad04.pdf ] Strona 6 z 31

Decyzje wielowariantowe zapisywane są za pomocą ciągu: if (wyrażenie1) instrukcja else if (wyrażenie2) instrukcja else if (wyrażenie3) instrukcja else instrukcja Wartości wyrażeń są kolejno obliczane, pierwsze wyrażenie prawdziwe ( tzn.!= 0 ) powoduje wykonanie odpowiedniej instrukcji i zakończenie wykonywania całej konstrukcji. Adam Rycerz [ wyklad04.pdf ] Strona 7 z 31

Instrukcja switch Niestrukturalny substytut konstrukcji else-if, który nadaje się do zastosowania w przypadku, gdy wystarczy nam porównywanie pewnego wyrażenia z wartościami stałych całkowitych (lub wyrażeń stałych o wartościach całkowitych): switch (wyrażenie) { } case wyrażenie-stałe: instrukcje /* po if, else-if było case wyrażenie-stałe: instrukcje /* instrukcja =>JEDNA (!) */ default: instrukcje [ Wartości wyrażeń-stałych muszą być RÓŻNE. ] Wykonywanie instrukcji rozpoczyna się od pierwszego przypadku (case) dla którego wyrażenie == wyrażenie-stałe; instrukcje można pominąć. Adam Rycerz [ wyklad04.pdf ] Strona 8 z 31 */

W instrukcji switch przypadki znaczą tyle co etykiety, a zatem dalsze instrukcje wykonywane są po kolei, o ile jawnie nie wykonamy akcji przerywającej (zwykle: instrukcja break lub return). Przykład: /* Zliczamy poszczególne cyfry */ while ((c = getchar())!= EOF) { } switch (c) { case 0 : case 1 : case 2 : case 3 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : ndigit[c- 0 ]++; break; default: break; /* Ten break można pominąć - ALE */ } /* ucierpi przejrzystość programu */ Adam Rycerz [ wyklad04.pdf ] Strona 9 z 31

Pętle: while oraz for >> Nie ma programu bez błędów pętli << W przypadku pętli: while (wyrażenie) instrukcja /* Ponownie: JEDNA instrukcja (!) */ najpierw obliczane jest wyrażenie; jeśli wartość jest różna od zera wykonuje się instrukcję, następnie ponownie oblicza się wyrażenie, itd. [ Cykl powtarza się aż do chwili, gdy wartość wyrażenia stanie się zerowa wówczas sterowanie przechodzi do instrukcji po pętli. ] UWAGA: Jeśli na początku mamy: wyrażenie == 0, instrukcja wewnątrz pętli while nie zostanie wykonana ani raz (!) Adam Rycerz [ wyklad04.pdf ] Strona 10 z 31

Przykład: podstawiamy wartości 0, 1, 2, n-1 do tablicy int: i=0; while (i<n) { } tab[i] = i; i++; Inny przykład pętla nieskończona z instrukcją pustą: while (1) ; ( Pętla jak wyżej nigdy nie zakończy swojego działania! ) W praktyce: po while (1) zwykle mamy blok { } zawierający break lub return. Adam Rycerz [ wyklad04.pdf ] Strona 11 z 31

Zamiast pętli postaci: wyrażenie1; while (wyrażenie2) { } instrukcja wyrażenie3; można użyć formy krótszej: for (wyrażenie1; wyrażenie2; wyrażenie3) instrukcja [ Powyżej zakładamy, że w bloku instrukcja nie użyto continue; w przeciwnym przypadku obie formy różnią się jednym wykonaniem instrukcji wyrażenie3; ] Adam Rycerz [ wyklad04.pdf ] Strona 12 z 31

Z punktu widzenie gramatyki języka C wszystkie trzy składniki w nawiasie po for są dowolnymi wyrażeniami; najczęściej wyrażenie1 i wyrażenie3 to przypisania (wyrażenie3 często wykorzystuje operatory ++, --) zaś wyrażenie2 jest wyrażeniem warunkowym. W przykładzie z inicjowaniem tablicy liczbami 0, 1,, n-1: for (i=0; i<n; i++) tab[i]=i; [ Ale można też tak: for (i=0; i<n; tab[i]=i,i++); ] Każdy z elementów: wyrażenie1 wyrażenie3 może zostać pominięty; musi jednak pozostać średnik! Jeśli pominiemy wyrażenie2 przyjmuje się, że jest ono prawdziwe, a zatem: for (;;) { } jest pętlą nieskończoną. Adam Rycerz [ wyklad04.pdf ] Strona 13 z 31

ZAGADKA: Co robi ten program? #include <stdio.h> int main() { int i,n=10; } for (i=0; i<n; printf("%d\n",i),i++) return 0; Adam Rycerz [ wyklad04.pdf ] Strona 14 z 31

Odpowiedź: NIC! Po nawiasach ( ) pętli for powinna być instrukcja (pojedyncza zakończona średnikiem, lub blokowa w nawiasach { } ) W tym przypadku, instrukcja to: return 0; Program wypisujący liczby 0, 1,, 9: int main() { int i,n=10; } for (i=0; i<n; printf( %d\n,i),i++); return 0; [ Po nawiasie ) występuje instrukcja pusta! ] Adam Rycerz [ wyklad04.pdf ] Strona 15 z 31

Wybór pętli (while czy for?) w dużym stopniu zależeć będzie od osobistych upodobań; jeśli nie mamy ani części inicjującej ani modyfikującej bardziej naturalne wydaje się użycie while, np: while ((c=getchar())== c== \n c== \t ) zamiast ; /* pomijamy białe znaki */ for (; (c=getchar())== c== \n c== \t ; ); Z kolei jeśli występują proste instrukcje inicjujące i przyrostu, bardziej naturalne będzie użycie for, np: for (i=0; i<n; i++) { } Do dobrego stylu programowania nie należy wpychanie do nawiasów ( ) for-a obliczeń niemających nic wspólnego z inicjowaniem ani przyrostem, lepiej umieścić je w bloku { } Adam Rycerz [ wyklad04.pdf ] Strona 16 z 31

Dalsze przykłady: Sortowanie tablic Pętla for w odróżnieniu od while często umożliwia skupienie instrukcji sterujących w jednym miejscu. Jest to szczególnie korzystne w przypadku kilku zagnieżdżonych pętli. Funkcja shellsort porządkuje tablicę liczb całkowitych metodą podaną przez D.L. Shell a w 1959 roku. [ => Aby zostać zapamiętanym, warto wymyślać algorytmy dopasowane do nazwiska ] W tej metodzie, w fazach początkowych porównuje się elementy oddalone od siebie, a nie sąsiadujące (jak np. w prostej metodzie bąbelkowej). Celem jest szybkie wyeliminowanie dużego nieporządku, aby w późniejszych fazach było mniej do zrobienia. Dla porównania zaczniemy od prostego algorytmu sortowania bąbelkowego : Adam Rycerz [ wyklad04.pdf ] Strona 17 z 31

/* A function implementing the bubble-sort */ void bubblesort(int arr[], int n) { int i, j, temp; for (i = 0; i < n-1; i++) /* Last i elements are already in place */ for (j = 0; j < n-i-1; j++) if (arr[j] > arr[j+1]) { } temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } /* https://www.geeksforgeeks.org/bubble-sort/ & AR */ Adam Rycerz [ wyklad04.pdf ] Strona 18 z 31

W funkcji bubblesort występują dwie zagnieżdżone pętle: W pierwszej z nich, indeks i biegnie przez wszystkie elementy tablicy arr, zaś pętla druga porównuje każdą parę najbliższych sąsiadów w zbiorze n-i pierwszych elementów tablicy, i w razie potrzeby dokonuje ich zamiany. Przykładowo, po pierwszym przebiegu pętli wewnętrznej, największy element tablicy na pewno znajdzie się na miejscu n-1. W drugim przebiegu, największy spośród pozostałych (n-1) elementów zostanie umieszczony na miejscu n-2, itd., aż do pełnego uporządkowania elementów tablicy rosnąco (a ściślej: niemalejąco). Adam Rycerz [ wyklad04.pdf ] Strona 19 z 31

/* shellsort: porządkuje v[0] v[n-1] rosnąco */ void shellsort(int v[], int n) { int gap, i, j, temp; } for (gap=n/2; gap>0; gap/=2) for (i=gap; i<n; i++) for (j=i-gap; j>=0 && v[j]>v[j+gap]; j-=gap) { temp = v[j]; v[j] = v[j+gap]; v[j+gap] = temp; } Adam Rycerz [ wyklad04.pdf ] Strona 20 z 31

Operator przecinkowy Ciekawym operatorem języka C, często spotykanym w pętlach for, jest przecinek, ( inaczej: operator przecinkowy ). W ciągu: wyr1, wyr2, wyr3,, wyrn wyrażenia obliczane są od lewej do prawej; jako typ i wartość wyniku przyjmowane są typ i wartość wyrn. ( Jednak przecinki oddzielające argumenty funkcji, lub np. nazwy zmiennych w deklaracji nie są operatorami; w takich przypadkach nie ma gwarancji, że obliczenia będą wykonywane od lewej do prawej. ) W pętli for możemy użyć operatorów przecinkowych do sterowania równolegle kilkoma indeksami. Dalej funkcja reverse(s) odwraca kolejność znaków w napisie s: Adam Rycerz [ wyklad04.pdf ] Strona 21 z 31

#include <string.h> /* reverse(s) : odwróć napis s */ void reverse(char s[]) { int c, i, j; /* to nie operatory! */ } for (i=0, j=strlen(s)-1; i<j; i++, j--) { } c = s[i]; s[i] = s[j]; s[j] = c; Adam Rycerz [ wyklad04.pdf ] Strona 22 z 31

Pętla do-while W przypadku pętli while oraz for, warunek zatrzymania jest sprawdzany na początku a zatem instrukcja wewnątrz pętli może nie zostać wykonana ani razu. W przypadku pętli do-while jest inaczej; pętl zawsze wykona się co najmniej jeden raz. Składnia pętli jest następująca: do instrukcja while (wyrażenie); [ Najpierw wykonuje się instrukcję, a potem oblicza wyrażenie. ] Adam Rycerz [ wyklad04.pdf ] Strona 23 z 31

Funkcje w C: Wprowadzenie W języku C funkcje pozwalają dzielić duże programy na mniejsze podprogramy, jak również korzystać z tego, co zostało już zrobione przez innych (np. funkcji bibliotecznych). Co ciekawe: w C formalnie rzecz ujmując nie ma procedur, zastępują je funkcje typu void nie zwracające żadnej wartości. Program napisany w dobrym stylu powinien składać się z jak największej liczby krótkich funkcji, których działanie łatwo zrozumieć i przetestować niezależnie; poźniej funkcji można używać jak czarnych skrzynek, nie dbając o to, jak zostały zrealizowane. Dobrze zaprojektowane funkcje pozwalają zignorować to, jak zadanie zostało wykonane, wystarczy jedynie wiedzieć, co będzie zrobione. Adam Rycerz [ wyklad04.pdf ] Strona 24 z 31

Mechanizm definiowania funkcji w C ilustruje przykład podnoszenia liczby zmiennopozycyjnej do potęgi całkowitej: #include <stdio.h> double power(double x, int n); int main() { int j; for (j=-10; j<=10; j++) printf( %d %g\n, j, power(2.0,j)); return 0; } /* c.d.n. */ Adam Rycerz [ wyklad04.pdf ] Strona 25 z 31

/* power: podnieś x do potęgi n */ double power(double x, int n) { double p=1.0; int j; if (n<0) p = 1.0/power(x,-n); /* rekurencja! */ else for (j=1; j<=n; j++) p *= x; return p; /* zwracanie wartości */ } Adam Rycerz [ wyklad04.pdf ] Strona 26 z 31

Ogólnie, definicja funkcji w C ma postać: typ-zwracanej-wartości nazwa-funkcji( deklaracje parametrów, jeśli występują) { deklaracje instrukcje } Definicje mogą pojawiać się w dowolnej kolejności (także w różnych plikach źródłowych); funkcji nie można zagnieżdżać. [ Typ-zwracanej-wartości void oznacza, że funkcja nie zwraca żadnej wartości użytecznej: return; zwróci sterowanie do miejsca wywołania.] Adam Rycerz [ wyklad04.pdf ] Strona 27 z 31

Deklaracja występująca przed funkcją main(): double power(double x, int n); to tzw. prototyp funkcji; nazwy parametrów można pominąć, pisząc po prostu: double power(double, int); Nazwy parametrów mogą być też inne niż w definicji funkcji, musi się jednak zgadzać ich liczba i typy (podobnie jak typ funkcji). Nazwy te są przy tym całkowicie lokalne; inne funkcje mogą zatem bez problemów używać parametrów o tych samych nazwach. [ Dla zmiennych zewnętrznych wymyślamy nazwy oryginane; dla zmiennych lokalnych już niekoniecznie. ] Chociaż nazwy parametrów funkcji w jej protytypie można pominąć, często ułatwią one zrozumienie, co funkcja robi, bez czytania definicji. Adam Rycerz [ wyklad04.pdf ] Strona 28 z 31

Funkcja power jest wywołana w wierszu funkcji main : printf( %d %g\n, j, power(2.0,j)); Wywołanie przekazuje do funkcji dwa argumenty i sterowanie; po zakończeniu działania funkcja wraca do miejsca wywołania wraz z liczbą (wartością zwracaną) przeznaczoną do sformatowania i wypisania na standardowe wyjście. [ Nazewnictwo: parametr zmienna w nawiasach okrągłych w definicji funkcji; argument wartość używana przy wywołaniu funkcji. ] Obliczona wartość (przechowywana w zmiennej automatycznej p) jest przekazywana do main instrukcją: return p; Ogólnie po słowie kluczowym return można umieścić dowolne wyrażenie: return wyrażenie; Adam Rycerz [ wyklad04.pdf ] Strona 29 z 31

Jeśli pominąć wyrażenie samo return; zwróci do miejsca wywołania funkcji jedynie sterowanie, bez przekazywania wartości. ( Podobnie dzieje się przy przekroczeniu końca funkcji, tj. kiedy sterowanie dotrze do zamykającego nawiasu } ) Argumenty funkcji: Przekazywanie przez wartość Specyficzną cechą języka C jest to, że wszystkie argumenty funkcji są przekazywane przez wartość : oznacza to, że funkcja zamiast swoich argumentów otrzymuje tak naprawdę ich kopie, które istnieją jedynie w czasie działania funkcji, jako wartości zmiennych tymczasowych. [ Jeśli chcemy, aby funkcja faktycznie zmodyfikowała wartość jakiejś zmiennej musimy przekazać jej adres, technicznie: wskaźnik do tej zmiennej. ] Adam Rycerz [ wyklad04.pdf ] Strona 30 z 31

Zaleta przekazywania przez wartość polega na tym, że zyskujemy bez jawnej deklaracji dodatkowe zmienne tymczasowe zainicjowane wartościami wywołania. Często pozwala to pisać funkcje w sposób bardziej zwarty. Przykładowo, w naszej funkcji power możemy pominąć deklarację int j; pętla wykonująca mnożenia (dla n>=0 ) będzie wówczas wyglądać następująco: for (p=1.0; n>0; n--) p *= x; [ Cokolwiek zrobimy ze zmienną n wewnątrz funkcji power nie ma to żadnego wpływu na wartość zmiennej j w funkcji main. ] Adam Rycerz [ wyklad04.pdf ] Strona 31 z 31