Wstęp do programowania Biblioteki
Biblioteki - rola Zawierają rozwiązania często występujących problemów (iostream, string, conio, ...), Zawierają rozwiązania szczegółowych problemów (math), pozwalają lepiej zaplanować tworzenie kodu programu, co ogranicza ryzyko popełnienia błędu (przykład)
Biblioteki - przykład bez biblioteki #include <iostream.h> #include <math.h> void wprowadz(int a[10], int &n) { cout<<"n="; cin>>n; for (int i=1; i<=n; i++) cout <<"a["<<i<<"]="; cin >>a[i]; } //************************************************ void wariancja(int a[10], int &n, float &war) float sr=0; sr+=a[i]; sr/=n; war=0; war=war+(a[i]-sr)*(a[i]-sr); war=sqrt(war/n); main() { int n,a[10]; float war; wprowadz(a,n); wariancja(a,n,war); cout <<"wariancja= "<<war; getchar();
Biblioteki - własna biblioteka #include <iostream.h> #include <math.h> int a[10], n; float war; #include "c:\moje-f.cpp" main() { wprowadz(); wariancja(); cout <<"wariancja= "<<war; getchar(); }
Biblioteki - własna biblioteka Treść pliku moje-f.cpp void wprowadz() { cout<<"n="; cin>>n; for (int i=1; i<=n; i++) cout <<"a["<<i<<"]="; cin >>a[i]; } //************************************************ void wariancja() float sr=0; sr+=a[i]; sr/=n; war=0; war=war+(a[i]-sr)*(a[i]-sr); war=sqrt(war/n);
Pliki nagłówkowe Pliki nagłówkowe zawierają prototypy funkcji, definicje stałych, deklaracje zmiennych, struktur itd. Przykład pliku nagłówkowego: int silnia(int n); float potega(float podstawa,int wykladnik); const int N=20; int dane[N];
Pliki nagłowkowe - co dają Kompilowane są źródła (c, cpp), Kompilator pobiera informacje potrzebne do kompilacji z plików nagłowkowych, Po kompilacji następuje łączenie: rys. obok, źródło Internet
Biblioteki standardowe Znajdują się w katalogu include przy standardowej instalacji, Najpopularniejsze to: iostream.h - operacje wejścia wyjścia, string.h - definicje funkcji operujących na napisach, assert.h - zawiera macro assert (asercja), conio.h - zarządza operacjami we/wy na konsoli MS-DOS, dirent.h - zarządza katalogami i ścieżkami dostępu w MS-DOS, dos.h - zawiera struktury danych i funkcje do wspierania MS-DOS dla rodziny procesorów Intel, float.h - zarządzanie liczbami rzeczywistymi, fstream.h - zarządzanie plikami, time.h - narzędzia do odczytywania, interpretacji i prezentacji czasu math.h - zawiera definicje popularnych funkcji matematycznych, limits.h - ograniczenia dla typów danych, stdio.h - operacje wejścia wyjścia (wersje nieobiektowe).
Biblioteki - wybrane zastosowania WE/WY z konsoli (wersje obiektowe) #include <iostream.h> void main (void) { int i; long l; char c; float f; double d; char t[50]; /*int */ cout<<"Podaj int"; cin>>i; cout <<i; /*long*/ cout<<"Podaj long"; cin>>l; cout <<l; /*char*/ cout<<"Podaj char"; cin>>c; cout <<c; /*float*/ cout<<"Podaj float"; cin>>f;cout<<f; /*double*/cout<<"Podaj double"; cin>>d;cout<<d; /*text*/cout<<"Podaj tekst"; cin>>t;cout<<t; }
Biblioteka assert.h Wiele kompilatorów oferuje makro assert(). To makro zwraca wartość TRUE, jeśli jego parametr ma wartość TRUE i podejmuje pewną akcję w przypadku, gdy jego parametr ma wartość FALSE. Wiele kompilatorów przerywa działanie programu w przypadku, gdy argument tego makra nie jest spełniony; inne zgłaszają wtedy wyjątek. #include <assert.h> #include <conio.h> int main(int argc, char **argv) { int x; cin>>x; assert(x); getch(); return 0; }
Biblioteka string.h – przykładowe funkcje Funcja strcat - łączy teksty, wynik w dest Składnia: char *strcat(char *dest, const char *src); Funcja strcpy - kopiuje tekst (source) do zmiennej (dest), Składnia: char *strcpy(char *dest, char * source); Funkcja strchr - podaje znak odpowiadający danemu kodowi, składnia: char *strchr( char *s, int c); Funkcja strcmp - porównuje teksty Składnia: int strcmp(const char *s1, const char *s2); Funkcja strlen - podaje ilość znaków w napisie Składnia: size_t strlen(const char *s); Uwaga: * oznacza wskaźnik, może to być napis lub tablica, czyli np. char dest[20]; char *src;
Przykład dla string.h Przykład: #include <string.h> #include <stdio.h> #include <iostream.h> #include <conio.h> //--------------------------------------------------------------------------- int main(int argc, char* argv[]) { char destination[20]; char *blank = " ", *c = "C++", *Borland = "Borland"; strcpy(destination, Borland); strcat(destination, blank); strcat(destination, c); cout<<destination; getch(); return 0; }
Przykład dla string.h #include <string.h> #include <stdio.h> #include <iostream.h> #include <conio.h> int main(int argc, char* argv[]) { char *buf1 = "aaa", *buf2 = "bbb", *buf3 = "ccc"; int ptr; ptr = strcmp(buf2, buf1); if (ptr > 0) cout<<"buf2 jest większy niż buf1\n"; else cout<<"buf2 jest mniejszy niż buf1\n"; cout<<"ptr="<<ptr<<endl; ptr = strcmp(buf2, buf3); cout<<"buf2 jest większy niż buf3\n"; cout<<"buf2 jest mniejszy niż buf3\n"; cout<<"ptr="<<ptr; getch(); return 0; } //---------------------------------------------------------------------------
Przykład dla string.h #include <iostream.h> #include <conio.h> int main(int argc, char* argv[]) { char *string = "Borland International"; cout<<"dlugosc="<<strlen(string); getch(); return 0; } //---------------------------------------------------------------------------
Problemy z wczytywaniem napisów #include <string.h> #include <stdio.h> #include <iostream.h> #include <conio.h> int main(int argc, char* argv[]) { char *napis; cout<<"Wczytaj napis"; cin>>napis; cout<<"napis="<<napis; getch(); return 0; } //--------------------------------------------------------------------------- Dzieje się tak, gdyż wprowadzanie danych jest buforowane i część napisu zostanie w buforze.
Wczytywanie napisów By uniknąć takich problemów należy czyścić zawartość strumienia lub użycie innej metody do wczytywania napisów. Taką metoda jest np. getline() #include <iostream.h> #include <conio.h> int main(int argc, char* argv[]) { char *napis; cout<<"Wczytaj napis: "; cin.getline(napis,50); cout<<"napis="<<napis<<endl; getch(); return 0; }
Funkcje z biblioteki math.h Ceil - zaokrągla do góry, Składnia double ceil(double x); cosh - funkcja cosinus hiperboliczny Składnia: double cosh(double x); exp - funkcja exponent Składnia: double exp(double x); Funkcja fabs- wartość bezwzględna dla liczby double, Składnia: double fabs(double x);
Biblioteka math.h Floor - zaokrągla w dół Skladnia: double floor(double x); pow - podnosi x do y Składnia: double pow(double x, double y); sqrt - pierwiastek kwadratowy z x składnia: double sqrt(double x); rand – zwraca liczbę losową z <0, RAND_MAX> int rand( void ); srand - inicjalizuje generator void srand( unsigned int );
Przykład dla math.h #include <string.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #include <math.h> int main(int argc, char* argv[]) { double result; double x = 4.0; result = exp(x); cout<<"e do potęgi "<<x<<"="<<result; getch(); return 0; } //---------------------------------------------------------------------------
Przykład dla math.h #include <string.h> #include <stdio.h> #include <iostream.h> #include <conio.h> #include <math.h> int main(int argc, char* argv[]) { float number = -1234.0; cout<<"wartosc bezwzględna: "<< number<< "wynosi"<< fabs(number); getch(); return 0; } return 0;
Przykład - kolory #include <windows.h> #include <iostream> #include <stdlib.h> using namespace std; int main() { HANDLE hOut; hOut = GetStdHandle( STD_OUTPUT_HANDLE ); cout << "Tekst" << endl << endl; //zmiana tła SetConsoleTextAttribute( hOut, BACKGROUND_RED ); cout << "Czerwone tło" << flush << endl << endl; SetConsoleTextAttribute( hOut, FOREGROUND_RED ); cout << "Ten napis jest czerwony" << endl << endl; //Napis3 ^ SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY ); cout << "Ten napis jest czerwony i INTENSITY" << endl; SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED ); system( "PAUSE" ); return 0; }
Przykład – przestrzenie nazw #include <iostream> #include <fstream> //using namespace std; int main() { int liczba; // cin>>liczba; // cin nie zadeklarowane std::cin>>liczba; std::cout<<liczba; }
Własne przestrzenie nazw #include <iostream> //tworzenie własnej przestrzeni nazw. // Przestrzenie nazw pozwalają unikać kolizji nazw (podobnie jak funkcje) namespace kalkulator { int a=0; int f(int x) return 2*x; } using namespace std; using namespace kalkulator; int main() int a=5; cout<<a<<endl; cout<<a<<std::endl ; cout<<f(2);
Wczytywanie napisów #include <iostream> using namespace std; int main() { char napis[10]; int liczba; //wczytywanie napisów wieloczłonowych cout <<"podaj napis (1):"; //podajemy Nowak 43 cin>>napis; cout << napis<<endl; cin.sync(); //czyscimy bufor strumienia cout <<"podaj napis (2):"; //podajemy Nowak 43 cin>>liczba; cout << napis<<liczba<<endl; cin.sync(); string napis1; getline(cin,napis1); cout<<napis1; }
Przykład - formatowanie #include <fstream> #include <iostream> using namespace std; int main() { int l =- 3; cout << l << endl; cout.width( 10 ); cout << left << l << endl; cout << right << l << endl; cout << internal << l << endl; system ("Pause"); }
Przyykład – systemy pozycyjne #include <fstream> #include <iostream> using namespace std; int main() { int l = 59; cout.setf( ios::hex, ios::basefield ); cout << l << endl; //3b cout.setf( ios::oct, ios::basefield ); cout << l << endl; //73 cout.setf( ios::dec, ios::basefield ); cout << l << endl; //59 system ("Pause"); }