Algorytmy i język C++ Tomasz Bielaczyc
|
|
- Sylwia Lis
- 8 lat temu
- Przeglądów:
Transkrypt
1
2 Literatura T. H. Cormen, C. E. Leiserson, R. L. Rivest, Wprowadzenie do algorytmów, WNT, 1997, J. Grębosz, Symfonia C++ standard, Editions 200 Kraków,2008, D. Harel, Rzecz o istocie informatyki (algorytmika), WNT, 1992, K. Jamsa, Wygraj z C++, ZNI "MIKOM", 1996.
3 Początek W IV w. p. n. e. Euklides podał algorytm wyznaczania NWD dwóch liczb naturalnych - jest to pierwszy znany algorytm. W III w. p. n. e. Eratostenes podał metodę znajdowania liczb pierwszych. Słowo algorytm wywodzi się od nazwiska perskiego matematyka z IX wieku Muhammeda Alchwarizmi (łac. Algorismus), który podał reguły dodawania, odejmowania, mnożenia i dzielenia liczb dziesiętnych.
4 Pierwsze kalkulatory William Oughtred stworzył suwak logarytmiczny w 1632 roku - po tym jak John Napier odkrył logarytmy. W 1642 roku Blaise Pascal stworzył Pascaline - pierwszy mechaniczny kalkulator - posiadający 8 obrotowych tarcz, dało się na nim wykonywać operacje dodawania i odejmowania na ośmiocyfrowych liczbach (zbudował takich urządzeń koło pięćdziesięciu - można je oglądać w muzeach). W 1694 roku Gottfried Wilhelm Leibniz zbudował Staffelwalze - wałek korkowy - maszynę do mnożenia (którą zaprojektował w 1671 roku). Thomas de Colmar skonstruował w 1820 roku kalkulator działający dzięki bębnom z kołami zębatymi - był on masowo produkowany przez kolejne 100 lat. Kalkulatory bazujące na prototypie stworzonym przez Willgodta Odhnera w 1890 roku używające tarcz z ruchomymi bolcami używane były do lat siedemdziesiątych dwudziestego wieku.
5 Pierwsze komputery W 1833 roku Charles Babbage zbudował "maszyne różnicową" służącą do obliczania pewnych wzorów matematycznych. Zrobił też projekt "maszyny analitycznej" do realizacji algorytmów zakodowanych w postaci otworów wydziurkowanych w kartach (wzorowanej na krośnie tkackim wynalezionym w 1801 roku przez Josepha Jacquarda). Kiedy Ada Byron zasugerowała, aby zilustrować działanie maszyny, pokazując, jak obliczałaby liczby Bernoulliego powstał algorytm uważany dziś za pierwszy program komputerowy.
6 Pierwsze współczesne komputery W 1890 roku Herman Hollerith zbudował maszyną tabulacyjną umożliwiającą dokonanie spisu ludności w USA w niecałe 3 lata. Do wprowadzania, sortowania i podliczania danych wykorzystywała dziurkowane karty. W 1896 roku Hollerith założył firmę Tabulating Machine Company, która w 1911 przekształciła się w International Business Machines (IBM). W 1939 Wiliam Hewlett i David Packard założyli firmę HP. Pierwszy komputer używający systemu binarnego został stworzony w 1933 roku przez Konrada Zuse. W 1945 roku powstał ENIAC - ważący 27 ton i zawierający lamp eelektronowych komputer służył do obliczeń różnorakiego rodzaju. W tym samym roku powstały tranzystory, dzięki którym kilka lat póżniej prędkość i wydajność komputerów została zwielokrotniona.
7 Asemblery Pierwsze "prawdziwe" komputery powstały w latach 40-tych XX wieku. Pierwsze języki programowania to asemblery. Są to języki bardzo zbliżone do kodu maszynowego. Jedna instrukcja języka odpowiada tutaj jednej instrukcji dla procesora. Języki tego typu nazywamy językami programowania niskiego poziomu. Kompilatory (języki tłumaczące zapis symboliczny na maszynowy) w tym przypadku również nazywane są asemblerami.
8 Języki wysokiego poziomu Aby ułatwić pracę użytkownikowi powstały języki wysokiego poziomu. Są to języki w dużym stopniu zrozumiałe dla użytkownika. Do przerobienia na język maszynowy konieczny jest kompilator, który rozbija polecenia na podpolecenia języka maszynowego. Przykładowe dzisiaj stosowane języki wysokiego poziomu to Java, Pascal, Python. Pierwszym takim językiem był Fortran stworzony w latach 50-tych przez Johna Backusa. Na przełomie lat 50-tych i 60-tych powstał Algol pierwszy język zaprojektowany we współpracy międzynarodowej.
9 Początki C W 1966 roku Martin Richards zaprojektował język BCPL (Basic Combined Programming Language). Jego następcą był język B, natomiast w 1972 roku Dennis Ritchie i Ken Thompson stworzyli język C (dla rozszerzenia możliwości języka B). Dopiero w 1978 roku język zyskał (ogromne) zainteresowanie w związku z pojawieniem się książki Briana Kerninghana i Dennisa Ritchiego pt. The C Programming Language (Język C, WNT, 1988). W 1981 roku po wprowadzeniu przez IBM komputera PC, język C oderwał się od UNIXowych korzeni i stał się populanym językiem mikrokomputerów.
10 C++ Język C zyskał popularność wśród programistów, gdyż umożliwia większą, niż inne języki kontrolę nad komputerem (można powiedzieć, że jest językiem niższego poziomu, niż np. Java). W roku 1983 Bjarne Stroustrup rozwinął C++. Rozszerza on C między innymi o obiekty (struktury mogące przechowywać dane i funkcje).
11 Kompilatory Rozwojowi języka grozi zawsze rozbicie na wiele niezgodnych ze sobą pakietów programowania. Kompilatory języka C dla PC są zgodne w obszarach objętych normą ANSI/ISO (American National Standarts Institute - Amerykański Narodowy Instytut Normalizacji, International Organization for Standardization - Międzynarodowa Organizacja Normalizacyjna), ale poza nimi występują różnice.
12 Najkrótszy możliwy program Najkrótszy możliwy program w języku C to main() {} Każdy program musi posiadać funkcję główną, której polecenia znajdują się w nawiasie {}. (W zależności od kompilatora do funkcji głównej często dodaje się przedrostek void lub int). Oczywiście powyższy program nic nie robi.
13 Instrukcja include Aby móc używać podstawowych komend wejścia/wyjścia musimy umieścić w programie ich definicje. Robimy to za pomocą instrukcji #include. Jest to dyrektywa preprocesora (kompilator wykonuje ją przed kompilowaniem). Dołącza ona plik odpowiedniej biblioteki. W poniższym przypadku mówi kompilatorowi, aby pobrał plik stdio.h i umieścił jego zawartość w tym miejscu programu.
14 Pierwszy program #include <stdio.h> int main() { printf("witaj świecie!"); //wypisuje na ekran: // Witaj świecie! }
15 Biblioteki W trakcie tego wykładu zamiast stdio.h będziemy używać biblioteki iostream. Ponadto dodamy przestrzeń nazw poleceniem using namespace std; (bez tego przed niektórymi poleceniami konieczne byłoby dopisywanie przedrostka std::). (Podobny do iostream z przestrzenią nazw std zasób poleceń, chociaż mniejszy, daje biblioteka iostream.h.)
16 Polecenia wejścia - wyjścia Jako polecenia standartowego wyjścia (wypisywania na ekran) będziemy wówczas mogli użyć cout (jest to polecenie języka C++) zamiast komendy printf z biblioteki stdio.h. Dla standartowego wejścia użyjemy komendy cin (a nie polecenia scanf).
17 Polecenia wejścia - wyjścia Wczytywane zmienne oddzielamy od siebie (oraz od polecenia cin) sybmolem >>. Wypisywane zmienne oraz wypisywany tekst (który wstawiamy w cudzysłów) odzielamy symbolem << (składnia poleceń printf oraz scanf jest bardziej skomplikowana)
18 Polecenia pomocnicze Poleceniem system("chcp 1250"); otrzymujemy możliwość dostania w konsoli polskich znaków - trzeba w tym celu we właściwościach konsoli wybrać czcionka: Lucida Console. Poleceniem ("cls"); możemy wyczyścić tekst w konsoli - po uruchomieniu programu pojawi się tylko tekst tego programu dotyczący. Aby konsola nie zniknęła natychmiast po wykonaniu zadania 1 w treści kodu programu musimy dopisać polecenie system("pause"); 1 dotyczy np. wxdev-c++
19 Zmienne typu char Zmienna typu char odpowiada jednemu znakowi i zajmuje jeden bajt pamięci (może ona służyć także do reprezentowania liczb w zakresie od -128 do 127).
20 Zmienne typu char Poniższy program wczytuje, a następnie wypisuje dwie litery. #include<iostream> using namespace std; int main( ) { char a, b; //deklarujemy dwie zmienne typu char cout<<"podaj swoje inicjały\n"; //"\n"-przejście do nowej linii cin >> a >> b; //wczytanie zmiennych a, b cout<<"imię zaczyna się od "<<a<<", a nazwisko od "<<b<<".\n"; }
21 Tablica znaków W poniższej funkcji głównej programu aby wczytać ciąg liter użyjemy tablicy znaków typu char. char IMIE[15]; //15 - maksymalna długość ciągu znaków cout << "Jak masz na imię? \n"; cin >> IMIE; //wczytanie ciągu znaków cout << "Witaj " << IMIE << "! \n";
22 Zmienne typu string Zamiast deklarować tablicę znaków możemy użyć zmiennej typu string. Niektóre kompilatory wymagają dodania biblioteki string (czyli dopisania w nagłówku #include <string>). Napiszmy jeszcze raz podobny program string imie, adres, dane; cout << "Podaj swoje imię. \n"; cin >> imie; cout << "Podaj swój adres. \n"; cin >> adres; //wpisujemy bez użycia spacji
23 Zmienne typu string Na koniec wypiszmy dane cout << "imię: " << imie << ", adres: " << adres << endl; (Ten sam efekt wypisania danych uzyskamy pisząc dane="imię: "+imie+", adres: "+adres; cout << dane << endl; //endl = "\n" )
24 Zmienna typu int Jednym z najbardziej popularnych typów zmiennych jest zmienna typu int. Typ int ma obecnie 2 rozmiar czterech bajtów (32 bitów) i obejmuje liczby całkowite z zakresu od (czyli ) do Zmienna unsigned mając 4 bajty reprezentuje liczby od 0 do Gdybyśmy chcieli działać na jeszcze większych liczbach możemy użyć zmiennej typu long long o rozmiarze ośmiu bajtów. 2 zależnie od kompilatora i od procesora, można to sprawdzić wpisując w programie cout «sizeof(int);
25 Zmienna typu int Dopiszmy do naszego programu pytanie o wiek. int wiek; int rok=2011; //deklarując zmienną możemy przypisać jej wartość cout << "Ile lat skończyłeś(łaś) lub skończysz w tym roku? \n"; cin >> wiek; rok = rok-wiek; //przypisanie nowej wartości zmiennej rok cout << "Urodziłeś się w " << rok << " roku. \n";
26 Działania, zakres int-a Oczywiście, +, są standartowymi działaniami. Operacja / daje dla zmiennych całkowitych wynik dzielenia z resztą (działanie na int-ach musi zwracać int-a). Działanie % daje resztę z dzielenia. Łatwo podać przykład dwóch liczb będących w zakresie int-a, których iloczyn bądź suma wychodzą poza ten zakres - wówczas otrzymamy nieprawidłowy wynik.
27 Kod ASCII Kod ASCII (American Standard Code for Information Interchange) przyporządkowuje liczby z zakresu literom i innym symbolom. Duże litery są reprezentowane liczbami od 65 do 90, a małe liczbami od 97 do 122. Wykonując poniższy program można sprawdzić jaką liczbą jest kodowany dany znak.
28 Kod ASCII Pisząc char znak; cin >> znak; int kod=znak; otrzymamy przyporządkowanie znakowi wpisanemu z klawiatury jego kodu ASCII. Następnie możemy go wypisać cout<<"znak "<<znak<<" jest kodowany liczbą "<<kod<<".";
29 Zadania Zadanie Napisz program proszący o podanie pięciu liter, a następnie wypisujący je na ekran w odwrotnej kolejności. Zadanie Napisz program pytający o imię, nazwisko oraz miasto zamieszkania, a następnie wypisujący te dane na ekran.
30 Zadania Zadanie Napisz program proszący o podanie dwóch liczb całkowitych, a następnie wypisujący ich sumę, różnicę, iloczyn oraz wynik dzielenia z resztą pierwszej przez drugą i drugiej przez pierwszą. Zadanie Napisz program pytający o rok i miesiąc urodzenia oraz wypisujący na ekran ilość przeżytych miesięcy. Zadanie Pisząc c=a%b; przypisujemy zmiennej c resztę z dzielenia a przez b. Napisz program obliczjący resztę z dzielenia pierwszej podanej liczby przez drugą bez użycia %.
31 Zadania Zadanie Napisz program proszący o wpisanie kolejnych trzech znaków z klawiatury i wypisujący ich kod ASCII. Zadanie Napisz program proszący o podanie liczby z zakresu od 97 do 122, a następnie wypisujący dla jakiej litery podana liczba jest kodem.
32 Instrukcja if Instrukcja warunkowa if umożliwia wykonanie pewnego polecenia lub bloku poleceń przy założeniu, że spełniony jest odpowiedni warunek. Może być postaci if(warunek) instrukcje lub if(warunek) instrukcja1 else instrukcja2 i tak dalej.
33 Instrukcja if Jeżeli instrukcja składa się z więcej niż jednego polecenia musi cała być wzięta w nawias { }. W warunku często używamy operacji relacji: == równy, > większy, >= większy lub równy, < mniejszy, <= mniejszy lub równy,! = różny oraz operatorów logicznych && oraz, lub,! nieprawda, że.
34 Podzielność Sprawdźmy podzielność jednej liczby całkowitej przez drugą. int a, b; cout << "Podaj a \n"; cin >> a; cout << "Podaj b \n"; cin >> b; if (a%b>0) cout << "Liczba a nie jest podzielna przez b. \n"; else cout << "Liczba b dzieli a. \n";
35 Minimum Znajdźmy teraz najmniejszą z trzech różnych liczb. int a, b, c; cout << "Podaj trzy różne liczby \n"; cin >> a >> b >> c; if (a<b && a<c) cout << "Pierwsza podadana liczba jest najmniejsza. \n"; else if (b<c) cout << "Druga podadana liczba jest najmniejsza. \n"; else cout << "Trzecia podadana liczba jest najmniejsza. \n";
36 Typ zmiennoprzecinkowy W poniższej funkcji użyjemy zmiennej typu float. Zajmuje ona 4 bajty pamięci, ma zakres od do i dokładność 6 cyfr znaczących. Przykładowo zapis e+09 oznacza liczbę , zapis e-13 oznacza
37 Równanie liniowe Aby rozwiązać równanie liniowe ax = b najpierw wczytajemy dane. float a, b, wynik; cout <<"Rozwiążmy równanie liniowe postaci ax=b. \n"; cout << "a="; cin >> a; cout << "b="; cin >> b;
38 Równanie liniowe Mamy trzy możliwości if (a!=0) { wynik=b/a; //dla typu float / jest zwykłym dzieleniem cout <<"Rozwiazaniem jest b/a=" <<wynik <<endl; } else if (b==0) cout <<"Rozwiązaniem jest każda liczba rzeczywista.\n"; else cout << "Równanie nie ma rozwiązań. \n";
39 Instrukcja switch W przypadku, gdy alternatywnych warunków jest więcej (i gdy da się je przedstawić za pomocą wartości) warto użyć instrukcji switch. Po wczytaniu danych float a,b; char dzialanie; cout << "Wprowadz dane: <liczba> <dzialanie> <liczba> \n"; cin >> a >> dzialanie >> b; możemy napisać funkcję definiującą wybrane działanie.
40 Instrukcja switch switch(dzialanie) { case + : cout << a+b << endl; break; case - : cout << a-b << endl; break; case * : cout << a*b << endl; break; case / : if(b==0) cout << "Nie dziel przez zero! \n" else cout << a/b << endl; break; default: cout << "Nieznane działanie" << endl; }
41 Dokładność Jeśli po uruchomieniu powyższego programu wpiszemy sumowanie bardzo dużej i bardzo małej liczby możemy dostać nieprawdziwy lub niedokładny wynik. Przykładowo sumując otrzymamy wynik Sześciocyfrowa dokładność zmiennych typu float nie pozwala otrzymać precyzyjnego wyniku w tym przypadku.
42 Dokładność Możemy poprawić dokładność używając zmiennej typu double. Ma on 8 bajtów i dokładność 15 cyfr znaczących. Można za jej pomocą reprezentować liczby z zakresu od 1.7e 308 do 1.7e Aby program wypisywał wynik obliczeń ze zwiększoną dokładnością musimy przed poleceniami wypisywania dodać polecenie cout.precision(15);
43 Inne działania Jeżeli chcemy poza standardowymi działaniami otrzymać na przykład sin(a), cos(a), log(a) lub a b poleceniem pow(a,b) albo całość z a poleceniem floor(a), musimy dołączyć do programu bibliotekę math.h. Napiszmy funkcję, która dla podanych liczb rzeczywistych a, b sprawdza, czy większe jest a b, czy b a.
44 include<math.h> float a,b; cout << "Wpisz dwie liczby \n"; cin >> a >> b; if(pow(a,b)>pow(b,a)) cout<<"a^b="<<pow(a,b)<<"<b^a="<<pow(b,a)<<endl; else if(pow(a,b)<pow(b,a)) cout<<"a^b="<<pow(a,b)<<"<b^a="<<pow(b,a)<<endl; else cout<<"a^b="<<pow(a,b)<<"=b^a="<<pow(b,a)<<endl;
45 Zadania Zadanie Napisz program proszący o podanie liczby całkowitej, a następnie wypisujący jej wartość bezwzględną. Zadanie Napisz (używając instrukcji switch) program pytający o ocenę jaką dostałeś na ostatnim egzaminie i po wczytaniu cyfry wypisujący ocenę pisemnie.
46 Zadania Zadanie Napisz program proszący o podanie trzech liczb całkowitych, a następnie stwierdzający, która z nich (lub które) jest największa. Zadanie Napisz program proszący o wybranie obliczenia pole koła lub pola trójkąta równobocznego, następnie proszący o podanie średnicy (lub długości boku) i obliczający (z dokładnością 15 cyfr) pole wybranej figury. Zadanie Napisz program proszący o podanie parametrów a, b, c, a następnie rozwiązujący równanie kwadratowe ax 2 + bx + c = 0.
47 Pętla for Pętla for ma postać for(stan początkowy; warunek; zmiany) instrukcje Przykładowo pętla służąca do wypisania 20 kolejnych liczb parzystych będzie wyglądać następująco int i, n=20; for(i = 0; i < n; i++) //instrukcje będą wykonywane dopóki i<n cout << 2*i << ", "; //i++ oznacza zwiększenie i o 1
48 Pętla for Napiszmy funkcję proszącą o podanie liczby naturalnej n, a następnie dla liczb i < n sprawdzający, czy i jest dzielnikiem n. int i, n; cout <<"Podaj liczbę n"<<endl; cin >>n; for(i = 2; i < n; i++) { if(n%i==0) cout <<"Liczba "<<i<<" dzieli "<<n<<".\n"; else cout <<"Liczba "<<i<<" nie dzieli "<<n<<".\n"; }
49 Liczby pierwsze Chcąc dostać odpowiedź na pytanie, czy n jest liczbą pierwszą w powyższym programie zadeklarujemy dodatkowo zmienną odp=0 oraz zmodyfikujemy warunek w następujący sposób if(n%i==0) odp=1; a na koniec napiszemy if(odp==0) cout <<"Liczba "<<n<<" jest pierwsza.\n"; else cout <<"Liczba "<<n<<" nie jest pierwsza.\n";
50 Ciąg liczb losowych Napiszmy program wczytujący losowy ciąg liczb z zakresu od 1 do 1000, a następnie znajdujący element maksymalny. Aby móc losować liczby poleceniem rand() potrzebujemy (dla niektórych kompilatorów) biblioteki stdlib.h. Aby tablica "wylosowanych" liczb nie była za każdym wykonaniem programu taka sama (początkowa wartość generatora jest za każdym razem taka sama) wstawimy przed pętlą polecenie srand(time(0)); które jako wartość początkową bierze liczbę sekund, która upłynęła od północy 1 stycznia 1970 roku. Potrzebna jest do tego (dla pewnych kompilatorów) biblioteka ctime. (Ponadto w preambule możemy zdefiniować stałą N równą 20 poleceniem #define N 20.)
51 Maksimum Losowanie ciągu liczb będzie wyglądać następująco int main() { srand(time(0)); int i, max=0; int T[N]; //deklarujemy tablicę (statyczną) for(i = 0; i < N; i++) { T[i] = rand() % (1000); cout << T[i] << endl; } }
52 Maksimum Dopiszmy pętlę znajdującą element maksymalny. for(i = 0; i < N; i++) if(t[i]>max) max = T[i]; cout << "Maksymalna z powyższych liczb to " << max << endl;
53 Złożoność Zauważmy, że szukając maksymalnego elementu wykonaliśmy n operacji porównania. Oznacza to, że program ma złożoność obliczeniową O(n) - czas wykonania jest proporcjonalny do liczby n danych wejściowych (rośnie liniowo ze wzrostem liczby elementów).
54 Złożoność Programy o złożoności O(n) działają dosyć szybko nawet dla dużych n. Dużo wolniej działają programy o złożoności O(n 2 ) (przykładowo dla n = średnio szybkiemu komputerowi wykonanie programu zajmie około jednej sekundy, czas rośnie tutaj z kwadratem, więc dla n = wykonanie programu zajmie około 16 sekund, dla n = ponad minutę). Dlatego warto, gdy tylko to możliwe, zastępować je programami o złożoności O(n logn).
55 Zadania Zadanie Napisz program sprawdzający czy podana liczba jest liczbą pierwszą. Zadanie Napisz program liczący silnię zadanej liczby. (Co się stanie, gdy wynik przekroczy zakres inta?) Zadanie Napisz program proszący o podanie liczby miesięcy n, kwoty k oraz oprocentowania rocznego p (z miesięczną kapitalizacją) i liczący jaką kwotę otrzymamy wpłacając k złotych na n miesięcy.
56 Zadania Zadanie Napisz program proszący o podanie liczby n, a następnie o wpisanie n liczb rzeczywistych i liczący ich sumę. (Czy możemy dodawać liczby bardzo duże do liczb bliskich zeru?) Zadanie Napisz program wczytujący losowo ciąg 1000 liczb naturalnych mniejszych od i sprawdzający, czy w tablicy znajduje się liczba 1000, a jeśli tak, to na którym miejscu. Zadanie Napisz program wczytujący dla podanej liczby n < ciąg liczb naturalnych długości n oraz znajdujący równocześnie (jedna pętla) minimalny i maksymalny element tego ciągu. (Jaka jest najmniejsza, a jaka największa ilość porównań, które program wykona?)
57 Pętla do while Pętla do while ma postać do instrukcje while(warunek); Instrukcje będą wykonywane dopóki spełniony będzie zadany warunek (zatem wykonanie instrukcji powinno między innymi zmieniać wartość zadaną w warunku).
58 Pętla do while - suma Napiszmy pętlę sumującą kolejne podawane liczby do momentu, gdy suma przekroczy wartość int a, suma=0; cout << "Wpisuj kolejne liczby. \n"; do { cin >> a; suma+=a; //równoznaczne z suma=suma+a; cout << "suma=" << suma << endl; } while(suma<=100);
59 Pętla while W powyższym przypadku instrukcja zostanie wykonana co najmniej raz. Jeśli zastosujemy pętlę while zaczyniemy od sprawdzenia warunku, więc możemy ani razu nie wykonać instrukcji. Pętla while jest postaci while(warunek) instrukcje
60 Pętla while - potęgi Napiszmy funkcję liczącą kolejną potęgę podanej liczby, dopóki jest ona mniejsza niż int liczba; cout << "Podaj liczbę \n"; cin >> liczba; int potega=liczba, wykladnik=1; while(potega<1000) { cout << liczba <<"^"<< wykladnik << "=" << potega << endl; potega*=liczba; //lub potega = liczba*potega; wykladnik++; }
61 do while vs while Zauważmy, że gdybyśmy użyli tutaj pętli do while, to w przypadku, gdyby pierwsza podana liczba była większa od 1000, wypisany zostanie pierwsza potęga tej liczby mimo, iż wypisywane miały być tylko potęgi mniejsze od Pętle do while, while oraz for można stosować zamiennie (w powyższym programie po dokonaniu pewnych poprawek moglibyśmy użyć pętli do while, a nawet for), jednak czasem użycie jednej jest dużo wygodniejsze niż innych.
62 Wyszukiwanie elementu w tablicy Aby napisać algorytm sprawdzający, czy dany element znajduje się w danej uporządkowanej tablicy liczb, możemy np. sprawdzić po kolei wszystkie elementy tablicy. Algorytm taki ma złożoność pesymistyczną O(n).
63 Wyszukiwanie binarne Algorytm wyszukiwania binarnego polega na wybraniu środkowego elementu tablicy i sprawdzeniu czy jest on szukanym elementem, a jeśli nie, to czy jest mniejszy czy większy od elementu szukanego. Jeśli jest mniejszy, powtarzamy procedurę dla lewej połowy tablicy, jeśli większy, dla prawej połowy. Ponieważ w każdym kroku zmniejszamy zakres poszukiwań co najmniej dwukrotnie, więc algorytm ma złożoność O(log n) (log rozumiany jest jako logarytm o podstawie 2). Poniższy program sprawdza, czy we wczytanej wcześniej tablicy T takiej, że T[i]<T[i+1] dla i {1,...,N}, znajduje się liczba S.
64 Wyszukiwanie binarne int l=1, p=n, odp=0, n; while (l<=p && odp==0) { n=(l+p)/2; if (T[n] < S) l=n+1; else if (T[n] > S) p=n-1; else odp = 1; }
65 Wyszukiwanie binarne Na koniec wypiszemy wynik if(wynik==1) cout<<"ciąg zawiera liczbę 200 \n"; else cout<<"ciąg nie zawiera liczby 200 \n"; Jeśli na koniec wynik=1, to znaczy, że nasz rosnący ciąg stu liczb naturalnych zawiera liczbę 200.
66 Potęgowanie binarne Najprostszy algorytm obliczający n m polega na wykonaniu m 1 kolejnych mnożeń przez n. Algorytm potęgowania binarnego polega na zastąpieniu działania n m równoważnym działaniem (n 2 ) m/2, czyli podstawieniem n = n*n; m = m/2; gdy wykładnik jest parzysty, lub działaniem n n m 1, czyli podstawieniem wynik = wynik*n; m--; gdy wykładnik jest nieparzysty.
67 Potęgowanie binarne Procedurę powtarzamy dopóki wykładnik jest różny od zera. Otrzymamy przykładowo 2 10 = 4 5 = = = =
68 Algorytn Euklidesa Pętlę while zastosujemy także w algorytmie Euklidesa, który służy do obliczania największego wspólnego dzielnika podanych liczb a i b. Polega on na obliczeniu r - reszty z dzielenia a przez b, zastąpieniu a przez b, zaś b przez r oraz w przypadku b > 0, powtórzeniu całej procedury. W momencie, kiedy b = 0, "obecne" a jest największym wspólnym dzielnikiem.
69 Algorytm Euklidesa int a,b,r ; cout << "Podaj dwie liczby naturalne.\n"; cin >> a >> b; while(b>0) { r=a%b; a=b; b=r; } cout << "NWD(a,b)=" << a << endl;
70 Zadania Zadanie Napisz program wymnażający kolejne wczytywane liczby rzeczywiste i wypisujący iloczyn na ekran, do momentu, gdy iloczyn przekroczy Zadanie Napisz program sumujący wczytane liczby rzeczywiste i wypisujący sumę na ekran, do momentu, aż wpisane zostanie zero. Zadanie Napisz program raz za razem proszący o podanie dwóch liczb naturalnych, i sprawdzający, czy pierwsza jest podzielna przez drugą, aż do momentu, gdy po raz drugi pierwsza liczba będzie podzielna przez drugą.
71 Zadania Zadanie Napisz program wczytujący losowo rosnący ciąg 1000 liczb naturalnych mniejszych od i sprawdzający, czy w tablicy znajduje się liczba 1000, a jeśli tak, to na którym miejscu. Zadanie Napisz program wczytujący podstawę i wykładnik i liczący binarnie potęgę. Zadanie Napisz program raz za razem proszący o podanie dwóch liczb naturalnych i liczący ich największy wspólny dzielnik do momentu, gdy wynik wyniesie 2 lub 3.
72 Zadania Zadanie Napisz program proszący o wpisywanie kolejnych ocen i liczący na bieżąco średnią, aż do momentu wpisania zera. Zadanie Napisz program proszący o podanie kwoty początkowej k, oprocentowania rocznego p (z miesięczną kapitalizacją) oraz kwoty wypłacanej co miesiąc m (zaraz po kapitalizacji odsetek) i sprawdzający kiedy opróżnimy konto (o ile nastąpi to przed upływem 10 lat) lub obliczający stan konta po 10 latach.
73 Sortowanie bąbelkowe Istnieje wiele sposobów na uporządkowanie danego ciągu liczb w kolejności od najmniejszej do największej. Jednym z prostszych jest sortowanie bąbelkowe. Ma ono złożoność O(n 2 ) (później podany zostanie algorytm sortowania o optymistycznej złożoności O(n log n)). Sortowanie bąbelkowe polega na kolejnym porównywaniu dwóch sąsiadujących elementów ciągu i ewentualnym ich zamienianiu tak, aby większy z nich występował jako późniejszy. Po jednokrotnym przeglądnięciu w ten sposób całej tablicy największy element ląduje na końcu. Po n 1 powtórzeniach tej procedury elementy tablicy będą uporządkowane od najmniejszego do największego. Napiszmy funkcję sortującą.
74 Sortowanie bąbelkowe for(i = 0; i < n-1; i++) for(j = 0; j < n-i; j++) if(t[j] > T[j+1]) swap(t[j],t[j+i]); //zamieniamy wartości miejscami Zauważmy, że w wewnętrznej pętli bierzemy j do n-i. Elementy tablicy od n-i do n są w tym momencie już posortowane.
75 Sortowanie bąbelkowe Na koniec wypisujemy posortowany ciąg for(i=0; i<n; i++) cout << T[i] << endl;
76 Sortowanie przez wybór Bardzo podobny jest algorytm sortowania przez wybór. Polega on na znalezieniu najmniejszego elementu tablicy i zamienieniu go z pierwszym elementem, następnie znalezieniu najmniejszego z pozostałych i zamienieniu go z drugim itd.
77 Przeliczanie systemów liczbowych Aby napisać program przeliczający systemy, przykładowo z dziesiętnego na szesnastkowy, musimy zdefiniować tablicę szesnastu znaków - każdy przypisany jednej cyfrze zadanej liczby. int ODP[7]; //w tę tablicę wpiszemy odpowiedniki cyfr //rozwinięcia szesnastkowego zadanej liczby int liczba, pozycja=0; char CYFRA[]=" ABCDEF"; //czyli CYFRA[0]=0; //... CYFRA[15]=F; (Podobnie możemy definiować tablice int-ów, np. int T[]={3,5,2,6,1} ustala rozmiar tablicy na 5. )
78 Przeliczanie systemów liczbowych Obliczając resztę z dzielenia naszej liczby przez 16 dostajemy ostatnią cyfrę rozwinięcia, po podzieleniu całkowitym liczby przez 16 powtarzając procedurę otrzymujemy kolejne cyfry, aż wynik całkowitego dzielenia przez 16 wynosi zero. cin >> liczba; while(liczba!=0) { ODP[pozycja] = liczba%16; liczba = liczba/16; pozycja++; }
79 Przeliczanie systemów liczbowych Teraz możemy wypisać wynik; cout << "Wynik zapisany cyframi szesnastkowymi: \n"; for(i=pozycja; i>0; i--) cout << CYFRA[ODP[i-1]];
80 Liczby słownie Za pomocą podobnego algorytmu możemy napisać program wyświetlający podaną liczbę słownie (tzn. wypisujący kolejno cyfry tej liczby. Po zdefiniowaniu nazw cyfr string NAPIS[10]={"zero","jeden","dwa","trzy","cztery", "piec","szesc","siedem","osiem","dziewiec"}; cyfry od ostatniej do pierwszej otrzymamy jako reszty z kolejnych dzieleń zadanej liczby przez 10.
81 Sito Erastotenesa Eratostenes w trzecim wieku przed naszą erą przedstawił następujący algorytm wyszukiwania liczb pierwszych. Wszystkie wielokrotności liczby 2 większe od niej samej oznaczamy jako liczby złożone. Z liczb większych od 2 wybieramy najmniejszą niezaznaczoną jeszcze liczbę (czyli 3) i wszystkie jej wielokrotności większe od niej samej oznaczamy jako złożone (niektóre liczby będą zaznaczane więcej niż raz). Postępując dalej według tej procedury jako liczby złożone oznaczamy wielokrotności 5, 7, 11 it.d. Dla danej liczby n wszystkie liczby mniejsze od n, które w efekcie powyższej procedury nie zostały oznaczone jako złożone, są liczbami pierwszymi.
82 Sito Erastotenesa Ustalmy liczbę n i wszystkie liczby mniejsze od niej oznaczamy jedynką. cout << "Ile liczb sprawdzić? \n"; cin >> n; int* T; //deklarujemy tablicę T = new int[n]; //definiujemy rozmiar tablicy for(i = 2; i < n; i++) T[i] =1; //kolejne liczby zaznaczamy //jako potencjalnie pierwsze
83 Tablica jako wskaźnik do pamięci Deklarując zmienną nadajemy nazwę pewnemu obszarowi pamięci, natomiast nazwa tablicy wskazuje dokładnie na miejsce w pamięci, gdzie ta tablica się zaczyna. Jeśli stosujemy dynamiczną alokację zmiennych (czyli rozmiar tablicy definiujemy na etapie wykonywania programu), musimy (dla niektórych kompilatorów) użyć powyższej składni lub napisać int*t=new int[n]. Operator * oznacza, że deklarujemy wskaźnik do pamięci. Operator new przydziela pamięć.
84 Sito Erastotenesa Zerem oznaczamy wszystkie liczby mniejsze od n, które są złożone, for (i = 2; i <= n; i++) if (T[i]==1) for (j = i; j*i < n; j++) T[i*j] =0; i wypiszmy liczby pierwsze mniejsze od n (czyli te numery, dla których wartość elenentu tablicy jest równa 1). for (i = 2; i < n; i++) if (T[i]==1) cout << i << ", ";
85 Schemat Hornera Aby obliczyć wartość wielomianu P n (x) = a n x n + a n 1 x n a 1 x + a 0 w danym punkcie x należy wykonać n dodawań, n mnożeń przez współczynnik a i oraz n(n 1)/2 mnożeń potrzebnych do podniesienia x na każdym miejscu do odpowiedniej potęgi. Ilość tych działań można zmniejszyć stosując schemat Hornera.
86 Schemat Hornera Schemat Hornera polega na rozpisaniu wielomianu P n (x) = a n x n + a n 1 x n a 1 x + a 0 = x(a n x n 1 + a n 1 x n a 1 ) + a 0 = = x(x(a n x n 2 + a n 1 x n a 2 ) + a 1 ) + a 0 = = x(x(...x(x a n + a n 1 ) + a n 2 ) a 1 ) + a 0 i obliczeniu jego wartości. Zauważmy, że wówczas wykonane zostanie jedynie n mnożeń oraz n dodawań, zatem zmniejszymy złożoność z O(n 2 ) do O(n).
87 Schemat Hornera Mając wczytane współczynniki wielomianu a[i] oraz wartość x użyć można w tym celu pętli; s=a[n]; for (int i=n-1; i>=0; i--) s=s*x+a[i];
88 Zadania Zadanie Napisz program proszący o podanie 10 liczb, a następnie sortujący (metodą bąbelkową) ten ciąg. Zrób to bez użycia polecenia swap Zadanie Napisz program wczytujący dla podanej liczby n losowy ciąg długości n oraz sortujący (przez wybór) ten ciąg. Omów złożoność programu. Zadanie Napisz program zadający pytanie na jaki system od dwójkowego do szesnastkowego zamienić zadaną liczbę zapisaną w systemie dziesiętnym, a następnie wyświetlający wynik w zadanym systemie.
89 Zadania Zadanie Napisz program wypisujący zadaną liczbę jako ciąg słów oznaczających jej kolejne cyfry. Zadanie Napisz program znajdujący dla zadanej liczby naturalnej najlepsze naturalne przybliżenie jej pierwiastka.
90 Zadania Zadanie Napisz program sprawdzający, ile jest liczb pierwszych mniejszych od podanej liczby. Zadanie Napisz program, który dla podanej liczby wspólczynników wczyta je po kolei i korzystając ze schematu Hornera policzy wartość wielomianu w zadanym punkcie. (Napisz program liczący wartość wielomianu bez użycia schematu Hornera. Porównaj złożoność tych dwóch programów.)
91 Macierz Macierz wyrazić możemy dwuwymiarową tablicą. Aby wypisać wcześniej zdefiniowaną macierz A o m kolumnach i n wierszach napiszemy for(i=0; i<n; i++) { for(j=0; j<m; j++) cout<<a[i][j]<<" "; cout<<endl; }
92 Macierze Aby zdefiniować macierz B jako transponowaną do A wystarczy podstawić B[j][i]=A[i][j] (jeśli A ma rozmiary n m, to B musi mieć rozmiary m n). Aby dodać dwie macierze A, i B (tych samych rozmiarów) wystarczy dla każdych i,j dodać A[i][j]+B[i][j].
93 Mnożenie macierzy Zdefiniujmy dwie macierze takie, aby liczba kolumn pierwszej z nich była równa liczbie wierszy drugiej. float A[3][4] = {{1,2,0,0}, {1,3,2,0}, {3,0,1,1}}; float B[4][2] = {{1, 2}, {2, 0.6}, {0, 1}, {3, 5}};
94 Mnożenie macierzy Aby pomnożyć macierze A, i B musimy policzyć odpowiednie sumy iloczynów; float AB[3][2]={{0}}; //deklarujemy macierz AB //na początku na każdym miejscu tablicy są zera for(int i=0; i<3; i++) for(int j=0; j<2; j++) for(int k=0; k<4; k++) AB[i][j] = AB[i][j]+A[i][k]*B[k][j];
95 Mnożenie macierzy Na koniec wypiszemy wynik: for(int i=0; i<3; j++) { for(int j=0; i<j; i++) cout << AB[i][j] << " "; cout << endl; }
96 Metoda Gaussa - Jordana Metoda Gaussa - Jordana rozwiązywania układów równań (mających tyle samo zmiennych, co równań) polega na wpisaniu wspólczynników układu w macierz uzupełnioną, a następnie wykonywaniu operacji na wierszach macierzy.
97 Metoda Gaussa - Jordana Napiszmy program rozwiązujący układ trzech równań z trzema niewiadomymi x + 2y = 3 3x + 6y + z = 5 4x + 2z = 8 Najpierw musimy wpisać w tablicę macierz współczynników, float A[3][4]={{1, 2, 0, 3},{3, 6, 1, 5},{4, 0, 2, 8}};
98 Metoda Gaussa - Jordana Pierwszy wiersz mnożymy przez stałą, aby na pierwszym miejscu uzyskać jedynkę, nastepnie odejmujemy ten wiersz pomnożony przez odpowiednie stałe od pozostałych wierszy, aby na tym miejscu dostać zera. W następnym kroku drugi wiersz mnożymy przez stałą, aby na drugim miejscu uzyskać jedynkę, nastepnie odejmujemy ten wiersz pomnożony przez odpowiednie stałe od pozostałych wierszy, aby na tym miejscu dostać zera. Podobnie postępujemy dla każdego następnego wiersza.
99 Metoda Gaussa - Jordana for(k=0; k<3; k++) { for(j=k; j<4; j++) A[k][j] = A[k][j]/A[k][k]; for(i=0; i<3; i++) if(i!= k) for(j=k; j<4; j++) A[i][j] = A[i][j]-A[i][k]*A[k][j]; }
100 Metoda Gaussa - Jordana Jeśli na miejscu, na którym powinniśmy uzyskać jedynkę znajduje się zero musimy zamienić dany wiersz z którymś z kolejnych, który w tym miejscu nie ma zera - jeśli każdy z nich ma na tym miejscu zero, to układ nie ma jednoznacznego rozwiązania. Jeśli układ ma jednoznaczne rozwiązanie, to po zastosowaniu powyższych przekształceń do wszystkich wierszy otrzymujemy macierz diagonalną jednostkową (+ kolumna rozwiązań).
101 Metoda Gaussa - Jordana if(a[k][k]==0) { brakrozw=1; for(i=k+1; i<3; i++) if(a[i][k]!=0) { for( j=0; j<4; j++) swap(a[i][j],a[k][j]); brakrozw=0; } }
102 Metoda Gaussa - Jordana Na koniec możemy wypisać rozwiązanie for(int i=0; i<3; i++) cout << "x(" << i << ")=" << A[i][3] << endl;
103 Zadania Zadanie Napisz program proszący o podanie rozmiarów macierzy (nie większych niż 5 5), a następnie wypisujący podaną macierz oraz macierz transponowaną. (Aby utworzyć tablicę dwuwymiarową dowolnego zadanego za pomocą zmiennych rozmiaru musielibyśmy napisać cin>>n>>m; float**a=new float*[n]; for( i=0; i<n; ++i) A[i]=new float[m]; Ponieważ w zadaniu rozmiar tablicy jest ograniczony od góry, więc nie musimy stosować tej procedury.)
104 Zadania Zadanie Napisz program sumujący dowolne dwie macierze o zadanym rozmiarze mniejszym od 5 5. Zadanie Napisz program mnożący dowolne dwie macierze o zadanych rozmiarach mniejszych niż 6 6 lub stwierdzający, że jest to niemożliwe. Zadanie Napisz program, który po wczytaniu współczynników rozwiązuje układ czterech równań liniowych lub stwierdza, że rozwiązanie jest niemożliwe.
105 Funkcje Funkcja główna nie musi być jedyną funkcją w programie. Często wygodnie jest zdefiniować pewną procedurę, a następnie wywoływać w programie jej wykonanie. Przy pisaniu dłuższych programów może to znacznie ułatwić pracę - program staje się czytelniejszy i każdą funkcję możemy wywoływać w programie dowolną ilość razy z różnymi argumentami. Funkcje umieszczamy w nagłówku - muszą one znajdować się poza funkcją główną programu.
106 Funkcja void Funkcja może nie zwracać żadnej wartości (funkcja typu void), tylko wykonywać jakąś czynność, np. wypisywanie na ekran. void pisz(int liczba) /*argumentem tej funkcji jest zmienna liczba typu int (funkcja może mieć jeden lub więcej argumentów)*/ { cout << "Podana liczba to " << liczba << endl; } Po zadeklarowaniu zmiennej (np. int a=5;) naszą funkcję wywołamy poleceniem pisz(a);
107 Funkcja typu int Częto używamy funkcji, które zwracają jakąś wartość. Przykładowo funkcja int wyznacznik(int x, int y, int z, int v) { return(x*v-y*z); } zwraca wyznacznik macierzy 2 2.
108 Funkcja typu int Teraz możemy w funkcji głównej wczytać dane i wypisać wyznacznik macierzy; int a11,a12,a21,a22; cout << "Podaj dane \n"; cin >> a11 >> a12 >> a21 >> a22; cout << wyznacznik(a11,a12,a21,a22);
109 Funkcja - algorytm Euklidesa Napiszmy funkcję liczącą największy wspólny dzielnik dwóch liczb. int NWD(int x, int y){ int r; while(y!=0){ r=x%y; x=y; y=r; } return(x); }
110 Funkcja - algorytm Euklidesa Możemy użyć jej na przykład do skracania ułamków; int d,a,b; do{ cout << "Podaj licznik i mianownik.\n"; cin << a << b; if(b!=0){ d = NWD(a,b); cout << "Wynik=" << a/d << "/" << b/d << endl; } else cout << "Błędne dane.\n"; } while(b!=0)
111 Zmienne lokalne Zauważmy, że zmienną r użytą w funkcji NWD zadeklarowaliśmy wewnątrz funkcji. Jest to zmienna lokalna, tzn. jest widoczna tylko wewnątrz funkcji. Zmienne deklarowane w funkcji głównej programu także nazywamy zmiennymi lokalnymi. Deklarowanie zmiennych poza jakąkolwiek funkcją (zmienne globalne) jest stosowane, gdy chcemy korzystać z tej zmiennej w różnych funkcjach programu (w innym wypadku wygodniej jest używać zmiennych lokalnych). (Pamięć zarezerwowana dla zmiennej globalnej jest czyszczona przed uruchomieniem programu, zatem zmienna globalna ma po zadeklarowaniu wartość zero, podczas, gdy zmienna lokalna r przed przypisaniem jej wartości przyjmuje pewną losową wartość.)
112 Metoda połowienia przedziału Metoda połowienia przedziału służy do znajdowania dla danej funkcji ciągłej miejsca zerowego w zadanym przedziale, o ile na jego brzegach funkcja przyjmuje przeciwne wartości. Miejsce zerowe wyznaczane jest z określoną dokładnością.
113 Metoda połowienia przedziału W nagłówku zdefiniujmy stałą wyznaczającą dokładność rozwiązania oraz funkcję f określającą naszą funkcję matematyczną. const double dokl = 0.001; double f(double x) { return tan(x/100); }
114 Metoda połowienia przedziału W funkcji głównej musimy wczytać wartości a oraz b i jeśli f(a) i f(b) są przeciwnych znaków, to wybieramy tę połówkę przedziału, na brzegach której wartości są przeciwne i powtarzamy tę procedurę, aż do zbliżenia się wartości funkcji do zera z zadaną dokładnością. do{ s = (a+b)/2; if(f(a)*f(s) < 0) b = s; else a = s; } while(fabs(f(s)) > dokl);//fabs oznacza wartość bezwzględną
115 Metoda połowienia przedziału Na koniec możemy wypisać wynik cout << "Miejsce zerowe funkcji f to " << s << endl; //f(s)=0
116 Metoda siecznych Podobny efekt możemy otrzymać stosując metodę siecznych. Możemy ją zastosować jeśli f jest funkcją ciągłą przyjmującą na brzegach przedziału (a,b) przeciwne wartości oraz taką, że f (x) 0.
117 Metoda siecznych Dla danych a,b punkt c definiujemy punkt przecięcia osi OX z sieczną łączącą (a,f (a)) oraz (b,f (b)), czyli b a c = b f (b) f (b) f (a). Za a podstawiamy wartość b, a za b wartość c i powtarzamy procedurę. Postępujemy tak dopóki f (c) jest większe od ustalonej stałej wyznaczającej dokładność.
118 Metoda siecznych Przedstawiony powyżej algorytm zapisany w języku C wyglądać będzie następująco do { c = b-f(b)*(b-a)/(f(b)-f(a)); a = b; b = c; } while(fabs(f(c)) > dokl);
119 Zadania Zadanie Napisz program wczytujący licznik i mianownik i następnie skracający zadany w ten sposób ułamek do momentu, gdy wynik wyniesie 1 2. Zadanie Napisz program znajdujący metodą połowienia przedziału miejsce zerowe dla funkcji f (x) = tg( x 100 ) pomiędzy dowolnymi punktami z dokładnością i wypisujący przybliżone miejsce zerowe oraz wartość funkcji w tym punkcie.
120 Zadania Zadanie Napisz program znajdujący metodą siecznych miejsce zerowe dla funkcji f (x) = tg( x 100 ) pomiędzy dowolnymi punktami z dokładnością i wypisujący przybliżone miejsce zerowe. Porównaj ilość kroków, w jakiej ten i poprzedni program znajdować będą miejsce zerowe.
121 Rekurencja - ciąg Fibinacciego Ważnym aspektem stosowania funkcji jest fakt, iż umożliwiają one rekurencje - tzn. wywołanie samej siebie. Funkcja zwracająca dany wyraz ciągu Fibonacciego wyglądać będzie tak int fib(int n) { if(n<=2) return(1); else return(fib(n-2)+fib(n-1)); }
122 Ciąg Fibinacciego Po zadeklarowaniu w programie zmiennej k i przypisaniu jej wartości k-ty wyraz ciągu Fibonacciego wypiszemy na ekran poleceniem cout << fib(k). Do zdefiniowania funkcji i jej wywołania możemy użyć tych samych nazw zmiennych lub różnych - w każdym przypadku zmienne te musimy zadeklarować osobno wewnątrz funkcji i osobno w funkcji głównej programu.
123 Rekurencja - symbol Newtona Wartość symbolu Newtona można policzyć ze wzoru ( ) n k = n! (n k)!k!. Można też skorzystać z własności ( ) ( n k = n 1 ) ( k 1 + n 1 ) k i napisać funkcję rekurencyjną, int newton(int n, int k) { } if(n==k k==0) else return 1; return newton(n-1,k-1)+newton(n-1,k);
124 Symbol Newtona Po podaniu n oraz k wypiszemy wynik. cout << "(n po k)= " << newton(n,k) << endl;
125 Funkcja Ackermana Przykładem funkcji rekurencyjnej jest funkcja Ackermana. Można zapisać ją wzorem n + 1 m = 0 F (m,n) = F (m 1,1) m > 0,n = 0. F (m 1,F (m,n 1)) m,n > 0
126 Funkcja Ackermana Funkcję Ackermana zapiszemy wzorem rekurencyjnym int acker(int m, int n) { if(m==0) return(n+1); else if(n==0) return(acker(m-1,1)); else return(acker(m-1,acker(m,n-1))); } a wywołamy cout << "acker("<<m<<","<<n<<")=" << acker(m,n) << endl;
127 Rekurencja - algorytm Euklisesa Pseudokod procedury rekurencyjnej obliczającej największy wspólny dzielnik dwóch liczb wygląda następująco euklid(a,b) 1 if b=0 2 then return a 3 else return eukl(b, a mod b)
128 Rekurencja - algorytm Euklisesa W języku C++ procedura rekurencyjna obliczająca największy wspólny dzielnik przyjmie postać: int euklid(int a, int b) { if(b==0) return a; else return euklid(b,a%b); }
129 Poprawność algorytmu Euklidesa Zauważmy, że jest to wersja rekurencyjna algorytmu euklidesa (Na każdym kroku za a podstawiane jest b, a za b podstawiane jest a (mod b) dopóki b 0). Ponadto zauważmy, że NWD(a, b) dzieli NWD(b, a(mod)b) oraz NWD(b, a(mod)b) dzieli NWD(a, b), co dowodzi, iż powyższa funkcja rzeczywiście wyznacza największy wspólny dzielnik dwóch liczb.
130 Sortowanie szybkie Sortowanie szybkie polega na przeniesieniu na początek tablicy elementów mniejszych od pierwszego elementu, a na koniec większych, a następnie powtarzaniu tej czynności dla początkowej i końcowej części tablicy. Rekursja kończy się, gdy kolejny fragment uzyskany z podziału zawiera tylko jeden element.
131 Sortowanie szybkie void sortuj(int T[],int L,int P){ //T[] <-> *T int i=l, j=p, v=t[l]; do{ while (T[i]<v) i++; while (v<t[j]) j--; if (i<=j){ swap(t[i], T[j]); i++; j--; } } while (i<=j); if (L<j) sortuj(t,l,j); if (i<p) sortuj(t,i,p); }
132 Zadania Zadanie Napisz program, który dla podanej liczby n wypisuje n pierwszych wyrazów ciągu Fibonacciego. Zadanie Napisz program liczący silnię za pomocą funkcji rekurencyjnej.
133 Zadania Zadanie Napisz programy liczące dla zadanych n oraz k wartość ( n k) wprost ze wzoru oraz rekurencyjnie. Porównaj szybkość i zakres poprawnego działania obu programów. Zadanie Napisz program wczytujący długość ciągu oraz kolejne elementy ciągu, a następnie porządkujący je zgodnie z algorytmem szybkiego sortowania. Omów pesymistyczną i optymistyczną złożoność tego algorytmu.
134 Wczytywanie po znaku, ASCII Pisząc j=getc(stdin); przypisujemy zmiennej j wczytany z klawiatury znak (o ile j jest zadeklarowane jako char) lub wartość w kodzie ASCII tego znaku (o ile j jest zadeklarowane jako int). Pamiętamy, że ASCII (American Standard Code for Information Interchange) jest to kod przyporządkowujący liczby z zakresu literom, cyfrom i innym znakom.
135 ASCII, wczytywanie po znaku Poniższy program pozwala na wczytanie ciągu znaków dowolnej długości, a po naciśnięciu klawisza enter (wartość 10 w kodzie ASCII) wypisuje ich wartości w kodzie ASCII. int j; do { j=getc(stdin); cout<<j<<", "; } while(j!=10); //wczytywane są kolejne znaki //i wypisywana jest ich wartość //aż do naciśnięcia ENTER
136 ASCII - reprezentacja liczb Po wykonaniu powyższego programu możemy zauważyć, że chcąc poprawnie zinterpretować znaki reprezentujące cyfry musimy od reprezantacji znaku odjąć 48.
137 ASCII Napiszmy program, który wczytuje ciąg znaków, a następnie po kolei wypisuje, czy dany znak jest liczbą czy literą. int j; do { j=getc(stdin); if(j>47&&j<58) cout<<"cyfra \n"; else if((j>64&&j<91) (j>96&&j<123)) cout<<"litera\n"; else cout<<"ani cyfra, ani litera\n"; } while(j!=10);
138 ASCII - tablica znaków Aby wczytać ciąg znaków i zapamiętać go w tablicy najpierw zadeklarujemy tablicę i pomocnicze zmienne char A[100]; int i=0; Następnie wczytamy tablicę znaków do { i++; A[i]=getc(stdin); } while(a[i]!=10);
139 ASCII - tablica znaków Aby wypisać wczytany ciąg znaków w odwrotnej kolejności napiszemy for(j=i-1; j>0; j--) cout<<a[j]; cout<<endl;
140 System dwójkowy Napiszmy program przeliczający podaną liczbę z systemu dwójkowego do dziesiętnego. Najpierw deklarujemy zmienne i wczytujemy ciąg znaków (złożony z zer i jedynek). int A[31]; int i=0, r=0, k; cout<<"podaj liczbę w systemie dwójkowym.\n"; do { i++; A[i]=getc(stdin)-48; } while(a[i]!=-38);
141 System dwójkowy Następnie obliczamy sumę odpowiednich potęg dwójki pomnożonych przez odpowiednie współczynniki. i--; for(k=i; k>0 ; k--) r+=(a[k]*pow(2,i-k)); cout<<r<<endl;
142 Duże liczby Napiszmy teraz program sumujący dwie dowolnie duże liczby (wychodzące poza zakres int-a). Na początek wczytamy dwie liczby jako tablice cyfr. int A[100], B[100], i=0, j=0, r=0, k; do { i++; A[i]=getc(stdin)-48; } while(a[i]!=-38);
143 Duże liczby i podobnie do { j++; B[j]=getc(stdin)-48; } while(b[j]!=-38); Załóżmy najpierw, że obie wczytane liczby są tej samej długości.
144 Dodawanie pisemne Ich sumę policzymy stosując schemat dodawania pisemnego. A[0]=0; B[0]=0; j--; for(k=j; k>=0 ; k--) { B[k]=B[k]+A[k]+r; if(b[k]>9) { r=1; B[k]=B[k]-10; } else r=0; }
145 Dodawanie pisemne Na koniec możemy wypisać wynik. if(b[0]!=0) cout<<b[0]; for(k=1; k<=j; k++) cout<<b[k];
146 Dodawanie pisemne W przypadku, gdy wczytane liczby nie będą tej samej długości możemy przesunąć mniejszą liczbę (tak aby była tej samej długości, co większa) a na początkowych miejscach umieścić zera. Powiedzmy, że pierwsza liczba jest mniejsza. for(k=j-1; k>j-i; k--) A[k]=A[k-j+i]; for(k=j-i; k>0; k--) A[k]=0;
147 Podzielność Mając wczytaną liczbę w tablicy a[i] możemy sprawdzić jej podzielność przez 3: s=0; for(k=0; k<i ; k++) s+=a[k] if(s%3==0) cout<<"wczytana liczba jest podzielna przez 3.\n"; else cout<<"wczytana liczba nie jest podzielna przez 3.\n";
148 Zadania Zadanie Napisz program wczytujący ciąg znaków oraz sprawdzający, czy najwięcej wczytano dużych liter, małych liter, czy innych znaków. Zadanie Napisz program wczytujący ciąg znaków oraz liczący sumę cyfr, które się wśród tych znaków znalazły. Zadanie Napisz program wczytujący dwie liczby jako ciągi znaków, a następnie sprawdzający która z nich jest większa.
149 Zadania Zadanie Napisz program wczytujący trzy liczby jako ciągi znaków, a następnie dodający je pisemnie. Zadanie Napisz program wczytujący dwie liczby - jedną jako ciąg znaków, drugą typu int i mnożący je. Zadanie Napisz program wczytujący liczbę jako ciąg znaków, a następnie sprawdzający, czy jest ona podzielna przez 11.
150 Wskaźniki Wskaźnik nie przechowuje wartości zmiennej ale, podobnie jak tablica, wskazuje miejsce w pamięci, w którym znajduje się zmienna danego typu. W poniższym przykładzie symbol * pomiędzy int, a wskaz oznacza, że wskaz jest wskaźnikiem do zmiennej typu int (a nie zmienną typu int). int *wsk; //deklaracja wskaźnika wsk=new int; //przydzielenie zmiennej miejsce w pamięci *wsk=5; //zapisanie liczby 5 w tym miejscu pamięci cout << *wsk << endl; delete wsk; //zwolnienie pamięci wskazywanej przez wskaźnik
151 Wskaźniki Polecenie delete zwalnia miejsce w pamięci, w którym przechowywana jest nasza zmienna - pamięć nie będzie zatem zajmowana przez cały czas wykonywania programu, co ma miejsce przy normalnym deklarowaniu zmiennych.
152 Wskaźniki int* T; int n, i; cout << "Podaj rozmiar tablicy. \n"; cin >> n; T = new int[n]; cout << "Podaj elementy tablicy \n"; for (i=0; i<n; i++) cin>>t[i]; cout << "Zawartosc tablicy: \n"; for (i=0; i<n; i++) cout << T[i] << ", "; delete [] T;
153 Aliasy Operator & adresu (referencji) występuje przy deklaracji zmiennej zwanej referencją. W poniższym przykładzie symbol & pomiędzy int, a alias oznacza, że zmienna alias jest typu referencyjnego i podszywa się pod zmienną x typu int. int x = 15; int & alias = x; cout << alias;
154 Wskaźniki Zamiast operatora * wyłuskania (dereferencji) w poniższym przypadku int x=35; int * wsk=&x; *wsk = 45; cout << x; wygodniej użyć operatora referencji int x=35; int& alias=x; alias = 45; cout << x;
155 Wskaźniki Funkcja skracająca ułamek postaci int skrac0(int a, int b) { int d=nwd(a,b); a=a/d; b=b/d; } nie będzie działać, gdyż wartości wyliczone wewnątrz funkcji nie są widoczne na zewnątrz.
156 Wskaźniki Nie możemy też użyć polecenia return w funkcji, gdyż funkcja ma powinna zwracać licznik i mianownik skróconego ułamka. Ponieważ polecenie return może zwracać tylko jedną wartość (pozostałe wartości wyliczone wewnątrz funkcji nie są widoczne na zewnątrz), więc nie osiągniemy tego standardową procedurą. Możemy jednak napisać funkcję używając wskaźników, która zmienia miejsce w pamięci.
157 Wskaźniki Funkcję skracającą ułamek możemy napisać używając wskaźników. void skrac1(int *a, int *b) { int d=nwd(*a,*b); *a=*a/d; *b=*b/d; } Funkcję taką wywołamy poleceniem skrac1(&licz, &mian). Wynik wypiszemy poleceniem cout << licz << "/" << mian << endl;
158 Tablice a wskaźniki Zauważmy, że funkcja sortowania szybkiego nie zawiera polecenia zwrócenia wartości return, a jednak zmienia wartości w tablicy. Wynika to stąd, że nazwa tablicy jest wskaźnikiem stałym, a nie nazwą zmiennej.
159 Referencje Do skracania ułamków możemy użyć także referencji void skrac2(int &a, int &b) { int d=nwd(a,b); a=a/d; b=b/d; } W tym przypadku funkcję wywołujemy poleceniem skrac2(licz, mian).
160 Struktury Poleceniem struct możemy stworzyć strukturę złożoną ze zmiennych. Stwórzmy strukturę o nazwie autor. struct autor{ string imie, nazwisko, tytul; int rok; }; //deklarujemy zmienne //czyli pola struktury
161 Struktury Możemy teraz zadeklarować zmienne typu autor oraz nadać im cechy. autor os1, os2; os1.imie = "Thomas"; os1.nazwisko = "Cormen"; os1.tytul = "Wprowadzenie do algorytmow"; os1.rok = 1997; cin >> os2.imie >> os2.nazwisko >> os2.tytul >> os2.rok;
Algorytmy i język C++
Wykład 6 Wskaźniki Wskaźnik nie przechowuje wartości zmiennej ale, podobnie jak tablica, wskazuje miejsce w pamięci, w którym znajduje się zmienna danego typu. W poniższym przykładzie symbol * pomiędzy
Bardziej szczegółowoPodstawy Programowania Podstawowa składnia języka C++
Podstawy Programowania Podstawowa składnia języka C++ Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Szablon programu w C++ Najprostszy program w C++ ma postać: #include #include
Bardziej szczegółowoProgramowanie - wykład 4
Programowanie - wykład 4 Filip Sośnicki Wydział Fizyki Uniwersytet Warszawski 20.03.2019 Przypomnienie Prosty program liczący i wyświeltający wartość silni dla wprowadzonej z klawiatury liczby: 1 # include
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoAlgorytmy i struktury danych. Wykład 4
Wykład 4 Różne algorytmy - obliczenia 1. Obliczanie wartości wielomianu 2. Szybkie potęgowanie 3. Algorytm Euklidesa, liczby pierwsze, faktoryzacja liczby naturalnej 2017-11-24 Algorytmy i struktury danych
Bardziej szczegółowo1 Podstawy c++ w pigułce.
1 Podstawy c++ w pigułce. 1.1 Struktura dokumentu. Kod programu c++ jest zwykłym tekstem napisanym w dowolnym edytorze. Plikowi takiemu nadaje się zwykle rozszerzenie.cpp i kompiluje za pomocą kompilatora,
Bardziej szczegółowoProgramowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44
Programowanie w C++ Wykład 2 Katarzyna Grzelak 4 marca 2019 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44 Na poprzednim wykładzie podstawy C++ Każdy program w C++ musi mieć funkcję o nazwie main Wcięcia
Bardziej szczegółowoInformacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char
Programowanie C++ Informacje wstępne #include - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char = -128 do 127, unsigned char = od
Bardziej szczegółowoProgramowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41
Programowanie w C++ Wykład 2 Katarzyna Grzelak 5 marca 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41 Reprezentacje liczb w komputerze K.Grzelak (Wykład 1) Programowanie w C++ 2 / 41 Reprezentacje
Bardziej szczegółowoZajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej
Zajęcia nr 2 Programowanie strukturalne dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej Pętla while #include using namespace std; int main ()
Bardziej szczegółowoRekurencja (rekursja)
Rekurencja (rekursja) Rekurencja wywołanie funkcji przez nią samą wewnątrz ciała funkcji. Rekurencja może być pośrednia funkcja jest wywoływana przez inną funkcję, wywołaną (pośrednio lub bezpośrednio)
Bardziej szczegółowo1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:
1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci: * Jan Kowalski * * ul. Zana 31 * 3. Zadeklaruj zmienne przechowujące
Bardziej szczegółowoProgramowanie komputerowe. Zajęcia 1
Programowanie komputerowe Zajęcia 1 Code::Blocks - tworzenie projektu Create New Project Console Application -> C++ Wybierz nazwę projektu Stworzy się nowy projekt z wpisaną funkcją main Wpisz swój program
Bardziej szczegółowoWiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java
Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java Cechy C++ Język ogólnego przeznaczenia Można programować obiektowo i strukturalnie Bardzo wysoka wydajność kodu wynikowego
Bardziej szczegółowoCzęść 4 życie programu
1. Struktura programu c++ Ogólna struktura programu w C++ składa się z kilku części: część 1 część 2 część 3 część 4 #include int main(int argc, char *argv[]) /* instrukcje funkcji main */ Część
Bardziej szczegółowoAlgorytm. a programowanie -
Algorytm a programowanie - Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik
Bardziej szczegółowodo instrukcja while (wyrażenie);
Instrukcje pętli -ćwiczenia Instrukcja while Pętla while (póki) powoduje powtarzanie zawartej w niej sekwencji instrukcji tak długo, jak długo zaczynające pętlę wyrażenie pozostaje prawdziwe. while ( wyrażenie
Bardziej szczegółowoProste programy w C++ zadania
Proste programy w C++ zadania Zbiór zadao do samodzielnego rozwiązania stanowiący powtórzenie materiału. Podstawy C++ Budowa programu w C++ Dyrektywy preprocesora Usunięcie dublujących się nazw Częśd główna
Bardziej szczegółowoI. Podstawy języka C powtórka
I. Podstawy języka C powtórka Zadanie 1. Utwórz zmienne a = 730 (typu int), b = 106 (typu long long), c = 123.45 (typu double) Wypisz następujące komunikaty: Dane sa liczby: a = 730, b = 106 i c = 123.45.
Bardziej szczegółowoPodstawy programowania skrót z wykładów:
Podstawy programowania skrót z wykładów: // komentarz jednowierszowy. /* */ komentarz wielowierszowy. # include dyrektywa preprocesora, załączająca biblioteki (pliki nagłówkowe). using namespace
Bardziej szczegółowoProgramowanie w C/C++ Instrukcje - konstrukcje powtórka. LABORKA Piotr Ciskowski
Programowanie w C/C++ Instrukcje - konstrukcje powtórka LABORKA Piotr Ciskowski zadanie 1. Licz się ze sobą Napisz funkcję bez argumentów i bez wyniku, która za każdym wywołaniem będzie podawała, ile razy
Bardziej szczegółowo4. Funkcje. Przykłady
4. Funkcje Przykłady 4.1. Napisz funkcję kwadrat, która przyjmuje jeden argument: długość boku kwadratu i zwraca pole jego powierzchni. Używając tej funkcji napisz program, który obliczy pole powierzchni
Bardziej szczegółowo1 Powtórzenie wiadomości
1 Powtórzenie wiadomości Zadanie 1 Napisać program, który w trybie dialogu z użytkownikiem przyjmie liczbę całkowitą, a następnie wyświetli informację czy jest to liczba parzysta czy nieparzysta oraz czy
Bardziej szczegółowoWstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami
Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami Przykład 1. Napisz program, który dla podanej liczby n wypisze jej rozkład na czynniki pierwsze. Oblicz asymptotyczną złożoność
Bardziej szczegółowoWHILE (wyrażenie) instrukcja;
INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while
Bardziej szczegółowo5. Rekurencja. Przykłady
5. Rekurencja Uwaga! W tym rozdziale nie są omówione żadne nowe konstrukcje języka C++. Omówiona jest za to technika wykorzystująca funkcje, która pozwala na rozwiązanie pewnych nowych rodzajów zadań.
Bardziej szczegółowo3. Instrukcje warunkowe
. Instrukcje warunkowe Przykłady.1. Napisz program, który pobierze od użytkownika liczbę i wypisze na ekran słowo ujemna lub nieujemna, w zależności od tego czy dana liczba jest ujemna czy nie. 1 #include
Bardziej szczegółowoProgramowanie strukturalne i obiektowe. Funkcje
Funkcje Często w programach spotykamy się z sytuacją, kiedy chcemy wykonać określoną czynność kilka razy np. dodać dwie liczby w trzech miejscach w programie. Oczywiście moglibyśmy to zrobić pisząc trzy
Bardziej szczegółowoWHILE (wyrażenie) instrukcja;
INSTRUKCJE ITERACYJNE WHILE, DO WHILE, FOR Instrukcje iteracyjne pozwalają powtarzać daną instrukcję programu określoną liczbę razy lub do momentu osiągnięcia określonego skutku. Pętla iteracyjna while
Bardziej szczegółowoLab 9 Podstawy Programowania
Lab 9 Podstawy Programowania (Kaja.Gutowska@cs.put.poznan.pl) Wszystkie kody/fragmenty kodów dostępne w osobnym pliku.txt. Materiały pomocnicze: Wskaźnik to specjalny rodzaj zmiennej, w której zapisany
Bardziej szczegółowoPrzykładowe zadania z teorii liczb
Przykładowe zadania z teorii liczb I. Podzielność liczb całkowitych. Liczba a = 346 przy dzieleniu przez pewną liczbę dodatnią całkowitą b daje iloraz k = 85 i resztę r. Znaleźć dzielnik b oraz resztę
Bardziej szczegółowoPodstawy Programowania C++
Wykład 3 - podstawowe konstrukcje Instytut Automatyki i Robotyki Warszawa, 2014 Wstęp Plan wykładu Struktura programu, instrukcja przypisania, podstawowe typy danych, zapis i odczyt danych, wyrażenia:
Bardziej szczegółowo6. Pętle while. Przykłady
6. Pętle while Przykłady 6.1. Napisz program, który, bez użycia rekurencji, wypisze na ekran liczby naturalne od pewnego danego n do 0 włącznie, w kolejności malejącej, po jednej liczbie na linię. Uwaga!
Bardziej szczegółowo2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,
2 Arytmetyka Niech b = d r d r 1 d 1 d 0 będzie zapisem liczby w systemie dwójkowym Zamiana zapisu liczby b na system dziesiętny odbywa się poprzez wykonanie dodawania d r 2 r + d r 1 2 r 1 d 1 2 1 + d
Bardziej szczegółowoFunkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.
Funkcje Deklaracja funkcji typ funkcji identyfikator_funkcji(lista parametrów formalnych); Typ funkcji określa typ wartości zwracanej przez funkcję (typ zdefiniowany pierwotnie jak int, typ zdefiniowany
Bardziej szczegółowoJęzyk ludzki kod maszynowy
Język ludzki kod maszynowy poziom wysoki Język ludzki (mowa) Język programowania wysokiego poziomu Jeśli liczba punktów jest większa niż 50, test zostaje zaliczony; w przeciwnym razie testu nie zalicza
Bardziej szczegółowoa[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a[10] 3-2 5 8 12-4 -26 12 45-76
. p. 1 Algorytmem nazywa się poddający się interpretacji skończony zbiór instrukcji wykonania zadania mającego określony stan końcowy dla każdego zestawu danych wejściowych W algorytmach mogą występować
Bardziej szczegółowoJęzyki i metodyka programowania. Wprowadzenie do języka C
Literatura: Brian W. Kernighan, Dennis M. Ritchie Język Ansi C, Wydawnictwa Naukowo - Techniczne, 2007 http://cm.bell-labs.com/cm/cs/cbook/index.html Scott E. Gimpel, Clovis L. Tondo Język Ansi C. Ćwiczenia
Bardziej szczegółowoPodstawy Programowania
Podstawy Programowania Monika Wrzosek Instytut Matematyki Uniwersytet Gdański Matematyka 2017/18 Monika Wrzosek (IM UG) Podstawy Programowania 1 / 119 Sprawy organizacyjne E-mail: mwrzosek@mat.ug.edu.pl
Bardziej szczegółowoProgramowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27
Programowanie w C++ Wykład 5 Katarzyna Grzelak 16 kwietnia 2018 K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27 Pojęcia z poprzednich wykładów Tablica to ciag obiektów tego samego typu, zajmujacy ciagły
Bardziej szczegółowoutworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,
Lista 3 Zestaw I Zadanie 1. Zaprojektować i zaimplementować funkcje: utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy, zapisz
Bardziej szczegółowoIX. Wskaźniki.(3 godz.)
Opracowała: dr inż. Anna Dubowicka Uczelniane Centrum Komputerowe PK IX. Wskaźniki.(3 godz.) Wskaźnik jest zmienną, która zawiera adres innej. 1. Definiowanie wskaźników. typ * nazwa ; gdzie: znak * informuje
Bardziej szczegółowoPodstawy Programowania Algorytmy i programowanie
Podstawy Programowania Algorytmy i programowanie Katedra Analizy Nieliniowej, WMiI UŁ Łódź, 3 października 2013 r. Algorytm Algorytm w matematyce, informatyce, fizyce, itp. lub innej dziedzinie życia,
Bardziej szczegółowoLuty 2001 Algorytmy (7) 2000/2001 s-rg@siwy.il.pw.edu.pl
System dziesiętny 7 * 10 4 + 3 * 10 3 + 0 * 10 2 + 5 *10 1 + 1 * 10 0 = 73051 Liczba 10 w tym zapisie nazywa się podstawą systemu liczenia. Jeśli liczba 73051 byłaby zapisana w systemie ósemkowym, co powinniśmy
Bardziej szczegółowoTablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119
Tablice Tablica to struktura danych, która może przechowywać wiele wartości tego samego typu. Na przykład tablica może zawierać: 10 wartości typu int opisujących liczbę studentów przyjętych na kierunek
Bardziej szczegółowo2. Zmienne i stałe. Przykłady Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117).
2. Zmienne i stałe Przykłady 2.1. Napisz program, który wypisze na ekran wynik dzielenia 281 i 117 w postaci liczby mieszanej (tj. 2 47/117). 5 int a = 281; int b = 117; 7 8 cout
Bardziej szczegółowoZaawansowane algorytmy i struktury danych
Zaawansowane algorytmy i struktury danych u dr Barbary Marszał-Paszek Opracowanie pytań praktycznych z egzaminów. Strona 1 z 12 Pytania praktyczne z kolokwium zaliczeniowego z 19 czerwca 2014 (studia dzienne)
Bardziej szczegółowoAlgorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie
Algorytmika i programowanie Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie Tablice Tablica jest zbiorem elementów tego samego typu. Każdy element jest identyfikowany (numer
Bardziej szczegółowoMACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata
MACIERZE Sobiesiak Łukasz Wilczyńska Małgorzata Podstawowe pojęcia dotyczące macierzy Nie bez przyczyny zaczynamy od pojęcia macierzy, które jest niezwykle przydatne we wszystkich zastosowaniach, obliczeniach
Bardziej szczegółowoStruktura pliku projektu Console Application
Struktura pliku projektu Console Application #include #include using namespace std; int main(int argc, char *argv[]) // to jest komentarz system("pause"); return EXIT_SUCCESS; Na początku
Bardziej szczegółowoTemat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.
Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych. 1. Rodzaje pamięci używanej w programach Pamięć komputera, dostępna dla programu,
Bardziej szczegółowoRozwiązanie. #include <cstdlib> #include <iostream> using namespace std;
Programowanie C++ Zadanie 1 Napisz program do obliczenia sumy i iloczynu ciągu liczb zakooczonego liczbą zero. Zakładamy, że ciąg zawiera co najmniej jedną liczbę (założenie to jest konieczne przy obliczeniu
Bardziej szczegółowoKonstrukcje warunkowe Pętle
* Konstrukcje warunkowe Pętle *Instrukcja if sposób na sprawdzanie warunków *Konstrukcja: if(warunek) else { instrukcje gdy warunek spełniony} {instrukcje gdy warunek NIE spełniony} * 1. Wylicz całkowity
Bardziej szczegółowoTablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011
Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011 Załóżmy, że uprawiamy jogging i chcemy monitorować swoje postępy. W tym celu napiszemy program, który zlicza, ile czasu
Bardziej szczegółowoStrona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta 16.09.2006. Strona 1 z 26. Powrót. Full Screen. Zamknij.
Programowanie Sobera Jolanta 16.09.2006 Strona 1 z 26 1 Wprowadzenie do programowania 4 2 Pierwsza aplikacja 5 3 Typy danych 6 4 Operatory 9 Strona 2 z 26 5 Instrukcje sterujące 12 6 Podprogramy 15 7 Tablice
Bardziej szczegółowoPodstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1
Podstawy programowania. Wykład Funkcje Krzysztof Banaś Podstawy programowania 1 Programowanie proceduralne Pojęcie procedury (funkcji) programowanie proceduralne realizacja określonego zadania specyfikacja
Bardziej szczegółowoI - Microsoft Visual Studio C++
I - Microsoft Visual Studio C++ 1. Nowy projekt z Menu wybieramy File -> New -> Projekt -> Win32 Console Application w okienku Name: podajemy nazwę projektu w polu Location: wybieramy miejsce zapisu i
Bardziej szczegółowoUniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy
Uniwersytet Kazimierza Wielkiego w Bydgoszczy Zespół Szkół nr 5 Mistrzostwa Sportowego XV Liceum Ogólnokształcące w Bydgoszczy Matematyka, królowa nauk Edycja X - etap 2 Bydgoszcz, 16 kwietnia 2011 Fordoński
Bardziej szczegółowoWieczorowe Studia Licencjackie Wrocław, Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa
Wieczorowe Studia Licencjackie Wrocław, 7.11.2006 Wstęp do programowania Wykład nr 6 (w oparciu o notatki K. Lorysia, z modyfikacjami) Sito Eratostenesa Zaprezentujemy teraz algorytm na wyznaczanie wszystkich
Bardziej szczegółowoMETODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02
METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE Wykład 02 NAJPROSTSZY PROGRAM /* (Prawie) najprostszy przykład programu w C */ /*==================*/ /* Między tymi znaczkami można pisać, co się
Bardziej szczegółowoTemat 1: Podstawowe pojęcia: program, kompilacja, kod
Temat 1: Podstawowe pojęcia: program, kompilacja, kod wynikowy. Przykłady najprostszych programów. Definiowanie zmiennych. Typy proste. Operatory: arytmetyczne, przypisania, inkrementacji, dekrementacji,
Bardziej szczegółowo4. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych.
Jarosław Wróblewski Matematyka dla Myślących, 008/09. Postęp arytmetyczny i geometryczny. Wartość bezwzględna, potęgowanie i pierwiastkowanie liczb rzeczywistych. 15 listopada 008 r. Uwaga: Przyjmujemy,
Bardziej szczegółowoALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny
ALGORYMY Algorytm to przepis; zestawienie kolejnych kroków prowadzących do wykonania określonego zadania; to uporządkowany sposób postępowania przy rozwiązywaniu zadania, problemu, z uwzględnieniem opisu
Bardziej szczegółowoPytania sprawdzające wiedzę z programowania C++
Pytania sprawdzające wiedzę z programowania C++ Wstęp 1. Zaprezentuj mechanikę tworzenia programu napisanego w języku C++. 2. Co to jest kompilacja? 3. Co to jest konsolidacja? 4. Co to jest kod wykonywalny?
Bardziej szczegółowoLiczby rzeczywiste. Działania w zbiorze liczb rzeczywistych. Robert Malenkowski 1
Robert Malenkowski 1 Liczby rzeczywiste. 1 Liczby naturalne. N {0, 1,, 3, 4, 5, 6, 7, 8...} Liczby naturalne to liczby używane powszechnie do liczenia i ustalania kolejności. Liczby naturalne można ustawić
Bardziej szczegółowoTablice są typem pochodnym. Poniżej mamy przykłady deklaracji różnych tablic:
Tablice TEORIA Tablica to ciąg obiektów tego samego typu, które zajmują ciągły obszar w pamięci. Dzięki stosowaniu tablic, zamiast nazywania każdej z np. stu zmiennych osobno możemy zabudować tablicę 100-elementową,
Bardziej szczegółowoWstęp do Programowania, laboratorium 02
Wstęp do Programowania, laboratorium 02 Zadanie 1. Napisać program pobierający dwie liczby całkowite i wypisujący na ekran największą z nich. Zadanie 2. Napisać program pobierający trzy liczby całkowite
Bardziej szczegółowoC++ wprowadzanie zmiennych
C++ wprowadzanie zmiennych Każda zmienna musi być zadeklarowana, należy określić jej nazwę (identyfikator) oraz typ. Opis_typu lista zmiennych Dla każdej zmiennej rezerwowany jest fragment pamięci o określonym
Bardziej szczegółowoJęzyk C, instrukcje sterujące (laboratorium)
Język C, instrukcje sterujące (laboratorium) Opracował: Tomasz Mączka (tmaczka@kia.prz.edu.pl) Na podstawie http://pl.wikibooks.org/wiki/c Wstęp Instrukcja warunkowa Instrukcja if/if-else pozwala na warunkowe
Bardziej szczegółowoProste algorytmy w języku C
Proste algorytmy w języku C Michał Rad AGH Laboratorium Maszyn Elektrycznych 2016-12-01 Outline Język C Zadanie pierwsze - obliczanie miejsc zerowych wielomianu Zadanie drugie - znajdowanie największego
Bardziej szczegółowo2.8. Algorytmy, schematy, programy
https://app.wsipnet.pl/podreczniki/strona/38766 2.8. Algorytmy, schematy, programy DOWIESZ SIĘ co oznaczają pojęcia: algorytm, schemat blokowy, język programowania, jakie są sposoby obliczania największego
Bardziej szczegółowoJĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6
JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM Wykład 6 1 SPECYFIKATOR static Specyfikator static: Specyfikator ten powoduje, że zmienna lokalna definiowana w obrębie danej funkcji nie jest niszczona
Bardziej szczegółowo#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 ); }
OPERACJE WEJŚCIA / WYJŚCIA Funkcja: printf() biblioteka: wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout) int printf ( tekst_sterujący, argument_1, argument_2,... ) ;
Bardziej szczegółowo1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania
1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja nie ma parametru i zwraca wartość na zewnątrz. nie ma parametru i nie zwraca wartości na zewnątrz. ma parametr o nazwie void i zwraca
Bardziej szczegółowoWstęp do programowania
wykład 4 Agata Półrola Wydział Matematyki i Informatyki UŁ sem. zimowy 2017/2018 Pętle wykonujące się podaną liczbę razy Jeśli chcemy wykonać pewien fragment programu określoną liczbę razy, możemy użyć
Bardziej szczegółowoAnaliza algorytmów zadania podstawowe
Analiza algorytmów zadania podstawowe Zadanie 1 Zliczanie Zliczaj(n) 1 r 0 2 for i 1 to n 1 3 do for j i + 1 to n 4 do for k 1 to j 5 do r r + 1 6 return r 0 Jaka wartość zostanie zwrócona przez powyższą
Bardziej szczegółowoPodstawy programowania w języku C
Podstawy programowania w języku C WYKŁAD 1 Proces tworzenia i uruchamiania programów Algorytm, program Algorytm przepis postępowania prowadzący do rozwiązania określonego zadania. Program zapis algorytmu
Bardziej szczegółowolekcja 8a Gry komputerowe MasterMind
lekcja 8a Gry komputerowe MasterMind Posiadamy już elementarną wiedzę w zakresie programowania. Pora więc zabrać się za rozwiązywanie problemów bardziej złożonych, które wymagają zastosowania typowych
Bardziej szczegółowoLab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.
Języki i paradygmaty programowania 1 studia stacjonarne 2018/19 Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur. 1. Identyfikator funkcji,
Bardziej szczegółowoSchematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.
Schematy blokowe I Jeżeli po schematach blokowych będzie używany język C, to należy używać operatorów: '&&', ' ', '!=', '%' natomiast jeśli Ruby to 'and', 'or', '%', '!='. 1. Dostępne bloki: a) początek:
Bardziej szczegółowoPodstawy Informatyki. Kompilacja. Historia. Metalurgia, I rok. Kompilatory C++ Pierwszy program. Dyrektywy preprocesora. Darmowe:
Podstawy Informatyki Metalurgia, I rok Historia Lata 0-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard Koniec lat 80 standard
Bardziej szczegółowo1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami
1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami Celem tych zajęć jest zrozumienie i oswojenie z technikami programowania przy pomocy wskaźników w języku C++. Proszę przeczytać rozdział 8.
Bardziej szczegółowoLiczby całkowite i rzeczywiste
Wykład 4(20 marzec 2014r.) Liczby całkowite i rzeczywiste Paulina Rogowiecka Klaudia Kamińska Adrianna Znyk 1 Spis treści: Czynniki pierwsze metoda próbnych dzieleń Pierwszość liczby naturalnej algorytmy
Bardziej szczegółowoPodstawy Informatyki. Metalurgia, I rok. Wykład 6 Krótki kurs C++
Podstawy Informatyki Metalurgia, I rok Wykład 6 Krótki kurs C++ Historia Lata 70-te XX w język C (do pisania systemów operacyjnych) "The C programming language" B. Kernighan, D. Ritchie pierwszy standard
Bardziej szczegółowoZadania do samodzielnego rozwiązania
Zadania do samodzielnego rozwiązania I. Podzielność liczb całkowitych 1. Pewna liczba sześciocyfrowa a kończy się cyfrą 5. Jeśli tę cyfrę przestawimy na miejsce pierwsze ze strony lewej, to otrzymamy nową
Bardziej szczegółowoProgramowanie obiektowe - zadania
Programowanie obiektowe - zadania Elementy języka Java Zad.1. Napisz program, który sprawdza, czy dana liczba całkowita jest parzysta. Zad.2. Napisz program, który sumuje dane dwie liczby tylko w przypadku,
Bardziej szczegółowoFunkcja kwadratowa. f(x) = ax 2 + bx + c,
Funkcja kwadratowa. Funkcją kwadratową nazywamy funkcję f : R R określoną wzorem gdzie a, b, c R, a 0. f(x) = ax 2 + bx + c, Szczególnym przypadkiem funkcji kwadratowej jest funkcja f(x) = ax 2, a R \
Bardziej szczegółowoPodstawy języka C++ Maciej Trzebiński. Instytut Fizyki Jądrowej Polskiej Akademii Nauk. Praktyki studenckie na LHC IVedycja,2016r.
M. Trzebiński C++ 1/14 Podstawy języka C++ Maciej Trzebiński Instytut Fizyki Jądrowej Polskiej Akademii Nauk Praktyki studenckie na LHC IVedycja,2016r. IFJ PAN Przygotowanie środowiska pracy Niniejsza
Bardziej szczegółowoProgramowanie komputerowe. Zajęcia 3
Programowanie komputerowe Zajęcia 3 Instrukcje przypisania Poza zwykłą instrukcją przypisania, powodującą ustawienie wartości zmiennej na podane wyrażenie, istnieje wiele innych, np. += dodaj, a+=b jest
Bardziej szczegółowofor (inicjacja_warunkow_poczatkowych(końcowych); wyrazenie_warunkowe; wyrazenie_zwiekszajace(zmniejszające)) { blok instrukcji; }
Pętle Pętle (ang. loops), zwane też instrukcjami iteracyjnymi, stanowią podstawę prawie wszystkich algorytmów. Lwia część zadań wykonywanych przez programy komputerowe opiera się w całości lub częściowo
Bardziej szczegółowoProgramowanie w Baltie klasa VII
Programowanie w Baltie klasa VII Zadania z podręcznika strona 127 i 128 Zadanie 1/127 Zadanie 2/127 Zadanie 3/127 Zadanie 4/127 Zadanie 5/127 Zadanie 6/127 Ten sposób pisania programu nie ma sensu!!!.
Bardziej szczegółowoWstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)
1 Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną) Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion,
Bardziej szczegółowoWskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady
Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4 Dr inż. Dariusz JĘDRZEJCZYK Wskaźniki Dynamiczna alokacja pamięci Przykłady 11/3/2016 AGH, Katedra Informatyki Stosowanej i Modelowania 2 Wskaźnik to
Bardziej szczegółowoJęzyki programowania zasady ich tworzenia
Strona 1 z 18 Języki programowania zasady ich tworzenia Definicja 5 Językami formalnymi nazywamy każdy system, w którym stosując dobrze określone reguły należące do ustalonego zbioru, możemy uzyskać wszystkie
Bardziej szczegółowoPROGRAMOWANIE W C++ ZADANIA
PROGRAMOWANIE W C++ ZADANIA Włodzimierz Gajda Rozdział 7 PĘTLE 7.1 PĘTLA FOR: rysowanie wzorków. ZADANIE 7.1.1 Napisz program drukujący na ekranie 19 gwiazdek: ******************* ZADANIE 7.1.2 Napisz
Bardziej szczegółowoFunkcja kwadratowa. f(x) = ax 2 + bx + c = a
Funkcja kwadratowa. Funkcją kwadratową nazywamy funkcję f : R R określoną wzorem gdzie a, b, c R, a 0. f(x) = ax + bx + c, Szczególnym przypadkiem funkcji kwadratowej jest funkcja f(x) = ax, a R \ {0}.
Bardziej szczegółowo7. Pętle for. Przykłady
. Pętle for Przykłady.1. Bez użycia pętli while ani rekurencji, napisz program, który wypisze na ekran kolejne liczby naturalne od 0 do pewnego danego n. 5 int n; 6 cin >> n; 8 for (int i = 0; i
Bardziej szczegółowoWstęp do informatyki- wykład 1
MATEMATYKA 1 Wstęp do informatyki- wykład 1 Systemy liczbowe Treści prezentowane w wykładzie zostały oparte o: S. Prata, Język C++. Szkoła programowania. Wydanie VI, Helion, 2012 www.cplusplus.com Jerzy
Bardziej szczegółowoSamodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =
Systemy liczbowe Dla każdej liczby naturalnej x Î N oraz liczby naturalnej p >= 2 istnieją jednoznacznie wyznaczone: liczba n Î N oraz ciąg cyfr c 0, c 1,..., c n-1 (gdzie ck Î {0, 1,..., p - 1}) taki,
Bardziej szczegółowoLaboratorium nr 1. i 2.
Laboratorium nr 1. i 2. Celem laboratorium jest zapoznanie się ze zintegrowanym środowiskiem programistycznym, na przykładzie podstawowych aplikacji z obsługą standardowego wejścia wyjścia, podstawowych
Bardziej szczegółowo