Wstęp do Programowania 2 dr Bożena Woźna-Szcześniak bwozna@gmail.com Akademia im. Jana Długosza Wykład 2
Stałe całkowite inne niż dziesiętne Stałe ósemkowe Stałe szesnastkowe Aby wskazać czy dane maj a być wyświetlane w systemie dziesietnym, szesnastkowym, czy też ósemkowym, należy posłużyć się manipulatorami strumienia dec, hex, oct.
manip.cpp #include <iostream> int main() { using namespace std; cout << "Podaj liczbe calkowita: "; int n; cin >> n; cout << "n n*n\n"; cout << n << " " << n * n << " (dziesietnie)\n"; // ustaw tryb szesnastkowy cout << hex; cout << n << " " << n * n << " (szesnastkowo)\n"; // ustaw tryb osemkowy cout << oct << n << " " << n * n << " (osemkowo)\n"; //alternatywny sposob wywolania manipulatora cout << "Podaj liczbe calkowita: "; dec(cout); cin >> n; cout << n << " " << n * n << " (dziesietnie)\n"; cout << "Podaj liczbe calkowita w formacie szesnastkowym: "; hex(cin); cin >> n; cout << n << " " << n * n << " (szesnastkowo)\n"; return 0;
manip.cpp Podaj liczbe calkowita: 5 n n*n 5 25 (dziesietnie) 5 19 (szesnastkowo) 5 31 (osemkowo) Podaj liczbe calkowita: 23 23 529 (dziesietnie) Podaj liczbe w formacie szesnastkowym: ff 255 65025 (szesnastkowo)
hexoct.cpp #include <iostream> using namespace std; int main() { using namespace std; int pas = 42, reka = 42, noga = 42; cout << "Obwod pasa = " << pas << " (dziesietnie)" << endl; cout << hex; cout << "Dlugosc reki = " << reka << " szesnastkowo" << endl; cout << oct; cout << "Dlugosc nogi = " << noga << " (osemkowo)" << endl; cout << dec; pas = 42, reka = 0x42, noga = 042; cout << "Obwod pasa = " << pas << " (dziesietnie)" << endl; cout << "Dlugosc reki = " << reka << "(szesnastkowo)" << endl; cout << "Dlugosc nogi = " << noga << " (osemkowo)" << endl; return 0;
hexoct.cpp Obwod pasa = 42 (dziesietnie) Dlugosc reki = 2a szesnastkowo Dlugosc nogi = 52 (osemkowo) Obwod pasa = 42 (dziesietnie) Dlugosc reki = 66(szesnastkowo) Dlugosc nogi = 34 (osemkowo)
Funkcja składowa cout.put() - morechar.cpp #include <iostream> int main() { using namespace std; char ch = M ; int i = ch; cout << "Kod ASCII znaku " << ch << " to " << i << endl; cout << "Dodajemy do kodu znaku jedynke:" << endl; ch = ch + 1; i = ch; cout << "Kod ASCII znaku " << ch << " to " << i << endl; // uzycie metody cout.put() do pokazania znaku cout << "Wyswietlenie char ch za pomoca cout.put(ch): "; cout.put(ch); cout.put(i); // uzycie metody cout.put() do pokazania stalej znakowej cout.put(! ); cout << endl; return 0;
morechar.cpp - wynik Kod ASCII znaku M to 77 Dodajemy do kodu znaku jedynke: Kod ASCII znaku N to 78 Wyswietlenie char ch za pomoca cout.put(ch): NN!
Systemowe ograniczenia typów danych C++ dostarcza następuj acych narzędzi do programowego badania rozmiarów typów: operator sizeof zbiór climits (w starszych imoplementacjach limits.h). Plik zawiera systemowe ograniczenia dla różnych typów calkowitych. zbiór cfloat (w starszych imoplementacjach float.h). Plik zawiera systemowe ograniczenia dla różnych typów zmiennoprzecinkowych.
Typy całkowite -climits Stała Co wyraża Wartość CHAR_BIT Liczba bitów w 1 bajcie 8 SCHAR_MIN Wartość minimmalna dla typu signed char -127 SCHAR_MAX Wartość maksymalna dla typu signed char 127 UCHAR_MAX Wartość maksymalna dla typu unsigned char 255 CHAR_MIN Wartość minimmalna dla typu char SCHAR_MIN lub 0 CHAR_MAX Wartość maksymalna dla typu char SCHAR_MAX lub UCHAR_MAX MB_LEN_MAX Maksymalna liczba bajtów w wielobajtowym znaku 1 SHRT_MIN Wartość minimmalna dla typu short int -32767 SHRT_MAX Wartość maksymalna dla typu short int 32767 USHRT_MAX Wartość maksymalna. dla typu unsigned short int 65535 INT_MIN Wartość minimmalna dla typu int -32767 INT_MAX Wartość maksymalna dla typu int 32767 UINT_MAX Wartość maksymalna dla typu unsigned int 65535 LONG_MIN Wartość minimmalna dla typu long int -2147483647 LONG_MAX Wartość maksymalna dla typu long int 2147483647 ULONG_MAX Wartość maksymalna dla typu unsigned long int 4294967295
limits.cpp #include <iostream> #include <climits> int main() { using namespace std; int n_int = INT_MAX; short n_short = SHRT_MAX; long n_long = LONG_MAX; cout << "int ma " << sizeof (int) << " bajty." << endl; cout << "short ma " << sizeof n_short << " bajty." << endl; cout << "long ma " << sizeof n_long << " bajty." << endl; cout << "Wartosci maksymalne:" << endl; cout << "int: " << n_int << endl; cout << "short: " << n_short << endl; cout << "long: " << n_long << endl << endl; cout << "Minimalna wartosc typu int = " << INT_MIN << endl; cout << "Bitow na bajt = " << CHAR_BIT << endl; return 0;
limits.cpp - wynik int ma 4 bajty. short ma 2 bajty. long ma 8 bajty. Wartosci maksymalne: int: 2147483647 short: 32767 long: 9223372036854775807 Minimalna wartosc typu int = -2147483648 Bitow na bajt = 8
Uwaga o inicjalizacji zmiennych w C++ #include <iostream> #include <climits> int main() { using namespace std; // składnia zaczerpnięte z C int x = CHAR_MAX; cout << "Maksymalna wartosc typu char = " << x << endl; // nowa typowa składnia w C++ int y(char_max); cout << "Maksymalna wartosc typu char = " << y << endl; return 0;
Przepełnienia - exceed.cpp #include <iostream> #include <climits> int main() { using namespace std; short jan = SHRT_MAX; unsigned short ewa = jan; cout << "Jan ma " << jan << " dolarów, a Ewa ma "; cout << ewa << " dolarow." << endl; cout<< "Do obu kont dodaj 1$." << endl << "Teraz "; jan = jan + 1; ewa = ewa + 1; cout << "Jan ma " << jan << " dolarów, a Ewa ma "; cout << ewa << " dolarów.\n Biedny Jan!" << endl; jan = ewa = 0; cout << "Jan ma " << jan << " dolarów, a Ewa ma " << ewa; cout << " dolarów." << endl; cout << "Zabierzmy z obu kont 1$." << endl << "Teraz "; jan = jan - 1; ewa = ewa - 1; cout << "Jan ma " << jan << " dolarów, a Ewa ma " << ewa; cout << " dolarów." << endl << "Szczęściara Ewa!" << endl; return 0;
Wynik wykonania exceed.cpp Jan ma 32767 dolarów, a Ewa ma 32767 dolarow. Do obu kont dodaj 1$. Teraz Jan ma -32768 dolarów, a Ewa ma 32768 dolarów. Biedny Jan! Jan ma 0 dolarów, a Ewa ma 0 dolarów. Zabierzmy z obu kont 1$. Teraz Jan ma -1 dolarów, a Ewa ma 65535 dolarów. Szczęściara Ewa!
Typy zmiennoprzecinkowe - cfloat #include <iostream> #include <cfloat> int main(){ using namespace std; cout <<"Definicje minimalnej liczby cyfr znaczących " << endl; cout <<"long double: "<< LDBL_DIG << endl; cout <<"double: "<< DBL_DIG << endl; cout <<"float: "<< FLT_DIG << endl; cout <<"Definicje liczby bitów reprezentujących mantysę" << endl; cout <<"long double: "<< LDBL_MANT_DIG << endl; cout <<"double: "<< DBL_MANT_DIG << endl; cout <<"float: "<< FLT_MANT_DIG << endl; cout <<"Definicje maksymalnych wartości wykładnika: " << endl; cout <<"long double: "<< LDBL_MAX_10_EXP << endl; cout <<"double: "<< DBL_MAX_10_EXP << endl; cout <<"float: "<< FLT_MAX_10_EXP << endl; cout <<"Definicje minimalnych wartości wykładnika: " << endl; cout <<"long double: "<< LDBL_MIN_10_EXP << endl; cout <<"double: "<< DBL_MIN_10_EXP << endl; cout <<"float: "<< FLT_MIN_10_EXP << endl; return 0;
gcc version 4.6.1 (Ubuntu/Linaro 4.6.1-9ubuntu3) Definicje minimalnej liczby cyfr znaczących long double: 18 double: 15 float: 6 Definicje liczby bitów reprezentujących mantysę long double: 64 double: 53 float: 24 Definicje maksymalnych wartości wykładnika: long double: 4932 double: 308 float: 38 Definicje minimalnych wartości wykładnika: long double: -4931 double: -307 float: -37
Metoda setf() Metoda setf() (ang. set flag) pozwala na kontrolowanie różnych aspektów formatowania danych wyjściowych, np. ios_base::showpoint - Wyświetlanie końcowego znaku dziesietnego ios_base::showbase - Wyświetlanie prefiksów systemow liczbowych ios_base::showpos - Wyświetlanie znaku + przed liczbami dodatnimi ios_base::fixed - Wyświetlanie liczb wnotacji stałoprzecinkowej ios_base::scientific - Wyświetlanie liczb w notacji naukowej
#include <iostream> int main(){ using std::cout; using std::ios_base; double price1 = 20.40; double price2 = 1.9 + 8.0 / 9.0; cout << "\"Futrzaki\" kosztuja " << price1 << " PLN!\n"; cout << "\"Smoki\" kosztuja " << price2 << " PLN!\n"; cout.setf(ios_base::showpoint); cout << "\"Futrzaki\" kosztuja " << price1 << " PLN!\n"; cout << "\"Smoki\" kosztuja " << price2 << " PLN!\n"; cout.precision(2); cout << "\"Futrzaki\" kosztuja " << price1 << " PLN!\n"; cout << "\"Smoki\" kosztuja " << price2 << " PLN!\n"; return 0;
"Futrzaki" kosztuja 20.4 PLN! "Smoki" kosztuja 2.78889 PLN! "Futrzaki" kosztuja 20.4000 PLN! "Smoki" kosztuja 2.78889 PLN! "Futrzaki" kosztuja 20. PLN! "Smoki" kosztuja 2.8 PLN!
#include <iostream> int main() { using namespace std; int pas = 42, reka = 0x42, noga = 042; cout.setf(ios_base::showbase); cout << "Obwod pasa = " << pas << endl; cout << "Dlugosc reki = " << hex << reka cout << "Dlugosc nogi = " << oct << noga return 0; << endl; << endl; Wynik Obwod pasa = 42 Dlugosc reki = 0x42 Dlugosc nogi = 042
#include <iostream> int main(){ using namespace std; float a, b; cout << "Podaj liczbe: "; cin >> a; cout << "Podaj druge liczbe: "; cin >> b; //rownowazne wyswietlaniu z cout.setf(ios_base::floatfield); cout << "a = " << a << "; b = " << b << endl; cout << "a + b = " << a + b << endl; cout << "a - b = " << a - b << endl; cout << "a * b = " << a * b << endl; cout << "a / b = " << a / b << endl; cout.setf(ios_base::fixed, ios_base::floatfield); cout << "a = " << a << "; b = " << b << endl; cout << "a + b = " << a + b << endl; cout << "a - b = " << a - b << endl; cout << "a * b = " << a * b << endl; cout << "a / b = " << a / b << endl; cout.setf(ios_base::scientific, ios_base::floatfield); cout << "a = " << a << "; b = " << b << endl; cout << "a + b = " << a + b << endl; cout << "a - b = " << a - b << endl; cout << "a * b = " << a * b << endl; cout << "a / b = " << a / b << endl; return 0;
Podaj liczbe: 2 Podaj druge liczbe: 3 a = 2; b = 3 a + b = 5 a - b = -1 a * b = 6 a / b = 0.666667 a = 2.000000; b = 3.000000 a + b = 5.000000 a - b = -1.000000 a * b = 6.000000 a / b = 0.666667 a = 2.000000e+00; b = 3.000000e+00 a + b = 5.000000e+00 a - b = -1.000000e+00 a * b = 6.000000e+00 a / b = 6.666667e-01
#include <iostream> int main() { using namespace std; int auks, bats, coots; // ponizsza instrukcja dodaje wartosci jako typ double, // nastepnie konwertuje wynik na int auks = 19.99 + 11.99; // te instrukcje dodaja wartosci jako typ int bats = (int) 19.99 + (int) 11.99; // stara skladnia C coots = int (19.99) + int (11.99); // nowa skladnia C++ cout << "auks = " << auks << ", bats = " << bats; cout << ", coots = " << coots << endl; char ch = Z ; // pokaz jako char cout << "Kod odowiadajacy znakowi " << ch << " to "; // pokaz jako int cout << int(ch) << endl; return 0;
auks = 31, bats = 30, coots = 30 Kod odowiadajacy znakowi Z to 90
#include <iostream> using namespace std; void fo() { static int a =5; a++; cout << a << endl; void go() { int a =5; a++; cout << a << endl; int main() { fo(); fo(); go(); go(); return 0; fo(); go(); Wynik 6 7 8 6 6 6
getline() #include <iostream> int main() { using namespace std; const int ArSize = 20; char name[arsize]; char dessert[arsize]; cout << "Podaj swoje imie:\n"; // wczytuje dane do znaku nowego wiersza cin.getline(name, ArSize); cout << "Podaj swoj ulubiony deser:\n"; cin.getline(dessert, ArSize); cout << "Mam dla ciebie " << dessert; cout << ", " << name << ".\n"; return 0;
getline() Podaj swoje imie: Bozena Wozna Szczesniak Podaj swoj ulubiony deser: Tort Czekoladowy Mam dla ciebie Tort Czekoladowy, Bozena Wozna Szczesniak. Metoda cin.getline() wczytuje znaki oraz zank nowego wiersza wygenerowany przez naciśnięcie klawisza ENTER, zastępujac go znakime pustym.
getline() #include <iostream> int main() { using namespace std; const int ArSize = 20; char name[arsize]; char dessert[arsize]; cout << "Podaj swoje imie:\n"; // wczytuje dane bez znaku nowego wiersza cin.get(name, ArSize); cout << "Podaj swoj ulubiony deser:\n"; //wczytujemy znak nowego wiersza cin.get(); cin.get(dessert, ArSize); cout << "Mam dla ciebie " << dessert; cout << ", " << name << ".\n"; return 0;
get() Podaj swoje imie: Bozena Wozna Szczesniak Podaj swoj ulubiony deser: Tort Czekoladowy Mam dla ciebie Tort Czekoladowy, Bozena Wozna Szczesniak. Metoda cin.get() wczytuje znaki, ale nie wczytuje zanku nowego wiersza wygenerowanego przez naciśnięcie klawisza Eneter. Metoda cin.get() pozostawia Enter w kolejce. Aby go przeczytać należy wywołać następujac a instrukcję: cin.get();
get() #include <iostream> int main() { using namespace std; const int ArSize = 20; char name[arsize]; char dessert[arsize]; cout << "Podaj swoje imie:\n"; // wczytuje dane bez znaku nowego wiersza cin.get(name, ArSize).get(); cout << "Podaj swoj ulubiony deser:\n"; cin.get(dessert, ArSize); cout << "Mam dla ciebie " << dessert; cout << ", " << name << ".\n"; return 0;
Odczytywanie danych składajacych się z liczb i łańcuchów #include <iostream> int main() { using namespace std; cout << "W ktorym roku zbudowano twoj dom?\n"; int rok; cin >> rok; cout << "Przy jakiej ulicy mieszkasz?\n"; char adres[80]; cin.getline(adres, 80); cout << "Rok budowy: " << rok << endl; cout << "Adres: " << adres << endl; return 0;
Odczytywanie danych składajacych się z liczb i łańcuchów W ktorym roku zbudowano twoj dom? 1200 Przy jakiej ulicy mieszkasz? Rok budowy: 1200 Adres: Kiedy cin odczytuje rok w strumieniu pozostaje znak enter. Znak ten jest czytane przez kolejne wywołanie cin.getline(). Dlatego też do zmiennej tablica przypisany zostaje pusty łańcuch.
Odczytywanie danych składajacych się z liczb i łańcuchów #include <iostream> int main() { using namespace std; cout << "W ktorym roku zbudowano twoj dom?\n"; int rok; cin >> rok; cin.get(); // wybranie entera z kolejki cout << "Przy jakiej ulicy mieszkasz?\n"; char adres[80]; cin.getline(adres, 80); cout << "Rok budowy: " << rok << endl; cout << "Adres: " << adres << endl; return 0;
Odczytywanie danych składajacych się z liczb i łańcuchów W ktorym roku zbudowano twoj dom? 2000 Przy jakiej ulicy mieszkasz? Armii Krajowej Rok budowy: 2000 Adres: Armii Krajowej