WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 1
PODSTAWY
PROGRAMOWANIA
kurs I - część 1
PROWADZCY: dr in\. Marcin Głowacki
E-Mail: Marcin.Glowacki@pwr.wroc.pl
Pok.907 C-5
Wrocław 2008
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 2
LITERATURA PODSTAWOWA
Jerzy Grębosz Symfonia C++ Oficyna Kallimach, Kraków 2002
Krystyna Koleśnik Podstawy programowania strukturalnego w
Języku C++ , Oficyna PWR 2006
Anna Struzińska-Walczak, Krzysztof Walczak, Nauka
programowania dla początkujących C++ , Wyd. W&W, W-wa
1999
LITERATURA UZUPEANIAJCA
Brian W. Kernigham, Dennis M. Ritchie; Język ANSI C, WNT
2001
Stroustrup B., Język C++, Warszawa, WNT, 2002
ZALICZENIE
- test końcowy
Ocena końcowa = 1/3*ćwiczeń + 1/3*laboratorium + 1/3*wykład
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 3
1.PRZEGLD TECHNIK PROGRAMOWANIA:
- programowanie liniowe: szereg komend i przeskoki GOTO (np. język Basic), JMP
(ASEMBLER)
- programowanie proceduralne: funkcje (return), GOSUB (BASIC), CALL FAR i CALL
NEAR(ASSEMBLER)
o program był traktowany jako seria procedur, działających na danych
o Procedura (funkcja) jest zestawem specyficznych, wykonywanych jedna po drugiej
instrukcji.
- programowanie strukturalne - z ukrywaniem danych: structure (C), record (PASCAL)
o idea główna to dziel i rządz. - ka\de zadanie jest rozbijane na zestaw mniejszych
zadań składowych
o dostęp do danych przez nazwa_strukt.nazwa_zmiennej
- programowanie obiektowe bazujące na obiektach
o pojawia się pojęcie klasy i obiektów tej klasy
o obiekty zawierają dane w postaci zmiennych i metody operujące na tych danych
o najczęściej obiekty są wyraznie odrębne i brak zale\ności pomiędzy nimi, patrz: brak
dziedziczenia i polimorfizmu
- programowanie zorientowane obiektowo programowanie obiektowe wzbogacone o
dziedziczenie i polimorfizm kod programu sam się orientuje z jakim typem obiektu ma do
czynienia i dobiera właściwą funkcję realizującą domyślną akcję (podobnie jak
przeładowanie/przecią\enie funkcji i operatorów, które same rozpoznają z jakimi
argumentami mają do czynienia)
o łatwa rozbudowa i korzystanie z elementów wcześniej zdefiniowanych
o związanie funkcji ze strukturą przetwarzanych danych
o dziedziczenie i ukrywanie danych
polimorfizm = wiele form jedna nazwa mo\e przybierać wiele form, forma aktualna jest
związana z daną klasą obiektu
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 4
KLASYCZNE PROJEKTOWANIE PROGRAMU:
- Rozpoznanie i analiza problemu
- Projektowanie programu
o Identyfikacja zachowań systemu: kto/co -> akcja -> kogo/czego -> rezultat (gracz-
>rzuca ->kostką -> liczba pomiędzy 1 i 6)
Identyfikacja struktur danych
Wskazanie bloków funkcjonalnych algorytm (minimum blokowy)
o Usystematyzowanie i uszczegółowienie
Tworzenie nowych typów i struktur danych (jeśli są potrzebne)
Ustalenie hierarchii zmiennych i ich zasięgu
Określenie wzajemnych zale\ności która funkcje wydają rozkazy, a która
spełniają polecenia, które funkcje wymieniają się usługami GRAF
WSPÓAPRACY
Podsystemy znajdowanie grup obiektów, które realizują odrębne
funkcjonalnie zadania, np. obsługa menu
o Składanie modelu określanie stanów, sekwencji działań oraz cykli \yciowych dla
danych oraz funkcji
- Implementacja
- Testowanie
- Uruchomienie i poprawki
ANALIZA PROBLEMU
" Od szczegółu do ogółu (wstępujące)
niepodzielne części łączy się w większe fragmenty
" Od ogółu do szczegółu (zstępujące)
bloki funkcjonalne uściśla się do operacji elementarnych
" W praktyce TECHNIKI MIESZANE
" Struktura danych
ALGORYTM - SCHEMAT BLOKOWY
START
" START, STOP
" OPERACJA WYKONAWCZA
i=0
j=j+1
" OPERACJA WARUNKOWA
if i<3
NIE
TAK
wyświetl
" OPERACJA WEJŚCIA/ WYJŚCIA
i
podaj k
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 5
IMPLEMENTACJA
Język programowania i narzędzia programistyczne
- stopień zło\oności języka
- poziom abstrakcji realizowanych funkcji
- projekty z kodem z ró\nych języków
Podział na odrębne moduły tworzone w zespole programistów
Właściwe zarządzanie projektem
Język C <-> Assembler
#include
_TEXT segment byte public 'CODE
; void main()
void main() {
_main proc near
printf("Hello world");
; {
}
; printf("Hello world");
push offset DGROUP:s@
call near ptr _printf
pop cx
; }
ret
_main endp
Poziomy maszynowe
L4 C++
int A, B, C; //fragment danych
&
A=B+C; //fragment programu
L3 Asembler (Intel x86) L1 kod maszynowy (Intel x86)
(.data) SEGMENT danych
cc dw (?) ; (offset cc = 0103h)
bb dw (?) ; (offset bb = 0105h)
aa dw (?) ; (offset aa = 0107h)
(.code) SEGMENT programu
...
(*) mov ax, cc 1010 0001 (A1h)
0000 0011 0000 0001 (0103h)
(*+3) add ax, bb 0000 0011 0000 0110 (0306h)
0000 0101 0000 0001 (0105h)
(*+7) mov aa, ax 1010 0011 (A3h)
0000 0111 0000 0001 (0107h)
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 6
MODEL PRZETWARZANIA
wpływ na sposób zakodowania programu
- z podziałem czasu (przełączanie zadań)
- czasu rzeczywistego
- równoległe (wiele procesorów)
- rozproszone (w sieci komputerowej, klastrze)
Zarządzający
klastrem
KOMP
KOMP
KOMP
KOMP
SWITCH
KOMP
KOMP
KOMP
KOMP
Legenda
KOMP
Komputer wchodzący w skład klastra
SWITCH Przełącznik sieciowy np., Gigabit Ethernet
Bardzo szybkie łącze np., Gigabit Ethernet
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 7
KOMPILACJA i KONSOLIDACJA
Pseudo-kompilatory generują tzw. bajtkod kod pośredni, który na etapie wykonywania jest
przekształcany w kod maszynowy mikrokod wykonywany wewnątrz procesora. Mikrokod jest
ró\ny dla ró\nych typów procesora.
Tekst programu
Moduły - objects Plik
(.cpp)
(.o lub .obj) wykonywalny
Program
Program
Program Program
Konsolidator
Kompilator
wykonalny
wynikowy
zródłowy ładujący
Inne
Procesor Procesor Procesor Procesor
moduły
Kod
Pseudo-
Kod
Interpreter
pośredni
kompilator maszynowy
Inne moduły z kodem pośrednim:
mogą pochodzić z innych kompilatorów dowolnych innych języków programowania:
- Pascal, Asembler, Fortran, Cobol, Modula 2 itd.
Program
Program
Kompilator
zródłowy
wynikowy
C
C
Program
Kompilator
Program
zródłowy
C++
wynikowy
C++
Program
Program
Program
Kompilator
zródłowy
Konsolidator
wykonalny
wynikowy
Pascal
Pascal
Program
Program
Kompilator
zródłowy
wynikowy
Asembler
Asembler
Program
Program
Kompilator
zródłowy
wynikowy
Fortran
Fortran
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 8
PREPROCESOR KOMPILATORA
" Przed uruchomieniem kompilatora
" Dyrektywy rozpoczynające się od: # (hash, krzy\yk)
#include //dla domyślnej lokalizacji plików nagłówkowych
lub
#include nazwa //dla plików nagłówkowych z bie\ącej kartoteki
" Definicja symbolu lub stałej:
#define NMAX 100
#define cośtam
" Dyrektywa warunkowa:
Przykład:
#ifndef p_sumaP //jeśli wcześniej nie było zdefiniowane p_sumaP
#define p_sumaH /*to trzeba zdefiniować p_sumaH i dołączyć
odpowiedni plik nagłówkowy */
#include p_suma.h //Umieszczenie treści pliku p_suma.h w tym miejscu
#endif
Inny przykład:
#define unix //informacja na początku, \e kompilacja w systemie Unix
.....
#ifdef unix
#include unix.h //dołącz jakiś własny plik nagłówkowy unix.h
#endif
#ifndef unix //dla innego systemu ni\ unix
#include system.h //dołącz jakiś własny plik nagłówkowy system.h
#endif
PROGRAM WYKONALNY
" Kompilacja programu zródłowego
" Binarny moduł wynikowy typu obiekt
" Aączenie modułów - Link
" Program uruchamialny: .com, .exe
" Uruchamianie krokowe - Debug
URUCHOMIENIE i PRZETESTOWANIE
Faza wdro\enia i obserwacja zachowania programu w warunkach rzeczywistej eksploatacji
Odnajdowanie przyczyn błędnego działania programu (ang. TROUBLESHOOTING)
" Błędy kompilacji (składniowe)
" Błędy logiczne
" Błędy funkcjonalne
" Pomyłki fazy projektowania
Obsługa potencjalnych błędów u\ytkownika
" Zmiany i rozszerzenia
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 9
ZALECENIA OGÓLNE:
1. Funkcje:
e"10 linijek programu,
wielokrotne powtórzenia.
wcięcia w tekście programu
spójny system nazw, np. zgodne z systemem węgierskim
2. Wyczerpujące komentarze w programach:
komentarz do końca linii: //
for (i=1;i<5;i++) { //pętelka słu\ąca do pokazu zaleceń ogólnych dla studentów
if (iLiczba == 7)
. . .
}
blok komentarza: /* blok */
for (i=1;i<5;i++) { /*inna pętelka z wykluczoną instrukcją, która nie jest ju\ potrzebna, ale
mo\e się przydać pózniej w fazie uruchomienia. Po zakończeniu fazy uruchomienia takie
zbędne instrukcje i bloki komentarzy mo\na usunąć np., \eby nie dawać sobie powodu do
wstydu i wyśmiewania przez następne pokolenia
if (iLiczba == 7) */
iLiczba--;
. . .
}
ZAOTA ZASADA
(nieznanego autora - przekazywana z pokolenia na pokolenie)
Cyt. rady starszego kolegi:
Program działa tak jak go napisałeś,
a nie tak jak Ci się wydawało, \e go napisałeś.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 10
2. REPREZENTACJA DANYCH
Dane przechowywane i przetwarzane w komputerach są postaci cyfrowej, zatem w postaci liczb o
pierwotnej postaci liczb binarnych zapisanych w systemie dwójkowym.
Dane, które zapisane są w pamięci komputera to tzw. zmienne, ze względu na fakt, \e ich wartości
mogą być modyfikowane w trakcie działania programu. Ka\da zmienna jest określonego typu i
posiada unikalną nazwę lub wskazanie w postaci adresu czyli miejsca w pamięci operacyjnej.
Wyró\niono trzy typy zmiennych, w zale\ności od zasięgu dostępności danych w ró\nych
miejscach programu:
Globalne deklarowane na początku programu, przed funkcją główną: main() ) dostępne w
ka\dym miejscu programu. Rezydują w pamięci przez cały czas funkcjonowania programu w
miejscu na stałe zarezerwowanym.
Lokalne dostępne w bloku, w którym zostały zadeklarowane i u\ywane tylko w jego obszarze,
np. w funkcji głównej lub innych zdefiniowanych funkcjach. Przeznaczone są do lokalnego
przetwarzania i dlatego mają charakter tymczasowy znikają po zakończeniu funkcji lub nie są
dostępne po opuszczeniu funkcji, np. w celu realizacji innej funkcji, a po powrocie są nadal
dostępne. Ka\de jednak nowe wywołanie funkcji tworzy na nowo zestaw zadeklarowanych
zmiennych z ich wartościami początkowymi. Tworzone są w pamięci podręcznej programu, w
przestrzeni, która mo\e być wielokrotnie u\yta do deklarowania ró\nych zmiennych lokalnych.
Statyczne podobnie jak zmienne lokalne dostępne są w bloku, w którym zostały zadeklarowane, z
tą jednak ró\nicą, \e zachowują swoją wartość podczas ponownego wywołania funkcji. Musza
posiadać stałą rezerwację w pamięci, podobnie jak zmienne globalne.
Widoczność zmiennych, zmienne statyczne oraz zjawisko przesłaniania zostanie omówione w
dalszej części kursu.
DEKLARACJE ZMIENNYCH
Deklaracja zmiennej polega na wskazaniu typu zmiennej i nazwy. Nie mo\na zakładać, \e zmienne
posiadają istotną wartość początkową, która mo\e być przypadkowa. Nie mo\na zakładać, \e
będzie to zero dla zmiennych przechowujących liczby. Mo\liwe jest zadeklarowanie zmiennych z
wartościami początkowymi:
Typ nazwa_zmiennej = wartość_początkowa;
int a,b,c;
float d,e,f;
double g,h;
Inicjalizacja wartości początkowych:
int a=0,b=1,c=5;
float d=0.1,e=0.5,f=7;
double g=0,h=0;
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 11
W języku C definicje zmiennych mają ustalone miejsce, zwykle na początku programu lub funkcji.
W języku C++ dopuszczono większą swobodę co do miejsca umieszczenia deklaracji zmiennych
zwykle mogą się pojawiać w dowolnym miejscu programu, np. przed ich pierwszym u\yciem lub
nawet w trakcie ich u\ycia:
for (int i=0;i<100;i++){
...
}
int a= (int b=5) + (int c=7); //to tylko przykład - proszę nie stosować takich praktyk.
Poprawiła się wygoda u\ycia zmiennych, ale jednocześnie pojawić się bałagan. Nale\y stosować
przede wszystkim rozsądek i utrzymywać w równowadze rozproszenie deklaracji zmiennych oraz
porządek i czytelność programu.
STRUKTURA PROGRAMU
W przypadku rozbudowanych programów mo\e być bardzo zró\nicowana. Dla prostych
przypadków mo\na przyjąć ogólną strukturę składającą się z dyrektyw dołączenia plików
nagłówkowych #include, następnie zmiennych globalnych
Przykładowa postać ogólna struktury programu:
#include //pliki nagłówkowe
int konto, licznik; //zmienne globalne
int XYZ(int dana1, int dana2){
int wynik, suma, m,n; //zmienne lokalne w funkcji XYZ
& .
return suma; //powrót z funkcji
}
int main(){
int a=0, b, c; //zmienne lokalne w funkcji głównej
...
XYZ(b,10); //wywołanie funkcji XYZ
for (int i=0; i<10; i++){
...
}
return 0; //powrót z kodem 0 jeśli poprawne zakończenie
}
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 12
TYPY DANYCH WBUDOWANE
Zarówno w języku C, jak i w języku C++ wyró\niamy pięć podstawowych typów danych:
int typ całkowity. U\ywany jest do zapamiętywania i zapisywania liczb całkowitych.
float typ zmiennopozycyjny (zmiennoprzecinkowy).
double typ zmiennoprzecinkowy podwójnej długości. Zmienne typu float oraz double
umo\liwiają zapamiętywanie i zapisywanie liczb posiadających część całkowitą i
ułamkową. Część ułamkową oddzielamy kropką.
char typ znakowy stosowany do zapamiętywania i zapisywania znaków ASCII oraz
krótkich liczb reprezentowanych na 8 bitach. Na niektórych architekturach zajmuje mo\e zajmować
więcej ni\ jeden bajt.
void typ pusty. Za jego pomocą mo\na deklarować funkcje nie zwracające \adnych wartości
oraz funkcje, które nie pobierają argumentów. Dodatkowo mo\liwe jest tworzenie
ogólnych wskazników.
Rozmiar typu <=> zakres liczb
jest uzale\niony od architektury procesora (zwykle 16 lub 32 bity) oraz kompilatora. W
nowoczesnych, 32-bitowych procesorach rodziny Pentium z najnowszymi kompilatorami, liczby
całkowite mają cztery bajty.
Znak jest zawsze pojedynczą literą, cyfrą lub symbolem i zajmuje pojedynczy bajt pamięci.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 13
TYPY ZMIENNYCH
Nazwa Przykład deklaracji Zakres Bajtów Zastosowanie
Litera, char cZnak; - 128 ... 127 1 Teksty
Litera bez znaku unsigned char ucMala; 0 ... 255 1 Male liczby
Mała liczba całkowita short int siLiczba; 0 ... 255 1 Małe liczby całkowite
short siLiczba; 0 ... 65535 2
Liczba całkowita int liczba -32768 ... 32767 2 Liczby całkowite
2 147 483 648 do 2 147 4
483 647
Liczba naturalna unsigned int i,j,k; 0 ... 65535 2 Liczba naturalna
unsigned 0 ... 4 294 967 295 4
2 147 483 648 do 2 147
Du\a liczba całkowita long int lDuza_liczba; 4 Du\e liczby całkowite
483 647
long lDuza_liczba; 8
-2^31 ... 2^31-1
B. du\e liczby naturalne unsigned long int ulBduza; 0 ... 2^64-1 8 Bardzo du\e liczby
naturalne
unsigned long ulBduza; 0 ... 2^128-1 16
Zmiennoprzecinkowa float fLiczba; ą(1,2e-38 ... 3,4e38) 4 Z przecinkiem
double float dfUlamek; ą(2,2e-308 ... 1,79e308) 8
double dfUlamek;
long double ldXduza -3,3e-4932 ... 1,1e4932 16
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 14
REPREZENTACJA LICZB STAAOPOZYCYJNYCH
Bit znaku dodawany jest na początku liczby blokując jeden bit, pozostała część liczby zapisana jest w naturalnym kodzie binarnym (NKB) lub w
kombinacjach z modułem lub operacją negowania liczby.
NKB to zapis liczby w naturalnym kodzie binarnym sumy kolejnych potęg liczby 2.
ZM to zapis znak-moduł (ang. sign-magnitude) utworzono przez dodanie jednego bitu do modułu (wartości bezwzględnej liczby zakodowanej w
NKB). Występuje podwójna reprezentacja zera.
U1 kod uzupełnień do 1 (ang. 1s complement) Najbardziej znaczący bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna). Jeśli liczba jest
dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja pozostałej części liczby stanowi jej wartość poni\ej
zera. Występuje podwójna reprezentacja zera.
U2 kod uzupełnień do 2 (ang. 2s complement) Najbardziej znaczący bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna). Jeśli liczba jest
dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja pozostałej części liczby, po dodaniu 1 stanowi jej
wartość poni\ej zera. Występuje pojedyncza reprezentacja zera.
BIAS kod polaryzowany u\ywany do zapisu cechy liczb zmiennopozycyjnych. Najbardziej znaczący bit jest bitem znaku (1-liczba dodatnia, 0-liczba
ujemna). Dalej podobnie jak w U2. Jeśli liczba jest dodatnia to wartość liczby zakodowana jest w NKB, a jeśli liczba posiada znak ujemny to negacja
pozostałej części liczby, po dodaniu 1 stanowi jej wartość poni\ej zera. Występuje pojedyncza reprezentacja zera.
BCD kod binarny liczb dziesiętnych reprezentowanych w postaci tetrad (czwórek bitów) reprezentujących kolejne cyfry dziesiętne. Ka\da tetrada
koduje cyfrę w NKB. Pierwszy bit jest bitem znaku (0-liczba dodatnia, 1-liczba ujemna)
Liczba ZM U1 U2 BIAS BCD
-128 10000000 00000000
-127 11111111 10000000 10000001 00000001 1000100100111
-126 11111110 10000001 10000010 00000010 1000100100110
... ... ... ... ... ...
-1 10000001 11111110 11111111 01111111 1000000000001
0 10000000 11111111 00000000 10000000 1000000000000
0 00000000 00000000 00000000 10000000 0000000000000
1 00000001 00000001 00000001 10000001 0000000000001
2 00000010 00000010 00000010 10000010 0000000000010
3 00000011 00000011 00000011 10000011 0000000000011
4 00000100 00000100 00000100 10000100 0000000000100
... ... ... ... ... ...
126 01111110 01111110 01111110 11111110 0000100100110
127 01111111 01111111 01111111 11111111 0000100100111
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 15
REPREZENTACJA LICZB ZMIENNOPOZYCYJNYCH
Binarny zapis liczb składa się z trzech części kodowanych o osobnych polach:
- jednobitowe pole znaku (ang. sign)
- n bitowe pole części ułamkowej zwane mantysą S (ang significant part)
- m bitowe pole części wykładniczej zwane cechą E (ang. exponent part)
Liczba A = +/- S * B +/- E gdzie B jest podstawą wykładnika i zwykle przyjmuje się 2, 10, 16
Część ułamkowa mantysa S jest zawsze z przedziału: [0.5, 1) lub inaczej 0.5 <= S < 1
A w postaci binarnej: 0.100...0 <= S =< 0.111 ....1 co oznacza 0*20 + 1*2-1 + 0* .... =0.5
Mo\na zauwa\yć, \e dwie pierwsze pozycje binarne dla całego przedziału są takie same zatem:
0.1 a -2 a -3& a -(n+1) co oznacza: 1*2-1+ a -2 * 2-2 + a -3 * 2-3 + ... + a -(n+1) * 2-(n+1)
Przykładowe długości cechy i mantysy [bity]
Komputer Słowo Znak Mantysa Cecha
VAX11 32 1 23 8
Intel 80 1 64 15
Standard 64 1 48 15
IEEE754 32 1 23 8
Standard IEEE 754 dla mantysy 23 bitowej i cechy 8 bitowej umo\liwia zapis liczb
od 0.5*2-128 do (1-2-24) 2+127
-(1-2-24) 2+127 - 0.5*2-128 +0.5*2-128 +(1-2-24) 2+127
0
Przykład przeliczenia danej dziesiętnej na binarną postać zmiennoprzecinkową:
Liczbę: 0,625625 * 103 mo\na przedstawić jako 625,625
Osobno traktując część całkowitą 625 mo\na ją zapisać binarnie jako 10 0111 0001
Część ułamkowa: 0,625 jest sumą 0,5 i 0,125 czyli 1*2-1 + 0* 2-2 + 1*2 3 zatem 0.101
W rezultacie otrzymujemy liczbę 10 0111 0001.101
Poniewa\ część całkowita mieści się na 10 bitach normalizujemy liczbę przesuwając przecinek o
10 pozycji w lewo robiąc z niej ułamek z częścią wykładnika o wartości 10:
0.1001110001101 * 210
ale odrzucamy równie\ przy zapisie mantysy dwa pierwsze bity: 0.1001110001101
Bit znaku Mantysa Cecha
0 (dodatnia) 0011 1000 1101 0000 0000 000 1 0001010
znak cechy (zapis polaryzowany BIAS)
Trudność mo\e sprawić przekształcenie części ułamkowej do mantysy. Często trzeba
normalizować liczbę dziesiętną do odpowiedniego zakresu aby część ułamkowa mieściła się w
zakresie od 0,5 do 1.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 16
Przykład. Sprawdzanie rozmiarów typów zmiennych istniejących w twoim
komputerze
#include
int main(){
using std::cout;
cout << "Rozmiar zmiennej typu int to:\t\t"<< sizeof(int) << " bajty.\n";
cout << "Rozmiar zmiennej typu short int to:\t"<< sizeof(short) << " bajty.\n";
cout << "Rozmiar zmiennej typu long int to:\t"<< sizeof(long) << " bajty.\n";
cout << "Rozmiar zmiennej typu char to:\t\t"<< sizeof(char) << " bajty.\n";
cout << "Rozmiar zmiennej typu float to:\t\t"<< sizeof(float) << " bajty.\n";
cout << "Rozmiar zmiennej typu double to:\t"<< sizeof(double) << " bajty.\n";
cout << "Rozmiar zmiennej typu bool to:\t"<< sizeof(bool) << " bajty.\n";
return 0;
}
Efekt:
Rozmiar zmiennej typu int to: 4 bajty.
Rozmiar zmiennej typu short int to: 2 bajty.
Rozmiar zmiennej typu long int to: 4 bajty.
Rozmiar zmiennej typu char to: 1 bajty.
Rozmiar zmiennej typu float to: 4 bajty.
Rozmiar zmiennej typu double to: 8 bajty.
Rozmiar zmiennej typu bool to: 1 bajty.
UWAGA: W twoim komputerze rozmiary zmiennych mogą być inne.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 17
DEFINICJA TYPÓW przez typedef
Dla przykładu ciągłe wpisywanie unsigned short int mo\e być \mudne, a co gorsza, mo\e
spowodować wystąpienie błędu.
C++ umo\liwia u\ycie słowa kluczowego typedef (od type definition, definicja typu), dzięki
któremu mo\esz stworzyć skróconą formę takiego zapisu.
Dzięki skróconemu zapisowi tworzony jest synonim, lecz nie jest to nowy typ.
Przy zapisywaniu synonimu typu u\ywa się słowa kluczowego typedef, po którym wpisuje się
istniejący typ, zaś po nim nową nazwę typu.
Na przykład:
typedef unsigned short int USHORT;
tworzy nową nazwę typu, USHORT, której mo\na u\yć wszędzie tam, gdzie mógłbyś u\yć
zapisu unsigned short int.
Przykład u\ycia typedef
// *****************
// Demonstruje u\ycie słowa kluczowego typedef
#include
typedef unsigned short int USHORT; //definiowane poprzez: typedef
int main() {
using std::cout;using std::endl;
USHORT Width = 5;
USHORT Length;
Length = 10;
USHORT Area = Width * Length; // UWAGA: * (gwiazdka) oznacza mno\enie.
cout << "Szerokosc:" << Width << "\n";
cout << "Dlugosc: " << Length << endl;
cout << "Obszar: " << Area <return 0;
}
Efekt:
Szerokosc:5
Dlugosc: 10
Obszar: 50
Analiza
W linii 4. definiowany jest synonim USHORT dla typu unsigned short int.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 18
STAAE
Do przechowywania danych słu\ą tak\e stałe - wartość stałej nie ulega zmianie. Podczas
tworzenia stałej trzeba ją zainicjalizować, pózniej nie mo\na ju\ przypisywać jej innej wartości.
C++ posiada dwa rodzaje stałych: literały i stałe symboliczne.
LITERAAY
Literał jest wartością wpisywaną bezpośrednio w danym miejscu programu. Na przykład:
int mojWiek = 19;
mojWiek jest zmienną typu int i mo\e być przypisywana dowolna wartość z zakresu int w
dowolnym momencie działania programu w miejscu dostępu do zmiennej;
19 jest literałem. Programista umawia się sam ze sobą, \e nie będzie zmieniał wartości literału w
trakcie działania programu. WARTOŚĆ TA MOśE ALE NIE POWINNA BYĆ ZMIENIANA.
STAAE SYMBOLICZNE
Stała symboliczna jest reprezentowana poprzez swoją nazwę - po zainicjalizowaniu stałej, nie
mo\na pózniej zmieniać jej wartości.
" Definicja klasyczna z u\yciem dyrektywy preprocesora #define przez proste podstawienie
tekstu:
#define STUDENCI 89
gdzie stała STUDENCI nie ma określonego typu (int, char, itd.). Za ka\dym razem, gdy
preprocesor natrafia na słowo STUDENCI, zastępuje je napisem 89.
" Definicja stałych za pomocą const, gdzie stała posiada swój typ
const unsigned short int STUDENCI = 89;
Stała ma typ, którym jest unsigned short int.
Zalety const:
- kod programu jest łatwiejszy w konserwacji i jest bardziej odporny na błędy,
- kompilator mo\e wymusić u\ycie jej zgodnie z tym typem.
UWAGA Stałe nie mogą być zmieniane podczas działania programu. Jeśli chcesz na
przykład
zmienić wartość stałej STUDENCI, musisz zmodyfikować kod zródłowy, po czym
skompilować program ponownie.
Mo\liwy jest zapis liczb w formie wykładniczej:8e2 (8*102), 10.4e8 (10.4*108), 5.2e-3 (5.2*10-3)
STAAE WYLICZENIOWE
Stałe wyliczeniowe umo\liwiają tworzenie nowych typów, a następnie definiowanie ich
wartości, które ograniczają się do wartości określonych w definicji typu.
Na przykład, mo\esz zadeklarować typ COLOR (kolor) jako wyliczenie, dla którego mo\esz
zdefiniować pięć wartości: RED, BLUE, GREEN, WHITE oraz BLACK.
Składnię definicji wyliczenia stanowią słowo kluczowe enum, nazwa typu, otwierający nawias
klamrowy, lista wartości oddzielonych przecinkami, zamykający nawias klamrowy oraz średnik.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 19
Przykład:
enum COLOR { RED, BLUE, GREEN, WHITE, BLACK };
W efekcie nowe wyliczenie otrzymuje nazwę COLOR, tj. tworzony jest nowy typ.
- RED (czerwony) jest stałą symboliczną o wartości 0,
- BLUE (niebieski) jest stałą symboliczną o wartości 1,
- GREEN (zielony) jest stałą symboliczną o wartości 2, itd.
Ka\da wyliczana stała posiada wartość całkowitą. Jeśli tego nie określisz, zakłada się \e pierwsza
stała ma wartość 0, następna 1, itd. Ka\da ze stałych mo\e zostać zainicjalizowana dowolną
wartością. Stałe, które nie zostaną zainicjalizowane, będą miały wartości naliczane począwszy od
wartości od jeden większej od wartości stałych zainicjalizowanych. Zatem, jeśli napiszesz:
enum COLOR { RED=100, BLUE, GREEN=500, WHITE, BLACK=700 };
To:
- RED będzie mieć wartość 100,
- BLUE będzie mieć wartość 101,
- GREEN wartość 500,
- WHITE (biały) wartość 501,
- BLACK (czarny) wartość 700.
Mo\esz definiować zmienne typu COLOR, ale mogą one przyjmować tylko którąś z wyliczonych
wartości (w tym przypadku RED, BLUE, GREEN, WHITE lub BLACK, albo 100, 101, 500, 501
lub 700). Zmiennej typu COLOR mo\esz przypisać dowolną wartość koloru.
W rzeczywistości mo\esz przypisać jej dowolną wartość całkowitą, nawet jeśli nie odpowiada
ona dozwolonemu kolorowi - dobry kompilator powinien w takim przypadku wypisać
ostrze\enie. Nale\y zdawać sobie sprawę, \e stałe wyliczeniowe to w rzeczywistości zmienne
typu unsigned int oraz \e te stałe odpowiadają zmiennym całkowitym. Mo\liwość nazywania
wartości okazuje się bardzo pomocna, na przykład podczas pracy z kolorami, dniami tygodnia
czy podobnymi zestawami.
Przykład stałych wyliczeniowych
#include
int main() {
enum Days { Sunday, Monday, Tuesday,
Wednesday, Thursday, Friday, Saturday };
Days today;
today = Monday; //przypisanie
if (today == 0 || today == Saturday) //sprawdzanie warunku
std::cout << "\nUwielbiam weekendy!\n";
else
std::cout << "\nWracaj do pracy.\n";
Efekt:
return 0;
Wracaj do pracy.
}
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 20
Analiza
W linii 3. definiowana jest stała wyliczeniowa Days (dni), posiadająca siedem, odpowiadających
dniom tygodnia, wartości. Ka\da z tych wartości jest wartością całkowitą, numerowaną od 0 w
górę (tak więc Monday poniedziałek ma wartość 1)1.
Tworzymy te\ zmienną typu Days tj. zmienną, która będzie przyjmować wartość z listy
wyliczonych stałych. W linii 7. przypisujemy jej wartość wyliczeniową Monday, którą następnie
sprawdzamy w linii 9.
Program podobny do poprzedniego, ale wykorzystujący stałe całkowite
#include
int main() {
const int Sunday = 0;
const int Monday = 1;
const int Tuesday = 2;
const int Wednesday = 3;
const int Thursday = 4;
const int Friday = 5;
const int Saturday = 6;
int today;
today = Monday;
if (today == Sunday || today == Saturday)
std::cout << "\nUwielbiam weekendy!\n";
else
std::cout << "\nWracaj do pracy.\n";
return 0;
}
Efekt:
Wracaj do pracy.
Analiza
ISTOTNY FAKT: Amerykanie liczą dni tygodnia zaczynając od niedzieli.
Wynik działania tego programu jest identyczny z wynikiem programu z listingu 3.7. W tym
programie ka\da ze stałych (Sunday, Monday, itd.) została zdefiniowana jawnie i nie istnieje typ
wyliczeniowy Days. Stałe wyliczeniowe mają tę zaletę, \e się same dokumentują
przeznaczenie typu wyliczeniowego Days jest oczywiste.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 21
PRZESTRZEC NAZW
Istnieje zdefiniowana (wbudowana) przestrzeń nazw std (od standard).
W języku C++ u\ywamy nazw dla standardowych plików nagłówkowych bez .h na końcu jest
ich około 50. Własne lub inne niestandardowe pliki nagłówkowe nadal zwykle nazywane są z
rozszerzeniem .h.
#include
a nie tak jak poprzednio #include (ang. obsolete)
U\ycie zmiennych i funkcji wymaga wskazania do jakiej przestrzeni nazw nale\ą.
Mo\na to zrobić na trzy sposoby:
1. definicja globalna przestrzeni nazw
przed main deklarujemy:
using namespace std;
int main() {
& ..
cout<< Coś tam ;
}
2. definicja lokalna u\ycia przestrzeni nazw
w main oraz w innych funkcjach wewnątrz klamry
int main () {
using std::cout;
& .
cout<< Coś tam ;
& .
}
3. bezpośrednie wskazanie przestrzeni nazw, do której nale\y dana funkcja przy ka\dym
wywołaniu funkcji
int main () {
&
std::cout<< Coś tam ;
&
}
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 22
ZNAKI
Zmienne znakowe (typu char) zwykle mają rozmiar jednego bajtu, co wystarczy do przechowania
jednej z 256 wartości. Typ char mo\e być interpretowany jako mała liczba (od
0 do 255) lub jako element zestawu kodów ASCII. Skrót ASCII pochodzi od słów American
Standard Code for Information Interchange. Zestaw znaków ASCII oraz jego odpowiednik ISO
(International Standards Organization) słu\ą do kodowania wszystkich liter (alfabetu
łacińskiego), cyfr oraz znaków przestankowych.
UWAGA Komputery nie mają pojęcia o literach, znakach przestankowych i zdaniach.
Rozpoznają tylko liczby. Zauwa\ają tylko odpowiedni poziom napięcia na określonym złączu
przewodów. Jeśli występuje napięcie, jest ono symbolicznie oznaczane jako jedynka, zaś gdy
nie występuje, jest oznaczane jako zero. Poprzez grupowanie zer i jedynek, komputer jest w
stanie generować wzory, które mogą być interpretowane jako liczby, które z kolei mo\na
przypisywać literom i znakom przestankowym.
W kodzie ASCII mała litera a ma przypisaną wartość 97. Wszystkie du\e i małe litery,
wszystkie cyfry oraz wszystkie znaki przestankowe mają przypisane wartości pomiędzy 0 a 127.
Dodatkowe 128 znaków i symboli jest zarezerwowanych dla wykorzystania przez producenta
komputera, choć standard kodowania stosowany przez firmę IBM stał się niejako
obowiązkowy .
UWAGA ASCII wymawia się jako eski.
ZNAKI i LICZBY
Gdy w zmiennej typu char umieszczasz znak, na przykład a , w rzeczywistości jest on liczbą
pochodzącą z zakresu od 0 do 255. Kompilator wie jednak, w jaki sposób odwzorować znaki
(umieszczone wewnątrz apostrofów) na jedną z wartości kodu ASCII.
Przykład wypisywania znaków na podstawie ich kodów
#include
int main(){
for (int i = 32; i<128; i++)
std::cout << (char) i;
return 0;
}
Efekt:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEF
GHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijkl
mnopqrstuvwxyz{|}~_
Ten prosty program wypisuje znaki o wartościach od 32 do 127.
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 23
ZNAKI SPECJALNE
Kompilator C++ rozpoznaje pewne specjalne znaki formatujące.
Znak Oznacza
\a Alarm (dzwonek)
\b Backspace (znak wstecz)
\f Form feed (koniec strony)
\n New line (nowa linia)
\r Carriage return (powrót karetki ; powrót na
początek linii)
\t Tab (tabulator)
\v Vertical tab (tabulator pionowy)
\' Single quote (apostrof)
\" Double quote (cudzysłów)
\? Question mark (znak zapytania)
\\ Backslash (lewy ukośnik)
\0oo Zapis ósemkowy
\xhhh Zapis szesnastkowy
Przed u\yciem znaków specjalnych jako zwykłych znaków tj, \ 0 ? powinien pojawić się \
zdejmujący znaczenie specjalne, np. \ , \ , \0 (znak Zero Null)
WYKAADY cz.1 v.3 (2008) Podstawy programowania 1 (dr.in\ Marcin Głowacki) 24
KONWERSJE / RZUTOWANIE TYPÓW
Jeśli podczas przetwarzania danych w operacji pojawiają się zmienne typów niespodziewanych
lub niezgodnych z definicją mo\e następować jawna lub niejawna konwersja typów zmiennych.
Konwersje niejawne występują w wyniku próby automatycznego dopasowania przez kompilator
typów zmiennych dla wykonania zadanej operacji, np.:
int m,n;
n=10;
m=n+1.2345;
W ostatnim wierszu dokonana została automatyczna konwersja zmiennej n na double, a następnie
po wykonaniu dodania konwersja sumy do typu int zanim nastąpiło przypisanie do m.
W wyniku operacji m będzie równe 11 (nastąpi odcięcie części ułamkowej, a nie zaokrąglenie).
Konwersja jawna jest wywoływana świadomie przez programistę.
Formy zapisu jawnej konwersji:
dany_typ wynik, wyra\enie_1;
inny_typ wyra\enie_2;
- forma funkcji
wynik = wyra\enie_1 + dany_typ(wyra\enie_2);
- forma rzutowania
wynik = wyra\enie_1 + (dany_typ)wyra\enie_2;
Przykład:
int m,n;
n=10;
m=n+int(1.2345);
Unika zbędnych konwersji niejawnych (n nie będzie konwertowane na double i double na int).
Rezultat obliczeń będzie taki sam jak w poprzednim przykładzie.
Przykład:
#include
int main() {
using std::cout; using std::endl;
int wynik_i,m,n,a;
float wynik_f,b;
m=4;n=10; a=10;b=4;
wynik_i=n+int(1.2345);
cout << "wynik_i: " << wynik_i <wynik_f=n+1.2345;
cout << "wynik_f: " << wynik_f <wynik_i=n/m;
Efekt:
cout << "wynik_i: " << wynik_i <Sam się przekonaj !
wynik_f=a/b;
cout << "wynik_f: " << wynik_f <return 0;
}
Wyszukiwarka
Podobne podstrony:
Uwaga! Azbest Ważne informacje cz1
Informatyka poziom podstawowy cz1 Egzamin maturalny 2012
Uwaga! Azbest Ważne informacje dla rolników cz1
Teoria i metodologia nauki o informacji
plan nauczania technik informatyk wersja 1
t informatyk12[01] 02 101
informatyka w prawnicza testy
Wyk6 ORBITA GPS Podstawowe informacje
Informacja komputerowa
Podstawowe informacje o Rybnie
Zagrożenia bezpieczeństa informacji
INFORMACJA O FIRMIE
2 Dynamika cz1
informacje dla szkolnej komisji
więcej podobnych podstron