Programowanie strukturalne. Tomasz Tyksiński

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

ZASADY PROGRAMOWANIA KOMPUTERÓW

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

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

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

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

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

Lab 9 Podstawy Programowania

Rekurencja (rekursja)

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

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

1. Napisz program wypisujący w kolejnych wierszach standardowego wyjścia pojedyncze słowa następującego napisu Bardzo dlugi napis. 2.

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

Algorytmy i język C++

I. Podstawy języka C powtórka

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

Języki programowania obiektowego Nieobiektowe elementy języka C++

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

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

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

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

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

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

Samodzielnie wykonaj następujące operacje: 13 / 2 = 30 / 5 = 73 / 15 = 15 / 23 = 13 % 2 = 30 % 5 = 73 % 15 = 15 % 23 =

Tablice deklaracja, reprezentacja wewnętrzna

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

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Programowanie obiektowe - zadania

lekcja 8a Gry komputerowe MasterMind

Podstawy programowania 1

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

Język C++ zajęcia nr 2

Podstawy programowania w języku C++

Język C zajęcia nr 11. Funkcje

1 Powtórzenie wiadomości

Podstawy programowania

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

Podstawy informatyki. Informatyka stosowana - studia niestacjonarne. Grzegorz Smyk

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

Funkcje. Deklaracja funkcji. Definicja funkcji. Wykorzystanie funkcji w programie.

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

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

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Algorytmy i struktury danych. Wykład 4

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

Zmienne i struktury dynamiczne

1. Napisz program, który wyświetli Twoje dane jako napis Witaj, Imię Nazwisko. 2. Napisz program, który wyświetli wizytówkę postaci:

do instrukcja while (wyrażenie);

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Wstęp do informatyki- wykład 7

2. 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).

Podstawy programowania w języku C++

DANE TEKSTOWE W JĘZYKU C/C++ - TABLICE ZNAKOWE

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

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

Wykład 1: Wskaźniki i zmienne dynamiczne

Pliki. Informacje ogólne. Obsługa plików w języku C

Język C, tablice i funkcje (laboratorium)

Część 4 życie programu

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

Struktury Struktura polami struct struct struct struct

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

Zmienne, stałe i operatory

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

2 Przygotował: mgr inż. Maciej Lasota

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

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

typ y y p y z łoż o on o e n - tab a lice c e w iel e owym m ar a o r we, e stru r kt k ury

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

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

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Struktury, unie, formatowanie, wskaźniki

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

> C++ typy wyliczeniowe, struktury, unie, konwersje napis <-> liczba, formatowanie wyjścia

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

Argumenty wywołania programu, operacje na plikach

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

Tablice. Monika Wrzosek (IM UG) Podstawy Programowania 96 / 119

ŁAŃCUCHY W JĘZYKU C/C++

Programowanie strukturalne i obiektowe. Funkcje

Napisz program wypisujący na standardowym wyjściu następujący napis: Napis zawierający różne dziwne znaczki // \ \$ &%.

C++ wprowadzanie zmiennych

Wstęp do informatyki- wykład 1 Systemy liczbowe

Wskaźniki. Informatyka

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

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

Zajęcia 4 procedury i funkcje

Podstawy Programowania C++

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Podstawy programowania. Wykład: 13. Rekurencja. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do Programowania, laboratorium 02

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Struktura pliku projektu Console Application

C-struktury wykład. Dorota Pylak

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Transkrypt:

Programowanie strukturalne Tomasz Tyksiński

Tematyka zajęć 1. Typy danych: podstawowe typy danych, typy złożone, typ wskaźnikowy, typ strukturalny, łańcuchy znaków, parametry funkcji main 2. Pętle, instrukcje 3. Funkcje: przekazywanie parametrów funkcji (przez wartość, przez wskaźnik, przez referencję), przekazywanie danych złożonych typów 4. Rekurencja: pojęcie rekurencji, definicje rekurencyjne, funkcje rekurencyjne 5. Losowość: generowanie liczb pseudolosowych, zastosowanie losowości algorytmy mieszające, losowanie liczb z danego przedziału Literatura 1. N. Wirth, Wprowadzenie do programowania systematycznego. WNT Warszawa 1978. 2. J. Grębosz, Symfonia C++, Oficyna Kallimach, Kraków 1993. 3. A. Struzińska-Walczak, K. Walczak, Nauka programowania dla początkujących. C++, W&W 1999 4. B. Eckel, Thinking in C, Beta 3 2006. 5. B. Eckel, Thinking in C++, Wydawnictwo Helion, 2002 2 S t r o n a

1. Typy danych 1.1 Liczby całkowite Deklaracja zmiennej typu całkowitego: int n. Można używać modyfikatorów przy deklaracji (long, unsigned). Operatory arytmetyczne, operatory binarne. Zadanie 1. Program wypisujący i-ty bit liczby całkowitej n typu int. (Licząc od końca i od początku) Wersja 1: Liczba n = n kn k-1 n 2n 1n 0 ponownie podajemy liczbę n oraz numer bitu i. Wersja 2: Liczba n = n 1n 2n 3 n k, podajemy liczbę n oraz numer bitu i. Jakie operatory wykorzystać najprościej? Jak wygląda ostatni znak liczby dodatniej? Jak wygląda znak liczby ujemnej? Zadanie 2. Program wypisujący reprezentację bitową liczby n. Dodatniej i ujemnej. Wypisywanie kolejnych bitów reprezentacji liczby w pamięci komputera. Wypisać wszystkie bity liczby n od lewej strony do prawej. Zauważyć jakie wartości bitów mają liczby n ujemne. Co oznaczają wypisane wyniki dla liczb ujemnych? Porównaj bity wartości dodatnich i ujemnych. Jak wygląda wartość 0? Jaka jest największa wartość typu całkowitego? Jaka jest najmniejsza wartość? Zadanie 3. Program wypisujący zapis dwójkowy liczby n. Dodatniej i ujemnej. Wypisać wartość liczby n w zapisie dwójkowym, liczby ujemne mają być wypisywane w czytelnej dla człowieka postaci b 1b 2 b k. Zapis liczb ujemnych będzie inny od reprezentacji binarnej w komputerze. W komputerze zapis U2 w tym zadaniu zapis znak-moduł. 1.2 Liczby rzeczywiste Zmienne typu float lub double. Reprezentacja zmiennoprzecinkowa. Zadanie 4. Program wyznaczający odległość pomiędzy dwoma punktami A i B w przestrzeni. Jaki jest wzór na odległość między punktami? Jak reprezentować punkt w przestrzeni 3 wymiarowej? Zadanie 5. Program wczytujący liczby całkowite aż do podania 0, a następnie wypisujący liczbę podanych wartości oraz średnią wartość wczytanych liczb. Nie używaj typu tablicowego. 1.3. Wskaźniki Zmienne wskaźnikowe są to zmienne, których wartością jest adres przechowywanej danej. Mamy zatem dwie wartości konkretną daną oraz wartość adresu komórki w której ta dana jest przechowywana. Normalna zmienna przechowuje bezpośrednio wartość danego typu, np. int x; natomiast zmienna dynamiczna deklarowana jako typ *nazwa; przechowuje adres do wartości typu typ, np. int *p; oznacza, że zmienna p przechowuje adres do danej typu int. Zmienną wskaźnikową również należy nie tylko zadeklarować, ale również zdefiniować (nadać wartość 3 S t r o n a

początkową). Wartość pusta w języku C oznaczana jest przez NULL, adres pusty, wskaźnik zerowy. Gwiazdka jest związana za zmienną, a nie z typem, tzn. int *p1, p2; oznacza p1 wskaźnikowe, ale p2 całkowite. Język C++ preferuje notację int* p1; co może być mylące (spacje są ignorowane). Przykład int n = 10; // zmienna n w pamięci, przypisujemy jej wartość 10 int *p = NULL; // deklaracja zmiennej wskaźnikowej p, przypisujemy wartość pustą p = n; // błąd: p jest adresem, n daną. Należy ustawić wartość zmiennej p na adres zmiennej n p = &n; // dobrze: & jest operatorem pobierania adres zmiennej, następuje zmiana adresu w p p = 20; // błąd: nie można zmienić wartości zmiennej n poprzez zmianę p, zmienia się adres w p *p = 20; // dobrze: zmieniamy wartość w adresie p, czyli również zmieniamy n, printf( Wartość n = %d, wartość pod adresem p = %d, adres p = %d, adres n = %d.\n, n, *p, p, &n); W ostatnim przykładzie wykorzystujemy operator * nazywany operatorem wyłuskania lub dereferencji. Wskaźniki mają również znaczenie przy tablicach tablica jest zarazem wskaźnikiem na pierwszy element tablicy, zastosowanie przy przekazywaniu typów złożonych do funkcji (przykłady przy funkcjach). W powyższych przykładach zmienna wskaźnikowa pokazywała na adres zmiennej statycznej, ale jeżeli w programie będziemy wykorzystywali wyłącznie zmienne wskaźnikowe (dynamiczne) to musimy sami zdecydować kiedy powstanie zarezerwowany obszar pamięci do przechowywania danej pod wskazanym adresem oraz kiedy obszar ten zostanie usunięty. Mamy wówczas pełną kontrolę nad czasem trwania wartości w pamięci, stąd nazwa zmiennych dynamicznych. Powstają one w innym obszarze pamięci zwanym stertą. Do zarezerwowania bloku pamięci w języku C wykorzystujemy funkcję malloc(rozmiar) (także calloc(ile, rozmiar), i realloc(adres, rozmiar)) do zwalniania pamięci funkcję free(adres). Przykład int *p; // zadeklarowana, niezdefiniowana wartość adresu *p = 10; // błąd: nie wiemy na co pokazuje p p = malloc(sizeof(int)); // najpierw zarezerwuj obszar pamięci wskazywany przez p 4 S t r o n a

if (p!= NULL) { // jeżeli się powiodła rezerwacja *p = 10; // podstaw w nowym obszarze wartość 10 (*p)++; // zmień wartość 10 na 11 printf( wartość =, *p);// wypisze wartość w adresie p free(p); } // zwolnij obszar wskazywany przez p Adres p nie zmienia się po zwolnieniu, można zatem jeszcze dodać p = NULL; po funkcji free. W języku C++ rezerwacja bloku pamięci realizowana jest operatorem new typdanych; zwalnianie obszaru pamięci za pomocą delete zmienna. Ponadto zamiast używać NULL wykorzystuje się wartość 0 (można NULL po dodaniu biblioteki stdlib). Przykład int *p = 0; // zadeklarowana i zdefiniowana wartość adresu p na NULL p = new int; // zarezerwuj obszar pamięci wskazywany przez p if (p!= 0) { // jeżeli się powiodła rezerwacja *p = 10; // podstaw w nowym obszarze wartość 10 (*p)++; // zmień wartość 10 na 11 cout << Wartość = << *p; // wypisze wartość w adresie p delete p; // zwolnij obszar wskazywany przez p p = 0; } // ustaw p na NULL Zadanie 6. Program liczący NWD dwóch liczb algorytmem Euklidesa z wykorzystaniem zmiennych dynamicznych. Zamiast używać zmiennych typu int zadeklarować zmienne typu wskazującego na int, zarezerwować dla nich pamięć, wystartować algorytm i na końcu usunąć zmienne z pamięci. 1.4 Struktury Złożony typ danych służący do przechowywania wielu wartości, różnego typu pod jedną zmienną. Struktury (czasem nazywane rekordami) składają się z pól, każde może być innego typu. Służą do strukturalnego opisu obiektów i przechowywania ich w pamięci. Patrzymy globalnie na obiekty, a następnie staramy się je modelować w programie, przykładowe struktury: Osoba imię, nazwisko, telefon. Samochód marka, model, pojemność, rok produkcji. Pracownik imię, nazwisko, pesel, stanowisko, pensja. Książka tytuł, autor, rok wydania, wydawnictwo, liczba stron, cena. Dodając do struktury funkcjonalność, operacje na strukturze oraz pewne dodatkowe właściwości dostajemy obiekt (Programowanie obiektowe). 5 S t r o n a

W języku C struktury tworzymy w następujący sposób: struct nazwa { // nazwa struktury, nie zmiennej to jest nowy typ strukturalny Typ1 Pole1; Typ2 Pole2;... }; struct nazwa zmienna; // deklaracja zmiennej strukturalnej typu strukturalnego nazwa Przykład struct Punkt { float x; float y; }; struct Punkt A; //definicja typu strukturalnego punkt składającego się // z dwóch współrzędnych, współrzędnej x oraz // współrzędnej y // zmienna A typu strukturalnego Punkt Odwołania do pól struktury realizowane są za pomocą kropki lub strzałki. Jeżeli zmienna jest zmienną statyczną wykorzystujemy kropkę: A.x = 1.0; A.y = 2.0; Jeżeli zmienna jest zmienną dynamiczną: struct Punkt *pa = &A; wykorzystujemy operator dereferencji, a następnie kropki: (*pa).x = 3.0; (*pa).y = 4.0; lub krócej można użyć operatora strzałki na strukturze wskazywanej: pa->x = 3.0; pa->y = 4.0; Zadanie 7. Napisz program operujący na rekordzie opisującym punkt w przestrzeni trzy współrzędne. Program ma wczytać dwa punkty A i B, a następnie obliczyć odległość między nimi. Zadanie 8. Napisz program operujący na dynamicznej zmiennej opisującej punkt w przestrzeni. Napisz program wczytujący trzy punkty i sprawdzający czy leżą na jednej prostej. Usunąć zmienne z pamięci na zakończenie programu. 1.5. Tablice Tablica ciągły obszar danych przechowujący wartości jednego typu, umożliwiający swobodny dostęp do elementów poprzez indeksowanie 0, 1, 2, 6 S t r o n a

Deklaracja w języku C rozmiar musi być stała wartością liczbową typ nazwa[wartość]; // np. int tab[100]; można wykorzystać preprocesor do zamiany napisów przed kompilacją #define MAX 100 // na początku programu, za include typ nazwa[max]; w języku C++ rozmiar tablicy może być również stałą zdefiniowaną wcześniej const int MAX = 100; typ nazwa[max]; W C99 można również deklarować rozmiar tablicy za pomocą zwyczajnej zmiennej int n = 100; typ nazwa[n]; Odwołania do elementów tablicy poprzez podanie indeksu int tab[100]; tab[10]=20; tab[0]=tab[1]+tab[2]; cout << tab[0]; Zadanie 9. Program sumujący dodatnie i ujemne elementy ciągu a n niezależnie. Długość ciągu n wczytana na początku. Program wypisuje dwie sumy. Zadanie 10. Algorytm obliczający wartość wielomianu W(x)= a n x n + a n-1 x n-1 + a 1 x + a 0, w punkcie x 0. Algorytm Hornera. Program realizujący Algorytm Hornera, dane w tablicy. Zadanie 11. Obliczanie iloczynu skalarnego dwóch wektorów n wymiarowych w i v. Program obliczający iloczyn skalarny, dane w tablicy. Zadanie 12. Program odwracający kolejność elementów w tablicy. 1.6 Łańcuchy znaków W języku C łańcuchy, czyli ciągi znaków są po prostu tablicami znaków, zakończonymi znakiem końca łańcucha, jest to znak ASCII o numerze 0, czyli '\0'. Do obsługi łańcuchów w języku C wymagamy biblioteki string.h, zawierającej podstawowe operacje na łańcuchach. Przegląd funkcji bibliotecznych: strlen, strcpy, strncpy, strcmp, strcat. Przykłady funkcji i ich opis w Podstawach programowania. Deklarujemy tablicę znaków char str[15]; Jest to 15 elementowa tablica, ale łańcuch musi kończyć się znakiem '\0' zatem zapiszemy w niej 14 znaków tekstu i znak końca łańcucha. 7 S t r o n a

Podstawowe operacje na łańcuchach - sprawdzenie długości łańcucha char tekst[256] = "Ala"; int len = strlen(tekst); deklarujemy łańcuch o maksymalnej długości 256, ale zapisujemy w nim tylko 3 znaki i znak końca łańcucha. - można podobnie jak w tablicy modyfikować pojedynczy znak tekstu char tekst[25] = "Ala"; tekst[0] = 'U'; - podstawianie, nie można podstawiać tablic, zatem operacja podstawiania jest realizowana poprzez kopiowanie jednego łańcucha w miejsce drugiego łańcucha strcpy(tekstnowy, tekstoryginalny); strcpy(x, "Ala ma kota"); - wycinanie tekstu umożliwia funkcja strncpy(tekstnowy, tekstoryginalny, ile); uwaga na znak zakończenia tekstu, jeżeli mieści się w liczbie kopiowanych znaków to dobrze, jeżeli nie to należy ustawić go ręcznie w konkretnym miejscu łańcucha docelowego, np. tekstnowy[7]='\0'; - porównywanie łańcuchów, podobnie jak z podstawianiem nie można wykonać porównania ==, trzeba wywołać funkcję int wynik = strcmp(tekst1, tekst2); wynik jest liczbą całkowitą równą 0 gdy teksty są równe, jeżeli podczas porównywania jakiś znak będzie różny to funkcja zwraca wartość ujemną gdy znak w tekst1 jest mniejszy niż znak w tekst2, zwraca wartość dodatnią w przeciwnym razie. char tekst1[25] = "kot"; char tekst2[25] = "kos"; wynik = strcmp(tekst1, tekst2); - łączenie tekstów (konkatenację) można zrealizować komendą strcat(tekst1, teskt2) przykładowo dwa krótkie napisy 8 S t r o n a

char tekst1[25] = "kot"; char tekst2[25] = "let"; wynik = strcat(tekst1, tekst2); Dodatkowo w C++ wprowadzono klasę string służącą do obiektowego zarządzania łańcuchami. - deklaracja zmiennej ma następującą postać string tekst; string test = Test ; // lub w wersji obiektowej string test( Test ); - obsługa wejścia wyjścia jest naturalna z wykorzystaniem strumieni cout << Podaj imię: ; cin >> tekst; cout << Masz na imię << tekst; - funkcje obsługi zmiennej typu string są metodami klasy zatem wywołujemy je dla danej zmiennej po kropce cout << Twoje imię ma << tekst.length() << liter. ; - konkatenacja łańcuchów jest obsługiwana operatorem + string tekst2; cout << Podaj nazwisko: ; cin >> tekst2; string dane = tekst1 + + tekst2; cout << Podałeś: << dane << endl; - porównywanie łańcuchów wygląda podobnie jak liczb if (tekst == Jan ) cout << Janek ; - można sprawdzać pojedyncze znaki podobnie jak w C (zapis tablicowy) cout << tekst[0] << endl; lub lepiej, bezpieczniej jednak wykorzystać metodę at() cout << tekst.at(0) << endl; - Obiekt klasy string można skonwertować do typu z języka C za pomocą metody c_str() 9 S t r o n a

string napis = Jan Kowalski ; cout << napis << endl; // wypisanie strumieniowe w C++ printf( %s\n, napis.c_str()); // wypisanie w języku C Zadanie 13. Tablica danych osobowych struktura Osoba zawierająca Imię, Nazwisko, Telefon. Wczytanie danych, wypisanie wszystkich, wypisanie i-tego elementu, zmiana i-tego elementu. Wykorzystaj typ łańcuchowy (tablica lub string) 1.7. Konwersje w języku C Zamiana typu całkowitego na łańcuch znaków oraz liczby zapisanej jako łańcuch znaków do typu całkowitego realizują odpowiednio funkcje itoa oraz atoi. - zamiana łańcucha na liczbę int atoi(char* tekst) zamienia tekst z zapisaną w nim liczbą, na wartość typu int np. podczas wczytywania argumentów przez funkcję main Zadanie 14. Wywołaj napisany program pisz.exe z dwoma argumentami łańcuchem znaków oraz liczbą całkowitą. Program ma wypisać znak o danym numerze z podanego łańcucha znaków. Przypomnijmy, że parametry można przekazać poprzez funkcję main main(int argc, char* argv[]) Argument argc to liczba parametrów, argv to tablica łańcuchów, zawierająca kolejne parametry wywołania programu zerowy element to nazwa programu. Zadanie powinno po wywołaniu pisz.exe Janek 3 wypisać na ekranie e - zamiana liczby na łańcuch char* itoa(int liczba, char* tekst, int podstawa) typ char* to typ wskaźnikowy, wskaźnik na pierwszy element tablicy znaków, równoważny zapis tablicy znaków bez podawania rozmiaru, liczba - zamieniana liczba całkowita, tekst - wynik zamiany liczby, uwaga na długość tekstu, musi wystarczyć do zapisana 32 bitowej liczby (lub dłuższej zależnie od systemu), podstawa - podstawa systemu konwersji np. 10 dla systemu dziesiętnego. Wynikiem funkcji jest adres do zmiennej tekst. Zadanie 15. Wczytaj liczbę całkowitą i wypisz na ekran cyfry dziesiętne w odwrotnej kolejności. 10 S t r o n a

2. Instrukcje, pętle Zadanie 1. Program wypisujący wszystkie liczby mniejsze niż 100 podzielne przez 3. Zadanie 2. Program wypisujący wszystkie liczby mniejsze niż 100 podzielne przez 3 i przez 7. Zadanie 3. Program wypisujący wszystkie liczby pięciocyfrowe, których suma cyfr wynosi 21. Zadanie 4. Program wypisujący początkowe liczby doskonałe. Liczba doskonała to taka która jest równa sumie swoich wszystkich podzielników, np. 6 jest liczbą doskonałą, bo 6 = 1 + 2 + 3, liczba 8 nie jest liczbą doskonałą bo 8 1 + 2 + 4. Zadanie 5. Program wypisujący tabliczkę mnożenia od 1 do 10, w ładnie sformatowanej tablicy na ekranie. Zadanie 6. Program obliczający, po wczytaniu wartości całkowitych a oraz n, wartość a n. Metoda naiwna, wykonująca kolejne mnożenia a n = a a a a. Zadanie 7. Szybkie potęgowanie a n. Przez zamianę n na zapis binarny. 3. Funkcje 3.1 Przekazywanie parametrów do funkcji W języku C można przekazywać parametry do funkcji poprzez wartość lub poprzez wskaźnik, w języku C++ można dodatkowo przekazywać parametry funkcji przez referencję (działa analogicznie jak wskaźnik). Przekazywanie przez wartość przekazuje wartość do funkcji, ale nie zwraca jej modyfikacji, chcąc przekazać zmiany wprowadzone wewnątrz funkcji należy przekazać parametr przez adres lub przez referencję. Funkcja może (nie musi) zwracać wyliczoną wartość za pomocą return. Zadanie 1. Zamień Zadanie 2.7 na postać funkcyjną, w jaki sposób należy przekazać parametry do funkcji. Napisz funkcję postaci int potega(int a, int n). 3.2 Przekazywanie tablic do funkcji Przekazywanie tablic przez wartość powodowałoby utworzenie kopii tablicy w pamięci, a następnie wszystkie operacje funkcja wykonywałaby na powstałej kopii i zmiany nie byłyby widoczne po zakończeniu funkcji. Efektywniej zatem jest przekazać parametr będący wskaźnikiem do tablicy, powstanie kopia zmiennej wskaźnikowej, ale pokazywać ona będzie na pierwszy element tablicy. Zmiany wprowadzone w tablicy wewnątrz funkcji są zatem przekazane na zewnątrz funkcji (ponieważ działa przekazywanie przez wskaźnik). Ponieważ tablice są równoważne wskaźnikom możemy zapisać przekazanie tablicy do funkcji na trzy równoważne sposoby. int funkcja1(int tab[100]) 11 S t r o n a

int funkcja2(int tab[]) int funkcja1(int *tab) Można również przekazać tablicę przez referencję, ale nie ma to większego sensu (referencja do wskaźnika). Zadanie 2. Zamień program z tablicą osób (Zadanie 1.13) na przejrzystszą postać z funkcjami dodającymi rekordy do tablicy i wyszukującymi. Zadanie 3. Napisać program z funkcjami obliczającymi podstawowe działania na liczbach zespolonych postaci a + bi. Jak reprezentować liczbę zespoloną w pamięci? Zdefiniuj działania dodawania, odejmowania, mnożenia, dzielenia, sprzężenia, modułu z liczby. Czy działania można zastąpić funkcjami, co jest wynikiem poszczególnych działań? 4. Funkcje rekurencyjne 4.1 Definicje rekurencyjne Pojęcie rekurencji polega na odwołaniu się podczas definiowania danej funkcji do samej siebie, oraz wyznaczeniu punktu końcowego przebiegu rekurencji. Przykładowo funkcję silnia można zdefiniować iteracyjnie n! = 1 2 3 (n 1) n lub rekurencyjnie 0! = 1 n! = (n 1)! n. Z wykorzystaniem warunków możemy zapisać, ją w następujący sposób n! = (n 1)! n, gdy (n > 0) lub 1 gdy (n = 0). 4.2 Funkcje rekurencyjne Poniższe definicje można zapisać w języku C/C++ jako funkcje, które pod danym warunkiem albo będą wywoływać same siebie, ze zmienionym parametrem, albo będą zwracać konkretną wartość finalną. Zadanie 1. Napisz rekurencyjną funkcję suma(n,k) sumującą liczby całkowite od n do n+k. Zadanie 2. Napisz rekurencyjną funkcję potęga(a, n) (w najprostszej wersji). Zadanie 3. Napisz rekurencyjną funkcję suma(tab, n), która rekurencyjnie będzie sumować n początkowych elementów z tablicy tab. Jak efektywnie przekazać parametry do tej funkcji? Zadanie 4. Napisz rekurencyjną funkcję sumadodatnich(tab, n), sumującą wyłącznie dodatnie elementy znajdujące się w tablicy tab. 12 S t r o n a

Zadanie 5. Napisz procedurę rekurencyjną wypisującą podawane liczby od końca. Zakończenie wprowadzania przez podanie 0. Bez wykorzystania tablicy pomocniczej, przechowującej dane. 5 Losowość 5.1 Wprowadzenie Komputer nie może generować w pełni losowych wartości, może je obliczać, a to znaczy, że nie będzie w nich prawdziwej losowości gdyż będą deterministyczne. Komputer może generować liczby pseudolosowe, które przypominają w praktyce liczby losowe, jednak są one wyznaczane za pomocą deterministycznego algorytmu. Obliczanie liczb rozpoczyna się od wartości początkowej tzw. zarodka ciągu pseudolosowego (ang. seed), a następnie jest powtarzane w pętli zgodnie z pewnym deterministycznym algorytmem. W języku C mamy dwie funkcje związane z ciągami pseudolosowymi: srand() oraz rand(). Pierwsza ustala zalążek generatora ciągu pseudolosowego, funkcję uruchamiamy jeden raz na początku programu, oznacza to, że każde wywołanie programu będzie generować inny ciąg pseudolosowy. Parametrem tej funkcji jest czas jej wywołania (liczba sekund która upłynęła od ustalonej daty), zapisujemy to w następujący sposób: srand(time(0)) lub srand(time(null)) w języku C. Losowanie wartości w trakcie działania programu polega na wywoływaniu funkcji rand(), jako wynik zwraca ona liczbę całkowitą z przedziału 0 do RAND_MAX z rozkładem jednostajnym (wartość RAND_MAX z reguły wynosi 32767). 5.2 Zadania Losowość w programach można wykorzystać do mieszania danych, losowania liczb z danego przedziału, losowania liczb z zadanym rozkładem, algorytmów wykorzystujących losowość w celu poprawienia złożoności, część algorytmów ma praktyczne zastosowanie jedynie przy wykorzystaniu losowości (np. generowanie liczb pierwszych). Zadanie 1. Wylosuj 100 liczb całkowitych z zadanego przedziału [a, b] z rozkładem jednostajnym. Zadanie 2. Symulator Lotto, losowanie 10 kul bez powtórzeń z puli 80 kul. Zadanie 3. Tasowanie talii kart, karta struktura o dwóch polach (kolor, wartość), talia tablica kart, zadanie ma wygenerować ułożoną talię kart, następnie potasować ją i wypisać jeszcze raz na ekranie. Zadanie 4. Wylosuj 1000 liczb z zakresu [0, 9], policz statystykę ich występowania. Czy uzyskano rozkład jednostajny generowanych liczb? Zadanie 5. Wylosuj 10 liczb rzeczywistych z przedziału [0, 10) z dokładnością do trzech miejsc po przecinku. Wypisz największą i najmniejszą wylosowaną wartość. 13 S t r o n a

14 S t r o n a