PODSTAWA PROGRAMOWANIA W C++, Technik Informatyk, C


Podstawy programowania - Język C

Program w języku C składa się z różnych elementów: dyrektyw preprocesora, komentarzy, deklaracji, funkcji i zmiennych. Te „trudne” pojęcia będą kolejno wyjaśniane.

Najprostszy program, wypisujący na ekranie komputera tekst „Niech zyje C” może wyglądać następująco:

0x08 graphic

Oczywiście program taki trzeba skompilować i uruchomić, ale zakładam, że „ten problem to nie problem”. Zajmiecie się Państwo tym na laboratorium. Po uruchomieniu programu otrzymacie na ekranie napis: „ Niech zyje C ”. Czyli na razie świetnie.

Program składa się z:

- dyrektywy preprocesora #include <stdio.h> nakazującej dołączenie do programu biblioteki, zawierającej często wykorzystywane funkcje oraz predefiniowane stałe. Warto zapamiętać, że pewne biblioteki dołącza się standardowo do praktycznie każdego programu w C.

Proszę też zapamiętać, że dołączana w tym wypadku (i w przypadku wszystkich Państwa programów) biblioteka nazywa się stdio.h a nie studio.h jak często piszą studenci (od standard I/O wejście wyjście a nie od STUDIA!).

- deklaracji funkcji main.

Funkcja main pełni szczególną rolę w C. W każdym programie w C musi znajdować się funkcja main i od niej zaczyna się wykonywanie programu. Funkcja, jak pamiętamy z Pascala, może otrzymać określone dane (argumenty) jak też zwracać wynik jej działania. W naszym przypadku funkcja main nie otrzymuje żadnych argumentów i nie zwraca żadnego wyniku. Możemy to podkreślić pisząc w ten sposób:

void main (void), gdzie void oznacza „pusty, nieokreślony”, w tym wypadku brak argumentów.

Po main() nie ma średnika!, jest natomiast ciało funkcji, czyli ciąg realizowanych przez nią instrukcji, który rozpoczyna się znakiem { i kończy znakiem }.

Znaki { i } pełnią podobną rolę jak w Pascalu słowa begin i end. Tak więc możemy się ich spodziewać jako oznaczenie zawartości funkcji, instrukcji w pętli oraz w instrukcjach warunkowych.

- komentarzy. W programie jest przykładowy, choć pozbawiony większego sensu komentarz. Komentarze w C są to bloki tesktu ograniczone znakami /* na początku i */ na końcu. Można także stosować znak // i po tym znaku wypisać komentarz, który wtedy musi kończyć się w tej samej linii np.:

// to jest komentarz, który musi skończyć się w tej linii

/* a ten komentarz

może być zapisany w kilku liniach musi się jednak kończyć znakiem: */

Proszę zapamiętać, że dawanie komentarzy w programach jest dobrym zwyczajem, jednak złym zwyczajem jest dawanie głupich komentarzy typu „A teraz wypisuję tekst”. Przykładem głupiego komentarza jest także ten w podanym przykładzie.

- właściwego opisu czynności jakie ma realizować dana funkcja, oddzielonych średnikami. W naszym przypadku jest to funkcja wypisująca na ekranie odpowiedni tekst. Funkcja ta nazywa się printf. Aby z niej skorzystać musieliśmy dołączyć ją z biblioteki studio.h na samym początku.

Funkcja printf jako argument, określony w nawiasach, dostaje „elementy” które mają zostać wypisane. W naszym przypadku jest to łańcuch tekstowy Nich zyje C. Proszę zapamiętać, że w C łańcuchy tekstowe podawane są w cudzysłowach, a nie w apostrofach (w Pascalu).

W wypisywanym łańcuchu pojawia się także sekwencja /n. Jest to sekwencja, która spowoduje przejście do nowej linii. Jest wiele sekwencji specjalnych, których opis przedstawię później.

Do prostego wyprowadzania komunikatów na ekran służyć może funkcja puts(łańcuch_tekstowy). Można więc zastąpić fragment z printf(...) za pomocą:

puts (”Niech zyje C”);

Z tym, że puts służy wyłącznie do wyświetlania łańcuchów tekstowych (i zmiennych tekstowych),a printf ma o wiele większe możliwości, co poznamy w dalszej części.

Zmienne, wyrażenia

Tak więc najprostszy program mamy za sobą. Teraz będzie trudniej ale mam nadzieję, że ciekawiej. No bo jaka korzyść będzie z Państwa jako programistów umiejących jedynie generować na ekranach różne, nawet najbardziej genialne napisy? Przejedziemy do zmiennych, wyrażeń i problemu wypisywania zmiennych.

Zmienna jest to „obiekt” przechowujący w pamięci dane określonego typu, posiadający określoną nazwę. Czyli takie pudełko na dane. Tak jak w życiu: w innych pudełkach przechowuje się buty a w innych jajka w innych jeszcze klucze. Niewłaściwe wykorzystanie tych pudełek, choć czasami możliwe, często prowadzi do nieporządanych sytuacji (wyobraźcie sobie jajka włożone do kieszeni na klucze).

Tak więc zmienna ma nazwę i typ. Przed swoim wykorzystaniem musi być także zadeklarowana (określony musi zostać jej typ oraz nazwa), najczęściej na początku funkcji. Typy zmiennych mają swoje nazwy a najpopularniejsze z nich to:

int (liczby całkowite), char (znaki ASCII lub liczby całkowite), double („duze” liczby całkowite), float (liczby z przecinkiem).

Zakresy wartości jakie przypisane są do poszczególnych typów zależą od kompilatora. Możemy jednak przyjąć, że int odpowiada Pascalowemu integer, char przechowa dowolny znak ASCII, float to real z Pascala.

Przykładowe deklaracje:

int stopien, liczba // dwie zmienne - stopień i liczba typu int

char znak // zmienna znak typu char

double a1, _A2, max // zmienne a1, a2, max typu double

float liczba_z_przecinkiem // zmienna typu float

Jak widać zasada jest prosty: najpierw indetyfikator typu potem, oddzielone przecinkami, identyfikatory (nazwy) zmiennych. Proszę zauważyć, że identyfikatory zmiennych, ale także nazwy funkcji, stałych i innych „obiektów” w C są to ciągi małych i dużych liter, cyfr (nie mogą się jednak od cyfr zaczynać) i znaku podkreślenia „_” (czyli tak samo jak w Pascalu). Ale uwaga: Język C rozróżnia małe i duże litery, tak więc Ala i ALA to DWA różne identyfikatory!

Tak utworzonym zmiennym przypisujemy wartości za pomocą znaku „=” (a nie „: =” jak w Pascalu). Tak więc możemy przypisać:

stopien = 5; znak = `a'; a1 = _A2 = 20000;

liczba_z_przecinkiem = 23.34;

Proszę zwrócić uwagę, że możemy wielokrotnie używać znaku „=” w przypisaniu tworząc odpowiednie łańcuchy, gdzie wartości przypisywane są od prawej strony do lewej (a = b = c = liczba = 123;).

Proszę także zapamiętać sposób wprowadzania zmiennych: dla łańcuchów tekstowych jest to tekst w cudzywłowach, dla pojedynczych znaków (char) jest to znak w apostrofach.

Oczywiście w przypisaniach możemy budować bardziej skomplikowane wyrażenia. Pisząc wyrażenie musimy zwracać uwagę na PRIORYTETY, czyli na kolejność, w jakiej wykonane zostaną operacje. Niektórzy narzekają na to, że priorytety nie zostały dobrane zbyt intuicyjnie, niestety jest to fakt, który musimy jakoś zaakceptować i się do niego przyzwyczaić. W każdym przypadku, gdy mamy wątpliwości, możemy korzystać z nawiasów okrągłych „(” i „)” wiedząc, że operacje w nawiasach wykonane zostaną w pierwszej kolejności. Do problemu priorytetów jeszcze wrócimy, gdy poznamy już większość operatorów.

Przykłady wyrażeń:

c = 2;

a = 2 + 3; // największy banał

b = 7 + 2 * a; // b = 17, prawda?

b = 2*b; // b = 34

a = a*b/c*d // Uwaga! tutaj mamy 0x01 graphic

a = (a*b)/(c*d) // tutaj zastosowaliśmy nawiasy aby operacja odpowiadała 0x01 graphic

Teraz trochę porządku. Mamy do dyspozycji następujące operatory arytmetyczne:

+, -, *, / (te są doskonale Państwu znane) oraz

% to jest operator dzielenia modulo, a więc „reszta z dzielenia” (odpowiada mod z Pascala)

Inną grupę stanowią operatory inkrementacji ++ i dekrementacji --. Stosuje się je do ZMIENNYCH w wyrażeniach. Wyróżnia się operator POSTinkremenracji i POSTdekrementacji jeśli znak ++ lub - występuje PO nazwie zmiennej oraz PREinkrementacji i PREdekrementacji jeśli znaki te występują PRZED nazwą zmiennej. I tak operatory PRE powodują zwiększenie lub zmniejszenie wartości zmiennej PRZED obliczeniem wyrażenia, a POST dopiero po jego wykonaniu. Różnica ta ma OGROMNE znaczenie, dlatego proszę szczególną uwagę zwrócić na przykłady:

a++; // zwiększa zawartość zmiennej a o 1 (a = a + 1)

++a; // preinkrementacja, ale na razie działa tak samo (a = a + 1)

b--; // zmniejsza b o 1 (b = b - 1)

--b; // predekrementacja, działa jak wyżej

ale uwaga:

a = 1; // i teraz w zależności od operacji:

0x08 graphic
0x08 graphic

b = ++a; /* wynik -> b = 2 bo b = a++; /* wynik -> b = 1, bo

NAJPIERW (PRE) zwiększono a */ a zwiększono PO (POST) obliczeniu wyrażenia */

Podsumowując PRE inkrementacja jest obliczana najpierw, a potem reszta wyrażenia, POST inkrementacja jest obliczana i zmienia wartość zmiennej PO obliczeniu całego wyrażenia. Aha: post i pre wyrażenia są bardzo „modne” na sprawdzianach, bo są „podchwytliwe” a prowadzący lubią podchwytliwe pytania, żeby sprawdzić, czy Państwo myślicie.

Ciekawostka: przed językiem C był język B. C powstał jako jego następca (o „jeden” lepiej w alfabecie). Tak więc po poznaniu operatora ++ wiecie już, czemu kolejny, obiektowy, „lepszy” następca C nazywa się C++.

Ułatwienia w budowaniu wyrażeń

Przy tworzeniu wyrażeń w C poza operatorem przypisania „=” możemy także stosować operatory „+=”, „-=”, „*=”, „/=”. Odnoszą się one do odpowiedniej operacji i poprzedniej wartości danej zmiennej. Na przykład zamiast pisać:

a = a + 5;

można napisać

a += 5.

Zamiast:

liczba2 = liczba 2 - liczba1;

zapiszemy:

liczba2 -= liczba1.

Podobnie z „*=” i „/=”. Są jeszcze inne, podobne, ale rzadziej wykorzystywane operatory, które poznamy później (o ile starczy czasu i semestru). Taki zapis zwiększa zwięzłość programu i przyspiesza jego pisanie, szczególnie, gdy nazwy zmiennych są długie lub, gdy posługujemy się odwołaniami do „długich” pól rekordów. Więcej przykładów będzie później.

Ciekawostka: rozwiązania te, jak i wiele innych, pochodzą jeszcze z czasów, gdy komputery miały mało pamięci i każdy zyskany bajt był cenny. Są jednak przydatne i teraz. Ale miło jest powspominać czasy pierwszych komputerów i cuda jakich dokonywali programiści by zmieścić grywaną grę na 48 KILO ! bajtach pamięci.

Poza wymienionymi mamy do dyspozycji wiele innych operatorów, rzadziej wykorzystywanych, dotyczących na przykład operacji na bitach lub często wykorzystywanych (wskaźniki, tablice), które będziemy omawiać stopniowo. Dokładne ich omówienie można znaleźć w każdej książce do C.

Wyrażenia logiczne i relacji

W wyrażeniach możemy także stosować operatory logiczne oraz relacji, wszędzie tam, gdzie chcemy uzyskać wynik o charakterze logicznym prawda lub fałsz. W języku C także dowolne wyrażenie liczbowe może być potraktowane jako logiczne: jeśli jego wynik to 0 (zero) to traktuje je jako fałsz, a jeśli różne od 0 to jako prawdę.

Operatory relacji i logiczne są następujące:

>, <, <=, >=, !=, == oraz operator negacji logicznej ! (NOT).

Uwaga! Znany z Pascala operator „<>” (różny) w C jest „!=”. Operator PORÓWNANIA wygląda tak „= =”. BARDZO BARDZO WAŻNE jest aby nie mylić go z operatorem przypisania „=”. Jest to błąd, jeden z wielu, który NIE zostanie wykryty przez kompilator.

Oczywiście można budować złożone wyrażenia logiczne korzystając z łączenia warunków AND („&&”) oraz OR („||”). Na przykład: ((a > b) && (b = = 5) || c = = 10) czyli a większe od b I b równe 5 LUB c równe 10.

Instrukcje warunkowe

Skoro poznaliśmy my już część operatorów, czas przypomnieć pojęcie instrukcji warunkowej, która pozwoli na konstruowanie bardziej sensownych przykładów programów. Podstawowa instrukcja warunkowe Jeżeli ma postać:

if ( wyrażenie)

instrukcja1

else

instrukcja2

Działanie jest Państwu doskonale znane z Pascala: jeżeli wyrażenie daje w rezultacie wynik różny od zera (czyli TRUE - prawda) to powoduje to wykonanie instrukcji1, jeśli w rezultacie mamy 0, wykonuje się instrukcja2. Część else można pominąć. A więc banalny przykład:

if (a > 0) printf (”a jest większe od zera”);

lub z else:

if (a > 0) printf (”a jest większe od zera”);

else

printf(”a jest mniejsze lub rowne 0”);

Przykłady banalne ale w tym momencie warto zwrócić uwagę na kilka zasadniczych kwestii, gdzie często później popełniacie błędy:

- nie ma słowa kluczowego then znanego z Pascala.

- każda instrukcja kończy się średnikiem, a więc należy taki średnik postawić także przed else.

Jeśli chcemy po if lub else wykonać więcej niż jedną instrukcję stosujemy instrukcję złożoną, podobnie jak w Pascalu, z tym że zamiast begin-end stosujemy nawiasy klamrowe { }. A więc:

if (b > 0 && a < 0) {

printf (”a jest mniejsze od zera”);

printf (”b jest większe od zera”);

c = a + b;}

else

printf(”Pozdrowienia od prowadzacego!”);

I teraz tak: Zastosowaliśmy klamrę { }. Taka konstrukcja nazywa się instrukcją złożoną i ZASTĘPUJE JEDNA INSTRUKCJĘ. Skoro więc instrukcja jest to wyrażenie kończące się średnikiem, a klamra { } zastępuje instrukcję, to średnik po niej NIE JEST JUŻ POTRZEBNY (w pewnym sensie już tam jest). I proszę zwrócić uwagę, że przed else tym razem go nie ma. Niby drobny szczegół, ale proszę to sobie zapamiętać.

Oczywiście instrukcje if-else można łączyć w większe konstrukcje, umożliwiając realizowanie złożonych warunków. Tak na przykład:

if (n > 0)

if (b == 6)

printf(”n wieksze od 0 i b równe 6”);

else

printf(”n większe od 0 i b równe 6”);

Proszę zwrócić uwagę, że instrukcja else zawsze dotyczy ostatniej instrukcji if. Oczywiście dzieje się to niezależnie od „wcięcia” w tekście, więc czasami może to okazać się nieczytelne i powodować błędy. Np.:

if (a>10)

if (b<10) c=10;

else c=5;

Mogło by się wydawać z zapisu, że else dotyczy pierwszej instrukcji if. W rzeczywistości program odniesie else do drugiej, wewnętrznej instrukcji if.

W ten sposób można budować rozbudowane „drabinki” if ... else if ... else ...

Operator warunkowy „? :”

W języku C istnieje też unikalny operator warunkowy „? :” który pozwala na zapisanie warunków bezpośrednio w równaniu. Działa w sposób następujący

warunek ? instrukcja_jeśli_spełniony : instrukcja_jeśli_nie_spełniony

W zależności od wyrażenia logicznego (warunek) wykona się część po ? jeśli był spełniony (!= 0) lub po : jeśli niespełnionu (= =0). Na przykład:

a = (c > 3) ? b : c;

co odpowiada zapisowi:

if (c > 3) a=b;

else a=c;

Przykład Zastosować instrukcję warunkową „? :” aby przyporządkować zmiennej Z większa z wartości zmiennych A i B czyli Z = max(A,B)

int Z, A, B;

puts("\nZ = max(A,B), podaj A i B");

scanf("%d %d", &A, &B);

Z = (A > B) ? A : B;

Instrukcja switch - case

Kolejna forma wyrażenia warunkowego jest instrukcja swich, która działa podobnie jak w Pascal'u instrukcja case, np:

switch (a)

{

case 1 : printf("a = 1");

break; /* break oznacza wyjście poza instrukcje

lub petle, dokladnie omowiony bedzie pozniej */

case 2 : printf("a = 2");

break;

default : printf("a jest rozne od 1 i od 2 "); /* sekcja default

wykonuje sie przy niespełnieniu pozostałych warunkow */

}

W miejsce (a) może zostać wpisane dowolne wyrażenia typu CAŁKOWITEGO. Instrukcja switch - case, podobnie jak w PASCALu case, może służyć do łatwego konstruowania menu, w których podejmuje się działania w zależności od decyzji użytkownika.

Stałe

W języku C możemy także definiować stałe. Dokonujemy ich deklaracji podobnie jak zmiennych, muszą one jednak zostać poprzedzone słowem kluczowym const. Wartości stałych nie mogą się zmieniać w programie. Dobrze zdefiniować je na samym początku programu jako pewnie zbiór parametrów i stałych przeliczników. Na przykład:

const int stala=2000;

Wyprowadzanie na ekran wartości zmiennych

No dobrze. Mamy już sporo podstaw, aby poćwiczyć na bardziej złożonych przykładach. Brakuje nam jedynie wyświetlania wartości obliczanych zmiennych oraz możliwości wprowadzania różnych wartości przez użytkownika. Do wyświetlania wartości zmiennych na ekranie warto wykorzystać funkcję printf. Robimy to w ten sposób, że tak jak poprzednio w cudzysłowach piszemy tekst, który chcemy wyświetlić, jednak w specjalny sposób oznaczamy miejsca, gdzie mają pojawić się wartości zmiennych.

Przypuśćmy, że mamy zmienną temp (typu int), która przechowuje temperaturę w stopniach Celsjusza. Przypuśćmy, że za pomocą bezparametrowej funkcji zmierz przypisaliśmy jej aktualną wartość, którą chcemy wyświetlić. Jest więc:

int temp;

temp = zmierz();

Chcemy, żeby pojawił się napis: temperatura wynosi ... stopni Celsjusza. I w miejsce kropek ma pojawić się zmierzona wartość. Tak więc w funkcji printf w miejscu kropek powinno pojawić się to oznaczenie, że tam ma być miejsce na wypisanie wartości zmiennej. Miejsce to oznaczamy za pomocą znaku % i oznaczenia typu zmiennej. W naszym przypadku będzie to %d (d oznacza decimal czyli liczbę dziesiętną). Po tekście, który chcemy wyprowadzić, oddzielone przecinkami mają się znaleźć zmienne lub wyrażenia, których wartości chcemy po kolei wprowadzić w oznaczone miejsca. Będzie więc:

printf (”temperatura wynosi %d stopnia Celsjusza”, temp);

Należy pamiętać o odpowiednim oznaczaniu typów zmiennych, które chcemy wyświetlić. I tak mamy:

%d dla całkowitych,

%s do wyprowadzania łańcuchów tekstowych,

%f zmiennoprzecinkowych w postaci dziesiętnej

%c zmienna typu char - jeden znak

%o wypisanie liczby w postaci ósemkowej

%x lub %X liczba szesnastkowa (odpowiednio duże i małe litery)

Dla wszystkich przypadków możemy określić szerokość pola, w której pojawi się wartość zmiennych, określając tę szerokość po znaku % na przykład:

%5d liczba dziesiętna, dla której zarezerwowane będzie pole o szerokości 5 znaków

Dla liczb zmiennoprzecinkowych, po znaku kropki dziesiętnej, można także podać liczbę cyfr po przecinku, do której ograniczona będzie precyzja wyświetlonej liczby. Na przykład:

%6.2f liczba zmiennoprzecinkowa z dwoma miejscami „po kropce”, obejmująca łącznie 6 znaków.

%0.3f j.w. z trzema miejscami „po kropce”, liczba znaków nieistotna (będzie dobrana automatycznie).

Wprowadzanie zmiennych

Do wprowadzania wartości od użytkownika (lub ogólnie - z urządzeń wejściowych) służy funkcja scanf. W przypadku funkcji scanf najpierw (jako pierwszy argument) podajemy łańcuch formatujący, który określa jak interpretowane mają być wartości wprowadzane od użytkownika. Dla uproszczenia możemy przyjąć, że jest to podobnie jak w funkcji printf, odpowiednie oznaczenie typu np. %d jeżeli wprowadzone mają być liczby całkowite. Możliwości interpretacji takich znaków wejściowych są naprawdę ogromne, ale zajmiemy się nimi później.

Na przykład:

scanf (”%f”, &liczba);

spowoduje wprowadzenie do zmiennej liczba wartości wprowadzonej przez użytkownika z klawiatury. Lub więcej wartości na raz:

scanf(”%f%f%f”, &X1, &X2, &X3);

Wprowadzane znaki, aż do znaku ENTER zostaną zinterpretowane jako liczba zmiennoprzecinkowa. Nie wolno zapominać o znaku & przez oznaczeniem zmiennej. Jest to związane z operacjami na adresach i wskaźnikach, co zostanie wyjaśnione później. Na razie przyjmijmy, że MUSI się tam znaleźć znak & przed każdą ze zmiennych. Jeśli o tym Państwo zapomnicie, to program się skompiluje i wykona, nie będzie żadnego komunikatu o błędzie, lecz program NIE BĘDZIE działał prawidłowo.

#include <stdio.h>

main ( )

{

/* wypisanie tekstu */

printf (”Niech zyje C\n”);

}



Wyszukiwarka

Podobne podstrony:
Podstawa programowa z techniki, szkoła, Materiały do techniki(technika)
podstawa programowa klasa 6 informatyka
PODSTAWA PROGRAMOWA KSZTAŁCENIA W ZAWODZIE TECHNIK INFORMATYK
Program nauczania Technik Informatyk 312[01] 2004 06 04
11-nkb~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
2-eukl~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
1-algo~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
c-zadania-w3, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, kol
2-eukl~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
x, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, kol 1
metody numeryczne - interpolacja, Nauka i Technika, Informatyka, Programowanie
ECDL Podstawy technik informatycznych
minmax3, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l6
2-eukl~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
2-eukl~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
program nauczania informatyki podstawówka i gimnazjum
2-eukl~1, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programowania, l2
c klasowka1 rozwiazania, wisisz, wydzial informatyki, studia zaoczne inzynierskie, podstawy programo

więcej podobnych podstron