1 Podstawy programowania w języku C i C++Podstawy programowania w języku C i C++. Tematy: Funkcje: deklarowanie, definiowanie, wywołanie Cele nauczania: Podstawowe zasady programowania. Praktyczna znajomość elementów programowania w języku C/C++ Docelowo : Opracowanie algorytmu wybranego zadania geodezyjnego i przedstawienie go w postaci schematu blokowego. Opracowanie programu w wybranym języku programowania Wykonanie dokumentacji programu . Szczegółowe dla lekcji: Zapoznanie się z pojęciem funkcji, deklarowaniem, definiowaniem, wywoływaniem. Umiejętność zastosowania funkcji w prostych programach. Praktyczne wprowadzanie, uruchamianie i kompilacja programów z instrukcjami wejścia/wyjścia.. Cele operacyjne lub szczegółowe cele kształcenia Po zakończeniu lekcji uczeń będzie umiał: tworzyć i stosować podstawowe proste funkcje w programach C i C++
2 Część merytoryczna Część wstępnaCzęść wstępna - organizacyjna: przywitanie, sprawdzenie obecności, wpisanie tematu lekcji. Część merytoryczna Ogniwo 1. Uświadomienie uczniom celów – pogadanka Celem zajęć jest zapoznanie się z pojęciem funkcji i jej zastosowaniem. Po 2 lekcjach : wpisuje i uruchamia programy, z zastosowaniem funkcji
3 Ogniwo 2 Poznanie nowych faktów – pogadankaW języku C i C++ można stosować funkcje. W C funkcja to wydzielona część programu, która przetwarza argumenty i ewentualnie zwraca wartość, która następnie może być wykorzystana jako argument w innych działaniach lub funkcjach. Funkcja może posiadać własne zmienne lokalne. W języku C istnieją funkcje biblioteczne opracowane przez producenta danej implementacji translatora języka, realizujące pewne standardowe operacje. Nie wszystko da się jednak wcześniej przewidzieć i standaryzować. Użytkownik – programujący często musi opracowywać własne, niestandardowe funkcje. Najważniejsze korzyści ze stosowania funkcji: Program z wykorzystaniem funkcji jest bardziej czytelny i zrozumiały Jest bezpośrednia odpowiedniość między algorytmem a tekstem programu Pewne powtarzające się fragmenty lub realizujące ściśle określone operacje mogą być wyodrębnione i zapisane w postaci jednej funkcji.
4 Ogniwo 3. Kształtowanie pojęć, poznawanie, systematyzowanie wiedzy -Funkcje w języku C są podobne do procedur i funkcji w Pascalu czy podprogramów w Fortranie. W języku C nie można jednak dokonywać zagnieżdżeń w funkcjach. Zaleca się by liczba linii tekstu nie przekraczała 60. Funkcje pozwalają wydajnie skrócić tekst programu, gdy pewne jego fragmenty się powtarzają. Użytkownik może tworzyć własne biblioteki zorientowane problemowo (np. matematyka, raporty, grafika itp.), co pozwala zaoszczędzić czas przy powtarzających się lub podobnych problemach. W języku C funkcja to wydzielona część programu, która przetwarza argumenty i ewentualnie zwraca wartość, która następnie może być wykorzystana, jako argument w innych działaniach lub funkcjach. Funkcja może posiadać własne zmienne lokalne. Najważniejsze korzyści ze stosowania funkcji: Program z wykorzystaniem funkcji jest bardziej czytelny i zrozumiały Jest bezpośrednia odpowiedniość między algorytmem a tekstem programu Pewne powtarzające się fragmenty programu lub realizujące ściśle określone operacje mogą być wyodrębnione i zapisane w postaci jednej funkcji.
5 Instrukcje wejścia i wyjścia w języku C - powtórzenie:Wejście i wyjście programu Do podstawowych funkcji języka C, umożliwiających komunikację z otoczeniem należą: dla operacji wyjścia: putchar, puts, printf; dla operacji wejścia: getchar, gets, scanf; Wejście: Funkcja putchar wysyła pojedynczy znak na zewnątrz - standardowo na ekran. Funkcja puts() wysyła łańcuch s do standardowego strumienia wyjściowego (stdout) Funkcja printf() jest bardziej uniwersalna. Może wyświetlić dane dowolnego typu i współpracować z wieloma argumentami. printf(ciag_formatujący, lista parametrów); Ciąg formatujący: %d, %f, %c, %s, %o, %x, %e, %g
6 Operacje wejścia wprowadzanie danych w C i C++Do wczytywania danych stosuje się instrukcje getchar(), gets(), scanf() w C i C++ oraz cin >> w C++ Funkcja gets() służy do wczytania pojedynczej linii. Np. char linia[80]; gets(linia); getchar umożliwia wprowadzenie pojedynczego znaku Np. char znak; znak=getchar(); putchar(znak); scanf() to uniwersalna funkcja do wprowadzania wszelkiego typu informacji. Składa się z łańcucha sterującego i listy danych. scanf(„lancuch_sterujacy”,lista_danych); Np. float ilosc; scanf(„%f”,&ilosc); Łańcuch sterujący zawiera specyfikatory formatowania – jak będą interpretowane dane wejściowe. Specyfikatory formatowania: %d – wprowadza liczbę całkowitą, %u – liczba bez znaku, %f – liczba float, %e – liczba w systemie wykładniczym, %g – liczba dziesiętna w najkrótszym zapisie, %c – dana znakowa char, %s – łańcuch znaków, %o – liczba ósemkowa, %x – liczba szesnastkowa
7 Podsumowanie – wejście, wyjście, liczby, zmienne, wzorce konwersjiAby wczytać liczbę należy użyć funkcji scanf w postaci: scanf("wzorzec",&zmienna); Aby wypisać wczytaną w ten sposób liczbę należy użyć funkcji printf, która służy do wypisywania komunikatów. Postać funkcji: printf("Komunikat wzorzec",zmienna); W funkcji scanf zawsze przed nazwą zmiennej używamy znaku &, a nie robimy tego przy używaniu funkcji printf. Zmienna służy do przechowania danych, których wartość ustala się w trakcie działania programu i może być zmieniana. Każda zmienna musi być zadeklarowana przed jej użyciem jako zmienna odpowiedniego typu: int, float, char itp. Do wypisywania komunikatów służy funkcja printf, lub puts a do wczytywania zmiennych funkcja scanf. Do poprawnego użycia obu funkcji należy znać podstawowe wzorce konwersji: %d, %f, %s.
8 Preprocesor, dyrektywy, funkcje biblioteczne CW C istnieje duża biblioteka funkcji standardowych, czyli dostępnych bezpośrednio w systemie. Zawarte są w tzw. modułach. Moduły biblioteczne dołącza się przez instrukcję #include
9 Stałe symboliczne Stała symboliczna jest nazwą zastępującą ciąg znaków #define NAZWA tekst Np. #define PI #define MIEJSCOWOSC Sosnowiec #define WYNIK printf(("Pole=%d\f %”,pole1) #define WZOR1 (a*b)
10 Stałe symboliczne - makrodefinicjeStała symboliczna jest nazwą przedstawiającą inną stałą - numeryczną, znakową lub tekstową. Definicję stałej symbolicznej umożliwia instrukcja #define: #define NAZWA tekst gdzie NAZWA jest nazwą stałej symbolicznej, a tekst jest związanym z tą nazwą łańcuchem znaków Przykłady: Makrodefinicje proste: #define identyfikator
11 Makrodefinicje parametryczne#define identyfikator(idPar1, idPar2,...) ciąg_jedn_leksykalnych Np. #define ILORAZ(a,b) ((a)/(b)) //- makrodefinicja ILORAZ - parametry w nawiasach! #define SUMA(a,b) ((a)+(b)) W trakcie kompilacji nazwy stałych symbolicznych są zastąpione przez odpowiadające im łańcuchy znaków. Ułatwia to parametryzację programu, a także umożliwia zastępowanie często niewygodnych w pisaniu sekwencji programu, tworzenie makrodefinicji
12 Funkcje Funkcja to blok instrukcji realizujących określony cel.Funkcje mogą być biblioteczne lub własne – napisane przez programistę Wywołujemy funkcję, aby wykonać zadanie, możemy przekazywać argumenty do funkcji a funkcja może zwracać wynik. Funkcje są szczególnie użyteczne, kiedy trzeba wielokrotnie wykonywać to samo zadanie. Z funkcji korzystamy także dla wspomagania organizacji trudnego programu. Gdy programy stają się większe, to praca z jedną dużą funkcją main() staje się coraz trudniejsza. Program można podzielić na części wykorzystując funkcje. Program dzielimy na sekcje, z których każda wykonuje oddzielne kompletne zadanie. Sekcje można podzielić na mniejsze jednostki. Tworzymy pojedyncze funkcje do wykonywania oddzielnych zadań i po powiązaniu ich razem w funkcji głównej main() powstaje gotowy cały program
13 Pojęcie funkcji w C W C funkcja (czasami nazywana podprogramem lub procedurą) to wydzielona część programu, która przetwarza argumenty i ewentualnie zwraca wartość, która następnie może być wykorzystana jako argument w innych działaniach lub funkcjach. Funkcja może posiadać własne zmienne lokalne. W odróżnieniu od funkcji matematycznych, funkcje w C mogą zwracać dla tych samych argumentów różne wartości. Funkcję w języku C tworzy się następująco: typ identyfikator (typ1 argument1, typ2 argument2, typ_n argument_n) { /* instrukcje */ } Przykład funkcji: int iloczyn (int x, int y) { int iloczyn_xy; iloczyn_xy = x*y; return iloczyn_xy; } Przyjęło się, że procedura od funkcji różni się tym, że ta pierwsza nie zwraca żadnej wartości. Zatem, aby stworzyć procedurę należy napisać: void identyfikator (argument1, argument2, argument_n)
14 Funkcje - przykłady /* Przykład 1 - program do obliczenia objętości walca z wykorzystaniem funkcji */ /* Program p53c - Objętość walca - funkcja */ #include
15 Przykład 2. Obliczenie pola koła – funkcja// polekola.cpp - funkcja Dev C++ lub C++ Builder #include
16 Przykład 3 – dodawanie 2 liczb – Dev C++// dodaw.cpp - funkcja dodawanie() - Dev C++ #include
17 Definiowanie funkcji: deklaracja, definicjaDeklaracja funkcji zgodnie ze standardem ANSI języka C: typ_funkcji nazwa_funkcji (lista_parametrów_formalnych); np. int suma2(int a, int b); Typ funkcji należy do zbioru typów dozwolonych w języku C. Nazwa funkcji jest budowana analogicznie jak nazwa zmiennej (bez spacji, zaczyna się od litery lub znaku podkreślenia). Lista parametrów formalnych to zestaw par: Typ_parametru_formalnego, nazwa_parametru_formalnego (oddzielone są przecinkami). Jeżeli lista parametrów formalnych jest pusta – funkcje bezparametrowe to w nawiasach nie ma parametrów lub słowo void. Jeżeli funkcja nie zwraca wartości, typ funkcji zastępowany jest słowem kluczowym void. Każda funkcja przed jej zdefiniowaniem w języku C++ powinna być zadeklarowana przez podanie tzw. prototypu funkcji, czyli nazwy funkcji wraz z typem oraz w nawiasach parametrów formalnych Prototyp jest konieczny, gdy wywołanie następuje przed podaniem definicji, ale prototyp warto zawsze umieścić na początku programu, co pozwala na dowolną kolejność definicji różnych funkcji.
18 Przykłady deklaracji funkcji:int SumaKwadratow(int n); // funkcja podaje wartość int, jeden parametr formalny typu int void Fun1(int m); // funkcja nie zwraca wartości, jeden parametr typu int Fun2(void); // lista parametrów jest pusta void Fun3(void0; // funkcja nie podaje wartości i lista parametrów jest pusta
19 Definicja funkcji – opis funkcjiTyp_funkcji NazwaFunkcji (lista_parametrów_formalnych) {Instrukcje} Inaczej Typ nazwa (deklaracja parametrów) {Instrukcje} Opis – definicja funkcji składa się z linii nagłówkowej (deklaracyjnej) oraz bloku ograniczonego klamrami { }, zawierającego lokalne deklaracje oraz instrukcje. Instrukcja return pokazuje miejsce, gdzie funkcja kończy działanie. Jeśli instrukcja return nie występuje w treści funkcji, to funkcja kończy swe działanie po osiągnięciu nawiasu zamykającego } Jeśli funkcja zwraca wartość to występuje instrukcja return wartość; lub return (wartość); Dozwolone jest też wystąpienie kilku instrukcji return w funkcji.
20 Przykłady definicji funkcjivoid funkcja_a(void) // wydruk 20 kresek _ { int i;printf(„\n”); for (i=1; i<20; i+=) printf(“_“); // brak instrukcji return } int funkcja_d (int a, int b, float c) #define CG 15.51 { if (c>CG) return (b+2); else return(a-b); // 2 instrukcje return int SumaKwadratow(int n) { int i, suma=0; for (i=1; i<=n; i++) suma += i*i; return suma; } W języku C++ wewnątrz jednej funkcji nie można definiować innej funkcji. Wszystkie funkcje są zewnętrzne w stosunku do pozostałych.
21 Wywołanie funkcji Aby wywołać daną funkcję, należy podać jej nazwę oraz w nawiasach listę parametrów aktualnych. Parametry aktualne odpowiadają parametrom formalnym umieszczonym w definicji funkcji Wartość parametrów aktualnych jest przekazywana do parametrów formalnych i na nich są wykonywane obliczenia. zmienna = nazwa_funkcji lista_parametrów_aktualnych) np. n=10; wynik = sumaKwadratow(n); nazwa_funkcji (lista_parametrów_aktualnych) Np. funkcja_a(); funkcja_b(10);
22 Wywołanie funkcji - opisWywołanie funkcji ma postać nazwy funkcji z podaną w nawiasach okrągłych listą argumentów, oddzielonych przecinkami. Liczba argumentów wywołania musi być dokładnie taka sama jak liczba parametrów w deklaracji i definicji funkcji. Nawet, jeśli funkcja jest bezargumentowa, nawiasy musimy podać: w przeciwnym przypadku nazwa zostanie potraktowana nie jako wywołanie, ale jak nazwa zmiennej wskaźnikowej wskazującej funkcję. Rolę argumentów mogą pełnić dowolne wyrażenia, których wartość jest typu zgodnego z zadeklarowanym typem odpowiedniego parametru funkcji. Nie musi być to typ identyczny z typem parametru: wywołanie będzie prawidłowe, jeśli wartość argumentu można niejawnie przekształcić na wartość zadeklarowanego typu parametru. Jeśli przy takiej konwersji może być tracona informacja, (czyli jest to konwersja zawężająca, a nie promocja), to zazwyczaj podczas kompilacji otrzymamy ostrzeżenia.
23 Program – obliczenie sumy kwadratów podanej liczby// Program f_sumkw.cpp - Suma kwadratow C++ #include
24 Wykorzystanie funkcji w różnych programachZaprojektowanie funkcji SumaPoteg(), której celem jest obliczenie wartości wyrażenia: 1k + 2k + … + nk // kwadrat1.cpp #include
25 Wersja programu. w której jest funkcja zdefiniowana w innym pliku// Plik kwadraty.cpp #include
26 Program do obliczenia pola figur - funkcje// Definicje funkcji float poleprostokata() { float a, b, p; cout << "Pole prostokata: "; cout << "podaj boki a b => "; cin >> a >> b; p=a*b; cout << "Pole prostokata wynosi: " << p << endl; return(p); } float poletrojkata() { float a, h, p; cout << "Pole trojkata: "; cout << "podaj bok a i wysokosc h => "; cin >> a >> h; p=0.5*a*h; cout << "Pole trojkata wynosi: " << p << endl; float polekola() { float r, p; cout << "Pole kola: "; cout << "podaj promien => "; cin >> r; p=M_PI*r*r; cout << "M_PI=" << M_PI << " "; cout << "Pole kola wynosi: " << p << endl; // Polafig1a.cpp - pola figur - funkcje, Dev C++ #include
27 /* pola_1.cpp pola figur: do, swich, funkcje – wielokrotne oblicz. */ #include
28 Widoczność zmiennych – zmienne lokalneW każdej funkcji prawie zawsze występują zmienne. Pojawia się problem zmiennych o tych samych nazwach, z których korzystają różne funkcje. Należy znać zasadę widoczności i dostępności zmiennych w programie. Zmienne lokalne: Zmienne zadeklarowane wewnątrz danego bloku instrukcji widoczne są tylko w tym bloku. Przykład 1: zmienna i zadeklarowana w pętli for – poza nią nie jest znana include
29 Zmienne lokalne i globalneZmienna dostępna tylko w określonym fragmencie kodu programu (np. wewnątrz pojedynczego bloku instrukcji, w funkcji) i tylko w nim dostępna) nazywana jest zmienną lokalną. Jeśli zmienna została zadeklarowana poza funkcją główną main() oraz poza wszystkimi funkcjami, widoczna jest w całym programie i nazywana jest zmienną globalną.
30 Przykładowy program ze zmienną globalną liczba// zmglob.cpp - zmienna globalne i jej wykorzystanie w funkcji zamiast argumentów #include
31 Przekazywanie parametrów funkcjiPodczas wywołania funkcji do parametrów formalnych są przekazywane wartości parametrów aktualnych. Takie przekazywanie nazywa się przekazywaniem przez wartość. Wyjątkiem są tablice, do których przekazywany jest adres pierwszego elementu tablicy. Przekazywanie wartości parametrów aktualnych do parametrów formalnych oznacza, że po zakończeniu wykonywania funkcji, wartość parametru aktualnego nie zmienia się, nawet, gdy wartość parametru formalnego ulegnie zmianie wskutek operacji wykonywanych przez funkcję.
32 void zwieksz(int a, int b) { a = a+100; b = b+200; Przykład – funkcja zwieksz() z przekazaniem parametrów przez wartość nie powoduje zmiany parametrów aktualnych – zmieniają się tylko wartości parametrów w ramach funkcji. // zwieksz1.cpp #include
33 void zwieksz(int *a, int *b) { *a = *a+100; *b = *b+200; Zmiana wartości zmiennych (parametrów aktualnych) przez użycie wskaźników. Parametrami aktualnymi są tu adresy zmiennych x i y. Funkcja powoduje zmianę wartości zmiennych x i y. // zwieksz2.cpp - zwiększenie wartości parametrów aktualnych przez użycie wskaźników #include
34 Zmiana wartości zmiennych przez referencję// zwieksz3.cpp - zwiększenie wartości parametrów aktualnych przez referencję #include
35 Praktyczny przykład wymagający zmiany wartości parametrów aktualnych – zamiana wartości 2 zmiennych:// 1) zamianaR.cpp – zamiana wartości parametrów aktualnych przez referencję #include
36 Zamiana wartości zmiennych - parametrów aktualnych przez wskaźnik// 2) zamianaW.cpp - zamiana wartości parametrów aktualnych przez wskaźnik #include
37 Podsumowanie – przekazywanie parametrów do funkcjiDomyślnym sposobem przekazywania parametrów do funkcji jest przekazywanie przez wartość. Nie trzeba się wtedy martwić czy przypadkiem funkcja nie zmieni wartości parametru. W przypadku potrzeby zmiany parametru aktualnego należy wykorzystać wskaźniki lub zastosować referencję.
38 Argumenty funkcji głównej main()int main (int argc, char *argv[]) { … return 0; } Funkcja main akceptuje dwie zmienne: int argc - liczbę całkowitą pokazującą liczbę argumentów w wierszu poleceń przy wywoływaniu programu (łącznie z nazwą programu), char *argv[ ] - wskaźnik do tablicy ciągów znakowych, zawierających argumenty z wiersza poleceń; alternatywnie *argv[] może być zadeklarowany jako **argv, jeśli programiście ta postać bardziej odpowiada. Przykład Jeśli program został wywołany z systemu operacyjnego za pomocą następującego wiersza poleceń: program1 abc def 6 to argc wynosi 4, argv: arg[0] = "program1" arg[1] = "abc" arg[2] = "def" arg[3] = "6"
39 Argumenty funkcji głównej – program przykładowy//argfglow.cpp - argumenty funkcji głównej #include
40 Funkcje matematyczne
41 Program do obliczenia azymutu z wykorzystaniem funkcji atan2(y,x)/* azatan2. - obliczenie azymutu - while */ #include
42 Program do obliczenia azymutu z wykorzystaniem funkcji atan2(y,x)/* az_atan2 - obliczenie azymutu - instrukcja do…while */ #include
43 Funkcje matematyczne Funkcje matematyczne znajdują się w bibliotece math.h, należy na początku kodu programu dopisać dyrektywę #include
44 // Program funmat1.cpp - funkcje matematyczne#include
45 Wskaźniki do funkcji W C można nie tylko podstawić daną w miejsce zmiennej (jak w każdym języku programowania) ale także można podstawić w miejsce funkcji wywoływanej w programie, inną funkcję, która jest potrzebna (np. sin) Aby wskazać funkcję stosujemy wskaźnik do funkcji. Np. deklaracja double ( *funkcja ) (double); należy rozumieć następująco: „Za pomocą wskaźnika do funkcji *funkcja można wskazać takie funkcje, które: pobierają jeden argument typu double float; zwracają do programu wartość typu double float” Dostępne są standardowe funkcje matematyczne zdefiniowane w pliku math.h oraz inne funkcje własne.
46 // Program wskfunk.c - wskaźniki do funkcji#include