Wstęp do programowania, część II

Podobne dokumenty
Wstęp do programowania. Dariusz Wardecki, wyk. V

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

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

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Lab 9 Podstawy Programowania

DYNAMICZNE PRZYDZIELANIE PAMIECI

Programowanie komputerowe. Zajęcia 4

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

Wskaźniki. Informatyka

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

Część 4 życie programu

Pętla for. Wynik działania programu:

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

ZASADY PROGRAMOWANIA KOMPUTERÓW

Zmienne, stałe i operatory

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Język C zajęcia nr 11. Funkcje

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

Podstawy Programowania C++

Język C++ zajęcia nr 2

Podstawy programowania w języku C++

Podstawy programowania w języku C

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

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

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

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

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

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

I - Microsoft Visual Studio C++

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

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

Materiał Typy zmiennych Instrukcje warunkowe Pętle Tablice statyczne Wskaźniki Tablice dynamiczne Referencje Funkcje

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

Wskaźniki. Przemysław Gawroński D-10, p marca Wykład 2. (Wykład 2) Wskaźniki 8 marca / 17

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

4. Funkcje. Przykłady

1 Podstawy c++ w pigułce.

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Programowanie strukturalne. Opis ogólny programu w Turbo Pascalu

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

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

Wstęp do programowania obiektowego, wykład 7

Wstęp do Programowania, laboratorium 02

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

/* dołączenie pliku nagłówkowego zawierającego deklaracje symboli dla wykorzystywanego mikrokontrolera */ #include <aduc834.h>

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

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

Wstęp do programowania

Programowanie, część I

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

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

Wykład 3 Składnia języka C# (cz. 2)

Elementy języka C. ACprogramislikeafastdanceonanewlywaxeddancefloorbypeople carrying razors.

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

1 Podstawy c++ w pigułce.

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

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

Microsoft IT Academy kurs programowania

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

C++ wprowadzanie zmiennych

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

> C++ dynamiczna alokacja/rezerwacja/przydział pamięci. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk. Wydział Inżynierii Metali i Informatyki Przemysłowej

Szablony klas, zastosowanie szablonów w programach

Podstawy programowania. Wykład: 8. Wskaźniki. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania

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

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

Programowanie komputerowe. Zajęcia 3

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

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

do instrukcja while (wyrażenie);

Programowanie w języku C++

Wstęp do wskaźników w języku ANSI C

KURS C/C++ WYKŁAD 6. Wskaźniki

Wskaźniki w C. Anna Gogolińska

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Instrukcje sterujące. Programowanie Proceduralne 1

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

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

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

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

Alokacja pamięci dla tablicy dwuwymiarowej

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podstawy programowania w języku C++

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

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

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Podstawowe algorytmy i ich implementacje w C. Wykład 9

- - Ocena wykonaniu zad3. Brak zad3

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

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Transkrypt:

Wstęp do programowania, część II Rafał J. Wysocki Instytut Fizyki Teoretycznej, Wydział Fizyki UW 8 listopada 2011 Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 1 / 63

Podstawy języka C++ Sprawdzanie warunków if () Instrukcje sterujące if (warunek) instrukcja; else instrukcja; // A // B if (warunek) { // A instrukcja;... } else { // B instrukcja;... } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 2 / 63

Podstawy języka C++ Sprawdzanie warunków if () Instrukcje sterujące if (warunek) instrukcja; else instrukcja; // A // B if (warunek) { // A instrukcja;... } else { // B instrukcja;... } 1 Jeżeli warunek ma wartość true, zostanie wykonana instrukcja (lub blok) A, zaś w przeciwnym wypadku instrukcja (lub blok) B. 2 Warunek powinien być wyrażeniem o wartości typu bool. Jeżeli tak nie jest, następuje konwersja wyniku do typu bool (zgodnie z zasadami przedstawionymi wcześniej). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 2 / 63

Podstawy języka C++ Instrukcje sterujące Sprawdzanie warunków if () c. d. Klauzula (ang. clause) else oraz instrukcja lub blok występujący po niej są opcjonalne. Przykład x = funkcja(arg); if (x < 0) x = 0; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 3 / 63

Podstawy języka C++ Instrukcje sterujące Sprawdzanie warunków if () c. d. Klauzula (ang. clause) else oraz instrukcja lub blok występujący po niej są opcjonalne. Przykład x = funkcja(arg); if (x < 0) x = 0; W niektórych przypadkach użycie trójargumentowego operatora prowadzi do bardziej zwartego kodu. Przykład x = y < z? z : y; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 3 / 63

Pętla while () Podstawy języka C++ Instrukcje sterujące while (warunek) instrukcja; while (warunek) { instrukcja;... } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 4 / 63

Podstawy języka C++ Instrukcje sterujące Pętla while () while (warunek) instrukcja; while (warunek) { instrukcja;... } 1 Powtarzaj instrukcję lub blok tak długo, jak długo warunek ma wartość true. 2 Warunek powinien być wyrażeniem o wartości typu bool. Jeżeli tak nie jest, następuje konwersja wyniku do typu bool (zgodnie z zasadami przedstawionymi wcześniej). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 4 / 63

Podstawy języka C++ Pętla do... while () Instrukcje sterujące do instrukcja; while (warunek) do { instrukcja;... } while (warunek); Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 5 / 63

Podstawy języka C++ Pętla do... while () Instrukcje sterujące do instrukcja; while (warunek) do { instrukcja;... } while (warunek); 1 Powtarzaj instrukcję lub blok tak długo, jak długo warunek ma wartość true. 2 Warunek powinien być wyrażeniem o wartości typu bool. Jeżeli tak nie jest, następuje konwersja wyniku do typu bool (zgodnie z zasadami przedstawionymi wcześniej). 3 Różni się od while () tym, że instrukcja (lub blok) będzie wykonana co najmniej raz, niezależnie od początkowej wartości warunku. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 5 / 63

Pętla for () Podstawy języka C++ Instrukcje sterujące for (ins1; war; ins2) instrukcja; for (ins1; war; ins2) { instrukcja;... } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 6 / 63

Podstawy języka C++ Instrukcje sterujące Pętla for () for (ins1; war; ins2) instrukcja; for (ins1; war; ins2) { instrukcja;... } 1 Wykonaj instrukcję ins1; 2 Oblicz war i jeżeli ma on wartość false lub 0, przerwij pętlę. 3 Wykonaj instrukcję (lub blok) za nawiasem. 4 Wykonaj instrukcję ins2. 5 Przejdź do kroku 2. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 6 / 63

Podstawy języka C++ Pętle for () i while () Instrukcje sterujące for (ins1; war; ins2) { instrukcja;... } ins1; while (war) { instrukcja;... ins2; } Powyższe dwa sposoby zapisu kodu pętli są równoważne. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 7 / 63

Podstawy języka C++ Instrukcje sterujące Pętle for () i while () c. d. Przykład for (int i = 1; i <= 10; i++) cout << i << "^2 = " << i*i << endl; int i = 1; while (i <= 10) { cout << i << "^2 = " << i*i << endl; i++; } W jednym i w drugim przypadku zostaną wydrukowane kwadraty liczb od 1 do 10. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 8 / 63

Podstawy języka C++ Instrukcje sterujące Zasięg deklaracji zmiennych Zasady określania zasięgu (ang. scope) deklaracji 1 Zmienna (lub stała) zadeklarowana wewnątrz bloku nie może być wykorzystywana poza tym blokiem. 2 Zmienna zadeklarowana w pierwszej instrukcji pętli for () jest traktowana tak, jakby została zadeklarowana wewnątrz bloku obejmującego tę pętlę. 3 Instrukcje zapisane przed deklaracją zmiennej nie mogą zawierać odwołań do niej. 4 Jeżeli w bloku zadeklarowana jest zmienna o takiej samej nazwie, jaką ma zmienna zadeklarowana poza tym blokiem, to instrukcje w bloku będą odwoływać się w pierwszej kolejności do zmiennej zadeklarowanej wewnątrz bloku (przesłanianie deklaracji). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 9 / 63

Podstawy języka C++ Instrukcje sterujące Skracanie kroku pętli continue continue Powoduje przejście do następnego kroku pętli: Dla pętli while () i do... while() powoduje przejście do sprawdzania warunku. Dla pętli for () powoduje przejście do kroku 4 w algorytmie wykonywania jej (wykonywanie instrukcji w trzecim polu w nawiasie). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 10 / 63

Podstawy języka C++ Instrukcje sterujące Skracanie kroku pętli continue continue Powoduje przejście do następnego kroku pętli: Dla pętli while () i do... while() powoduje przejście do sprawdzania warunku. Dla pętli for () powoduje przejście do kroku 4 w algorytmie wykonywania jej (wykonywanie instrukcji w trzecim polu w nawiasie). Przykład for (j = 1; j <= 20; j++) { if (j % 2) continue; count << j << "^2 = " << j*j << endl; } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 10 / 63

Podstawy języka C++ Skracanie pętli break Instrukcje sterujące break Powoduje natychmiastowe przerwanie wykonywania pętli. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 11 / 63

Podstawy języka C++ Instrukcje sterujące Skracanie pętli break break Powoduje natychmiastowe przerwanie wykonywania pętli. Przykład k = 0; a_k = 1; suma = 1; while (k < N) { k++; a_k /= k; suma += a_k; if (a_k < epsilon) break; } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 11 / 63

Podstawy języka C++ Instrukcje sterujące Instrukcja wyboru switch 1 Słowo kluczowe switch. 2 Wyrażenie w nawiasie okrągłym. 3 Początek bloku. 4 Lista wartości (stałych) do porównania z wyrażeniem, każda ze słowem kluczowym case (np. case 100:). 5 Opcjonalnie słowo kluczowe default oznaczające domyślną akcję. 6 Koniec bloku. Jeżeli wartość wyrażenia jest równa wartości za słowem kluczowym case, to następuje przeskok do miejsca w bloku, gdzie znajduje się słowo kluczowe case z tą wartością. W przypadku braku dopasowania następuje przeskok do miejsca w bloku oznaczonego przez default. break powoduje natychmiastowe opuszczenie bloku. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 12 / 63

switch - przykład Podstawy języka C++ Instrukcje sterujące switch (req) { case RPM_REQ_NONE: break; case RPM_REQ_IDLE: rpm_idle(dev, RPM_NOWAIT); break; case RPM_REQ_SUSPEND: rpm_suspend(dev, RPM_NOWAIT); break; case RPM_REQ_AUTOSUSPEND: rpm_suspend(dev, RPM_NOWAIT RPM_AUTO); break; case RPM_REQ_RESUME: rpm_resume(dev, RPM_NOWAIT); } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 13 / 63

Podstawy języka C++ Skoki (ang. jump) goto Instrukcje sterujące suma = a_k = 1; for (k = 0; k < N; suma += a_k) { if (a_k < epsilon) goto dalej; a_k /= ++k; } dalej: dalej: jest etykietą (ang. label) oznaczającą miejsce, od którego należy kontynuować wykonywanie programu. Instrukcji goto nie można używać do przeskoków między funkcjami (tzn. docelowa etykieta musi być w treści tej samej funkcji, w której jest instrukcja goto prowadząca do niej). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 14 / 63

Podstawy języka C++ Instrukcje sterujące Łączenie wyrażeń, (przecinek), (przecinek) 1 Oblicz wyrażenie (lub wykonaj instrukcję) po lewej stronie przecinka (łącznie ze wszystkimi efektami ubocznymi). 2 Zaniedbaj wynik obliczonego wyrażenia. 3 Oblicz wyrażenie (lub wykonaj instrukcję) po prawej stronie przecinka. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 15 / 63

Podstawy języka C++ Instrukcje sterujące Łączenie wyrażeń, (przecinek), (przecinek) 1 Oblicz wyrażenie (lub wykonaj instrukcję) po lewej stronie przecinka (łącznie ze wszystkimi efektami ubocznymi). 2 Zaniedbaj wynik obliczonego wyrażenia. 3 Oblicz wyrażenie (lub wykonaj instrukcję) po prawej stronie przecinka. Przykład Następujący kod spowoduje wydrukowanie liczb 20 i 30 (w tej kolejności): int i, b = 20, c= 30; i = b, c; cout << i << endl; i = (b, c); cout << i << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 15 / 63

Podstawy języka C++ Funkcje i argumenty Definiowanie funkcji z argumentami Argumenty funkcji 1 Definiuje się w nagłówku funkcji, w nawiasie okrągłym za nazwą. 2 Ich definicje rozdziela się przecinkami. 3 Są definiowane podobnie, jak zmienne wewnątrz funkcji. 4 Mogą być wykorzystywane jako zmienne wewnątrz funkcji. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 16 / 63

Podstawy języka C++ Funkcje i argumenty Definiowanie funkcji z argumentami Argumenty funkcji 1 Definiuje się w nagłówku funkcji, w nawiasie okrągłym za nazwą. 2 Ich definicje rozdziela się przecinkami. 3 Są definiowane podobnie, jak zmienne wewnątrz funkcji. 4 Mogą być wykorzystywane jako zmienne wewnątrz funkcji. Przykład funkcja z jednym argumentem double f(double x) { return x*x + 1; } Zwraca wynik będący kwadratem jej argumentu zwiększonym o 1. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 16 / 63

Podstawy języka C++ Funkcje i argumenty Wywołanie funkcji (ang. function call) Na poziomie kodu źródłowego Polega na umieszczeniu w instrukcji nazwy funkcji z listą wartości parametrów w nawiasie okrągłym. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 17 / 63

Podstawy języka C++ Funkcje i argumenty Wywołanie funkcji (ang. function call) Na poziomie kodu źródłowego Polega na umieszczeniu w instrukcji nazwy funkcji z listą wartości parametrów w nawiasie okrągłym. Podczas wykonywania programu Kod (tzn. rozkazy dla procesora) wygenerowany na podstawie instrukcji zawartych w treści funkcji jest wykonywany w punkcie programu, w którym w kodzie źródłowym była umieszczona nazwa funkcji. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 17 / 63

Podstawy języka C++ Funkcje i argumenty Wywołanie funkcji (ang. function call) Na poziomie kodu źródłowego Polega na umieszczeniu w instrukcji nazwy funkcji z listą wartości parametrów w nawiasie okrągłym. Podczas wykonywania programu Kod (tzn. rozkazy dla procesora) wygenerowany na podstawie instrukcji zawartych w treści funkcji jest wykonywany w punkcie programu, w którym w kodzie źródłowym była umieszczona nazwa funkcji. Podczas wykonywania programu Wynik generowany przez funkcję jest wykorzystywany w wyrażeniu w tym miejscu, w którym następuje wywołanie funkcji. Za każdym razem wygenerowanie wyniku następuje w efekcie wykonania kodu funkcji (kodu utworzonego na podstawie instrukcji zapisanych w treści funkcji). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 17 / 63

Podstawy języka C++ Funkcje i argumenty Przekazywanie wartości argumentów do funkcji Podczas wykonywania programu 1 Tworzone są zmienne, których nazwy i typy danych odpowiadają nazwom i typom danych argumentów funkcji. 2 Wartości znajdujące się na pozycjach odpowiadających argumentom w zapisie wywołania funkcji (np. suma += sin(a);) stają się początkowymi wartościami tych zmiennych. 3 Wykonywany jest kod reprezentowany przez instrukcje w treści funkcji, odwołujący się do tych zmiennych. 4 Wykonanie tego kodu może skończyć się wygenerowaniem wyniku, który jest wykorzystywany w sposób określony przez kod wywołujący funkcję. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 18 / 63

Podstawy języka C++ Funkcje i argumenty Przekazywanie wartości argumentów do funkcji przykład Całka trapezowa dla funkcji f() z poprzedniego przykładu. double trapez(double a, double b, int N) { double delta, suma, x_j; int j; } suma = (f(a) + f(b)) / 2; delta = (b - a) / N; for (j = 1, x_j = a; j < N; j++) { x_j += delta; suma += f(x_j); } suma *= delta; return suma; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 19 / 63

Podstawy języka C++ Funkcje i argumenty Funkcje biblioteczne (ang. library function) Gotowe funkcje, które zostały napisane oraz skompilowane przez kogoś innego i znajdują się w specjalnych zbiorach funkcji, zwanych bibliotekami (ang. library). Przykłady sin(), cos(), exp(), sqrt() (pierwiastek kwadratowy). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 20 / 63

Podstawy języka C++ Funkcje i argumenty Funkcje biblioteczne (ang. library function) Gotowe funkcje, które zostały napisane oraz skompilowane przez kogoś innego i znajdują się w specjalnych zbiorach funkcji, zwanych bibliotekami (ang. library). Przykłady sin(), cos(), exp(), sqrt() (pierwiastek kwadratowy). Pliki nagłówkowe (ang. header files) Pliki zawierające, między innymi, nagłówki funkcji bibliotecznych, które mogą być wykorzystane w programie. Na podstawie nagłówków kompilator znajduje odpowiednie funkcje w bibliotekach. Nagłówki funkcji matematycznych znajdują się w pliku nagłówkowym cmath. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 20 / 63

Stałe (ang. constant) Podstawy języka C++ Stałe i referencje const Słowo kluczowe używane przy definiowaniu stałych. Po nim podaje się typ danych, nazwę oraz wartość stałej. Przykład const double pi = 3.14159265358979323846; W C++ stałe mają własności analogiczne do zmiennych poza tym, że ich wartości nie zmieniają się. Argument funkcji może być zadeklarowany jako stała i wtedy jego wartość nie może być mdyfikowana wewnątrz funkcji (otrzymuje on wartość przy wywoływaniu funkcji). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 21 / 63

Podstawy języka C++ Referencje (ang. reference) Stałe i referencje Referencja jest symbolem definiowanym podobnie, jak zmienna, ale w jej definicji, bezpośrednio przed nazwą, znajduję się znak & (ang. ampersand). Przykład double &ref = x; Wartością referencji jest zmienna odpowiedniego typu, wskazana w jej definicji (np. x powyżej). Referencję można traktować jako alternatywną nazwę (alias) zmiennej. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 22 / 63

Podstawy języka C++ Stałe i referencje Referencje i argumenty funkcji Argument funkcji może być zadeklarowany jako referencja i wtedy: 1 W wywołaniu funkcji na pozycji odpowiadającej temu argumentowi musi stać nazwa zmiennej odpowiedniego typu (nie może to być wyrażenie). 2 Zmienna ta będzie używana w treści funkcji bezpośrednio w miejscach, w których następują odwołania do reprezentującego ją argumentu. Przykład double oblicz(double r, int &n) { return r / ++n; } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 23 / 63

Podstawy języka C++ Stałe i referencje Referencje i argumenty funkcji przykład Wywołanie funkcji oblicz() k = 0; a_k = 1; suma = 1; while (k < N) { a_k = oblicz(a_k, k); suma += a_k; if (a_k < epsilon) break; } Zmienna k jest modyfikowana przez funkcję oblicz() (występuje w niej pod nazwą n). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 24 / 63

Tablice Tablice, elementy, indeksy Tablica (ang. array) Zestaw N zmiennych tego samego typu numerowanych liczbami w zakresie od 0 do (N 1). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 25 / 63

Tablice Tablice, elementy, indeksy Tablica (ang. array) Zestaw N zmiennych tego samego typu numerowanych liczbami w zakresie od 0 do (N 1). Element tablicy Zmienna wchodząca w skład tablicy, mająca przypisaną określoną liczbę, która ją identyfikuje. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 25 / 63

Tablice Tablice, elementy, indeksy Tablica (ang. array) Zestaw N zmiennych tego samego typu numerowanych liczbami w zakresie od 0 do (N 1). Element tablicy Zmienna wchodząca w skład tablicy, mająca przypisaną określoną liczbę, która ją identyfikuje. Indeks (ang. index) elmentu tablicy Liczba identyfikująca element tablicy. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 25 / 63

Tablice Tablice, elementy, indeksy Tablica (ang. array) Zestaw N zmiennych tego samego typu numerowanych liczbami w zakresie od 0 do (N 1). Element tablicy Zmienna wchodząca w skład tablicy, mająca przypisaną określoną liczbę, która ją identyfikuje. Indeks (ang. index) elmentu tablicy Liczba identyfikująca element tablicy. Długość tablicy Liczba elementów tablicy (N). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 25 / 63

Tablice Rozmieszczenie elementów w pamięci, nazwa tablicy W C++ zakłada się, że elementy tablicy będą zawsze rozmieszczane w pamięci jeden obok drugiego, zgodnie z kolejnością indeksów (tzn. element o najmniejszym indeksie będzie znajdował się w pamięci w lokacji o najniższym adresie). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 26 / 63

Tablice Rozmieszczenie elementów w pamięci, nazwa tablicy W C++ zakłada się, że elementy tablicy będą zawsze rozmieszczane w pamięci jeden obok drugiego, zgodnie z kolejnością indeksów (tzn. element o najmniejszym indeksie będzie znajdował się w pamięci w lokacji o najniższym adresie). Nazwa tablicy Jest wykorzystywana do identyfikowania tablicy oraz wszystkich jej elementów. W programie reprezentuje adres tablicy, czyli adres jej pierwszego elementu. a[j] Element tablicy o nazwie a, któremu odpowiada indeks j (w ogólności j może być stałą lub dowolnie skomplikowanym wyrażeniem). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 26 / 63

Tablice Deklaracja i definicja tablicy Deklaracja tablicy Określenie typu danych dla elementów tablicy, nazwy oraz (nie obowiązkowo) liczby elementów w nawiasie kwadratowym, np. int tab[100]; int liczby[]; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 27 / 63

Tablice Deklaracja i definicja tablicy Deklaracja tablicy Określenie typu danych dla elementów tablicy, nazwy oraz (nie obowiązkowo) liczby elementów w nawiasie kwadratowym, np. int tab[100]; int liczby[]; Definicja tablicy Deklaracja tablicy, w której jest określona liczba elementów. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 27 / 63

Tablice Deklaracja i definicja tablicy Deklaracja tablicy Określenie typu danych dla elementów tablicy, nazwy oraz (nie obowiązkowo) liczby elementów w nawiasie kwadratowym, np. int tab[100]; int liczby[]; Definicja tablicy Deklaracja tablicy, w której jest określona liczba elementów. Po zdefiniowaniu tablicy każdy jej element może być wykorzystywany jako niezależna zmienna. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 27 / 63

Tablica przykład Tablice i wskaźniki w C++ Tablice int tab[10];... for (int j = 0; j < 10; j++) tab[j] = 0; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 28 / 63

Tablice Tablica przykład int tab[10];... for (int j = 0; j < 10; j++) tab[j] = 0; Uwaga! 1 Kompilator C++ nie sprawdza, czy używane w programach wartości indeksów tablic są właściwe. 2 Wartości te również nie są kontrolowane podczas wykonywania programu. 3 Ujemne wartości indeksów są dopuszczalne (oznaczają hipotetyczne elementy o adresach mniejszych od adresu pierwszego elementu). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 28 / 63

Przykład zastosowania tablicy Tablice Tablice dobrze sprawdzają się w zastosowaniach, w których mamy do czynienia ze stosunkowo dużą, ustaloną liczbą obiektów tego samego typu. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 29 / 63

Tablice Przykład zastosowania tablicy Tablice dobrze sprawdzają się w zastosowaniach, w których mamy do czynienia ze stosunkowo dużą, ustaloną liczbą obiektów tego samego typu. Problem W zbiorze (N + M + 1) wylosowanych liczb mamy znaleźć taką, dla której w tym zbiorze jest N liczb nie większych i M nie mniejszych od niej. Dla N = M jest to problem wyznaczania mediany ( środkowego elementu ) zbioru. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 29 / 63

Tablice Przykład zastosowania tablicy Tablice dobrze sprawdzają się w zastosowaniach, w których mamy do czynienia ze stosunkowo dużą, ustaloną liczbą obiektów tego samego typu. Problem W zbiorze (N + M + 1) wylosowanych liczb mamy znaleźć taką, dla której w tym zbiorze jest N liczb nie większych i M nie mniejszych od niej. Dla N = M jest to problem wyznaczania mediany ( środkowego elementu ) zbioru. Metoda poszukiwania rozwiązania Ustawimy liczby w danym zbiorze w kolejności rosnącej i wybierzemy tę, która będzie na pozycji (N + 1). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 29 / 63

Tablice Algorytm sortowania tablicy (przez wybieranie) 1 Zapisz każdą wylosowaną liczbę w innym elemencie tablicy a[] o długości L = N + M + 1. 2 Powtarzaj dla indeksów i od 0 do (L 2): 1 Wyznacz indeks j taki, że element tablicy o tym indeksie jest najmniejszy spośród elementów o indeksach od i do (L 1) włącznie. 2 Zamień miejscami element o indeksie i z elementem o indeksie j. 3 Po zakończeniu powyższych czynności tablica jest posortowana. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 30 / 63

Tablice Algorytm sortowania tablicy (przez wybieranie) 1 Zapisz każdą wylosowaną liczbę w innym elemencie tablicy a[] o długości L = N + M + 1. 2 Powtarzaj dla indeksów i od 0 do (L 2): 1 Wyznacz indeks j taki, że element tablicy o tym indeksie jest najmniejszy spośród elementów o indeksach od i do (L 1) włącznie. 2 Zamień miejscami element o indeksie i z elementem o indeksie j. 3 Po zakończeniu powyższych czynności tablica jest posortowana. Wyznaczanie najmniejszego elementu (krok 2.1) 1 Niech j = i. 2 Powtarzaj dla indeksów k od (i + 1) do (L 1): Jeśli a[k] < a[j], to niech j = k. 3 j jest poszukiwanym indeksem. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 30 / 63

Program sortujący tablicę Tablice for (int i = 0; i < L-1; i++) { // Poszukiwanie indeksu j int j = i; for (int k = i + 1; k < L; k++) if (a[k] < a[j]) j = k; } // Zamiana miejscami a[i] z a[j] if (j > i) { double m = a[j]; a[j] = a[i]; a[i] = m; } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 31 / 63

Tablice Program sortujący tablicę c. d. Wypełnianie tablicy W powyższym kodzie źródłowym pominięto wypełnianie tablicy: srandom(time(null)); for (int i = 0; i < L; i++) a[i] = 1.0 / (1.0 + random()); Funkcja random() generuje liczby pseudolosowe w zakresie od 0 do RAND_MAX. Do tablicy wstawiane są liczby pseudolosowe z przedziału (0, 1]. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 32 / 63

Tablice Program sortujący tablicę c. d. Wypełnianie tablicy W powyższym kodzie źródłowym pominięto wypełnianie tablicy: srandom(time(null)); for (int i = 0; i < L; i++) a[i] = 1.0 / (1.0 + random()); Funkcja random() generuje liczby pseudolosowe w zakresie od 0 do RAND_MAX. Do tablicy wstawiane są liczby pseudolosowe z przedziału (0, 1]. Wynik obliczeń Po przeprowadzeniu sortowania tablicy wystarczy wydrukować a[n] jako wynik. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 32 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa Poszukujemy liczb pierwszych nie większych od N Niech A = {2, 3,..., N} będzie zbiorem liczb, natomiast k i m miejscami do przechowywania pośrednich wyników. 1 Niech k = 2. 2 Jeśli k 2 > N, zbiór A zawiera tylko liczby pierwsze. 3 Usuwamy z A wszystkie wielokrotności k, począwszy od k 2. 4 W m zapisz najmniejszą liczbą ze zbioru A większą od k. 5 Niech k = m. 6 Przejdź do kroku 2. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 33 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa Poszukujemy liczb pierwszych nie większych od N Niech A = {2, 3,..., N} będzie zbiorem liczb, natomiast k i m miejscami do przechowywania pośrednich wyników. 1 Niech k = 2. 2 Jeśli k 2 > N, zbiór A zawiera tylko liczby pierwsze. 3 Usuwamy z A wszystkie wielokrotności k, począwszy od k 2. 4 W m zapisz najmniejszą liczbą ze zbioru A większą od k. 5 Niech k = m. 6 Przejdź do kroku 2. Zbiór A w powyższym algorytmie można zastąpić tablicą. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 33 / 63

Sito Eratostenesa z użyciem tablicy Przykład: Poszukiwanie liczb pierwszych Poszukujemy liczb pierwszych nie większych od N Niech a[] będzie tablicą o (N + 1) elementach typu bool. 1 Niech wszystkie elementy a[j] dla j > 1 mają wartość true. 2 Niech k = 2 3 Wstaw false do wszystkich elementów a[j], dla których j jest wielokrotnością k, począwszy od k 2. 4 Powtarzaj: k = k + 1 Jeśli k 2 > N, przejdź do kroku 5. Jeśli a[k] ma wartość true, przejdź do kroku 3. 5 Wydrukuj indeksy j, dla których elementy a[j] mają wartość true. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 34 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy program bool a[n+1]; int j; for (j = 2; j <= N; j++) a[j] = true; for (int k = 2; k*k <= N; k++) if (a[k]) { for (j = k*k; j <= N; j += k) a[j] = false; } for (j = 2; j <= N; j++) if (a[j]) cout << j << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 35 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy usprawnione W poprzednim programie nie wykorzystujemy elementów a[0] i a[1]. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 36 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy usprawnione W poprzednim programie nie wykorzystujemy elementów a[0] i a[1]. Poszukujemy liczb pierwszych nie większych od N Niech a[] będzie tablicą o (N 1) elementach typu bool. 1 Niech wszystkie elementy a[j] mają wartość true. 2 Niech k = 2 3 Wstaw false do wszystkich elementów a[j], dla których (j + 2) jest wielokrotnością k, począwszy od k 2. 4 Powtarzaj: k = k + 1 Jeśli k 2 > N, przejdź do kroku 5. Jeśli a[k 2] ma wartość true, przejdź do kroku 3. 5 Wydrukuj liczby j, dla których elementy a[j 2] mają wartość true. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 36 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy poprawiony program bool a[n-1]; int j; for (j = 0; j < N-1; j++) a[j] = true; for (int k = 2; k*k <= N; k++) if (a[k-2]) { for (j = k*k - 2; j < N-1; j += k) a[j] = false; } for (j = 0; j < N-1; j++) if (a[j]) cout << (j + 2) << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 37 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych Poszukujemy liczb pierwszych nie większych od N Niech a[] będzie tablicą o (N + 6)/8 elementach typu unsigned char. 1 Niech wszystkie elementy a[j] mają wartość 0 (wszystkie bity są zerami). 2 Niech k = 2 3 Wstaw 1 do wszystkich bitów w a[] odpowiadających wielokrotnościom k, począwszy od k 2. 4 Powtarzaj: k = k + 1 Jeśli k 2 > N, przejdź do kroku 5. Jeśli bit w a[] odpowiadający k jest zerem, przejdź do kroku 3. 5 Wydrukuj liczby j, dla których odpowiadające im bity w a[] są zerami. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 38 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Obserwacja Wynik wyrażenia (N + 7)/8 jest równy wynikowi dzielenia N przez 8 z zaokrgleniem w górę. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 39 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Obserwacja Wynik wyrażenia (N + 7)/8 jest równy wynikowi dzielenia N przez 8 z zaokrgleniem w górę. Ponieważ pierwszy bit w tablicy ma odpowiadać liczbie 2, a każdy element zawiera 8 bitów, liczba elementów a[] musi być równa wynikowi dzielenia (N 1) przez 8 z zaokrągleniem w górę. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 39 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Obserwacja Wynik wyrażenia (N + 7)/8 jest równy wynikowi dzielenia N przez 8 z zaokrgleniem w górę. Ponieważ pierwszy bit w tablicy ma odpowiadać liczbie 2, a każdy element zawiera 8 bitów, liczba elementów a[] musi być równa wynikowi dzielenia (N 1) przez 8 z zaokrągleniem w górę. Liczbę elementów a[] można obliczyć tak: (N 1 + 7)/8 = (N + 6)/8 Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 39 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Bit w a[] odpowiadający liczbie k 1 Pierwszy bit odpowiada liczbie 2. 2 Każdy element a[] odpowiada 8 bitom. 3 Indeks: i = (k 2)/8 (dzielenie z pominięciem reszty). 4 Pozycja bitowa: b = (k 2) % 8. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 40 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Bit w a[] odpowiadający liczbie k 1 Pierwszy bit odpowiada liczbie 2. 2 Każdy element a[] odpowiada 8 bitom. 3 Indeks: i = (k 2)/8 (dzielenie z pominięciem reszty). 4 Pozycja bitowa: b = (k 2) % 8. Sprawdzanie wartości bitu (a[(k-2)/8] & (1 << ((k-2) % 8)) == 0 Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 40 / 63

Przykład: Poszukiwanie liczb pierwszych Sito Eratostenesa z użyciem tablicy i wzorów bitowych c. d. Bit w a[] odpowiadający liczbie k 1 Pierwszy bit odpowiada liczbie 2. 2 Każdy element a[] odpowiada 8 bitom. 3 Indeks: i = (k 2)/8 (dzielenie z pominięciem reszty). 4 Pozycja bitowa: b = (k 2) % 8. Sprawdzanie wartości bitu (a[(k-2)/8] & (1 << ((k-2) % 8)) == 0 Wstawianie jedynki a[(k-2)/8] = 1 << ((k-2) % 8) Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 40 / 63

Przykład: Poszukiwanie liczb pierwszych Sito z użyciem tablicy i wzorów bitowych program unsigned char a[(n+6)/8]; int j; for (j = 0; j < (N+6)/8; j++) a[j] = 0; for (int k = 2; k*k <= N; k++) if ((a[(k-2)/8] & (1 << ((k-2) % 8))) == 0) { for (j = k*k; j <= N; j += k) a[(j-2)/8] = 1 << ((j-2) % 8); } for (j = 2; j <= N; j++) if ((a[(j-2)/8] & (1 << ((j-2) % 8))) == 0) cout << j << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 41 / 63

Wskaźniki Czym są wskaźniki Wskaźnik (ang. pointer) Zmienna, której wartością jest adres innej zmiennej. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 42 / 63

Czym są wskaźniki Tablice i wskaźniki w C++ Wskaźniki Wskaźnik (ang. pointer) Zmienna, której wartością jest adres innej zmiennej. Deklaracja wskaźnika Umieszcza się * przy nazwie zmiennej, np.: int *ptr; char *p; // Wartością jest adres zmiennej typu int // Wartością jest adres zmiennej typu char Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 42 / 63

Czym są wskaźniki Tablice i wskaźniki w C++ Wskaźniki Wskaźnik (ang. pointer) Zmienna, której wartością jest adres innej zmiennej. Deklaracja wskaźnika Umieszcza się * przy nazwie zmiennej, np.: int *ptr; char *p; // Wartością jest adres zmiennej typu int // Wartością jest adres zmiennej typu char Operator & obliczanie adresu zmiennej n zmienna typu int, ptr wskaźnik zdefiniowany jak wyżej. ptr = &n; // Adres n staje się wartością wskaźnika ptr Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 42 / 63

Wskaźniki Dostęp do zmiennej poprzez wskaźnik Gdy wskaźnik wsk zawiera adres zmiennej n Wtedy następujące operacje dają ten sam wynik (wstawienie liczby 2 do zmiennej n): n = 2; *wsk = 2; Operację oznaczoną symbolem * powyżej nazywa się wyłuskaniem. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 43 / 63

Wskaźniki Dostęp do zmiennej poprzez wskaźnik Gdy wskaźnik wsk zawiera adres zmiennej n Wtedy następujące operacje dają ten sam wynik (wstawienie liczby 2 do zmiennej n): n = 2; *wsk = 2; Operację oznaczoną symbolem * powyżej nazywa się wyłuskaniem. Wskaźnik można traktować jak okno dające dostęp do zmiennej. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 43 / 63

Wskaźniki Dostęp do elementów tablicy poprzez wskaźnik Elementy tablicy i wskaźnik tego samego typu ptr = &a[j]; // Adres a[j] staje się wartością wskaźnika ptr ptr + 1 // Adres a[j+1] ptr - 1 // Adres a[j-1] ptr + k // Adres a[j+k] Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 44 / 63

Wskaźniki Dostęp do elementów tablicy poprzez wskaźnik Elementy tablicy i wskaźnik tego samego typu ptr = &a[j]; // Adres a[j] staje się wartością wskaźnika ptr ptr + 1 // Adres a[j+1] ptr - 1 // Adres a[j-1] ptr + k // Adres a[j+k] Dla ptr == &a[j] równoważne są następujące zapisy a[j+k] // Wartość elementu a[] o indeksie j+k *(ptr+k) // Wartość zmiennej pod adresem ptr przesuniętym o k ptr[k] // Wartość zmiennej pod adresem ptr przesuniętym o k *(a+j+k) // Wartość zmiennej pod adresem a przesuniętym o j+k Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 44 / 63

Wskaźniki Dostęp do elementów tablicy poprzez wskaźnik Elementy tablicy i wskaźnik tego samego typu ptr = &a[j]; // Adres a[j] staje się wartością wskaźnika ptr ptr + 1 // Adres a[j+1] ptr - 1 // Adres a[j-1] ptr + k // Adres a[j+k] Dla ptr == &a[j] równoważne są następujące zapisy a[j+k] // Wartość elementu a[] o indeksie j+k *(ptr+k) // Wartość zmiennej pod adresem ptr przesuniętym o k ptr[k] // Wartość zmiennej pod adresem ptr przesuniętym o k *(a+j+k) // Wartość zmiennej pod adresem a przesuniętym o j+k Nazwę tablicy można traktować jako stałą wskaźnikową. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 44 / 63

Wskaźniki Operacje na wskaźnikach Zwiększanie i zmniejszanie, += i -= Prawa strona musi być całkowitego typu. Oznacza przesunięcie adresu we wskaźniku o pewną liczbę pozycji. Dla wskaźnika typu int ptr += k; // Adres w ptr jest zwiększany o k * sizeof(int) Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 45 / 63

Wskaźniki Operacje na wskaźnikach Zwiększanie i zmniejszanie, += i -= Prawa strona musi być całkowitego typu. Oznacza przesunięcie adresu we wskaźniku o pewną liczbę pozycji. Dla wskaźnika typu int ptr += k; // Adres w ptr jest zwiększany o k * sizeof(int) Inkrementacja i dekrementacja, ++ i -- Przesunięcie do przodu lub do tyłu o jedną zmienną danego typu (np. element tablicy). Można łączyć z innymi wyrażeniami (jak dla zwykłych zmiennych). Dla wskaźnika typu int ptr++; // Adres w ptr jest zwiększany o sizeof(int) Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 45 / 63

Wskaźniki Odejmowanie wskaźników Można odjąć jeden wskaźnik od drugiego (tego samego typu). Ma to sens, gdy wskaźniki zawierają adresy elementów tej samej tablicy. Wynikiem jest różnica między adresami wyrażona jako przesunięcie mierzone liczbą pozycji w tablicy (tzn. różnica indeksów odpowiadających elementom tablicy, których adresy zawierają te wskaźniki). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 46 / 63

Wskaźniki Odejmowanie wskaźników Można odjąć jeden wskaźnik od drugiego (tego samego typu). Ma to sens, gdy wskaźniki zawierają adresy elementów tej samej tablicy. Wynikiem jest różnica między adresami wyrażona jako przesunięcie mierzone liczbą pozycji w tablicy (tzn. różnica indeksów odpowiadających elementom tablicy, których adresy zawierają te wskaźniki). Zmienna jest wskazywana przez wskaźnik Gdy adres tej zmiennej jest wartością danego wskaźnika. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 46 / 63

Przekazywanie tablic do funkcji Problem z przekazywaniem tablic do funkcji W C++ tablica nie może być argumentem funkcji 1 Argumenty funkcji to zmienne: Których wartości początkowe pochodzą z innych części programu (przekazywanie przez wartość). Które zostały zdefiniowane w innych częściach programu (przekazywanie przez referencję). 2 Tablice nie są zmiennymi! Tablica jest zespołem zmiennych. Nazwa tablicy jest stałą wskaźnikową. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 47 / 63

Przekazywanie tablic do funkcji Dostęp do tablic (z funkcji) poprzez wskaźniki Wskaźniki mogą być argumentami funkcji 1 Wskaźnikowe argumenty funkcji można w treści tej funkcji traktować tak, jakby były nazwami tablic. 2 Wartość (początkowa) parametru wskaźnikowego oznacza lokację (w pamięci), którą funkcja ma traktować jako początek tablicy. 3 Funkcja musi poznać liczbę elementów tablicy niezależnie od adresu jej początku. Informacja o liczbie elementów nie jest automatycznie przekazywana wraz z adresem początku tablicy. Musi ona być przekazana do funkcji w inny sposób (np. jako dodatkowy argument funkcji). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 48 / 63

Przekazywanie tablic do funkcji Dostęp do tablic (z funkcji) poprzez wskaźniki Wskaźniki mogą być argumentami funkcji 1 Wskaźnikowe argumenty funkcji można w treści tej funkcji traktować tak, jakby były nazwami tablic. 2 Wartość (początkowa) parametru wskaźnikowego oznacza lokację (w pamięci), którą funkcja ma traktować jako początek tablicy. 3 Funkcja musi poznać liczbę elementów tablicy niezależnie od adresu jej początku. Informacja o liczbie elementów nie jest automatycznie przekazywana wraz z adresem początku tablicy. Musi ona być przekazana do funkcji w inny sposób (np. jako dodatkowy argument funkcji). void sort(double *a, int n); Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 48 / 63

Funkcja sortująca tablicę Przekazywanie tablic do funkcji void sort(double *a, int n) { // Sortowanie tablicy. for (int i = 0; i < n-1; i++) { // Poszukiwanie indeksu j. int j = i; for (int k = i + 1; k < n; k++) if (a[k] < a[j]) j = k; } } // Zamiana miejscami a[i] z a[j]. if (j > i) { double m = a[j]; a[j] = a[i]; a[i] = m; } Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 49 / 63

Funkcja sortująca tablicę Przekazywanie tablic do funkcji void sort(double *a, int n) { // Sortowanie tablicy. for (int i = 0; i < n-1; i++) { // Poszukiwanie indeksu j. int j = i; for (int k = i + 1; k < n; k++) if (a[k] < a[j]) j = k; } } // Zamiana miejscami a[i] z a[j]. if (j > i) { double m = a[j]; a[j] = a[i]; a[i] = m; } Wskaźniki można definiować jako tablice o nieznanej długości: void sort(double a[], int n); Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 49 / 63

Napisy i tablice Tablice i wskaźniki w C++ Przekazywanie tablic do funkcji Literały tekstowe (napisy) w czasie kompilacji są zamieniane na tablice o elementach typu char. Podczas uruchamiania programu zwykle są one umieszczane w obszarze pamięci tylko do odczytu. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 50 / 63

Przekazywanie tablic do funkcji Napisy i tablice Literały tekstowe (napisy) w czasie kompilacji są zamieniane na tablice o elementach typu char. Podczas uruchamiania programu zwykle są one umieszczane w obszarze pamięci tylko do odczytu. 1 Napis w kodzie źródłowym reprezentuje adres, pod którym znajduje się ciąg znaków w postaci tablicy. 2 Dla zbioru znaków ASCII każdy element tej tablicy reprezentuje 1 znak. Znaki odpowiadają liczbom całkowitym, zgodnie ze zbiorem znaków wykorzystywanym przez kompilator. W kodzie źródłowym mogą być zapisywane bezpośrednio (np. a ) lub jako kody (liczby całkowite). 3 Ostatnim elementem tej tablicy zawsze jest znak o kodzie 0. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 50 / 63

Napisy i wskaźniki Tablice i wskaźniki w C++ Przekazywanie tablic do funkcji Napisy mogą być odczytywane z pomocą wskaźników: char *s = "Ala ma kota"; // s zawiera adres początku napisu cout << s << endl; // Drukowanie napisu // Drukowanie napisu for (int i = 0; i < 11; i++) cout << s[i]; // Drukuj znak pod adresem s + i cout << endl; // Drukowanie napisu do cout << *s; // Drukuj znak pod adresem s while (*s++); cout << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 51 / 63

Przekazywanie tablic do funkcji Tablice o elementach typu char i ciągi znaków Każdą tablicę o elementach typu char można wykorzystać do drukowania ciągu znaków. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 52 / 63

Przekazywanie tablic do funkcji Tablice o elementach typu char i ciągi znaków Każdą tablicę o elementach typu char można wykorzystać do drukowania ciągu znaków. W tym celu adres poszątku tablicy przekazuje się do cout, jakby był on adresem napisu: char tab[6]; tab[5] = \0 ; // Znak o kodzie 0. tab[0] = A ; for (int i = 1; i < 5; i++) tab[i] = tab[i-1] + 1; cout << tab << endl; Drukowanie kończy się w momencie napotkania znaku \0. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 52 / 63

Argumenty programu Argumenty programu Argumenty funkcji main() argc liczba argumentów programu + 1. *argv[] tablica wskaźników zawierających adresy argumentów programu. int main(int argc, char *argv[]) Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 53 / 63

Argumenty programu Argumenty programu Argumenty funkcji main() argc liczba argumentów programu + 1. *argv[] tablica wskaźników zawierających adresy argumentów programu. int main(int argc, char *argv[]) 1 Pierwszy (o indeksie 0) element argv[] to adres nazwy programu (użytej do uruchomienia go). 2 Element argv[] o indeksie argc ma wartość NULL (czyli 0). 3 Pozostałe elementy argv[] wskazują na ciągi znaków wprowadzone w linii poleceń (po nazwie programu). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 53 / 63

Argumenty programu Uruchamianie programu z argumentami 1 Argumenty programu rozdziela się spacjami (tzn. spacja stanowi separator dla argumentów programu). 2 Jeżeli argumentem programu ma być ciąg znaków zawierający spację, trzeba użyć cudzysłowu lub znaku \ (ang. backslash). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 54 / 63

Argumenty programu Uruchamianie programu z argumentami 1 Argumenty programu rozdziela się spacjami (tzn. spacja stanowi separator dla argumentów programu). 2 Jeżeli argumentem programu ma być ciąg znaków zawierający spację, trzeba użyć cudzysłowu lub znaku \ (ang. backslash). Przykład./program raz dwa trzy cztery Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 54 / 63

Argumenty programu Uruchamianie programu z argumentami 1 Argumenty programu rozdziela się spacjami (tzn. spacja stanowi separator dla argumentów programu). 2 Jeżeli argumentem programu ma być ciąg znaków zawierający spację, trzeba użyć cudzysłowu lub znaku \ (ang. backslash). Przykład./program raz dwa trzy cztery Drukowanie argumentów programu for (int j = 1; j < argc; j++) cout << argv[j] << endl; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 54 / 63

Dynamiczne zarządzanie pamięcią Wykorzystanie pamięci przez program Zasady wykorzystania pamięci 1 Każdy program jest wykonywany jako jedno z wielu zadań (ang. task). 2 Zadania nie mogą przeszkadzać sobie nawzajem. 3 Każde zadanie dysponuje własną pamięcią. Zawartość pamięci wykorzystywanej przez zadanie (na ogół) nie może być modyfikowana przez inne zadania. Jądro systemu operacyjnego przydziela pamięć zadaniom według potrzeb. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 55 / 63

Dynamiczne zarządzanie pamięcią Wykorzystanie pamięci przez program Zasady wykorzystania pamięci 1 Każdy program jest wykonywany jako jedno z wielu zadań (ang. task). 2 Zadania nie mogą przeszkadzać sobie nawzajem. 3 Każde zadanie dysponuje własną pamięcią. Zawartość pamięci wykorzystywanej przez zadanie (na ogół) nie może być modyfikowana przez inne zadania. Jądro systemu operacyjnego przydziela pamięć zadaniom według potrzeb. Pamięć statyczna 1 Kod (ang. code) rozkazy dla procesora. 2 Dane tylko do odczytu (np. literały tekstowe). 3 Zmienne globalne i statyczne (wartość przeżywa zakończenie wykonywania funkcji). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 55 / 63

Dynamiczne zarządzanie pamięcią Pamięć dynamiczna Zmienne lokalne 1 Tworzone przed rozpoczęciem wykonywania bloku (np. treści funkcji) lub w trakcie wykonywania go. 2 Usuwane po zakończeniu wykonywania bloku. 3 Znajdują się w obszarze pamięci zwanym stosem (ang. stack), w którym pamięć jest przydzielana automatycznie (przez jądro systemu operacyjnego). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 56 / 63

Dynamiczne zarządzanie pamięcią Pamięć dynamiczna Zmienne lokalne 1 Tworzone przed rozpoczęciem wykonywania bloku (np. treści funkcji) lub w trakcie wykonywania go. 2 Usuwane po zakończeniu wykonywania bloku. 3 Znajdują się w obszarze pamięci zwanym stosem (ang. stack), w którym pamięć jest przydzielana automatycznie (przez jądro systemu operacyjnego). Stos jest wykorzystywany także do innych celów (argumenty funkcji, adresy powrotne dla funkcji) i może mieć ograniczone rozmiary. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 56 / 63

Dynamiczne zarządzanie pamięcią Pamięć dynamiczna Zmienne lokalne 1 Tworzone przed rozpoczęciem wykonywania bloku (np. treści funkcji) lub w trakcie wykonywania go. 2 Usuwane po zakończeniu wykonywania bloku. 3 Znajdują się w obszarze pamięci zwanym stosem (ang. stack), w którym pamięć jest przydzielana automatycznie (przez jądro systemu operacyjnego). Stos jest wykorzystywany także do innych celów (argumenty funkcji, adresy powrotne dla funkcji) i może mieć ograniczone rozmiary. Pamięć rezerwowana na żądanie Przydzielana programowi po zgłoszeniu przez niego jawnego zapotrzebowania na określoną ilość pamięci. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 56 / 63

Dynamiczne zarządzanie pamięcią Rezerwowanie pamięci na żądanie Rezerwowanie pamięci z pomocą new Rezerwowanie pamięci na zmienną: ptr = new double; Rezerwowanie pamięci na tablicę: ptr = new double[n]; Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 57 / 63

Rezerwowanie pamięci na żądanie Dynamiczne zarządzanie pamięcią Rezerwowanie pamięci z pomocą new Rezerwowanie pamięci na zmienną: ptr = new double; Rezerwowanie pamięci na tablicę: ptr = new double[n]; Zasady 1 Typ danych wskaźnika ptr musi odpowiadać typowi danych rezerwowanej zmiennej lub tablicy (void * pasuje do każdego typu danych). 2 W przypadku niepowodzenia wskaźnik ptr będzie mieć wartość NULL (czyli 0). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 57 / 63

Dynamiczne zarządzanie pamięcią Zwalnianie pamięci przydzielonej na żądanie Pamięć przydzielona na żądanie pozostaje do dyspozycji programu, aż zostanie przez niego jawnie zwolniona (nie ma znaczenia to, w którym miejscu programu została ona zarezerwowana). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 58 / 63

Dynamiczne zarządzanie pamięcią Zwalnianie pamięci przydzielonej na żądanie Pamięć przydzielona na żądanie pozostaje do dyspozycji programu, aż zostanie przez niego jawnie zwolniona (nie ma znaczenia to, w którym miejscu programu została ona zarezerwowana). Zwalnianie pamięci z pomocą delete Zwalnianie pamięci zarezerwowanej na zmienną: delete ptr; Zwalnianie pamięci zarezerwowanej na tablicę: delete [] ptr; Wskaźnik ptr musi zawierać adres obszaru pamięci przydzielonego na żądanie. Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 58 / 63

Dynamiczne zarządzanie pamięcią Korzystanie z pamięci przydzielonej na żądanie Pamięć rezerwowana na żądanie i wskaźniki 1 Zmienne rezerwowane z pomocą new są dostępne tylko przez wskaźniki (jest to główne zastosowanie wskaźników w C++). Trzeba przechowywać ich adresy, żeby można było zwolnić pamięć zajmowaną przez nie. 2 Tablice rezerwowane z pomocą new mają takie same własności, jak zwykłe tablice, ale nie mają nazw (są dostępne tylko za pośrednictwem wskaźników). Rafał J. Wysocki (rwys@fuw.edu.pl) Wstęp do programowania, część II 8 listopada 2011 59 / 63