KURS C/C++ WYKŁAD 5. Typ wyliczeniowy enum

Podobne dokumenty
Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

dr inż. Paweł Myszkowski Wykład nr 8 ( )

1. Wprowadzanie danych z klawiatury funkcja scanf

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Operacje wejścia/wyjścia odsłona pierwsza

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Informatyka, Ćwiczenie Uruchomienie Microsoft Visual C++ Politechnika Rzeszowska, Wojciech Szydełko. I. ZałoŜenie nowego projektu

Struktury, unie, formatowanie, wskaźniki

2 Przygotował: mgr inż. Maciej Lasota

Wstęp do programowania

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Operacje na plikach. Informatyka. Standardowe strumienie wejścia i wyjścia

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Spis treści OPERACJE WEJŚCIA-WYJŚCIA W JĘZYKU C++. STEROWANIE FORMATEM, MANIPULATORY. Informatyka 2

> C++ typy wyliczeniowe, struktury, unie, konwersje napis <-> liczba, formatowanie wyjścia

Strumienie standardowe C

Języki i metody programowania. Omówienie języków C, C++ i Java

Pliki. Informacje ogólne. Obsługa plików w języku C

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

Podstawy programowania skrót z wykładów:

Wstęp do informatyki- wykład 8 Pętla while, do while,for -pętla w pętli- przykłady Operator rzutowania Manipulatory

Część 4 życie programu

KURS C/C++ WYKŁAD 1. Pierwszy program

Język C++ Różnice między C a C++

Funkcje zawarte w bibliotece < io.h >

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Funkcje zawarte w bibliotece < io.h >

Biblioteka standardowa - operacje wejścia/wyjścia

Język C++ zajęcia nr 1

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Formatowane (tekstowe) wejście/wyjście. Binarne wejście/wyjście.

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Podstawy programowania w C++

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima 2015

Wejście wyjście strumieniowe

Laboratorium 6: Ciągi znaków. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Funkcje standardowej biblioteki wejść-wyjść do wyświetlania i pobierania danych

Języki i metodyka programowania. Wprowadzenie do języka C

Podstawy Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

1 P roste e t ypy p d a d n a ych c - c ąg ą g d a d l a szy 2 T y T py p z ł z o ł żo ż ne e d a d n a ych c : T BLICE

Zmienne, stałe i operatory

Pliki wykład 2. Dorota Pylak

Język C i C++. Podstawy. Zagadnienia do opanowania. Przykład 1. (modyfikuj kod, aby zrealizować punkty 5., 7.)

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wykład 2 Operacje wejściawyjścia. Ewa Gajda

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Pliki wykład 2 -przekazywanie strumieni do funkcji -funkcje get(char &) i getline(string)

Wstęp do Programowania 2

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

1 Podstawy c++ w pigułce.

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

Programowanie strukturalne i obiektowe

Wstęp do Programowania, laboratorium 02

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Podstawy Programowania Podstawowa składnia języka C++

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Wstęp do programowania

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Podstawy algorytmiki i programowania - wykład 4 C-struktury

1 Podstawy c++ w pigułce.

Programowanie - wykład 4

Wykład 2 Składnia języka C# (cz. 1)

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

C++ wprowadzanie zmiennych

Języki programowania - podstawy

Podstawy programowaniu. Wykład: 3. Budowa programu Operacje we/wy Instrukcje wyboru. dr Artur Bartoszewski - Podstawy programowania, sem.

Pliki. Informacje ogólne. Obsługa plików w języku C

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Wstęp do programowania. Wykład 1

Pliki wykład. Dorota Pylak

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

C-struktury wykład. Dorota Pylak

Dr inż. Robert Wójcik. Zakład Podstaw Informatyki i Teleinformatyki Politechnika Wrocławska. Wykład Podstawowe elementy języka

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 5

Wykład PASCAL - Pliki tekstowe

Programowanie strukturalne. dr inż. Tadeusz Jeleniewski

Języki C i C++ Wykład: 1. Wstęp Budowa programu Operacje we/wy Instrukcje wyboru. dr Artur Bartoszewski - Języki C i C++, sem.

Wykład :37 PP2_W9

tablica: dane_liczbowe

Wstęp do programowania

Wstęp do programowania

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Laboratorium 1. Programowanie II - Kierunek Informatyka. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawy Programowania

I - Microsoft Visual Studio C++

Transkrypt:

Typ wyliczeniowy enum KURS C/C++ WYKŁAD 5 Istnieje inna często wygodniejsz niż deklaracja const metoda nazywania stałych całkowitych Deklaracja: enum {WRITE, READ, DELETE); definiuje trzy stałe całkowite WRITE, READ, DELETE, które nazywamy stałymi wyliczanymi i przypisuje im kolejno wartości całkowite 0,1,2. Deklaracja ta jest równoważna zapisowi: const WRITE = 0; const READ = 1; const DELETE = 2; Wyliczenie może mieć nazwę. enum RIGHT {WRITE, READ, DELETE); Nazwa wyliczenia staje się odrębnym typem. enum nazwa_typu { lista wyliczeniowa } Przykład: enum miesiace {styczeń, luty, marzec, kwiecień, maj, czerwiec}; enum miesiace {styczen =1, luty, marzec, kwiecien=6, maj, czerwiec=luty+marzec}; enum miesiace {styczen =1, luty, marzec, kwiecien, maj, czerwiec}; W ten sposób zdefiniowaliśmy nowy typ o nazwie miesiace. Definiujemy zmienną tego typu: miesiace mm; Sposób użycia tych zmiennych jest następujący: mm = styczen; if (mm = = luty) {...} Kompilator ostrzega przy przypisaniach np.: mm = 2; powinno być mm = miesiace (2); mm = 3; mm = miesiace (3); mm = miesiace (23); // nie ma błędu, pakiet Borland 3.1 Kompilator sygnalizuje błąd przy przypisaniu: styczeń = 1; ponieważ zmienne wyliczeniowe sa traktowane jak constans. // enum {BLACK, BLUE, GREEN, CYAN, RED, MAGENTA);

enum {black, blue, green, cyan, red, magenta); czyli black = 0, blue = 1, itd textcolor (green); cprintf ( Zmiana koloru na zielony ); printf ( \n ); Operacje we/wy Język C/C++ nie posiada zdefiniowanych instrukcji realizujących operacje we/wy. Do tego celu służą funkcje znajdujące się w standardowych bibliotekach. standardowe strumienie predefiniowane wejścia/wyjścia stdin - strumień wejściowy (konsola) stduot - strumień wyjściowy (konsola) stderr - strumień komunikatów błędów (konsola) stdaux - strumień pomocniczy (konsola) stdprn - strumień drukarki np.: fputs ( Nazwa firmy, stdprn); Funkcja printf(); Funkcje printf() i scanf(), służą do realizacji tzw. formatowanego we/wy. Składnia funkcji jest następująca: int printf (const char *format [,argument,...]); Parametr format wskazuje tzw. łańcuch formatujący. Pewne sekwencje tego łancucha są specjalnie traktowane przez funkcje printf(). int a=1; float b=2.45; char c= d ; printf("wartość zmiennej a = %d zmiennej b = %4.2f \ zmiennej c = %c zmiennej d = %s \n",a,b,c, C++ ); char text[]= C++ ; printf("wartość zmiennej a = %.2d zmiennej b = %4.2f \ zmiennej c = %c zmiennej d = %s \n",a,b,c,text); Aby wydrukować znak % trzeba napisać: %% Ogólny format sekwencji formatującej przedstawia się następująco: %[flagi][szerokość][.precyzja][h l L]znak-typu.

flagi: flagi znaczenie default - dosunięcie argumentu do lewego krańca jego pola znak tylko dla ujemnej + liczba zawsze ze znakiem +/- # dla formatu x,x, poprzedzenie liczby 0x, 0X bez znaków wiodących dla formatu o, poprzedzenie liczby 0 dla formatu e,e,f wstawia zawsze znak kropki szerokość: n - wyświetlanych jest przynajmniej n znaków. Jeśli wartość zajmuje mniej niż n znaków szerokość pola jest uzupełniana dodakowymi spacjami z lewej lub prawj strony w zależności od ustawionej flagi. float y=10.96 printf ("y=%5.2f ",y); y=10.96 printf ("y=%10.2f ",y); y= 10.96_ printf ("y=%#.0f ",y); y=11. int i = 12; printf ("y=%#x",y); y=0xc. int y=23; printf ("y=%6d",y); y = 23_ printf ("y=%-6d",y); y =23 _ printf ("y=%+6d",y); y = +23 _ znak_typu: znak typu argument wejściowy argument wejściowy d,i całkowity liczba dziesiętna ze znakiem o całkowity liczba ósemkowa bez znaku x,x całkowity liczba szesnastkowa bez znaku u całkowity liczba dziesiętna bez znaku

c znak pojedynczy znak s wskaźnik łańcucha ciąg znaki łańcucha, aż do wystapienia \0 lub tyle ile określono w precyzji f zmiennoprzecinkowy [-]m.ddd gdzie liczbę cyfr d określa precyzja (domyślnie 6). e, E zmiennoprzecinkowy [-]m.dde+-xx. Przed kropką dokładnie jedna cyfra, liczba cyfr po kropce zależna od precyzji(domyślnie 6). g, G zmiennoprzecinkowy liczba będzie wyświetlana w postaci e lub f w zależności od zadanej precyzji. Nie wypisuje zbędnej kropki dziesiętnej i nie znaczących zer. y=0.000002; printf ("y=%f y=%g y=%e",y); wyświetla: y=0.000002 y=2e-06 y=2.000000e-06 y=2000000; wyświetla: y=2000000.000000 y=2e+06 y=2.000000e+06 modyfikatory: modyfikator h l znaczenie argument traktowany jak typu short int dla znaków typu d,i,o,u,x,x argument traktowany jak long int dla znaków typu d,i,o,u,x,x dla znaków e, E, g, G jako typu double L argument traktowany jak long double dla znaków typu e,e,f,g,g precyzja:.0 - dla e, E, f nie jest drukowany znak kropka dziesiętna liczba zero nie zostanie wydrukowana.n znak typu d,i,o,u,x,x znaczenie n cyfr znaczących zostanie wydrukowanych, jeśli jest ich mniej

uzupełnienie zerami z lewej strony., jeśli więcej nie będzie obcięta. e,e, f s n cyfr znaczących zostanie wydrukowanych po przecinku dziesiętnym. Ostatnia cyfra jest zaokraglana. co najmniej n znaków zostanie wydrukowanych long double y=2.1e45; printf ("y=%le,y); y = 2.100000e+45 printf ("y=%.2le,y); y = 2.10e+45 printf ("y=%lf,y); long int y=50000; printf ("y=%ld,y); y = 50000 printf ("y=%d",y); y=902 printf ("y=%.6d",y); y=000902 char nazwa[]="microsoft"; printf ("%.5s", nazwa); Micro Przyjmowane precyzje domyślne: 1 - dla znaków typu d, i,o, u, x, X 6 - dla znaków typu e, E, f - wszystkie cyfry znaczące dla znaków typu G,g - łańcuchy są drukowane do pierwszego znaku \0., znaków c nie dotyczy. Jeśli wartość zajmuje mniej niż n znaków szerokość pola jest uzupełniana dodatkowymi z lewej lub prawj strony w zależności od ustawionej flagi. spacjami Funkcja scanf() Funkcja scanf() służy do realizacji formatowanego wejścia. Składnia tej funkcji jest następująca: int scanf (const char* format [,address,...]); Parametr format wskazuje tzw. łańcuch formatujący. łańcuch ten zawiera sekwencje określające typy wprowadzanych danych. Funkcja wczytuje znaki ze standardowego wejścia, interpretuje je zgodnie ze specyfikacjami zawartymi w formacie i zapamiętuje wyniki w miejscach określonych przez pozostale argumenty. Argumenty muszą być adresami, określają adres obszaru pamięci gdzie dane mają być umieszczone. int i,j;

scanf("%d%d", &i, &j); Ogólny format sekwencji formatującej przedstawia się następująco: %[*][szerokość][h l L] znak-typu. * oznacza, że dane pole zostanie odczytane ale nie zostanie zapamiętane we wskazanym miejscu szerokość znak-typu określa maksymalną liczbę znaków danego pola tak jak opisane w funkcji printf(), dodatkowo można używać dużych liter: D, O, I, U scanf ("%d,%d,%d", &d, &m, &r); - wprowadzane dane oddzielane muszą być przecinkami. float f; scanf ("%5f", &f); wprowadzamy 1234567 printf ("f=%f", f); f=12345.0 char tab[20]; scanf ("%7s", tab); wprowadzamy Wolszczan printf ("s=%s", tab); s=wolszcz Funkcja gets(), puts() char *gets (char *s); // #include <stdio.h> Funkcja odczytuje znaki ze standardowego strumienia wejściowego (stdin) i umieszcza je w łańcuchu s; char znaki[20]; gets (znaki); Czytanie jest przerywane po napotkaniu znaku końca wiersza, ktry zostaje zamieniony na znak końca łańcucha(null). int puts (const char *s); char znaki[20]= Przykład wyprowadzania łańcucha na ekran ; puts (znaki); Ekran: Przykład wyprowadzania łańcucha na ekran Strumienie predefiniowane C++ Wprowadzanie i wyprowadzanie informacji można potraktować jako strumień bajtów płynący od źródła do ujścia. Jeśli chcemy zmiennej x nadać wartość wczytaną z klawiatury, wtedy strumień bajtów płynie od urządzenia zewnętrznego - klawiatura do tego miejsca w pamięci przeznaczonego dla zmiennej x. Dla operacji we/wy kompilator predefiniuje kilka strumieni (predefiniuje czyli zakłada stumień, otwiera strumień i po zakończeniu programu zamyka strumień) : cout, cin, cerr. Aby skorzystać z tych strumieni w programie trzeba umieścić dyrektywę: #include<iostream.h> podobnie jak dla C <stdio.h>.

Ze strumieniem wyjściowym cout został stowarzyszony operator << << insert operator (put to wstaw do strumienia cout) Ze strumieniem wyjściowym cin został stowarzyszony operator >> >> extract operator (get from pobierz ze strumienia cin ) Przykład #include<iostream.h> void main(){ } int x = 123; cout<<x; Można wysyłać różne typy zmiennych i stałych przy pomocy jednej instrukcji np. int x=123; cout<<"wartość x = "<< x <<'.' W przykładzie tym, za pomocą jednej instrukcji przesłano na ekran napis Wartość x =, wartość zmiennej i pojedynczy znak kropki. Na ekranie pojawi się napis: Wartość x = 123. Poszczególne typy oddzielone są operatorami <<. W C++ ze strumieniem cout współpracuje zestaw manipulatorów dec, oct, hex. Zmieniają one bieżący format dla całkowitego argumentu. Przykład #include<iostream> main(){ } int x=123; cout<<dec<<x<<' ' <<oct<<x<<' ' <<hex<<x; Przykład pokazuje jak można wyświetlić wartość całkowitą w trzech systemach liczbowych: dec, oct, hex. Wynik działania programu to :123 173 7b. Ze strumieniem wejściowym cin został stowarzyszony operator >>, odpowiadający za wczytanie informacji ze strumienia wejściowego (którego początek jest na klawiaturze), czyli program Przykład. void main(){ int x; cout<<"wprowadź wartość x :\n"; cin>>x; // >> pobieranie ze strumienia płynącego z klawiatury

} cout<<"wartość x = "<<x; powoduje wczytanie ze strumienia wejściowego (klawiatury) wartości do zmiennej x. Jak widać operacje we/wy dla standardowych typów realizowane są bardzo prosto. Nie musimy pamiętać o formacie wprowadzania i wyprowadzania wyników, a strumienie cout i cin interpretują je prawidłowo. Trochę trudniej przedstawiają się te operacje dla typów zdefiniowanych przez użytkownika, ale o tym opowiemy dużo później. Mamy również możliwość specyfikacji szerokości pola, precyzji i sposobu wypełniania pola. Do tego celu służą funkcje składowe klasy o nazwie ios. Są nimi: int width (int) - określa minimalny rozmiar pola, dotyczy tylko jednej następnej operacji we/wy int width () - zwraca bieżący rozmiar pola int precission (int) - dokładność wypisywania liczb zmiennoprzecinkowych. Przez domniemanie=6. Efekt trwały. int precission() - zwraca bieżąca wartość precyzji int fill (int) - znak wypełniający obszar. Efekt trwały int fill () - podaje bieżący parametr. Przykłady wykorzystania funkcji i manipulatorów formatujących int liczba; cout.width (9); cout.fill ( * ); cout<<liczba; ******107 - musi być wywołana przed operacją na strumieniu char string[12]; cin.width(11); cin>>string - nie ma wpływy na liczby, a jedynie na stringi. Zapobiega przekraczaniu zakresu char napis[7]; cin.width (sizeof(napis)); cin>>napis; //1 miejsce jest przeznaczane na \0 Odpowiednikiem tych funkcji są manipulatory które można wstawić do strumienia: setw (długość) <=> cout.width (dlugosc) setfill (znak) <=> cout.fill (znak) setprecision <=> cout.precision (liczba); setw(9); setfill ( * ); setprecision(2); // muszą być umieszczone w strumieniu setprecision(n); - działa do odwołania

setfill ( * ); - działa do odwołania. setw(n); - dla następnej wyprowadzanej wartośći. liczba=67.237; cout<< setw(9) << setfill ( * ) << setprecision(2)<<liczba; cout<<f; Ekran:****67.24 Porównanie bibliotek stdio oraz iostream Jak widać z powyższej analizy, język C++, wprowadził znaczne uproszczenia w realizacji mechanizmów we/wy. Ponadto, biblioteka stdio ma wiele wad, które zniwelowały w/w mechanizmy. Należą do nich między innymi: 1. printf(), scanf() są funkcjami ze zmienną ilością argumentów. Kompilator nie ostrzega więc o przypadku niedostosowania formatu do listy argumentów np.: printf( %i %f %d, a, b); 2. nie są kontrolowane przypadki złego typu argumentów (patrz wyżej) 3. dla funkcji scanf, jeśli liczba argumentów jest mniejsza niż w formacie - efekt jest nie zdefiniowany, w przeciwnym przypadku, dane są pobierane choć nie zdefiniowane. Mieszanie bibliotek Pomiędzy predefiniowanymi strumieniami stdio... cout... nie ma żadnej łączności. W związku z tym, gdy mieszamy operacje we/wy realizowane mechanizmami C i C++, możemy spodziewać się nieprzewidzianych efektów z ich realizacją. cout<< tekst1 ; printf( tekst2 ); cout<< tekst3 ; printf( tekst4 ); Powyższy zapis nie musi wcale prowadzić do oczekiwanego rezultatu: tekst1tekst2tekst3tekst4. Może być np. tekst1tekst3tekst2tekst4 lub odwrotnie. Strumień cout jest buforowany a stdout nie. Inna jest więc zasada wypisywania. Język C++ przewidział mechanizm synchronizujący oba te strumienie. Jest nim funkcja ios::sync_with_stdio(); Powinna być użyta na początku programu. Użycie tej funkcji powoduje jednak utratę szybkości, ponieważ strumienie przestają byc buforowane.