Wprowadzenie do jezyka C, Tutoriale, Programowanie


Wstęp do programowania w języku C++

  1. Informacje podstawowe

ALGORYTM to przedstawienie rozwiązania zadania w sposób uporządkowany,
tj. z wyszczególnieniem kolejnych czynności.

Program napisany w języku programowania jest jednym ze sposobów zapisu algorytmu.

W języku C, C++ dozwolone jest używanie niżej wymienionych znaków:

A - Z - wielkie litery (bez polskich znaków)

a - z - małe litery (bez polskich znaków)

0 - 9 - cyfry

spacja . , : ; ' $ "

# % & ! _ {} [] () < > |

+ - / * =

Z tych znaków możemy budować nazwy, które będziemy używać w naszych programach. Każda nazwa przed użyciem musi zostać zadeklarowana, czyli musimy poinformować kompilator z jakim typem obiektu, po napotkaniu naszej nazwy, ma do czynienia.

Język C/C++ należy do języków o swobodnym formacie. Pisząc program instrukcje umieszcza się jedna po drugiej w kolejności zależnej od realizowanego algorytmu. Miejsce instrukcji w pisanej linii jest dowolne. Może być ona napisana na początku, w środku, rozbita na kilka linii. Jej koniec (instrukcji) nie jest oznaczony przez przejście do nowej linii, lecz przez średnika. Musi się on znaleźć zawsze na końcu naszej instrukcji.

Napisany przez nas program nie jest w takiej postaci zrozumiały przez komputer. Musi zostać przetłumaczony na język maszynowy. Tym zajmuje się kompilator. Niestety to jeszcze nie wszystko. W naszym programie bowiem występować będą biblioteki, czyli gotowe funkcje.
W trakcie kompilacji sprawdzane jest jedynie odwołanie do bibliotek. Jeżeli kompilacja przebiegnie poprawnie uruch
amiany jest linker, czyli taki program, który zlinkuje, czyli połączy nasz program i treść funkcji bibliotecznych. Dopiero teraz otrzymamy gotowy do uruchomienia program.

  1. Typy zmiennych

W języku C/C++ mamy do dyspozycji następujące typy zmiennych:

Inny podział typów, to:

My zajmiemy się typami podstawowymi. Możemy je podzielić na typy reprezentujące:

Zarówno typy reprezentujące liczby całkowite, jak i znaki alfanumeryczne, mogą wystąpić
w dwóch wariantach. Mogą być ze znakiem, piszemy wówczas signed, lub bez znaku - unsigned.

W tabeli zebrano określenia typów wraz z zakresem przyjmowanych wartości i liczbą zajętych bajtów.

Nazwa typu

Typ

Zakres

Wielkość

(w bajtach)

Uwagi

char

całkowity(znaki)

-128 … 127

1

 

unsigned char

całkowity(znaki)

0..255

1

 

int

całkowity

-231..231-1

4

Na kompilatorach 16 bitowych ma 2 bajty

unsigned int

całkowity

0 … 4,294,967,295

4

Na kompilatorach 16 bitowych ma 2 bajty

short int

całkowity

-32768..32767

2

 

unsigned short int

całkowity

0 … 65535

2

 

long int

całkowity

-2,147,483,648 ... 2,147,483,647

4

 

unsigned long int

całkowity

0 ... 4,294,967,295

4

 

float

zmiennoprzecinkowy

3.4 x 10-38 ...

3.4 x 10+38

4

 6 znaków precyzji

double

zmiennoprzecinkowy

1.7*10-308..1.7*10+308

8

 10 znaków precyzji

long double

zmiennoprzecinkowy

3.4*10-4932..1.1*104932

10

Do typów pochodnych zaliczamy:

  1. Deklaracje

    1. Deklaracje zmiennych

Pisząc program często wykonujemy różne operacje na liczbach chcemy nie tylko. Nie chcemy jednak napisać programu, który wykonuje swoje działanie dla jednych, konkretnych, ściśle określonych danych. Dlatego musimy umieścić w naszym programie zmienne, które zastąpią nam konkretne liczby i umożliwią napisanie programu pozwalającego na szersze jego zastosowanie. Miejsce, w którym umieścimy deklaracje zmiennych jest dowolne. Wymagane jest jedynie,
by deklaracja wystąpiła przed wywołaniem zmiennej. Możemy więc zadeklarować zmienne
na początku programu umieszczając wszystkie deklaracje razem. Możemy też umieścić je między poszczególnymi instrukcjami programu, czyli tuż przed miejscem, w którym użycie danej zmiennej okaże się niezbędne.

Deklaracja zmiennej w programie wygląda tak:

typ_zmiennej nazwa_zmiennej;

gdzie:

typ_zmiennej - jeden z typów dostępnych w języku,

nazwa_zmiennej - nazwa, jaką nadaliśmy naszej zmiennej, nie może być to słowo kluczowe języka i byłoby dobrze, gdyby była związana z zastosowaniem, przeznaczeniem naszej zmiennej.

Przykłady:

0x01 graphic

    1. Deklaracja stałych

Jeżeli w programie mamy elementy, których wartości nie mogą ulec zmianie, to nazywamy je obiektami stałymi. Na przykład liczba π, która może być wykorzystywana przy obliczaniu obwodu i pola koła. Możemy ją zdefiniować nadając jednocześnie odpowiednią wartość.

float pi=3.14;

Jednakże może się zdarzyć, że w innej części programu przez roztargnienie zmienimy wartość pi. Żeby mieć pewność, że taka sytuacja nie zaistnieje, powinniśmy poprzedzić naszą definicję słowem kluczowym const. W ten sposób powstanie definicja obiektu stałego.

const float pi=3.14;

W tym momencie też inicjalizujemy wartość naszej liczby pi. Nie możemy tego zrobić później. Obiekty zadeklarowane i zainicjowane ze słowem const nie mogą być w żaden sposób
w programie zmieniane.

Inicjalizacja - nadanie wartości obiektowi w momencie jego powstania, deklarowania.

  1. Budowa programu

Ogólny układ programu w C jest następujący:

Dyrektywy preprocesora

Deklaracje ogólne

Main()

{

lokalne zmienne funkcji main;

instrukcje do wykonania;

}

Definicje funkcji

Wszystkie programy pisane w C muszą zawierać przynajmniej jedną funkcję, choć zwykle mają ich więcej. W każdym programie musi wystąpić funkcja o nazwie main.

Funkcja main jest pierwszą funkcją, która jest wykonywana, gdy program jest uruchamiany. Program kończy działanie z zakończeń wykonywania ostatniej instrukcji funkcji main.

A teraz kilka ogólnych uwag dotyczących pisania programu w C:

  1. Dyrektywy preprocesora to specjalne polecenia, które powodują odpowiednią kompilację programu, a jednocześnie nie mają wpływu na jego przebieg po kompilacji. Pierwszym opisanym poleceniem będzie #include. Powoduje ono dołączenie do naszego programu pliku z kodem źródłowym, który chcemy wykorzystać w naszym programie.

  2. Deklaracje zmiennych nie mają ściśle określonego miejsca. Wygodnie jest je umieszczać razem w jednym miejscu. Na pewno muszą wystąpić przed swoim pierwszym wywołaniem. Zależnie od miejsca deklaracji mają różny zasięg dostępności.

  3. Z funkcjami postępujemy podobnie jak ze zmiennymi. Muszą zostać zadeklarowane przed swoim pierwszym wywołaniem. Należy pamiętać o średniku za deklaracją funkcji.

  4. Jak już zostało napisane w programie musi wystąpić funkcja main. Jej położenie
    w programie jest dowolne. Na pewno za to zostanie uruchomiona jako pierwsza ze wszystkich funkcji naszego programu.

  5. Wewnątrz funkcji umieszczane są zmienne lokalne, czyli takie, które ważne są jedynie
    w obrębie tej funkcji. Podobnie, jak zmienne ogólne, muszą zostać zadeklarowane przed swoim pierwszym użyciem.

  6. Oprócz deklaracji funkcji, czyli informacji, że w programie znajduje się funkcja określonego typu o danej nazwie, wykorzystująca opisane zmienne, musi się również znaleźć definicja funkcji.

  7. Definicja funkcji to nazwa funkcji, jej typ, zmienne przekazywane i zwracana wartość oraz instrukcje, które są wykonywane przez naszą definiowaną funkcję. Instrukcje muszą znaleźć się w nawiasach klamrowych, lecz za zamykającym nawiasem nie stawiamy średnika.

Najprostszy program:

#include <stdio.h>

main()

{

printf („Witam i o zdrowie pytam”);

}

Powyższy program wypisuje na ekranie tekst „Witam i o zdrowie pytam”. Można napisać jeszcze prostszy program, który nie będzie niczego wykonywał. Wystarczy opuścić w naszym programie funkcję printf. Tylko wtedy nie zobaczymy żadnego efektu działania programu.

Jakie są jego elementy składowe?

Na początek dyrektywy preprocesora, które muszą być poprzedzone znakiem #, a ich pisanie musimy rozpocząć w pierwszej kolumnie tekstu. Tu nie ma dowolności.

#include <stdio.h> - dołącza bibliotekę, w której umieszczone są prototypy funkcji umożliwiających wprowadzanie i wyprowadzanie informacji do i z naszego programu, czyli takie programy, które są odpowiedzialne za kontakt ze światem zewnętrznym. Jest to plik nagłówkowy stdio.h. Instrukcja ta musi znaleźć się przed funkcją main. Nazwę nagłówka umieszczamy w ostrych nawiasach (< >). Takie podanie nazwy oznacza, że plik nagłówka będzie szukany na dysku systemowym, który zawiera resztę aplikacji. Niektóre książki podają inną postać nagłówka:

#include "stdio.h"

“” - oznacza, że pliku nagłówkowego należy szukać w aktualnym katalogu. Będzie to prawdą, gdy napiszemy własny plik nagłówkowy, ale standardowe pliki powinny być podawane
w ostrych nawiasach.

Uwaga: nie używaj średnika do oddzielania plików nagłówka, ale nie zapomnij o znaku #
w pierwszej kolumnie
.

W naszym programie nie zadeklarowaliśmy żadnych zmiennych, gdyż nie były one potrzebne. Przejdziemy teraz do kolejnej części programu.

Pierwsza linia jest standardowym początkiem wszystkich programów C - main(). Po niej znajduje się instrukcja w nawiasach klamrowych { }. Te nawiasy oznaczają początek i koniec listy instrukcji, które tworzą program - w tym przypadku jest tylko jedna instrukcja. Średnik ; oznacza koniec instrukcji.

Można się zastanowić, dlaczego nawiasy klamrowe są w różnych liniach, a nie w jednej. Można nasz program zapisać w postaci:

main(){printf("Witam i o zdrowie pytam ");}

lecz w ten sposób się raczej nie pisze, jest on bowiem mało czytelny.

Funkcja printf działa tak, jak sugeruje jej nazwa: drukuje, na ekranie, wszystko to, co się jej każe. Zobaczmy, jakie są jej możliwości.

  1. Wprowadzanie i wyprowadzanie informacji

    1. Wyprowadzanie informacji - instrukcja printf

Instrukcja ta umożliwia wyprowadzenie tekstu lub liczby na ekran monitora. Kursor po wykonaniu instrukcji pozostanie na końcu wyprowadzanego tekstu. Jej postać jest następująca:

printf(”ciąg_sterujący”, lista_zmiennych);

gdzie

ciąg_sterujący - ciąg znaków, zwykle sterujących, podany w cudzysłowie,

lista_zmiennych - nazwa zmiennej lub wielu zmiennych oddzielonych przecinkami, których wartość ma być wyświetlona na ekranie.

Bardzo ważnym elementem tej funkcji jest właśnie ciąg_sterujący, bowiem w nim zawarta jest informacja o typie i sposobie wyprowadzania zmiennych podanych w funkcji printf.

W naszym przykładzie wyświetlony ma zostać tylko tekst, podajemy go w cudzysłowie i nie dodajemy żadnych informacji o sposobie wyświetlania zmiennych. Po prostu ich nie ma.

Jednakże bardzo często niezbędne jest wyświetlenie na ekranie wyniku liczbowego, czyli wartości naszej zmiennej. Wtedy nasza funkcja przybierze postać

printf(”ciąg_sterujący_%typ_zmiennej”, lista_zmiennych);

Funkcja analizuje ciąg_sterujący począwszy od pierwszego znaku. Wyświetla napotkane znaki tak długo, aż pojawi się znak %, który jest sygnałem, że w podanej specyfikacji funkcji podana jest również zmienna, której wartość ma zostać wyświetlona. Typ_zmiennej mówi, że wyświetlana wartość zmiennej jest oznaczona jako typ_zmiennej i zostanie zamieniona na odpowiadający tej postaci ciąg znaków. Funkcja analizuje kolejne znaki, jeśli jest to tekst, to wyświetla go znak po znaku, aż znów napotka znak %. Ponownie wyświetla wartość zgodnie z podaną specyfikacją
i idzie dalej. Kończy swoje działanie wtedy, gdy napotka drugi ”.

Należy zwrócić uwagę na to, by wyspecyfikowany typ był więc zgodny z typem zmiennej, jaki został zadeklarowany dla niej w programie. Jeżeli bowiem zechcemy wyświetlić jako Integer (zmienna tego typu zajmuje dwa bajty) zmienną typu Double (ta zmienna zajmuje osiem bajtów), to zostaną wykorzystane do tego celu jedynie dwa pierwsze bajty informacji.

W tabeli zestawione zostały wybrane oznaczenia typów zmiennych dla funkcji printf.

Określenie formatu dla %

Oznaczenie

Typ

Objaśnienie

%c

char

Pojedynczy znak, litera

%d (%i)

int

Liczba całkowita ze znakiem w systemie 10

%e (%E)

float lub double

Liczba w formacie wykładniczym

%f

float lub double

Liczba zmiennoprzecinkowa ze znakiem

%g (%G)

float lub double

Wybiera krótszy format %f lub %e

%o

int

Liczba wyświetlana w systemie ósemkowym bez znaku

%s

tablica znaków

Ciąg znaków

%u

int

Liczba całkowita bez znaku

%x (%X)

int

Liczba wyświetlana w systemie HEX bez znaku

%%

Znak %

Dodatkowo funkcja printf pozwala na formatowanie wyświetlanego tekstu, czyli na jego ułożenie na ekranie. W poniższych tabelkach zestawione zostały flagi, kody sterujące i znaki specjalne, które należy umieścić w celu uzyskania odpowiedniego wyglądu informacji na ekranie.

Flagi:

-

wyrównuje do lewej, standardowo do prawej

+

zawsze wyświetla znak liczby

Kody sterujące wypisywaniem tekstu i znaki specjalne:

\b

przesuń w lewo o znak (backspace)

\n

nowa linia

\f

nowa strona

\t

pozioma tabulacja, kursor przesunięty o wielkość tabulatora w prawo

\ r

przesunięcie do początku linii, powrót karetki

\v

tabulator pionowy

\”

znak ”, bez \ oznaczałby koniec ciągu sterującego

\\

znak \, czyli backslash

\'

apostrof

\?

znak zapytania

Dodatkowo można określać sposób wyświetlania samej liczby, czyli z ilu znaków powinna się składać i ile mieć miejsc po przecinku. Składnia jest wtedy następująca:

„% [flagi] [szerokość].[precyzja] [wielkość] typ_zmiennej”

gdzie

szerokość - liczba wszystkich znaków liczby, jeśli podana liczba znaków jest większa niż liczba znaków liczby, to dodane zostaną spacje, w przeciwnym wypadku liczba nie zostanie obcięta; jeżeli poprzedzimy ten parametr zerem (0), to brakujące do długości znaki zostaną uzupełnione zerami;

precyzja - liczba wyświetlonych miejsc po przecinku;

wielkość - czy liczba jest typu long (%ld) czy short (%hd).

Przykłady:

printf("Total = %+d",total); - na ekranie pojawi się napis Total = , a za nim wartość zmiennej total wyświetlona jako liczba całkowita w systemie dziesiętnym.

Funkcja printf analizuje ciąg sterujący od lewej strony do prawej. Ponieważ początek jest zwykłym tekstem wypisuje go znak po znaku. Po napotkaniu znaku % dostaje wiadomość, że teraz nastąpi informacja o sposobie wyprowadzenia zmiennej na ekran. Analizuje teraz kolejno znaki znajdujące się po %. W naszym przypadku będzie wyprowadzać na ekran liczbę w postaci całkowitej ze znakiem
w systemie dziesiętnym. Jest to pierwsza wyprowadzana wartość zmiennej. Przechodzi do kolejnego znaku ciągu sterującego. Teraz jest to
", funkcja kończy analizę ciągu, więcej zmiennych nie będzie
i odczytuje nazwę zmiennej, której wartość ma wyświetlić w formacie podanym w funkcji printf. Wyświetla wartość zmiennej, nie zmieniając po wyprowadzeniu położenia kursora, kończy działanie funkcji printf.

printf("%+6.2f ", x) - na ekranie zostanie wyświetlona wartość zmiennej x ze znakiem („+” - jeśli dodatnia, „-„ - dla ujemnej), będzie miała ona 6 cyfr, w tym dwie
po przecinku;
-

    1. Wprowadzanie informacji - instrukcja scanf

Instrukcja ta umożliwia wprowadzenie danych z zewnątrz (np. z klawiatury) do uruchomionego programu. Ważne jest, że scanf zamienia ciąg znaków na wartość im odpowiadającą, umieszczoną
w odpowiednim miejscu pamięci. Postać instrukcji jest następująca:

scanf(„ciąg_sterujący”,&zmienna1,&zmienna2,...);

gdzie

ciąg_sterujący - podawany jest w cudzysłowie, określa, w jaki sposób ciąg znaków (zwykle podawany z klawiatury) powinien zostać zamieniony na liczbę przyporządkowaną zmiennej;

&zmienna- adres zmiennej, gdzie przechowywana jest jej wartość, tam zostanie umieszczona liczba po jej konwersji z wprowadzonych znaków; nazwę zmiennej obowiązkowo należy poprzedzić znakiem &.

Wprowadzając dane możemy:

Przykład:

scanf(„%d %d”,&k,&j); - oznacza wprowadzenie (wczytanie) dwóch wartości całkowitych do k
i
j. Liczby mogą być podane (napisane) w tej samej linii, musi między nimi wystąpić przynajmniej jedna spacja, lub w różnych liniach tak długo, aż zostanie podany ostatni znak liczby.

Podobnie jak printf, również scanf potrzebuje informacji o typie wprowadzanej wartości. Służą
do tego te same określenia.

  1. Instrukcja przypisania

To jedna z najważniejszych instrukcji każdego języka programowania. Pozwala na nadanie zmiennej określonej wartości, obliczenie wyrażeń matematycznych, przypisanie zmiennej wyniku działania funkcji.

Operatorem przypisania jest znak równości =.

Przy pisaniu tej instrukcji należy pamiętać, że nazwa zmiennej, której przyporządkowywać będziemy wartość wyrażenia, musi znajdować się po lewej stronie instrukcji. Za znakiem = podajemy przyporządkowywane wyrażenie.

Składnia

zmienna = wyrażenie;

Wykonanie instrukcji powoduje przypisanie zmiennej, stojącej po lewej stronie symbolu =, wartości wyrażenia zapisanego po prawej jego stronie. Wyrażenie musi być tego samego typu, co zmienna.

Przykład:

i = i + 1; //nieprawdziwe matematycznie, oznacza, że wartość zmiennej i zostanie zwiększona o 1

x = 3; //w zmiennej x znajdzie się wartość 3

  1. Operatory arytmetyczne, relacji, logiczne

    1. Operatory arytmetyczne

Do realizacji działań arytmetycznych stosowane są przedstawione w tabeli operatory dwuargumentowe:

Znak

Opis

+

Dodanie dwóch wartości

-

Odjęcie jednej wartości od drugiej

/

Podzielenie jednej wartości przez drugą

*

Pomnożenie jednej wartości przez drugą

%

Reszta z dzielenia dwóch liczb, dzielenie modulo

Dodatkowo możemy wykorzystywać w programie dwa operatory jednoargumentowe:

++

Inkrementacja, zwiększenie o 1

--

Dekrementacja, zmniejszenie o 1

Operatory te mogą przyjąć dwie formy: