Wykład 1 Dr inż. Tadeusz Jeleniewski e-mail: tadeusz.jeleniewski@pwr.edu.pl lub t.jeleniewski@ujw.pl Materiały streszczenia wykładów, zadania, przykłady znajdują się pod adresem: http://tjeleniewski.ujw.edu.pl Przedmiot kończy się zaliczeniem na stopień Proponowany termin kolokwium zaliczeniowego ostatni wykład w semestrze letnim Formą towarzyszącą jest laboratorium 2017-02-16 Programowanie strukturalne W1 1
Programowanie strukturalne program zajęć 1. Wprowadzenie Algorytmiczne języki programowania. Struktura programu źródłowego w języku C/C++. Proces kompilacji, konsolidacji i uruchamiania. Przykład prostego programu. Jednostki składniowe języka. 2. Podstawowe pojęcia Typy wartości, zmienne. Reprezentacja danych w komputerze. Typy całkowite i rzeczywiste. Inicjacja zmiennych. 3. Komunikacja programu z otoczeniem Funkcje scanf, prntf, gets, puts. Podejście "obiektowe" - strumienie standardowe cin, cout 4. Wskaźniki Zmienne i ich adresy. Odwoływanie się do zmiennych przez nazwę lub adres. Zmienne wskaźnikowe - notacja, znaczenie. Arytmetyka wskaźników. 5. Operatory i wyrażenia Przypisanie proste i arytmetyczne, wyrażenia arytmetyczne, inkrementacja i dekrementacja, operatory logiczne, relacje, operatory bitowe, wyrażenie warunkowe 6. Sterowanie wykonaniem programu Instrukcja if, if... else, else if. Zagnieżdżanie instrukcji if. Instrukcja switch... case 7. Instrukcje iteracyjne Pojęcie pętli programowej. Pętla for, pętle z badaniem warunku na początku (while) i na końcu (do... while). Zagnieżdżanie pętli. Instrukcje break oraz continue 8. Funkcje Pojęcie funkcji w C/C++. Deklaracja (prototyp) i definicja funkcji. Zwracanie wartości funkcji. Przekazywanie argumentów przez wartość, adres i referencję 9. Tablice i łańcuchy Typ strukturalny - tablica, deklaracja i inicjacja wartości elementów. Tablice jako argumenty funkcji. Łańcuch znaków i jego reprezentacja w postaci tablicy znakowej. 10. Struktury Pojęcie struktury, deklaracja struktury, atrybuty dostępu, możliwość definiowania metod. Zagnieżdżanie struktur. Wskaźniki na struktury. Tablice struktur. Unie i ich zastosowanie. 2017-02-16 Programowanie strukturalne W1 2
Literatura Walter Savitch Programowanie w tonacji C++. Wydawnictwo RM, Warszawa, 2005 Jerzy Grębosz Symfonia C++. Oficyna Kallimach, Kraków, 2010 Jesse Liberty C++ dla każdego. Wydawnictwo HELION, 2002 I wiele innych podręczników na temat programowania w języku C/C++ 2017-02-16 Programowanie strukturalne W1 3
O czym będzie pierwszy wykład? Co to jest program komputerowy i jak powstaje Struktura programu źródłowego w języku C/C++ Jednostki składniowe Typy i zmienne całkowite, reprezentacja danych całkowitych, stałe całkowite Typy rzeczywiste, inicjacja zmiennych rzeczywistych Typy i zmienne wskaźnikowe 2017-02-16 Programowanie strukturalne W1 4
Tworzenie programu komputerowego w języku C/C++ (i innych) odbywa się w dwóch etapach: - opracowanie kodu źródłowego - generowanie kodu wynikowego. Przed rozpoczęciem opracowywania kodu źródłowego należy obmyślić algorytm rozwiązania postawionego zadania. Algorytm to sposób rozwiązania pewnej klasy zadań. Opracowanie kodu źródłowego czyli tzw. kodowanie to zapis wcześniej obmyślonego algorytmu w języku programowania - w naszym przypadku jest nim język C/C++. Kod wynikowy generuje komputer. Specjalny program - kompilator analizuje kod źródłowy programu pod względem poprawności leksykalnej, składniowej i częściowo semantycznej (znaczeniowej) i po ewentualnym usunięciu przez programistę wykrytych błędów tłumaczy na postać pośrednią, do której inny program (program łączący - linker) dołącza brakujące elementy umieszczone w bibliotekach funkcji. 2017-02-16 Programowanie strukturalne W1 5
Po pomyślnym zakończeniu procesu łączenia powstaje kod wynikowy - program gotowy do wykonania przez maszynę. Jest to algorytm rozwiązania zadania zapisany w języku wewnętrznym komputera. Algorytm nie jest na ogół pozbawiony błędów wykonania. Są to błędy, których nie wykrywa kompilator w fazie analizy poprawności programu źródłowego. Inna kategoria błędów, to błędy wykrywane przez program tłumaczący kompilator. Są to tzw. błędy kompilacji. Porównać je można do błędów ortograficznych, składniowych oraz gramatycznych, które często zdarza nam się popełniać w języku naturalnym (nawet ojczystym). Rysunek przedstawia schematycznie przebieg procesu tworzenia kodu wynikowego pewnego programu 2017-02-16 Programowanie strukturalne W1 6
2017-02-16 Programowanie strukturalne W1 7
Charakterystyczną cechą języka C/C++ jak i wielu innych języków programowania jest możliwość budowy programu z wielu modułów. Modułem w języku C/C++ może być każdy plik zawierający poprawny kod źródłowy. Program w języku C/C++ buduje się z funkcji. Każda funkcja może (ale nie musi) posiadać parametry i może, ale nie musi reprezentować wartość określonego typu. Aby możliwe było wygenerowanie kodu wynikowego programu w postaci przyjmowanej przez system operacyjny (w systemach operacyjnych DOS, Windows jest to zbiór z rozszerzeniem.exe) w jednym (i tylko w jednym) module programu musi znaleźć się funkcja o nazwie main (lub podobnej zależnie od środowiska). Od tej funkcji głównej system rozpoczyna wykonywanie programu. Moduł, który zawiera tą funkcję nazywa się modułem głównym. 2017-02-16 Programowanie strukturalne W1 8
Najprostszy, poprawny program w C/C++ może mieć postać: { } void main(void) Program ten składa się z bezparametrowej funkcji main. Funkcja ta nie reprezentuje żadnej wartości - powiadamy że nie "zwraca" do systemu operacyjnego żadnej wartości. Wewnątrz nawiasów klamrowych znajduje się blok, który zawiera definicję funkcji. Definicję funkcji często nazywa się jej ciałem. Przydatność praktyczna takiego programu jest oczywiście znikoma. Wewnątrz bloku stanowiącego definicję funkcji nie umieszczono żadnego polecenia ten program niczego nie wykonuje. 2017-02-16 Programowanie strukturalne W1 9
Inny, prosty program może mieć postać: /* Program 1.2 - przykład prostego programu napisanego w języku C++. Program wyświetla na ekranie komunikat powitalny */ #include <iostream.h> void main(void) { cout << "\nwitaj w świecie C++"; } 2017-02-16 Programowanie strukturalne W1 10
W tekście tego programu można wyróżnić następujące elementy (jednostki składniowe): komentarz - fragment tekstu pomijany przez kompilator w procesie analizy i tłumaczenia programu źródłowego; komentarzem jest dowolny tekst pomiędzy parą symboli dwuznakowych /* (ukośnik gwiazdka) oraz */ (gwiazdka ukośnik); w wersji C++ języka znacznikiem komentarza (tzw. jednowierszowego) jest też znak // i wtedy kompilator ignoruje napis od tego znacznika do końca wiersza; dyrektywa preprocesora - słowo include wraz z poprzedzającym je znakiem #; jest to polecenie dla kompilatora, aby przed rozpoczęciem analizy tekstu źródłowego dołączył do niego tzw. plik nagłówkowy o nazwie iostream.h; w plikach nagłówkowych znajdują się definicje symboli użytych w programie oraz tzw. prototypy funkcji; deklaracja funkcji main - przykładowy program składa się z bezparametrowej funkcji głównej nie reprezentującej sobą żadnej wartości, na co wskazuje słowo kluczowe void poprzedzające nazwę funkcji głównej; wewnątrz nawiasów klamrowych znajduje się blok zawierający definicję (ciało) funkcji głównej; cout jest nazwą obiektu zdefiniowanego w pliku nagłówkowym iostream.h; obiekt ten to tzw. strumień wyjściowy, do którego za pomocą operatora << (również zdefiniowanego w pliku iostream.h) program prześle tekst komunikatu do wyświetlenia na ekranie monitora. 2017-02-16 Programowanie strukturalne W1 11
Przykładowy program wyświetli na ekranie monitora napis (komunikat) treści: Witaj w świecie C++ oraz zakończy działanie. Takie samo zadanie wykona program: /* Program w1_2 - inna wersja (proceduralna) prostego programu, ktory wyswietla komunikat powitalny */ #include <stdio.h> void main(void) { printf("\nwitaj w swiecie C++"); } Do wyświetlenia komunikatu użyto tutaj funkcji standardowej o nazwie printf, której parametrem jest łańcuch znaków. Funkcja ta nie zwraca żadnej wartości. Warto zauważyć, że w tym przypadku do tekstu programu dołączono inny niż poprzednio plik nagłówkowy. W pliku stdio.h znajduje się prototyp funkcji standardowej użytej w naszym przykładzie. Definicja tej funkcji znajduje się w bibliotece funkcji standardowych, która jest automatycznie przeglądana przez program łączący w fazie tworzenia kodu wynikowego. 2017-02-16 Programowanie strukturalne W1 12
Jednostkami składniowymi języka C++ są: identyfikatory, słowa kluczowe, znaki przestankowe, stałe, literały łańcuchowe, operatory. Identyfikatorem (nazwą) w języku C++ może być ciąg znaku podkreślenia. Identyfikator jest nazwą elementu języka (zmiennej, funkcji itp.). Pierwszy znak identyfikatora musi być literą lub znakiem podkreślenia. dużych i małych liter, cyfr i Kompilator C++ rozróżnia pierwsze 32 litery nazwy. Nazwy dłuższe są poprawne. Kompilator rozróżnia duże i małe litery nazwy. Nazwa Yuma_15_10 np. yuma_15_10 jest identyfikatorem zupełnie innego elementu programu niż 2017-02-16 Programowanie strukturalne W1 13
Słowa kluczowe są to identyfikatory zastrzeżone dla specjalnych celów. Mogą być wykorzystywane tylko zgodnie z ich przeznaczeniem. Zestawienie wszystkich słów kluczowych można znaleźć w wielu podręcznikach języka C/C++ Kilka przykładów słów kluczowych: void for int short float return do while struct class continue switch case Słowa kluczowe to instrukcje języka, nazwy typów, dyrektywy preprocesora i kompilatora itp. 2017-02-16 Programowanie strukturalne W1 14
Znakami przestankowymi są: [ ] ( ) { }, ; :... * = # nawiasy kwadratowe [ ] - definiowanie tablic i wskazywanie ich elementów, nawiasy okrągłe ( ) - grupowanie wyrażeń, wywołania funkcji, lista parametrów, nawiasy klamrowe { } - początek i koniec instrukcji złożonej (bloku), przecinek, - oddzielanie elementów listy, średnik ; - zakończenie instrukcji, dwukropek : - poprzedzający go ciąg znaków jest etykietą, wielokropek... - deklarowanie funkcji o zmiennej liczbie parametrów, gwiazdka * - deklarowanie zmiennych wskaźnikowych, znak równości = - oddzielanie deklaracji zmiennej od części inicjującej tą zmienną, znak # - oznaczenie dyrektywy preprocesora. 2017-02-16 Programowanie strukturalne W1 15
Typ danej to zbiór wartości jakie dana może przyjmować. Typ danej determinuje również sposób jej przechowywania w pamięci komputera i obszar jaki zajmuje (liczbę jednostek pamięci - bajtów). W języku C/C++ dostępne są typy proste i strukturalne. Typy proste wykorzystuje się do tworzenia typów strukturalnych. Do kategorii prostych w języku C/C++ należą typy: - arytmetyczne całkowite i rzeczywiste, - wskaźnikowe, W języku C++ występuje ponadto typ referencyjny. Typy strukturalne mogą składać się z danych typów prostych i innych typów strukturalnych. Typami strukturalnymi w języku C/C++ są: - tablice, - struktury, - unie. W C++ grupę typów strukturalnych uzupełniają klasy. Typ danej jest pojęciem logicznym. Reprezentantem fizycznym typu danej jest zmienna. 2017-02-16 Programowanie strukturalne W1 16
Typy i zmienne całkowite. Typy całkowite w C/C++ są skończonymi, przeliczalnymi podzbiorami zbioru liczb całkowitych. Zmienne typów całkowitych deklaruje się w programach za pomocą słów kluczowych (lub ich kombinacji): char int long signed short unsigned typ znakowy typ całkowity typ tzw. długich liczb całkowitych liczby całkowite ze znakiem typ tzw. krótkich liczb całkowitych liczby całkowite bez znaku 2017-02-16 Programowanie strukturalne W1 17
Wymienione słowa kluczowe można łączyć dla oznaczenia różnych kombinacji cech zmiennych. Przykłady: char a; signed char a; - zmienna a jest wartością dziesiętną kodu ASCII pewnego znaku wartość kodu jest opatrzona znakiem plus lub minus short k, m, n; short int k, m, n; short signed k, m, n; short signed int k, m, n; - zmienne k, m, n są liczbami całkowitymi krótkimi ze znakiem unsigned short q, ilosc; unsigned short int q, ilosc; - zmienne q, ilosc są liczbami całkowitymi krótkimi bez znaku int K[20] signed int K[20]; - tablica K zawiera liczby całkowite ze znakiem (dodatnie albo ujemne) 2017-02-16 Programowanie strukturalne W1 18
unsigned _jakosc; unsigned int _jakosc; - zmienna _jakosc jest liczbą całkowitą bez znaku long dlugosc, kat; long int dlugosc, kat; signed long int dlugosc, kat; - zmienne dlugosc, kat są liczbami całkowitymi długimi ze znakiem unsigned long szerokosc, x, y; unsigned long int szerokosc, x, y; - zmienne szerokosc, x, y są liczbami całkowitymi długimi bez znaku 2017-02-16 Programowanie strukturalne W1 19
Obszar zajmowany w pamięci oraz zakres wartości zmiennych całkowitych zależą od sprzętu, systemu operacyjnego, kompilatora, wreszcie typu wartości. Przykładowo w systemie programowania C/C++ Borland: unsigned char 8 bitów 0 255 signed char 8 bitów -128 127 unsigned int 16 bitów 0 65535 short signed int 16 bitów -32768 32767 signed int 16 bitów -32768 32767 long unsigned int 32 bity 0 4.294.967.295 long signed int 32 bity -2.147.483. 648 2.147.483.647 2017-02-16 Programowanie strukturalne W1 20
Inicjowanie zmiennych polega na przypisaniu im początkowej wartości. Kompilator podczas tłumaczenia programu źródłowego nadaje zmiennym wartości nieokreślone (przypadkowe). Prowadzi to często do powstania trudnych do wykrycia błędów wykonania. Zapobiec temu może inicjowanie zmiennych przed ich pierwszym użyciem. W języku C/C++ można tego dokonać wraz z deklaracją zmiennej. Ma ona następującą postać ogólną: typ-całkowity identyfikator [=stała-odpowiedniego-typu] (1.1) Uwaga! Dalej w wyrażeniach przedstawiających postać ogólną składni będziemy używać "metasymbolu" [ ] dla oznaczenia części zdania, która może, ale nie musi wystąpić. Metasymbol { } będzie oznaczać część definicji, która może wystąpić wiele razy. 2017-02-16 Programowanie strukturalne W1 21
Przykłady deklaracji i inicjacji zmiennych znakowych: char litera_a=65; char bubel='b'; char Nowa_Linia='\n'; wartość dziesiętna kodu znaku A znak B znak sterujący "przejście" do następnej linii char odstep16='\x20'; znak o kodzie szesnastkowym 20 - odstęp (spacja) char odstep10='\32'; znak o kodzie dziesiętnym 32 spacja Zmiennym typu znakowego (char) nadaje się wartości (również początkowe) podając wartość dziesiętną kodu znaku lub znak ujęty w apostrofy. Znaki sterujące oraz znaki wykorzystywane przez język C/C++ są kodowane w postaci \litera-lub-znak. Można również podać wartość szesnastkową lub ósemkową kodu ASCII znaku. 2017-02-16 Programowanie strukturalne W1 22
Znaki sterujące w C/C++ Sekwencja Wartość hex Nazwa znaku \a 07 BEL sygnał dźwiękowy Funkcja \b 08 BS cofnięcie kursora i usunięcie znaku \f 0C FF wysunięcie strony (ang. Form Feed) \n 0A LF przesunięcie o 1 wiersz w dół (ang. Line Feed) \r 0D CR przesunięcie kursora na poczatek linii (ang. Carriage Return) \t 09 HT tabulator poziomy \v 0B VT tabulator pionowy \\ 5C lewy ukośnik \' 27 apostrof \" 22 cudzysłów \? 3F znak zapytania 2017-02-16 Programowanie strukturalne W1 23
Aby zainicjować zmienne typów int i long int należy po znaku równości podać liczbową stałą całkowitą. Może nią być: stała dziesiętna, stała ósemkowa (rozpoczynająca się od cyfry 0), stała szesnastkowa (rozpoczynająca się znakami 0x). W podanym dalej przykładzie programu występują deklaracje zmiennych całkowitych, ich inicjacje oraz wywołania funkcji wyprowadzania do standardowego urządzenia wyjściowego - monitora. 2017-02-16 Programowanie strukturalne W1 24
/* Przyklad programu, w ktorym wystepuja inicjacje zmiennych calkowitych i wyswietlanie ich wartosci */ #include <conio.h> //Wiersze nr 3-5 #include <stdio.h> #include <stdlib.h> using namespace std; // 6 int main(void) // 7 { // 8 char xa=65, my='y'; // 9 unsigned int x=12101, y=0121, z=0xfa; // 10 short signed int q=-23409, r=11206; // 11 unsigned long dluga=234ul; // 12 signed long int po_co=-567l; // 13 system("cls"); // 14 printf("\n Liczby: \n wartosc xa = %c \n wartosc my = %c", xa, my); // 15 i 16 printf("\n wartosc x = %u \n wartosc y = %o \n wartosc z = %x", x, y, z); // 17 i 18 printf("\n wartosc q = %d \n wartosc r = %d", q, r); // 19 printf("\n wartosc dluga = %lu \n po_co = %ld", dluga, po_co); // 20 system("pause"); // 21 system("cls"); // 22 return 0; // 23 } 2017-02-16 Programowanie strukturalne W1 25
Pierwsze 2 wiersze tekstu stanowią komentarz (łańcuch znaków pomiędzy /* i */ ). Wiersze 3-5 - dyrektywy include preprocesora (poprzedza je znak #); polecają dołączyć w tym miejscu do tekstu programu pliki nagłówkowe conio.h oraz stdio.h. W plikach tych znajdują się definicje stałych i symboli oraz prototypy funkcji odpowiedzialnych za obsługę konsoli (plik conio.h) oraz standardowego wejścia-wyjścia (plik stdio.h). Znaki < > ograniczające nazwy tych plików oznaczają, że kompilator powinien szukać tych zbiorów w specjalnym katalogu o nazwie INCLUDE stanowiącym podkatalog katalogu, gdzie zlokalizowane są wszystkie elementy języka C/C++. Ograniczniki " " nazw plików nagłówkowych polecają kompilatorowi szukać tych zbiorów w bieżącej kartotece (tzw. katalogu roboczym). Wiersz 6 informuje o tym, że do poprawnego skompilowania i uruchomienia programu niezbędna jest tzw. "przestrzeń nazw" (biblioteka) std Wiersz 7 zawiera deklarację (nagłówek) funkcji głównej main. Wiersz 8 - nawias klamrowy otwierający blok, który stanowi "ciało" funkcji głównej W wierszu 9 znajdują się deklaracje i inicjacje zmiennych całkowitych typu char. Zmienną xa zainicjowano wartością dziesiętną kodu dużej litery A (wartość 65), a zmienną my - znakiem y (wewnątrz maszyny jest on przechowywany jako liczba o wartości dziesiętnej 121). W wierszu 10 zadeklarowano i nadano wartości początkowe zmiennym x, y, z typu całkowitego bez znaku; zmiennej x nadano wartość dziesiętna 12101, zmiennej y - wartość 81 zapisaną w postaci ósemkowej jako 0121; zmienna z będzie mieć wartość odpowiadającą liczbie dziesiętnej 250; w wyrażeniu inicjującym wartość tą zapisano w postaci stałej szesnastkowej jako 0xfa. 2017-02-16 Programowanie strukturalne W1 26
Wiersz 11 - deklaracja i inicjacja zmiennych q oraz r typu całkowitego krótkiego ze znakiem. Nadano im wartości początkowe właściwe dla ich typów. W wierszu 12 znajduje się deklaracja i inicjator zmiennej całkowitej długiej bez znaku dluga - nadano jej wartość początkową 234. Litery UL sygnalizują kompilatorowi, że powinien on zapisać tą daną w pamięci w postaci właściwej dla typu unsigned long. Zapobiega to ewentualnej zmianie sposobu zapisu w czasie wykonywania programu. W wierszu 13 zadeklarowano i zainicjowano zmienną całkowitą po_co typu signed long int. W wierszu 14 znajduje się wywołanie funkcji standardowej system("cls"); jej prototyp znajduje się w pliku nagłówkowym stdlib.h, a jej zadaniem jest wykonanie polecenia systemu operacyjnego, którego nazwa jest argumentem funkcji - będzie to "oczyszczenie" ekranu monitora ze zbędnych napisów pochodzących np. z poprzednio wykonywanego programu i ustawienie kursora w lewym górnym rogu ekranu. Wiersze 15-20 zawierają wywołania funkcji standardowej printf odpowiedzialnej za obsługę wyjścia z programu. Funkcja printf obsługuje tzw. wyjście formatowane. Jest to funkcja o zmiennej liczbie argumentów. Pierwszym jej argumentem musi być łańcuch znaków zawierający znaki wyświetlane na ekranie oraz tzw. kody formatujące, które określają sposób przedstawiania danych (sposób tłumaczenia wyświetlanych danych z zapisu wewnętrznego, zero-jedynkowego, na postać czytelną dla człowieka). Kolejne argumenty tej funkcji to nazwy wyprowadzanych zmiennych. 2017-02-16 Programowanie strukturalne W1 27
Wywołanie funkcji printf w wierszu 15 i 16 spowoduje wyświetlenie napisu Liczby:. W następnym wierszu pojawią się nazwy zmiennych xa oraz my i ich wartości (znaki A oraz y). Kody formatujące są zastępowane wartościami zmiennych użytych jako kolejne argumenty funkcji. Kod formatujący %c jest właściwy dla danych typu char. Kod %u oznacza konwersję na postać zewnętrzną liczby całkowitej bez znaku. Kod %o jest właściwy dla wartości w postaci ósemkowej, a kod %x odpowiada zmiennym o wartościach w postaci szesnastkowej (wiersz numer 17). Ciąg znaków %d wykonuje konwersję na postać zewnętrzną liczb dziesiętnych (w tym przypadku chodzi o liczby całkowite krótkie ze znakiem). Prototyp funkcji printf znajduje się w pliku nagłówkowym stdio.h. Wiersz 20 wyświetla wartości zmiennych dluga oraz po_co; na ekranie będą poprzedzone napisami odpowiednio wartosc dluga = oraz po_co =. Kod formatujący %lu odpowiada konwersji liczby całkowitej długiej bez znaku, a łańcuch %ld oznacza polecenie konwersji liczby całkowitej ze znakiem W wierszu 21 ponownie wywołano funkcję system, tym razem z argumentem pause, która wyświetla komunikat "Aby kontynuować naciśnij dowolny klawisz " i "czeka" na wpisanie do bufora klawiatury dowolnego znaku, a następnie wraca do wykonywania programu. Efektem jest "zatrzymanie" działania komputera do momentu naciśnięcia dowolnego klawisza. W ten sposób możemy odczytać z ekranu wyniki działania. Instrukcja return 0 kończy działanie programu i powoduje powrót do systemu operacyjnego z kodem błędu o wartości 0. 2017-02-16 Programowanie strukturalne W1 28
2017-02-16 Programowanie strukturalne W1 29
Typy rzeczywiste są nieciągłymi podzbiorami zbioru liczb rzeczywistych. Ich rodzaje i zakresy wartości są następujące: Typ/słowo kluczowe Rozmiar w bitach Zakres od Zakres do float 32 3,4*10 38 3,4*10 38 double 64 1,7*10 308 1,7*10 308 long double 80 3,4*10 4932 1,1*10 4932 Kilka przykładów deklaracji i inicjacji zmiennych rzeczywistych: float blad = -12.3e-2; zmienna blad ma wartość początkową 0,123 double x, y = 18., z =.11e11; x nieokreślona, y wartość 18, z wartość 0,11*10 11 long double r_dluga = -0.304e-607L; r_dluga wartość 0,304*10 607 typu long double float xc = 16.099e+32F; xc wartość 16,099*10 32 2017-02-16 Programowanie strukturalne W1 30
Wartości zmiennych rzeczywistych są standardowo przechowywane w postaci właściwej dla typu double - podobnie jak w przypadku liczb całkowitych, litery F, f, L, l umieszczane po liczbie w miejscu jej inicjacji zapobiegają wykonywaniu konwersji. W języku C/C++ można deklarować i używać zmienne, które zamiast właściwej danej zawierają adres obszaru pamięci - miejsca przechowywania właściwej danej. Obszar ten może być interpretowany jako zmienna określonego typu. Zmienna zawierająca adres innej zmiennej nosi nazwę zmiennej wskaźnikowej lub krócej wskaźnika. Zmienna, której adres zapisany jest w zmiennej wskaźnikowej to zmienna wskazywana. Wskaźniki w języku C/C++ są wygodnym i często używanym mechanizmem; umożliwiają: tworzenie i przetwarzanie tzw. dynamicznych struktur danych, zarządzanie blokami pamięci, łańcuchami znaków i tablicami, przekazywanie parametrów do i z funkcji. 2017-02-16 Programowanie strukturalne W1 31
/* Przyklad uzycia i dzialania zmiennych wskaznikowych */ #include <stdio.h> #include <conio.h> #include <stdlib.h> using namespace std; int main(void) { char znak = 'y', *w_znak = &znak; // w_znak - wskaznik, adres zmiennej znak int numer = 113, *w_numer = &numer; // w_numer - adres zmiennej numer double rzecz = 13.077e21, *w_rzecz = &rzecz; // w_rzecz - adres zmiennej rzecz system("cls"); printf("\n Wartosci zmiennych wskazywanych: \n %c, %d, %f", znak, numer, rzecz); *w_znak = 'A'; *w_numer = 251; *w_rzecz = -11.11e2; printf("\nnowe wartosci zmiennych wskazywanych:\n %c, %d, %f", znak, numer, rzecz); system("pause"); system("cls"); return 0; } 2017-02-16 Programowanie strukturalne W1 32
2017-02-16 Programowanie strukturalne W1 33