. Podstawy Programowania 1. Instrukcje sterujące. Arkadiusz Chrobot. 21 października 2015

Podobne dokumenty
Podstawy Programowania 1 Instrukcje sterujące. Plan. Instrukcje sterujące. Blok instrukcji. Notatki. Notatki. Notatki. Notatki.

Laboratorium 2: Pętle i instrukcje warunkowe. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

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

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

4. Funkcje. Przykłady

Wstęp do Programowania, laboratorium 02

Podstawy Programowania C++

Podstawy programowania. Wykład 3 Konstrukcje sterujące. Krzysztof Banaś Podstawy programowania 1

Język C zajęcia nr 5

Język C część 2. Podejmowanie decyzji w programie. if else. switch

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

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

1 Podstawy c++ w pigułce.

Cw.12 JAVAScript w dokumentach HTML

Instrukcje sterujące. Programowanie Proceduralne 1

Wykład 3. Instrukcje powtarzające

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

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

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

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

Podstawy programowania w języku C

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

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

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); }

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

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

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Instrukcje sterujące

Proste algorytmy w języku C

Pętla for. Wynik działania programu:

1 Podstawy c++ w pigułce.

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19

Konstrukcje warunkowe Pętle

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

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

do instrukcja while (wyrażenie);

Programowanie strukturalne i obiektowe. Funkcje

#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 ); }

Język C zajęcia nr 11. Funkcje

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

1. Wprowadzanie danych z klawiatury funkcja scanf

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Proste algorytmy w języku C

2 Przygotował: mgr inż. Maciej Lasota

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

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

Pętla for. Matematyka dla ciekawych świata -19- Scilab. for i=1:10... end. for k=4:-1:1... end. k=3 k=4. k=1. k=2

do instrukcja while(wyrażenie);

Programowanie - wykład 4

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

JAVAScript w dokumentach HTML (2)

Wstęp do programowania

Programowanie - instrukcje sterujące

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

dr inż. Jarosław Forenc

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

Wskaźniki w C. Anna Gogolińska

Algorytmy i struktury danych. Wykład 4

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

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Część 4 życie programu

6. Pętle while. Przykłady

Podstawy Programowania. Wykład 1

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

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

7. Pętle for. Przykłady

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

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

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Wstęp do programowania

Podstawy i języki programowania

Wstęp do programowania

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

Metody numeryczne Technika obliczeniowa i symulacyjna Sem. 2, EiT, 2014/2015

Funkcje. Spotkanie 5. Tworzenie i używanie funkcji. Przekazywanie argumentów do funkcji. Domyślne wartości argumentów

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

METODY KOMPUTEROWE W OBLICZENIACH INŻYNIERSKICH

Zmienne, stałe i operatory

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Algorytm. a programowanie -

Podstawowe elementy programowania strukturalnego. Wbudowane typy danych w C++

Wstęp do programowania

Podstawy Programowania Wykład trzeci: Instrukcje warunkowe i iteracyjne.

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

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

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

Luty 2001 Algorytmy (7) 2000/2001

3 Przygotował: mgr inż. Maciej Lasota

a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10]

#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 ); }

Programowanie strukturalne i obiektowe

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Laboratorium 1: Podstawy języka c. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

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

Język C - podstawowe informacje

Wykład II PASCAL - podstawy składni i zmienne, - instrukcje wyboru, - iteracja, - liczby losowe

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

Transkrypt:

.. Podstawy Programowania 1 Instrukcje sterujące Arkadiusz Chrobot Zakład Informatyki 21 października 2015 1 / 55

Plan.1 Instrukcje sterujące.2 Blok instrukcji.3 Instrukcja warunkowa.4 Instrukcja wielokrotnego wyboru.5 Instrukcje iteracyjne Pętla for Pętla while Pętla do while.6 Słowa kluczowe break i continue.7 2 / 55

Instrukcje sterujące Instrukcje sterujące Instrukcje sterujące lub instrukcje zmieniające przepływ sterowania w programie stanowią niezbędny element każdego języka programowania. Pozwalają one na wykonywanie lub wielokrotne wykonanie określonych instrukcji przetwarzania danych lub grup takich instrukcji, w zależności od wartości określonych warunków. Umożliwiają one zatem realizację złożonych algorytmów w programach komputerowych. 3 / 55

Blok instrukcji Blok instrukcji Blok instrukcji pozwala zgrupować instrukcje, które mają być przez program wykonane łącznie, jakby były pojedynczą instrukcją. Blok rozpoczyna znak {, a kończy znak. Zastosowanie bloku widzieliśmy na przykładzie definicji funkcji main(), jednakże jest on używany także w innych elementach programów, również razem z instrukcjami sterującymi. 4 / 55

Instrukcja warunkowa Opis Instrukcja warunkowa Instrukcja warunkowa jest instrukcją decyzyjną, która steruje wykonaniem innych instrukcji lub grup instrukcji w zależności od wartości zawartego w niej warunku. Schemat instrukcji warunkowej jest następujący: if(warunek) instrukcja; else instrukcja_alternatywna; Jeśli spełniony jest warunek to wykonywana jest instrukcja w przeciwnym przypadku instrukcja_alternatywna. Zarówno instrukcja, jaki i instrukcja_alternatywna mogą być pojedynczymi instrukcjami lub blokami instrukcji. Słowo kluczowe else może zostać pominięte wraz z instrukcją alternatywną. Warunek w instrukcji warunkowej może być dowolnym wyrażeniem. 5 / 55

Instrukcja warunkowa Uwagi Instrukcja warunkowa Język C pozwala pominąć nie tylko słowo kluczowe else i instrukcję alternatywną, ale również instrukcję znajdującą się tuż za warunkiem, poprzez postawienie średnika za zamykającym nawiasem okrągłym. Taki zapis ma niewielkie zastosowanie praktyczne. Jednym z najczęściej spotykanych błędów jest pomylenie w warunku instrukcji przypisania (=) z operatorem ==. Zapis warunku z operatorem przypisania jest uznawany przez kompilator 1 za prawidłowy i w pewnych sytuacjach może być celowo i poprawnie wykorzystany przez programistę. 1 Kompilator jedynie generuje ostrzeżenie domagając się, by programista umieścił taki warunek w dodatkowej parze nawiasów okrągłych 6 / 55

Instrukcja warunkowa Przykład Instrukcja warunkowa if(a==b) a=5; else b=5; Część programistów zaleca, aby stosować blok (umieszczać instrukcje w nawiasach klamrowych) nawet wtedy, gdy po warunku i/lub słowie kluczowym else występują tylko pojedyncze instrukcje: if(a==b) { a=5; else { b=5; 7 / 55

Instrukcja warunkowa Instrukcja warunkowa Zagnieżdżanie instrukcji warunkowych Instrukcję warunkową można umieścić w innej instrukcji warunkowej. Taką czynność nazywa się zagnieżdżaniem, a instrukcję znajdującą się wewnątrz innej - instrukcją zagnieżdżoną: if(a==3) { if(b==4) c=5; Ta technika pisania programu, może sprawić, że powstały kod będzie nieczytelny. Lepiej w takiej sytuacji zastosować warunek złożony: if(a==3 && b==4) c=5; Należy jednak pamiętać o tym, że w języku C stosowane jest skracanie obliczania warunków logicznych. 8 / 55

Instrukcja wielokrotnego wyboru Instrukcja wielokrotnego wyboru Instrukcja wielokrotnego wyboru pozwala wykonać zbiór instrukcji w zależności od wartości zmiennej typu int lub char lub typów od nich pochodnych. Schemat tej instrukcji jest następujący: switch(zmienna) { case wartość_1: instrukcja_1; break; case wartość_n: instrukcja_n; break; default: instrukcja; Liczba przypadków (case) jest ograniczona jedynie zakresem wartości przyjmowanych przez zmienną. 9 / 55

Instrukcja wielokrotnego wyboru Instrukcja wielokrotnego wyboru Uwagi Przypadek w instrukcji wielokrotnego wyboru może obejmować więcej niż jedną instrukcję. W takim wypadku wszystkie one muszą znajdować się przed słowem kluczowym break, które kończy zapis przypadku a podczas wykonania programu działanie instrukcji switch. Jeśli słowo break zostanie pominięte, to program przystąpi do realizacji następnego w kolejności przypadku, nie sprawdzając dla jakiej wartości zmiennej powinien on być wykonany. Czasem jest to przez programistów celowo wykorzystywane, lecz dosyć często stanowi błąd. Jeśli zmienna nie ma żadnej z wartości określonych w przypadkach, to zostaje wykonany przypadek domyślny oznaczony słowem kluczowym default. Ten przypadek może być całkowicie pominięty w zapisie instrukcji wielokrotnego wyboru. 10 / 55

Instrukcja wielokrotnego wyboru Instrukcja wielokrotnego wyboru Przykład switch(a) { case 1: puts("jeden"); break; case 2: puts("dwa"); break; case 3: puts("trzy"); break; default: puts("inna wartość"); Jeśli zmienna a będzie miała wartość 1, to program wypisze na ekran wyraz Jeden, jeśli 2, to na ekranie pojawi się napis Dwa. Podobnie program zachowa się, gdy zmienna a będzie miała wartość 3. Jeśli zmienna będzie miała inną wartość, niż trzy wyżej wymienione, to na ekranie pojawi się napis Inna wartość. 11 / 55

Instrukcje iteracyjne Instrukcje iteracyjne Instrukcje iteracyjne, nazywane krótko pętlami, pozwalają na powtarzanie określonej instrukcji lub grup instrukcji określoną (czasem nieskończoną) liczbę razy. Powtórzenie pętli nazywane jest w informatyce iteracją lub po prostu powtórzeniem. Zazwyczaj wynik każdej iteracji jest różny od wyniku jej poprzedniczki. W niektórych sytuacjach mogą one być takie same. 12 / 55

Pętla for Instrukcje iteracyjne Pętla for Pętla for służy do powtarzania instrukcji lub bloku instrukcji określoną, z góry zadaną liczbę razy. Z tą pętlą najczęściej jest związana co najmniej jedna zmienna nazywana licznikiem pętli lub zmienną sterującą. Schemat tej pętli jest następujący: for(inicjacja;warunek_kontynuacji;krok) instrukcja;,gdzie inicjacja oznacza nadanie licznikowi lub licznikom pętli wartości początkowej, warunek_kontynuacji oznacza warunek, który musi spełniać wartość licznika lub liczników pętli, aby się ona wykonywała, natomiast krok określa zmianę wartości tego liczników lub licznika pętli. Umieszczona w pętli instrukcja może być pojedynczą instrukcją lub blokiem instrukcji. W obu przypadkach ta część instrukcji iteracyjnej nazywa się ciałem pętli. Licznikiem (licznikami) pętli for może być zmienna dowolnego z przedstawionych na wykładzie pierwszym typów. Najczęściej te zmienne mają jednoliterowe nazwy, choć zdarzają się wyjątki do tej reguły. Pętle for można zagnieżdżać. 13 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { for(a=0;a<5;a++) printf("%d\n",a); return 0; 14 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { for(a=0;a<5;a++) { printf("%d\n",a); return 0; 15 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { for(a=1;a<=5;a++) printf("%d\n",a); return 0; 16 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { for(a=0;a<7;a+=2) printf("%d\n",a); return 0; 17 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { a=1; for(;a<=5;) { printf("%d\n",a); a++; return 0; 18 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a; int main(void) { for(a=7;a>0;a--) printf("%d\n",a); return 0; 19 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int i,j; int main(void) { for(i=7,j=0;i>j;j++,i--) printf("%d %d\n",i,j); return 0; 20 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> double x; int main(void) { for(x=0.0;x<0.5;x+=0.01) printf("%.10lf\n",x); return 0; 21 / 55

Pętla for Instrukcje iteracyjne Pętla for #include<stdio.h> int a,i; int main(void) { for(i=0;i<5;i++) { a+=i; printf("%d\n",a); return 0; 22 / 55

Pętla for Instrukcje iteracyjne Pętla for int a; int main(void) { for(a=0;a<5;a++) ; return 0; 23 / 55

Pętla while Instrukcje iteracyjne Pętla while Pętla while powtarza wykonanie objętych nią instrukcji tak długo, jak długo spełniony jest zawarty w niej warunek. Schemat takiej pętli jest następujący: while(warunek_kontynuacji) instrukcja; Podobnie, jak w przypadku pętli for, ciało pętli while może być pojedynczą instrukcją, blokiem instrukcji lub nawet być puste. Liczba powtórzeń takiej pętli nie jest z góry zadana, dlatego musi w niej być zawarte wyrażenie lub grupa wyrażeń, które spowodują, że po skończonej liczbie iteracji ta pętla się zakończy. Pętle while można zagnieżdżać. 24 / 55

Pętla while Instrukcje iteracyjne Pętla while #include<stdio.h> char a; int main(void) { while(a!='q') scanf(" %c",&a); return 0; 25 / 55

Pętla while Instrukcje iteracyjne Pętla while #include<stdio.h> char a; int main(void) { while(a!='q') { scanf(" %c",&a); return 0; 26 / 55

Pętla while Instrukcje iteracyjne Pętla while #include<stdio.h> int x,y; int main(void) { while(y>=0) { scanf("%d",&y); x+=y; return 0; 27 / 55

Pętla do while Instrukcje iteracyjne Pętla do while Pętla do while jest podobna do pętli while nie tylko w zapisie, również w działaniu. Podstawowa różnica między nimi polega na tym, że ciało w tej pierwszej zawsze wykona się co najmniej raz, ponieważ warunek jest w niej sprawdzany na końcu. Schemat tej pętli jest następujący: do ciało while(warunek);,gdzie, podobnie jak w przypadku innych pętli ciało może być pojedynczą instrukcją, blokiem instrukcji lub może być puste. 28 / 55

Pętla do while Instrukcje iteracyjne Pętla do while #include<stdio.h> char a; int main(void) { do scanf(" %c",&a); while(a!='q'); return 0; 29 / 55

Pętla do while Instrukcje iteracyjne Pętla do while #include<stdio.h> char a; int main(void) { do { scanf(" %c",&a); while(a!='q'); return 0; 30 / 55

Pętla do while Instrukcje iteracyjne Pętla do while #include<stdio.h> int x,y=1; int main(void) { do { x+=1; y*=x; while(x!=10); return 0; 31 / 55

Słowa kluczowe break i continue Słowo kluczowe break Słowo kluczowe break oprócz instrukcji wielokrotnego wyboru może być także użyte wewnątrz dowolnej pętli. Zazwyczaj jest ono wtedy umieszczone także w instrukcji warunkowej. Jeśli dojdzie do jego wykonania, to przerwie ono działanie pętli, kończąc ją tym samym wcześniej niż wynikałoby to z jej warunku kontynuacji. 32 / 55

Słowa kluczowe break i continue Słowo kluczowe continue Słowo kluczowe continue jest używane wyłącznie wewnątrz dowolnego rodzaju pętli. Podobnie jak break występuje ono wówczas w instrukcji warunkowej. Nie przerywa ono jednak całości wykonania pętli, a jedynie jej bieżące powtórzenie (iterację). 33 / 55

Słowa kluczowe break i continue Słowo kluczowe continue Przykład #include <stdio.h> int i; int main(void) { for(i=-5;i<=5;i++) { if(i==0) continue; printf("wynik dzielenia 5 przez %d: %lf\n",i,5.0/i); return 0; 34 / 55

Słowa kluczowe break i continue Słowo kluczowe goto Słowo kluczowe (instrukcja) goto (zlepek dwóch angielski słów go i to) powoduje przeniesie sterowania do wskazanego etykietą miejsca w programie. Ta etykieta może być znajdować się zarówno powyżej jak i poniżej wystąpienia instrukcji goto, a nawet wskazywać na miejsce jej wystąpienia. Choć początkowo ta instrukcja wydaje się bardzo użyteczna, to jej stosowanie w nowoczesnych językach programowania pociąga za sobą wiele problemów. W początkach techniki komputerowej była ona nadużywana, co prowadziło do powstawania nieczytelnych programów komputerowych. Doprowadziło to do tak dramatycznej sytuacji, że jeden z pionierów informatyki, Edsger Dijkstra zdecydował się publicznie zabronić jej używania. W języku C goto używana jest zazwyczaj do obsługi sytuacji wyjątkowych i (przez doświadczonych programistów) do usprawniania działania programów. Należy za wszelką cenę unikać jej używania w innych, nieuzasadnionych przypadkach. 35 / 55

Słowa kluczowe break i continue Słowo kluczowe goto Przykład #include <stdio.h> int i; int main(void) { label_1: i++; printf("%d\n",i); if(i==15) goto label_2; goto label_1; label_2: return 0; 36 / 55

Silnia Opis Silnia jest działaniem matematycznym na liczbach naturalnych, które zdefiniowane jest następująco: 0! = 1 1! = 1 n! = 1 2 3 4... (n 1) n Program na następnym slajdzie realizuje to działanie za pomocą pojedynczej pętli for. Jej licznik (zmienna i) służy także do przechowywania kolejnych liczb naturalnych, które mnożne są przez siebie. Proszę zwrócić uwagę, na użycie zmiennej factorial, która służy nie tylko do zapamiętania wyniku końcowego, ale także wyników częściowych. Pętla do while służy do ograniczenia użytkownikowi możliwości zlecenia programowi policzenia silni dla liczby większej niż 20. Wynik byłby większy niż może pomieścić typ long long int. Proszę zwrócić uwagę, że program działa poprawnie także wtedy, gdy każemy mu liczyć silnię z zera. Pętla for się wprawdzie nie wykona ani razu, ale prawidłowy wynik od początku będzie w zmiennej factorial. 37 / 55

Silnia Kod #include <stdio.h> unsigned long long int factorial = 1; unsigned char i,number; int main(void) { do { printf("podaj liczbę naturalną mniejszą niż 21, "); printf("dla której chcesz obliczyć silnię:\n"); scanf("%hhu",&number); while(number>20); for(i=1;i<=number;i++) factorial*=i; printf("silnia z %hhu to %llu\n",number,factorial); return 0; 38 / 55

Silnia Kod - inny zapis #include <stdio.h> unsigned long long int factorial = 1; unsigned char i,number; int main(void) { do { printf("podaj liczbę naturalną mniejszą niż 21, "); printf("dla której chcesz obliczyć silnię:\n"); scanf("%hhu",&number); while(number>20); for(i=1;i<=number;factorial*=i,i++) ; printf("silnia z %hhu to %llu\n",number,factorial); return 0; 39 / 55

Największy wspólny dzielnik Opis Kolejny przykład, to program, który liczy Największy Wspólny Dzielnik (ang. Greatest Common Divider - gcd. Jest on implementacją algorytmu z wykładu pierwszego, ale nie do końca wierną. Wprawdzie nazwy zmiennych zostały zachowane, ale ze względu na czytelność zapisu zdecydowałem, że lepiej będzie dopuścić do wykonania przypisań m = n i n = r, nawet po tym, jak obliczanie reszty da w wyniku zero.powoduje to jeszcze jedną rozbieżność. Wynik końcowy nie jest zapisany w zmiennej n, lecz w m. 40 / 55

Największy wspólny dzielnik Kod #include <stdio.h> unsigned int r, n, m; int main(void) { puts("podaj dwie liczby naturalne większe od zera"); scanf("%d",&m); scanf("%d",&n); do { r=m%n; m=n; n=r; while(r!=0); printf("największym wspólnym dzielnikiem podanych liczb jest %d\n",m); return 0; 41 / 55

Równianie kwadratowe Opis Kolejny program liczy pierwiastki równania kwadratowego, ale używając wzorów, które są odporne na akumulację błędów zaokrąglenia, które charakterystyczne są dla typów zmiennoprzecinkowych i które dają się zaobserwować dla przypadku gdy a c b i gdy używamy typu float. Te wzory to: q [b+sgn(b) ], 1 2 x 1 = q a oraz x 2 = c q, gdzie sgn to funkcja signum, która daje wartość 1, gdy b 0 lub 1 w przeciwnym przypadku. Proszę zwrócić uwagę, że program nie rozróżnia przypadku kiedy równanie ma tylko jeden pierwiastek. Zachowuje się on wówczas jakby istniały dwa pierwiastki o takiej samej wartości. Tę wadę można stosunkowo łatwo poprawić. Funkcję signum zrealizowano w nim za pomocą operatora trójargumentowego. Program jest zabezpieczony na wypadek, gdyby użytkownik wprowadził zero jako wartość współczynnika a. Użyta w programie funkcja sqrt() pochodzi z biblioteki matematycznej włączanej za pomocą nagłówka math.h i liczy pierwiastek kwadratowy z podanej liczby. 42 / 55

Równianie kwadratowe Kod #include<stdio.h> #include<math.h> float a,b,c,delta,q; int main(void) { puts("podaj współczynniki równania kwadratowego"); do { printf("a= "); scanf("%f",&a); if(a==0.0) puts("wartość współczynnika 'a' nie może wynosić 0! Wprowadź go jescze raz."); while(a==0.0); printf("b= "); scanf("%f",&b); printf("c= "); scanf("%f",&c); delta = b*b-4*a*c; if(delta>=0) { q= (b<0)? -0.5*(b-sqrt(delta)) : -0.5*(b+sqrt(delta)); printf("x1=%f x2=%f\n",q/a,c/q); else puts("brak rozwiązań w dziedzinie liczby rzeczywistych."); return 0; 43 / 55

Kod dwójkowy Opis Czasem występuje potrzeba wypisania na ekranie reprezentacji dwójkowej liczby dziesiętnej. Niestety, standard C99 języka C nie przewiduje specjalnego ciągu formatującego dla funkcji printf(), który umożliwiłby zrobienie tego w prosty sposób. Na szczęście problem staje się prostszy jeśli przypomnimy sobie, że każda liczba jest w sposób dwójkowy zapisana w pamięci komputera. Trzeba tylko ten zapis wyciągnąć na ekran. Robi to następny przykładowy program. Wypisuje on na ekran ośmiobitową wartość zmiennej typu char za pomocą pojedynczej pętli for. W tej pętli wartości kolejnych bitów (począwszy od najstarszego) zmiennej number wyznaczane są w operacji maskowania (iloczynu bitowego). Drugim argumentem tej operacji jest wartość stałej mask (jedynka na najstarszym bicie, pozostałe są równe zero), przesunięta w lewo o zadaną licznikiem pętli liczbę miejsc. 44 / 55

Kod dwójkowy Kod #include <stdio.h> #define MASK 128 // 10000000 int i; char number; int main(void) { puts("podaj liczbę, którą chcesz wpisać w postaci binarnej"); scanf("%hhi",&number); for(i=0;i<8*sizeof(number);i++) printf("%d",number&(mask>>i)?1:0); return 0; 45 / 55

Liczby pierwsze Opis Liczby pierwsze, to takie liczby naturalne większe od jeden, które dzielą się bez reszty wyłącznie przez jeden i przez siebie. Znajdywanie takich liczb jest na tyle skomplikowane, że mają duże liczby pierwsze mają zastosowanie w kryptografii. Kolejny program szuka takich liczb w przedziale od 3 do maksymalnej liczby mieszczącej się w typie unsigned long long int. Niestety, algorytm, który on stosuje jest mało efektywny. W najprostszej formie polega on na generowaniu kolejnych liczby naturalnych, które są dzielone przez wszystkie liczby, naturalne większe od jeden i mniejsze od niej samej. Program stosuje trochę udoskonaloną jego wersję. Liczby do sprawdzenia generowane są zewnętrznej pętli for, ale są to wyłącznie liczby nieparzyste. Wewnętrzna pętla for dzieli je przez wszystkie liczby naturalne począwszy od 2, a skończywszy na części całkowitej pierwiastka z tej liczby, powiększonego o jeden. Jeśli liczba nie podzieli się bez reszty w trakcie takiego sprawdzania, to znaczy, że jest pierwsza. Proszę zwrócić uwagę na użycie w programie zmiennej typu bool oraz instrukcji break. 46 / 55

Liczby pierwsze Kod #include <stdio.h> #include <limits.h> #include <math.h> #include <stdbool.h> unsigned long long int candidate, divider; bool prime; int main() { puts("liczby pierwsze od 3"); for(candidate=3;candidate<=ullong_max;candidate+=2) { prime=true; for(divider=2;divider<sqrt(candidate)+1;divider++) if(candidate%divider==0) { prime = false; break; if(prime) printf("%llu ",candidate); return 0; 47 / 55

Kosinus Opis W bibliotece matematycznej języka C dostępna jest funkcja cos(), która wyznacza kosinus kąta podanego w radianach. Warto jednak wiedzieć jak wartość takiej funkcji trygonometrycznej wyznaczyć bez pomocy biblioteki matematycznej. Jedną z metod jest użycie szeregu MacLaurina, który dla funkcji cos(x) przyjmuje następującą postać: cos(x) = 1 x2 2! + x4 4! x6 6! +... + ( 1)k x 2k (2k)! +... Jeśli podzielimy kilka pierwszych wyrazów tego szeregu parami przez siebie, to dojdziemy do wniosku, że każdy następny różni się od następnego o czynnik x2, gdzie i określa pozycję wyrazu w szeregu, przy czym i = 1 (2i)(2i 1) ma wyraz x2 2!. 48 / 55

Kosinus Opis - ciąg dalszy Program na następnym slajdzie liczy wartość kosinusa dla kąta równego π/3 radianów. W pętli while wartości kolejnych wyrazów są wyliczane i zapamiętywane w zmiennej term, zmienna cosinus zapamiętuje sumę wszystkich dotychczas obliczonych w pętli wyrazów szeregu, a i wyznacza numer pozycji kolejnego wyrazu. Pętla zatrzymuje się wtedy, gdy wartość wyliczonego z szeregu kosinusa będzie równa wartości zwróconej przez funkcję cos(). Tych wartości nie możemy jednak porównywać bezpośrednio, jedynie z pewną dokładnością. Tę dokładność definiuje w programie stała epsilon - jedenaście miejsc po przecinku. Porównujemy jej wartość z błędem bezwzględnym przybliżenia wartości kosinusa, czyli wartością bezwzględną z różnicy obliczonej wartości kosinusa i podanej przez funkcję cos(). Wartość bezwzględna liczona jest za pomocą funkcji fabs(), również dostępnej w bibliotece matematycznej. 49 / 55

Kosinus Kod #include<stdio.h> #include<math.h> #define EPSILON 1e-11 double cosinus = 1, term = 1, i = 1; const double x = M_PI/3; int main(void) { while(fabs(cos(x)-cosinus)>epsilon) { term *= -1.0*x*x/((2*i-1)*(2*i)); cosinus += term; i++; printf("wartość kosinusa dla kąta %lf wynosi %lf\n",x,cosinus); return 0; 50 / 55

Funkcja eksponencjalna Opis Podobnie jak w przypadku kosinusa możemy policzyć wartość funkcji eksponencjalnej. Dla niej szereg MacLaurina przyjmuje następującą postać: e x = 1 + x 1! + x2 2! + x3 3! +... + xk k! +... Postępując podobnie jak poprzednio ustalimy, że każdy następny wyraz szeregu różni się od poprzedniego o czynnik x i, gdzie i > 0 jest numerem pozycji wyrazu w szeregu. Program na następnym slajdzie liczy wartość eksponenty dla podanego przez użytkownika wykładnika w analogiczny sposób, jak liczył kosinusa program z poprzedniego slajdu. Główna różnica w konstrukcji pętli while polega na tym, że sprawdzany jest błąd względny wyliczonej z szeregu wartości i wartości funkcji exp() (również z biblioteki matematycznej), zamiast błędu bezwzględnego. Można w tym programie zastosować pierwszą z wymienionych metod, gdyż wartość zmiennej exponent nigdy nie jest równa zero. 51 / 55

Funkcja eksponencjalna Kod #include<stdio.h> #include<math.h> #define EPSILON 1e-1 double exponent = 1.0, x, i=1, term = 1; int main(void) { puts("podaj wykładnik potęgi, do której chcesz podnieść liczbę e"); scanf("%lf",&x); while(fabs((exp(x)-exponent)/exponent)>epsilon) { term *= (x/i); exponent += term; i++; printf("wartość e^x wynosi %lf\n",exponent); return 0; 52 / 55

Podziękowania W prezentacji wykorzystałem materiały udostępnione przez dra inż. Grzegorza Łukawskiego oraz mgra inż. Leszka Ciopińskiego. 53 / 55

Pytania? 54 / 55

koniec Dziękuję Państwu za uwagę! 55 / 55