1. Proste typy danych 1. Proste typy danych

Transkrypt

1. Proste typy danych 1. Proste typy danych
1. Proste typy danychdanychciąg dalszy
2. Typy złożone danych :
TABLICE
Wykład 3
ZMIENNE PROSTE: TYPY WBUDOWANE
Typy zmiennoprzecinkowe:
Różne rozmiary
bajtowe.
W konsekwencji
różne wielkości i
maksymalnych liczb i
rożne dokładności
•float
•double
•long double
Notacja naukowa:
mantysa
wykładnik
Żadnych
spacji!
Opcjonalnie
znak + lub -
+5.37E+16
Opcjonalnie
kropka
dziesiętna
Może być E
lub e
Może być +
lub - ,
można też
pominąć
2
D. Makowiec: Programowanie dla I BioInf
2013-03-04
ZMIENNE PROSTE: TYPY WBUDOWANE
Liczby zmiennoprzecinkowe różnią się od liczb całkowitych :
•sposobem przechowywania w pamięci komputera (znak, wykładnik, mantysa)
•sposobem realizacji obliczeń (: przy tej samej WIĘKSZEJ wartości cechy)
Część ułamkowa
wykładnik
IEEE standard
S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
0 1………….8 9……………………………………31
Odczytywanie
pamięci
wartość = (-1)S * 2
przy czym:
(E -127 )
1.( F ) = 1 +
*1.(F)
bit1 bit 2
bit 23
+
+
....
+
21
22
2 23
Do pamięci:
0.15625= (-1)0 * 2(-3 +127) * 1.01 = (0 01111100 0100000000000000000000)
-0.15625= (-1)1 * 2(-3 +127) * 1.01 = (0 01111100 0100000000000000000000)
Z pamięci:
0 10000000
0 10000001
1 10000001
0 00000001
00000000000000000000000=
10100000000000000000000=
10100000000000000000000=
00000000000000000000000=
(-1)0
(-1)0
(-1)1
(-1)0
*
*
*
*
2(128-127) * 1.0 = 2
2(129-127) * 1.101 = 6.5
2(129-127) * 1.101 = -6.5
2(1-127) * 1.0 = 2-126
3
D. Makowiec: Programowanie dla I BioInf
2013-03-04
ZMIENNE PROSTE: TYPY WBUDOWANE
int 2 : ( 0000 0000 0000 0000 0000 0000 0000 0010)
float 2.0 : ( 0100 0000 0000 0000 0000 0000 0000 0000)
Standard C++ przewiduje
wyświetlanie 6 wartości liczby zmiennoprzecinkowej
pomijanie końcowych zer
4
D. Makowiec: Programowanie dla I BioInf
2013-03-04
Klasa numeric_limits
#include <iostream>
#include <limits>
using namespace std;
main(){
cout <<"najwiekszy float = "<< numeric_limits<float>::max()<<'\n';
cout <<"namniejszy float = "<< numeric_limits<float>::min() <<'\n';
cout <<"min eksponent binarnie float = ”
<< numeric_limits<float>::min_exponent <<'\n';
cout <<"min eksponent dziesietnie float = ”
<< numeric_limits<float>::min_exponent10 <<'\n';
cout <<"max eksponent binarnie float = ”
<< numeric_limits<float>::max_exponent <<'\n';
cout <<"max eksponent dziesietnie float = ”
<< numeric_limits<float>::max_exponent10 <<'\n';
cout <<"ilosc cyfr mantysy binarnie float = ”
<< numeric_limits<float>::digits <<'\n';
cout <<"ilosc cyfr mantysy dziesietnie float = ”
<< numeric_limits<float>::digits10 <<'\n';
cout <<"nieskonczonosc w float = "<< numeric_limits<float>::infinity() <<'\n';
cout <<"epsilon dla float = "<< numeric_limits<float>::epsilon() <<'\n';
cout <<"blad zaokraglania dla float = "<< numeric_limits<float>::round_error() ;
cout <<"styl zaokraglania dla float = "<< numeric_limits<float>::round_style \n';
return;}
5
epsilon
D. Makowiec: Programowanie dla I BioInf
2013-03-04
ZMIENNE zmiennoprzecinkowe
Liczby zmiennoprzecinkowe rozmieszczone są niejednorodnie
małe gęściej
duże rzadziej
duże rzadziej
6
D. Makowiec: Programowanie dla I BioInf
2013-03-04
PODSUMOWANIE
W języku C++ mamy wbudowane dwa podstawowe typy arytmetyczne:
całkowite i zmiennoprzecinkowe. Są one dostępne przez słowa kluczowe
języka:
typy całkowite :
bool, char, short, int, long,
unsigned
typy zmiennoprzecinkowe :
float, double, long double
wchar_t
różnią się ilością
zajmowanej pamięci oraz
obecnością lub
nieobecnością znaku
różnią się ilością
zajmowanej pamięci
Arytmetyka zależy od typu
Arytmetyka całkowitoliczbowa
to obcinanie ułamków:
int i=2, j=3;
int k=i/j; /* k==0 */
Arytmetyka zmiennoprzecinkowa to
zaokrąglanie wyników.
•Wynik może nie należeć do zbioru
liczb reprezentowanych
•Jak się zaokrągla zależy od
kompilatora.
7
D. Makowiec: Programowanie dla I BioInf
2013-03-04
KONWERSJA TYPU
C++ automatyczne konwertuje:
(1)wartości w chwili przypisywania wartości jednego typu
arytmetycznego zmiennej innego typu arytmetycznego
int i=3.12234;
// zmiennej i przypisana zostanie liczba 3
(2) wartości, jeżeli w wyrażeniu użyto rożnych typów
int i=3; float x=5.0;
double suma= x+i; //zmienne x oraz i są konwertowane
//do double przed operacją
argumenty obliczeń są domyślnie poszerzane do najobszerniejszego typu ( do int dla
całkowitych i do double dla zmiennoprzecinkowych)
(3) wartości przekazywane funkcjom jako parametry
Można wymusić zmiany – rzutowanie :
jak w C : (nazwa_typu) wartość
jak funkcja: nazwa_typu (wartość)
operator rzutowania: static_cast<nazwa_typu> (wartość)
8
D. Makowiec: Programowanie dla I BioInf
2013-03-04
OBLICZENIA w C++
Obliczenia prowadzimy
korzystając z funkcji
bibliotecznych
(tutaj: z biblioteki cmath)
lub własnych
9
D. Makowiec: Programowanie dla I BioInf
2013-03-04
OBLICZENIA w C++
Prototypy funkcji
pojawić się
muszą przed
użyciem.
Definicje funkcji
pojawiają się
Kolejno w pliku.
10
D. Makowiec: Programowanie dla I BioInf
2013-03-04
NAZWY ZMIENNYCH
Co może być nazwą w C++
Dowolnie długi ciąg :
liter,
cyfr,
i znaku podkreślenia ‘_’
Ale:
nazwa nie może zaczynać się od cyfry
nazwa nie może być identyczna z żadnym ze słów kluczowych
Literały, czyli
stałe wartości w
programie:
Zapis
10
Zapis
8
znak
łańcuch znakowy
D. Makowiec: Programowanie dla I BioInf
Zapis
16
11
2013-03-04
SŁOWA KLUCZOWE
12
D. Makowiec: Programowanie dla I BioInf
2013-03-04
TABLICA ZNAKÓW: TRADYCYJNIE
0
A
1
l
2
3
a
char Napis[14];
4
m
5
a
Mamy
przydzieloną
pamięć na 14
zmiennych
znakowych
numerowanych
od 0 do 13
6
7
k
8
o
9
t
10
a
11
12
13
\0
Napis[0]=‘A’;
Napis[1]=‘l’;
Napis[2]=‘a’;
Napis[3]=‘ ‘;
Napis[4]=‘m’;
Napis[5]=‘a’;
Napis[6]=‘ ‘;
Napis[7]=‘k’;
Napis[8]=‘o’;
Napis[9]=‘t’;
Napis[10]=‘a’;
char Napis [14]={‘A’, ’l’, ’a’, ‘ ‘ , ‘m’, ‘a’, ‘ ‘, ‘k’, ‘o’, ‘t’, ‘a’};
char Napis [14]=”Ala ma kota”;
char Napis []=”Ala ma kota”;
D. Makowiec: Programowanie dla I BioInf
W tablicy jest
umieszczany znak
końca łańcucha
Tablica ma rozmiar
taki jak literał +1
13
2013-03-04
TABLICA : STRUKTURA WIELU IDENTYCZNYCH DANYCH
Typ danych
Nazwa tablicy
Nawias klamrowy z
rozmiarem tablicy
int tabela [ 23]
rozmiar tablicy
musi być wielkością
stałą: literał albo
zmienna const
Elementy tablicy numerujemy od ZERA!!!!!
Inicjowanie tablicy tylko przy definicji:
int karty[4]= {3,4,5,6};
float cos[3]={2.5, -0.1};
double duza[2222]={0};
14
D. Makowiec: Programowanie dla I BioInf
2013-03-04
TABLICA ZNAKÓW: WPROWADZANIE DANYCH
Zadanie:
Poproś klienta o podanie imienia oraz nazwy jego ulubionego deseru
Dane:
Wynik:
zapytanie_1 = „Podaj imię”
zapytanie_2 =„Podaj ulubiony deser”
tablice znakowe imie[] i deser[]
Pomocnicza: komunikat_OK
wyświetl zapytanie_1
pobierz imie
wyświetl zapytanie_2
pobierz deser
wyświetl komunikat_OK
15
D. Makowiec: Programowanie dla I BioInf
2013-03-04
TABLICA ZNAKÓW: WPROWADZANIE DANYCH
#include <iostream>
// odczyt danych z konsoli
int main(){
using namespace std;
system("chcp 1250");
Polska strona kodowa,
ale z Lucida
const int rozmiar = 20;
char imie[rozmiar];
char deser[rozmiar];
UWAGA:
cin każdy biały znak:
spacja,
tabulator,
znak nowej linii
odczytuje jako separator
łańcuchów.
cout << "Podaj swoje imię : \n ";
cin >> imie;
cout << "Podaj swój ulubiony deser : \n ";
cin >> deser;
cout << " Mamy dla Ciebie " << deser << ", " << imie <<endl;
cin.ignore(1000,'\n');
cin.get();
return 0;
}
Pomija 1000 znaków aż następnego ‘\n’
16
D. Makowiec: Programowanie dla I BioInf
2013-03-04
TABLICA ZNAKÓW: WPROWADZANIE DANYCH
Obsługa błędu w cin
int ile_porcji;
liczby.cpp
cout << "Ile porcji chcesz? \n" ;
while ( ! (cin >> ile_porcji) ){
cout<< "podaj liczbę, proszę \n";
cin.clear();
cin.ignore(10000,'\n');
1. Likwiduje flagę błędu w cin
2. Pomija 1000 znaków aż następnego ‘\n’
}
Można połączyć operacje:
cout << "Twój wzrost : \n ";
cin << wzrost i cin.get();
(cin >> wzrost).get();
cout << "Podaj swoje imię : \n ";
cin.getline(imie, rozmiar);
cout << imie<< ", Twój wzrost to "<<
wzrost<< endl;
17
D. Makowiec: Programowanie dla I BioInf
2013-03-04

Podobne dokumenty