KURS C/C++ WYKŁAD 1 Pierwszy program Tworzenie programu odbywa sie w dwóch etapach: 1. opracowanie kodu źródłowego 2. generowanie kodu wynikowego Pierwszy etap polega na zapisaniu algorytmu za pomocą instrukcji języka. W efekcie programista otrzymuje kod źródłowy programu, który jest plikiem tekstowym zawierającym zapis algorytmu. Drugi etap polega na przetłumaczeniu konstrukcji właściwych językowi wyższego poziomu na rozkazy procesora i doprowadzenie programu do postaci wykonywanej przez komputer. Operacja ta składa się z dwóch faz: kompilacji i linkowania czyli łączenia. Edytor Tworzymy program źródłowy i umieszczamy go w pliku test.cpp (test.c) Kompilacja Kompilator sprawdza czy instrukcje są zgodne z regułami języka programowania. Zapisuje instrukcje języka wysokiego poziomu za pomocą instrukcji procesora. Program po kompilacji test.obj (test.o) Kompilator zewnętrzny BCC. Linkowanie Linker to program, który konsoliduje (łączy) pliki.obj i biblioteki. W efekcie konsolidacji powstają dwa pliki.map i.exe. Program po linkowaniu test.exe (test.com) Linker zewnętrzny TLINK. Przykłady programów Program_1 void main() printf ("świat jest piękny tylko ludzie są brzydcy :)"); Program 2 #include<iostream.h> void main()
cout<<"gdyby ich nie było byłby jeszcze piękniejszy"; Wykonanie tych programów spowoduje wyświetlenie na ekranie monitora napisu zawartego w cudzysłowiach. Każdy program musi zawierać funkcję zwaną main(). Main() jest nazwą specjalną. Od niej rozpoczyna się wykonywanie programu. Treść tej funkcji (zwana ciałem funkcji), czyli instrukcje wykonywane w ramach tej funkcji, zawarte są między dwoma nawiasami klamrowymi... W naszych programach funkcja main() ma tylko jedną instrukcję: 1. printf ("świat jest piękny..."); 2. cout<<"gdyby ich nie było..."; średnik jest znakiem końca instrukcji. Każda instrukcja musi być zakończona średnikem. Język C/C++ jest językiem o tzw. wolnym formacie. Wszystko może się znaleźć w każdym miejscu linii, a nawet rozpisane na kilka linii. Poza nielicznymi sytuacjami, w dowolnym miejscu instrukcji można przejść do kolejnej linii i tam kontynuować pisanie, ponieważ koniec instrukcji określa nie koniec linii, ale średnik. Operacje we/wy nie należą do definicji języka C/C++ i umieszczone są w jednej ze standardowych bibliotek, aby można z niej było skorzystać musimy umieścić na początku programu linię: #include<iostream.h> Dyrektywa #include powoduje, że kompilator wstawia do programu plik nagłówkowy, biblioteki stdio lub iostream.zmodyfikujmy nasze programy w instrukcjach odpowiadających za wyświetlenie napisu: 1. printf ( Coś tam \ni coś tu"); 2. cout<<"coś tam \ni coś tu"; Wstawienie w środek tekstu znaku \n powoduje przerwanie wypisywania w bieżącym wierszu i jego kontynuację od początku w nowym wierszu: Coś tam I coś tu Miejsce wstawienia tego znaku zależy od sposobu w jaki chcemy wypisać komunikat. Znak \ informuje ze będzie to znak szczególny i należy go traktować w sposób specjalny. Oprócz znaku \n dostępne są inne znaki formatujące np.: \t - wstawienie zanku tabulacji, \a - wstawienie znaku dzwonka Program 3 #include <stdio.h> /* Program do wyznaczania pola powierzchni kwadratu o boku a */ void main() int bok, pole; printf ("wprowadź długość boku kwadratu bok = "); scanf ("%i", &bok); //pobierz wartość zmiennej bok z klawiatury pole = bok * bok; //instrukcja przypisania, bok * bok - wyrażenie
printf ("pole kwadratu o boku %i wynosi %i",bok,pole); Ekran: wprowadź długość boku kwadratu bok =_ //10 <Enter> pole kwadratu o boku 10 wynosi 100 Program 4 /* Program do wyznaczania pola powierzchni kwadratu o boku a */ #include <iostream.h> void main() int bok, pole; // <-32768, 32767> cout<<"wprowadź długość boku kwadratu bok="; cin>>bok; pole = bok * bok; cout << "pole kwadratu o boku "<< bok <<"wynosi "<<pole; Program 5 /* Program do wyznaczania długości okręgu */ #include <stdio.h> float r, obwod, pi; printf("wprowadź długość promienia r = "); scanf ("%f", &r); pi = 3.14; obwod = 2 * pi * r; printf ("Obwód okręgu wynosi %f ",obwod); Program 6 /* Program do wyznaczania długości okręgu */ #include <iostream.h> void main() float r, obwod, pi; cout<<"wprowadź długość promienia r="; cin>>r; pi = 3.14; obwod = 2 * pi *r; cout <<"Obwód okręgu wynosi <<obwod; W języku C++ komentarze moga być umieszczane dwojako: - ograniczenie tekstu znakami /*...*/. Komentarz taki może ciągnąć się przez wiele linijek. - zastosowanie znaków //. Kompilator po napotkaniu takich znaków ignoruje resztę linii do końca. - jest to komentarz charakterystyczny tylko dla C++. Komentarze /* i // moga się zagnieżdżać lub nie, tzn. nie można zapisać: /*.../*...*/...*/,
zależy to od kompilatora. W języku C/C++ rozróżnia się duże i małe litery. Słowa kluczowe są zastrzeżone i muszą być pisane małymi literami. Słowami kluczowymi są np.: int, float, for, while itp. są one częścią definicji języka. W języku C/C++ wszystkie zmienne muszą być zadeklarowane przed ich użyciem. Deklaracja składa się z nazwy typu i listy zmiennych danego typu. Instrukcje: 1. scanf ("%i", &bok); 2. cin>>bok; odpowiadają za operacje związane ze standardowym urządzeniem wejściowym (C-onsole INput). Umożliwiają one wczytanie z klawiatury liczby, której wartość zostaje przypisana zmiennej bok. Działanie funkcji scanf () opiera się na analizie lańcucha formatującego. "%i" łańcuch formatujący %i dziesiętna postać parametru Musimy pamietać o typie wczytywanej liczby, i o tym czy mamy wpisac znak & czy też nie przed nazwą zmiennej. Znak & jest operatorem pobrania adresu. Po wczytaniu danych następuje część obliczeniowa. Następne instrukcje odpowiadające za wydrukowanie wartości wyniku. 1. printf ("pole kwadratu o boku %i wynosi %i",bok,pole); 2. cout <<"pole kwadratu o boku "<<bok <<" wynosi "<<pole; Instrukcje te spowodują wyświetlenie na ekranie zarówno testów umieszczonych wewnątrz znaków cudzysłowia, jak i wartości zmiennych a i p. Działanie funkcji printf() opiera się na analizie łańcucha formatującego. "pole kwadratu o boku %i wynosi %i" - %i dziesiętna postać parametru bok %i dziesiętna postać parametru pole Ekran: pole kwadratu o boku 8 wynosi 64 łańcuch formatujący W miejscu gdzie został określony typ wyprowadzanej liczby przez znak %i zostanie wyświetlona wartość pierwszego argumentu czyli wartość zmiennej bok w formacie liczb całkowitych oraz w miejscu gdzie został określony typ wyprowadzanej liczby przez znak %i zostanie wyświetlona wartość drugiego argumentu czyli wartość zmiennej pole również w formacie liczb całkowitych.. Struktura programu jednomodułowego tzn. zapisanego w jednym pliku, Struktura programu w języku C/C++ jest następująca: 1. dyrektywy dołączające pliki nagłówkowe bibliotek standardowych i zdefiniowanych przez użytkownika 2. prototypy funkcji lub definicje funkcji 3. deklaracje zmiennych globalnych
4. słowo kluczowe main() 5. klamra 6. deklaracja zmiennych lokalnych 7. treść programu 8. klamra 9. definicje funkcji Znakowe funkcje wejścia/wyjścia Funkcje getchar(); putchar(c); Program 7 char c; c=getchar(); putchar(c); Zadeklarowana w programie zmienna jest typu char. Typ char najlepiej nadaje się do przechowywania i obsługi znaków w komputerze, jest to zwykle 8 bitowy bajt. W C/C++ rozmiary obiektów wyraża się wielokrotnością rozmiaru typu char. Zależnie od sprzętu char jest typem całkowitym bez znaku lub ze znakiem. Zawiera odpowiednio liczby całkowite z zakresu <0, 255> lub <-128, 127 >. Napewniej jest przyjąć zakres <0,127>. Program używa funkcji getchar() do czytania kolejnego znaku ze standardowego strumienia wejściowego(stdin) int getchar(void) i funkcji putchar() do wysyłania znaku do standardowego strumienia wyjściowego (stdout) int putchar(int) Makra getche(); putch(c); Program 8 char c; c = getch (); // bez echa putch (c); c = getche (); // z echem putch (c); Instrukcje wyboru Instrukcja warunkowa if Do sterowania przebiegiem programu służą instrukcje wyboru, które pozwalają lub nie wykonywać pewne fragmenty programu.
Wyrażenie. Wyrażenie jest ciągiem operatorów i argumentów które specyfikuje obliczenie. Przykłady wyrażeń: x<=2, a>0, a = = 0, a!= 0, 2*x+5, 2*x, 5 Wartość wyrażenia można testować za pomocą instrukcji if lub switch. Składnia instrukcji if jest następująca: lub if (wyrażenie) instrukcja1; if (wyrażenie) instrukcja1; else instrukcja2; Jeżeli obliczona wartość wyrażenia jest różna od zera to wykonuje się instrukcję1, jeżeli występuje else to instrukcja2 wykonuje się wtedy gdy wartość wyrażenia wynosi zero. W języku C/C++ nie ma osobnego typu logicznego czyli takiego, który przyjmuje wartości prawda i fałsz. Fałsz 0 Prawda 1 Operatory porównania: > < = = >= <=!= dają wartość 1, jeżeli warunek jest prawdziwy i 0 jeżeli warunek jest fałszywy. Program 1 int a; scanf ("%d", &a); if (a>0) // a > 0 - to jest wyrażenie warunkowe printf ("wprowadzono liczbę dodatnią\n"); printf ("Koniec"); Program 2 int a; scanf ("%d", &a); if (a>=0) // a >= 0 - to jest wyrażenie warunkowe printf ("wprowadzono liczbę dodatnią lub zero"); else // else czyli jeżeli a < 0 printf ("wprowadzono liczbę ujemną");
Program 2a int a, b; scanf ("%d", &a); if (a>=0) printf ("wprowadzono liczbę dodatnią lub zero"); b=0; else // else czyli jeżeli a < 0 printf ("wprowadzono liczbę ujemną"); b=1; printf ("\n a=%d b=%d", a, b); Przykład 3 int a = 9; if (a) printf (" jestem w if "); else printf ("jestem w else "); instrukcja if (a)...; jest równoważna instrukcji: if (a!= 0)...; Przykład 4 int y, x; x=20; y=4; // x=3; y=4; x=2; y=1; if (y-2*x) printf (" jestem w if "); else printf ("jestem w else "); a jest różne od zera instrukcja if (y-2*x)...; jest równoważna instrukcji: if ( (y-2*x)!= 0)...; y-2*x jest różne od zera Wartości wyrażenia innej niż zero odpowiada stan prawda (true) Wartości wyrażenia zero odpowiada stan fałsz (false)
instrukcja w if, if...else i switch nie może być deklaracją. W przypadku zagnieżdżonych instrukcji if... else, else jest wiązana z ostatnią instrukcją if bez else. if (a>0) if (b<0) printf ("a>0, b<0") else printf ("a>0 i b>=0") if (a>0) if (b<0) printf ("a>0, b<0") else printf ("a>0 i b>=0") else printf ("a<=0") użycie nawiasów klamrowych zmienia połączenia if z else if (a>0) if (b<0) printf ("a>0, b<0") //ponieważ użyto nawiasów else printf ("a<=0") Instrukcja switch() Składnia instrukcji: switch (wyrażenie) case wyrażenie_stałe: instr;... default: instr; Instrukcja switch powoduje przekazanie sterowania do jednej z ciągu instrukcji wyznaczonej wartością wyrażenie. wyrażenie musi być typu całkowitego lub musi być klasą dla której istnieje jednoznaczne przekształcenie do typu całkowitego. Najpierw obliczana jest wartość wyrażenie,, a nstępnie wynik porównuje się z kolejnymi stałymi przypadków wyrażenie_stałe. Jeśli któraś ze stałych jest równa wartości wyrażenie to sterowanie przekazuje się do instrukcji która jest poprzedzona tą etykietą. Jeśli wartość wyrażenia nie zgadza sie z żadną z wartości podanych w etykietach case i występuje etykieta default., to sterowanie przekazuje się do instrukcji które ta etykieta poprzedza, jeżeli etykieta default nie występuje, wówczas nie wykona się żadna z instrukcji zawartych w instrukcji switch. Wykonywanie instrukcji kończy się po napotkaniu instrukcji break która jest instrukcją skoku i powoduje opuszczenie bieżącej instrukcji switch. * Miejsce etykiety default jest dowolne, ale może ona wystąpić tylko jeden raz. * Może być tylko jedna etykieta z tą sama wartością
* Etykiety wyboru muszą być tego samego co wyrażenie typu całkowitego. Jeśli po etykiecie case nie umieścimy instrukcji break, wtedy będą wykonywane instrukcje umieszczone po kolejnej etykiecie case. Przykład 1 #include<iostream.h> char dzialanie; float w,a,b; dzialanie= cin>>a>>b; switch (dzialanie) case '+': w=a+b; case '-': w=a-b; case ': ': w=a/b; case '* ': w=a*b; default: cout<<"niepoprawny OPERATOR\n"; cout<<w; Przykład 2 #include<iostream.h> int nr, delta; cin>>nr; switch (nr) case 1: case2: case3: delta=1; case 4: delta=12; //brak instrukcji break powoduje wykonanie default default: delta=0; cout<<"delta="<<delta; Instrukcje switch mogą być zagnieżdżone. switch (rok_operacji)
case 1997: switch(litera) case a : drukuj_a(); case b : drukuj_b(); case 1998: switch(litera) case a : drukuj_a(); case b : drukuj_b(); default: cout<<" NIEPOPRAWNY ROK OPERACJI\n";