Politechnika Białostocka Wydział Elektryczny Katedra Elektrotechniki Teoretycznej i Metrologii Instrukcja do pracowni specjalistycznej z przedmiotu Informatyka 2 Kod przedmiotu: ES1C300 016 (studia stacjonarne) Spis treści 1. Opis stanowiska... 3 1.1. Stosowana aparatura... 3 1.2. Oprogramowanie... 3 2. Wiadomości teoretyczne... 3 2.1. Operacje wejścia-wyjścia w języku C++... 3 2.2. Struktura programu w języku C++... 7 2.3. Formatowanie wyjścia... 8 3. Przebieg ćwiczenia... 13 4. Literatura... 15 5. Zagadnienia na zaliczenie... 15 OPERACJE WEJŚCIA-WYJŚCIA W JĘZYKU C++. STEROWANIE FORMATEM, MANIPULATORY 6. Wymagania BHP... 15 Numer ćwiczenia INF25 Autor: dr inż. Jarosław Forenc Białystok 2013 Materiały dydaktyczne przeznaczone dla studentów Wydziału Elektrycznego PB. Wydział Elektryczny, Politechnika Białostocka, 2013 (wersja 1.0) Wszelkie prawa zastrzeżone. Żadna część tej publikacji nie może być kopiowana i odtwarzana w jakiejkolwiek formie i przy użyciu jakichkolwiek środków bez zgody posiadacza praw autorskich. Informatyka 2 2 z 16 Instrukcja INF25
1. Opis stanowiska 1.1. Stosowana aparatura Podczas zajęć wykorzystywany jest komputer klasy PC z systemem operacyjnym Microsoft Windows (XP/Vista/7). 1.2. Oprogramowanie Na komputerach zainstalowane jest środowisko programistyczne Microsoft Visual Studio 2008 Standard Edition lub Microsoft Visual Studio 2008 Express Edition zawierające kompilator Microsoft Visual C++ 2008. 2. Wiadomości teoretyczne 2.1. Operacje wejścia-wyjścia w języku C++ Operacje wejścia-wyjścia nie są częścią języka C++. Ich wykonywanie umożliwiają biblioteki standardowo dołączane przez producenta kompilatora. Wprowadzanie i wyprowadzanie informacji w języku C++ zostało zrealizowane za pomocą strumieni. Wszystkie strumienie są obiektami odpowiednich klas. Wykorzystanie w programie strumieni wymaga dołączenia pliku nagłówkowego iostream: #include <iostream> W języku C++ dostępne są cztery predefiniowane strumienie: - cout - związany ze standardowym urządzeniem wyjścia (ekran), nazwa strumienia pochodzi od ang. C-onsole OUT-put; - cin - związany ze standardowym urządzeniem wejścia (klawiatura), nazwa strumienia pochodzi od ang. C-onsole IN-put; - cerr - związany ze standardowym urządzeniem, na które chce się wypisywać komunikaty o błędach (standardowo ekran) - strumień niebuforowany; - clog - związany ze standardowym urządzeniem, na które chce się wypisywać komunikaty o błędach (standardowo ekran) - strumień buforowany. Za wysyłanie i odbieranie informacji ze strumienia odpowiadają operatory << i >>: - << - operator odpowiadający za wysyłanie informacji do strumienia, nazywany jest często operatorem wstawiania (ang. insert lub put to); - >> - operator odpowiadający za wczytywanie informacji, nazywany jest operatorem ekstrakcji (ang. extract operator lub get from). Zakładamy, że w programie znajdują się następujące deklaracje zmiennych (wraz z inicjalizacją): int x = 10 int y = 25; float z1 = 1.1234567; float z2 = 11.1234567; char txt[10] = "Napis"; - wyświetlenie wartości zmiennej x typu int (pomiędzy nazwą strumienia cout i operatorem << oraz pomiędzy operatorem << i nazwą zmiennej x może nie być spacji lub może znajdować się tam ich dowolna liczba): cout << x; 10 - wyświetlenie wartości zmiennej x typu int poprzedzonej tekstem "x = ": cout << "x = " << x; x = 10 - wyświetlenie wartości dwóch zmiennych, x i y, typu int (pomiędzy liczbami nie będzie żadnego odstępu, gdyż nie został on wstawiony do strumienia): Informatyka 2 3 z 16 Instrukcja INF25 Informatyka 2 4 z 16 Instrukcja INF25
cout << x << y; 1025 - wyświetlenie wartości dwóch zmiennych, x i y, typu int oddzielonych znakiem spacji: cout << x << " " << y; 10 25 - wyświetlenie wartości dwóch zmiennych, z1 i z2, typu float (domyślnie wyświetlanych jest sześć pierwszych znaczących cyfr): cout << z1 << " " << z2; 1.12346 11.2346 - wyświetlenie łańcucha znaków: cout << txt; Napis - wyświetlenie wartości zmiennych x, y i txt w oddzielnych wierszach (za pierwszym razem do przejścia do nowego wiersza zastosowano sekwencję \n, zaś za drugim - manipulator endl): cout << x << "\n" << y << endl << txt; 10 25 Napis Ogólne zasady dotyczące wyświetlania danych przy zastosowaniu strumienia cout i operatora << są następujące: - liczby całkowite wyświetlane są w systemie dziesiętnym; - zmienne typów char, unsigned char wyświetlane są jako pojedyncze znaki; - liczby zmiennoprzecinkowe (float, double) wyświetlane są z dokładnością do 6 cyfr (część całkowita i ułamkowa, bez zbędnych zer); - wskaźniki wyświetlane są w systemie szesnastkowym; - zmienne typów char *, unsigned char * wyświetlane są jako łańcuchy znaków. Zakładamy, że w programie znajdują się następujące deklaracje zmiennych: int x; float z; - wczytanie zmiennej x typu int: cin >> x; - wczytanie zmiennej x typu int i zmiennej z typu float (przy wprowadzaniu wartości zmiennych, użytkownik może oddzielić je od siebie dowolną liczbą białych znaków, do których należą: spacja, tabulacja i enter): cin >> x >> z; Ogólne zasady dotyczące wczytywania danych przy zastosowaniu strumienia cin i operatora >> są następujące: - białe znaki (spacja, tabulacja, enter) są ignorowane; - wczytywanie tekstów jest kończone po napotkaniu pierwszego białego znaku; - liczby wczytywane są w systemie dziesiętnym; - nie można umieszczać spacji pomiędzy znakiem liczby a jej wartością; Informatyka 2 5 z 16 Instrukcja INF25 Informatyka 2 6 z 16 Instrukcja INF25
- wczytywanie liczby całkowitej jest kończone, gdy kolejny znak nie jest cyfrą; - w liczbach zmiennoprzecinkowych nie może występować spacja w środku. 2.2. Struktura programu w języku C++ Program w języku C++ ma taką samą strukturę jak w języku C. Najprostszy program w języku C++. #include <iostream> int main() { std::cout << "Witaj swiecie!" << std::endl; } Wykonanie programu rozpoczyna się od funkcji main(). W funkcji tej znajduje się instrukcja wyświetlająca na ekranie tekst "Witaj swiecie". Tekst ten jest wstawiany do strumienia cout. Na koniec do strumienia wstawiane jest przejście do nowego wiersza (endl). W języku C++ nie jest wymagane umieszczanie na końcu programu instrukcji return 0;. Przed nazwami identyfikatorów cout i endl umieszczony jest tekst std::. Oznacza on, że identyfikatory te pochodzą z biblioteki standardowej (dokładniej - z tzw. przestrzeni nazw std). W celu uniknięcia ciągłego pisania std:: przed nazwami identyfikatorów, umieszcza się w programie dyrektywę using namespace std;. Powyższy program przyjmie zatem postać: Najprostszy program w języku C++. #include <iostream> using namespace std; int main() { cout << "Witaj swiecie!" << endl; } W programie można stosować wszystkie funkcje znane z języka C (także te, które dotyczącą operacji wejścia-wyjścia). Pliki nagłówkowe mają swoje zoptymalizowane wersje, np. zamiast math.h, można dołączyć plik cmath, zamiast time.h - ctime, zamiast string.h - cstring. 2.3. Formatowanie wyjścia Domyślny sposób wyświetlania wartości zmiennych można zmodyfikować stosując: - funkcje setf i unsetf z klasy ios ustawiające odpowiednie flagi; - funkcje z klasy ios zmieniające towarzyszące im parametry, np. szerokość, precyzję; - manipulatory (modyfikatory). Manipulatory są to specjalne wartości, które można wstawić do strumienia. Powodują one zmianę sposobu formatowania wyświetlanych danych. Większość manipulatorów działa ciągle, tzn. na wszystkich kolejnych danych wstawianych do strumienia. Poniżej opisano najważniejsze manipulatory oraz podano przykłady ich zastosowania. hex, dec, oct - określają system liczbowy, w którym są wyświetlane / wczytywane liczby: hex - szesnastkowy, dec - dziesiętny, oct - ósemkowy; - działają tylko dla liczb całkowitych, - domyślnie działa manipulator dec; int x = 100; cout << x << " " << hex << x << " "; cout << oct << x << endl; cout << x << endl; 100 64 144 144 Informatyka 2 7 z 16 Instrukcja INF25 Informatyka 2 8 z 16 Instrukcja INF25
showpoint, noshowpoint - manipulator showpoint włącza, zaś noshowpoint wyłącza pokazywanie nieznaczących zer i kropki dziesiętnej przy wyświetlaniu liczb zmiennoprzecinkowych; - domyślnie działa manipulator showpoint; float x = 10; cout << showpoint << x << " " << noshowpoint << x; 10.0000 10 showpos, noshowpos - manipulator showpos włącza, zaś noshowpos wyłącza pokazywanie znaku liczby dodatniej; - domyślnie działa manipulator noshowpos; int x = 10; float y = 12.34567; cout << showpos << x << " " << noshowpos << x << endl; cout << showpos << y << " " << noshowpos << y << endl; +10 10 +12.3457 12.3457 int x = 10; cout << dec << x << " " << showbase << x << noshowbase; cout << hex << x << " " << showbase << x << noshowbase; cout << oct << x << " " << showbase << x; 10 10 a 0xa 12 012 fixed, scientific - fixed włącza notację dziesiętną zapisu liczb zmiennoprzecinkowych, zaś scientific - notację wykładniczą (naukową); - domyślnie liczby zmiennoprzecinkowe wyświetlane są z dokładnością do 6 cyfr (część całkowita i ułamkowa); włączenie manipulatora fixed powoduje, że wartość 6 dotyczy liczby cyfr tylko części ułamkowej; włączenie manipulatora scientific powoduje, że wartość 6 dotyczy tylko liczby cyfr części ułamkowej mantysy; do zmiany dokładności służy manipulator setprecision() opisany w dalszej części instrukcji; float x = 100.123456; cout << x << endl; cout << fixed << x << endl; cout << scientific << x << endl; 100.123 100.123459 1.001235e+002 showbase, noshowbase - manipulator showbase włącza, zaś noshowbase wyłącza wyświetlanie 0x na początku liczby w systemie szesnastkowym i 0 na początku liczby w systemie ósemkowym; - domyślnie działa manipulator noshowbase; endl - wstawia do strumienia znak przejścia do nowego wiersza; - endl jest równoważne wstawieniu do strumienia \n oraz flush; Informatyka 2 9 z 16 Instrukcja INF25 Informatyka 2 10 z 16 Instrukcja INF25
flush - opróżnia bufor wyjściowy; setw(int n) - manipulator setw() ustawia na n szerokość wyświetlania liczb lub wczytywania tekstów; - ustawiona wartość dotyczy tylko najbliższej operacji wejścia-wyjścia; - użycie manipulatora wymaga dołączenia pliku nagłówkowego iomanip; int x = 12345; cout << x << endl; cout << setw(10) << x << endl << x << endl; 12345 12345 12345 setprecision(int n) - manipulator setprecision() ustawia na n dokładność wyświetlania liczb zmiennoprzecinkowych; - dla trybu krótkiego (domyślnego) jest to łączna ilość cyfr przed i po kropce dziesiętnej; - dla trybu fixed jest to ilość cyfr po kropce dziesiętnej; - dla trybu scientific jest to dokładność mantysy (ale nie wykładnika); - manipulator setprecision() działa ciągle, jego użycie wymaga dołączenia pliku nagłówkowego iomanip; float x = 12.123456; cout << setprecision(5) << x << endl; cout << fixed << x << endl; cout << scientific << x << endl; 12.123 12.12346 1.21235e+001 setfill(char n) - manipulator setfill() ustawia znak będący wypełnieniem (domyślnie - spacja); - manipulator setfill() działa ciągle, jego użycie wymaga dołączenia pliku nagłówkowego iomanip; int x = 12345; cout << setfill('*'); cout << setw(10) << x << endl; cout << setw(10) << x << endl; *****12345 *****12345 W poniższym programie zapisywane są do macierzy wygenerowane pseudolosowo liczby zmiennoprzecinkowe typu float z zakresu (-50, 50). Następnie elementy macierzy wyświetlane są z podziałem na wiersze i kolumny oraz z dokładnością do trzech cyfr po kropce dziesiętnej. Zapisanie liczb zmiennoprzecinkowych do macierzy i wyświetlenie jej elementów z podziałem na wiersze i kolumny. #include <iostream> #include <iomanip> #include <ctime> using namespace std; #define N 4 #define M 5 Informatyka 2 11 z 16 Instrukcja INF25 Informatyka 2 12 z 16 Instrukcja INF25
int main() { float T[N][M]; int i, j; } srand((unsigned int)time(null)); for (i=0; i<n; i++) for (j=0; j<m; j++) T[i][j] = 100*(float)rand()/RAND_MAX - 50; cout << fixed << setprecision(3); for (i=0; i<n; i++) { for (j=0; j<m; j++) cout << setw(10) << T[i][j]; cout << endl; } Manipulatory fixed i seprecision() działają ciągle, więc wystarczy tylko jednokrotne ich użycie przed pętlą wyświetlającą elementy macierzy. Natomiast manipulator setw() dotyczy tylko najbliższej operacji wejścia-wyjścia, zatem musi znajdować się w pętli for. Przykładowy wynik działania powyższego programu: 6.618-27.541-35.147 11.235-28.539 32.482-45.065 29.177-42.822 44.375 49.017 46.915 36.261 13.588 12.038-24.276 6.545 1.527 45.004 6.990 3. Przebieg ćwiczenia Na pracowni specjalistycznej należy wykonać zadania wskazane przez prowadzącego zajęcia. W różnych grupach mogą być wykonywane inne zadania. 1. Napisz program wyświetlający na ekranie wizytówkę o podanej formie. Wpisz w wizytówce swoje dane. Zastosuj odpowiednie strumienie i operatory. ******************************** * Jan Kowalski * * e-mail: j.kowalski@gmail.com * * tel. 123-456-789 * ******************************** 2. Napisz program, w którym użytkownik wczytuje z klawiatury kwotę w złotych (PLN). Następnie program wyświetla informację, ile za tę kwotę można kupić innych walut (EUR, USD, GBP, CHF, CAD, DKK, JPY). Poszukaj w Internecie kursów kantorowych. Wyniki przedstaw w postaci tabeli. Przyjmij, że część całkowita wyświetlanych liczb nie będzie zawierać więcej niż 7 cyfr. Zadbaj o odpowiednie wyrównanie wyświetlanych liczb. Zastosuj odpowiednie strumienie i manipulatory. Przykładowy wynik działania programu: Podaj kwote w PLN: 100 ------------- ---------- ------------ Kraj Waluta Kwota ------------- ---------- ------------ EUGiW EUR x.xx USA USD x.xx W. Brytania GBP x.xx Szwajcaria CHF x.xx Kanada CAD x.xx Dania DKK x.xx Japonia JPY x.xx ------------- ---------- ------------ 3. Dana jest następująca deklaracja i inicjalizacja zmiennych: int a = 11, b = -22, c = +33; Wyświetl wartości zmiennych zgodnie z poniższym wzorem: @@+33@@-22@@@11 Zastosuj odpowiednie manipulatory. Nie wyświetlaj żadnych znaków ani łańcuchów znaków. 4. Napisz program wyświetlający na ekranie tabliczkę mnożenia dla liczb od 1 do wartości wprowadzonej przez użytkownika z klawiatury. Zastosuj odpowiednie strumienie i manipulatory. Informatyka 2 13 z 16 Instrukcja INF25 Informatyka 2 14 z 16 Instrukcja INF25
4. Literatura [1] Grębosz J.: Symfonia C++ standard: programowanie w języku C++ orientowane obiektowo. Tom 1 i 2. Wydawnictwo Edition 2000, Kraków, 2008. [2] Stroustrup B.: Programowanie. Teoria i praktyka z wykorzystaniem C++. Wydanie II poprawione. Helion, Gliwice, 2013. [3] Eckel B.: Thinking in C++. Edycja polska. Helion, Gliwice, 2002. [4] Prata S.: Język C++. Szkoła programowania. Wydanie VI. Helion, Gliwice, 2012. [5] Wileczek R.: Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows. Helion, Gliwice, 2009. [6] http://www.cplusplus.com/reference/ - C++ Reference 5. Zagadnienia na zaliczenie 1. Opisz predefiniowane strumienie w języku C++. 2. Podaj ogólne zasady dotyczące wyświetlania danych przy zastosowaniu strumienia cout i operatora << oraz wczytywania danych przy wykorzystaniu strumienia cin i operatora >>. 3. Scharakteryzuj manipulatory stosowane do zmiany sposobu formatowania wyświetlanych danych. 6. Wymagania BHP Warunkiem przystąpienia do praktycznej realizacji ćwiczenia jest zapoznanie się z instrukcją BHP i instrukcją przeciw pożarową oraz przestrzeganie zasad w nich zawartych. W trakcie zajęć laboratoryjnych należy przestrzegać następujących zasad. - Sprawdzić, czy urządzenia dostępne na stanowisku laboratoryjnym są w stanie kompletnym, nie wskazującym na fizyczne uszkodzenie. - Jeżeli istnieje taka możliwość, należy dostosować warunki stanowiska do własnych potrzeb, ze względu na ergonomię. Monitor komputera ustawić w sposób zapewniający stałą i wygodną obserwację dla wszystkich członków zespołu. - Sprawdzić prawidłowość połączeń urządzeń. - Załączenie komputera może nastąpić po wyrażeniu zgody przez prowadzącego. - W trakcie pracy z komputerem zabronione jest spożywanie posiłków i picie napojów. - W przypadku zakończenia pracy należy zakończyć sesję przez wydanie polecenia wylogowania. Zamknięcie systemu operacyjnego może się odbywać tylko na wyraźne polecenie prowadzącego. - Zabronione jest dokonywanie jakichkolwiek przełączeń oraz wymiana elementów składowych stanowiska. - Zabroniona jest zmiana konfiguracji komputera, w tym systemu operacyjnego i programów użytkowych, która nie wynika z programu zajęć i nie jest wykonywana w porozumieniu z prowadzącym zajęcia. - W przypadku zaniku napięcia zasilającego należy niezwłocznie wyłączyć wszystkie urządzenia. - Stwierdzone wszelkie braki w wyposażeniu stanowiska oraz nieprawidłowości w funkcjonowaniu sprzętu należy przekazywać prowadzącemu zajęcia. - Zabrania się samodzielnego włączania, manipulowania i korzystania z urządzeń nie należących do danego ćwiczenia. - W przypadku wystąpienia porażenia prądem elektrycznym należy niezwłocznie wyłączyć zasilanie stanowiska. Przed odłączeniem napięcia nie dotykać porażonego. Informatyka 2 15 z 16 Instrukcja INF25 Informatyka 2 16 z 16 Instrukcja INF25