KURS C/C++ WYKŁAD 1
Transkrypt
KURS C/C++ WYKŁAD 1
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 #include<stdio.h> 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<stdio.h> #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> void main(){ 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" - � łańcuch formatujący %i � dziesiętna postać parametru bok %i � dziesiętna postać parametru pole Ekran: pole kwadratu o boku 8 wynosi 64 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 #include<stdio.h> void main(){ 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 getch(); getche(); putch(c); Program 8 #include<stdio.h> #include<conio.h> void main(){ 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: if (wyrażenie) instrukcja1; lub 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 Prawda 0 1 Operatory porównania: > < = = >= <= != dają wartość 1, jeżeli warunek jest prawdziwy i 0 jeżeli warunek jest fałszywy. Program 1 #include<stdio.h> #include<conio.h> void main(){ int a; scanf ("%d", &a); if (a>0) // a > 0 - to jest wyrażenie warunkowe printf ("wprowadzono liczbę dodatnią\n"); printf ("Koniec"); getch(); } Program 2 #include<stdio.h> #include<conio.h> void main(){ 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ą"); getch(); } Program 2a #include<stdio.h> #include<conio.h> void main(){ 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); getch(); } Przykład 3 #include<stdio.h> #include<conio.h> void main(){ int a = 9; if (a) printf (" jestem w if "); else printf ("jestem w else "); getch(); } instrukcja if (a) ....; jest równoważna instrukcji: if (a != 0) ....; a jest różne od zera Przykład 4 #include<stdio.h> #include<conio.h> void main(){ 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 "); getch(); } 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; break; .... default: instr; break; } 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> #include<conio.h> void main(){ char dzialanie; float w,a,b; dzialanie=getch(); cin>>a>>b; switch (dzialanie){ case '+': w=a+b; break; case '-': w=a-b; break; case ': ': w=a/b; break; case '* ': w=a*b; break; default: cout<<"NIEPOPRAWNY OPERATOR\n"; break; } cout<<w; getch(); } Przykład 2 #include<iostream.h> #include<conio.h> void main(){ int nr, delta; cin>>nr; switch (nr){ case 1: case2: case3: delta=1; break; case 4: delta=12; //brak instrukcji break powoduje wykonanie default default: delta=0; } cout<<"delta="<<delta; getch(); } Instrukcje switch mogą być zagnieżdżone. switch (rok_operacji){ case 1997: switch(litera) { case �a�: drukuj_a(); break; case �b�: drukuj_b(); break; } break; case 1998: switch(litera) { case �a�: drukuj_a(); break; case �b�: drukuj_b(); break; } break; default: cout<<" NIEPOPRAWNY ROK OPERACJI\n"; }