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";
}