Metodyki i Techniki Programowania 1 1 ZAJ CIA 3. 1. MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA IDE zintegrowane środowisko programistyczne, zawierające kompilator, edytor tekstu i linker, pozwalające sterować nimi w ramach jednego programu, np.: środowisko Borland C++ 3.1 lub Bloodshed DEV C++. Edytor tekstowy program, w którym zapisujemy kod źródłowy (.cpp). Pliki bibliotek (.h) zawierają standardowe funkcje języka C. Preprocesor zajmuje się kodem źródłowym, zanim jeszcze rozpocznie się kompilacja, m.in. potrafi dołączać wybrane pliki oraz określać, które części kodu widoczne dla kompilatora. Dyrektywy preprocesora umieszcza się na początku kodu źródłowego i obejmują obszar od symbolu # do najbliŝszego znaku końca linii. Kompilator program przetwarzający kod i umieszczający go w pliku (.obj). źródłowy (.cpp) na kod maszynowy Linker program scalający plik (.obj) z kodem startowym i kodem bibliotek na plik wykonywalny (.exe). Kod startowy stanowi interfejs pomiędzy programem a systemem operacyjnym. Debugger program słuŝący do eliminowania błędów (ang. bugs). KOMPILATOR I LINKER PROCES POWSTAWANIA PROGRAMU mgr inŝ. Adam Idźkowski 1
Metodyki i Techniki Programowania 1 2 WYKONYWANIE PROGRAMU PYTANIA KONTROLNE 1. Wyjaśnij róŝnicę między plikiem kodu źródłowego, plikiem kodu obiektowego a plikiem wykonywalnym. 2. Do czego słuŝy preprocesor, kompilator, linker? 3. Wyjaśnij proces wykonywania programu przez komputer. mgr inŝ. Adam Idźkowski 2
Metodyki i Techniki Programowania 1 3 2. OGÓLNA STRUKTURA PROGRAMU, PIERWSZY PROGRAM W JĘZYKU C, FUNKCJA printf STRUKTURA PROGRAMU PISANEGO W JĘZYKU C Rys. 2. Struktura programów w języku C. Modułowa struktura programów tworzonych w języku C. Funkcje moduły składają się z instrukcji. Jest 5 rodzajów instrukcji. Instrukcje składają się ze słów kluczowych, danych i operatorów. PIERWSZY PROGRAM W JĘZYKU C Napiszmy nasz pierwszy program w języku C. 1. KaŜdy program w C musi obowiązkowo zawierać funkcję main. Od tej funkcji program rozpoczyna zawsze swoje działanie (słowo kluczowe void przed main mgr inŝ. Adam Idźkowski 3
Metodyki i Techniki Programowania 1 4 oznacza, Ŝe funkcja nie zwraca Ŝadnej wartości, natomiast void w nawiasach, Ŝe nie ma ona parametrów). 2. Instrukcje funkcji zapisujemy wewnątrz nawiasów { }, poszczególne instrukcje oddzielamy średnikami. 3. Przed funkcją main umieszczamy tzw. dyrektywy preprocesora. 4. NaleŜy równieŝ zwrócić uwagę na to, Ŝe w języku C rozróŝniane małe i duŝe litery, a więc printf, Printf lub PRINTF dla kompilatora to nie to samo (oczywiście poprawny jest tylko pierwszy zapis). 5. Komentarze w języku C umieszcza się pomiędzy zestawem znaków /* i */, lub //. #include <stdio.h> // dyrektywy preprocesora int main(void) /* Nasz pierwszy program w C */ { printf( Dzien dobry ); // uzycie funkcji printf } /* innych funkcji w tym programie nie ma */ W kodzie źródłowym pojawiły się następujące zestawy znaków: /* Tak zamieszczamy komentarz */ #include dyrektywa dołączenia tekstu zawartego w pliku stdio.h plik biblioteka (Standard Input Output), w nim zawarte definicje funkcji wejścia/wyjścia, między innymi funkcja ptintf( ) main() główna funkcja programu void typ danej pustej, tu: brak argumentów funkcji main() int typ zwracanej wartości przez funkcję (integer liczba całkowita) { początek treści funkcji } koniec treści funkcji printf() standardowa funkcja formatowanego wyjścia (to ona pozwala wyświetlić na ekranie łańcuchy znaków oraz liczby we właściwym formacie) 3. Dane w j zyku C, dane stałe, deklaracje i typy zmiennych, operatory arytmetyczne i przypisania, funkcje printf i scanf DANE W JĘZYKU C Nie ma porządnego programu bez danych. Kiedy wprowadzamy do jakiegoś programu liczby, litery czy całe łańcuchy znaków oczekujemy, zostaną Ŝe one w jakiś sposób przetworzone. Mamy tu do czynienia z danymi wejściowymi. Program komputerowy przetwarza te dane na konkretne wyniki. Tu z kolei mamy do czynienia z danymi wyjściowymi. NaleŜy zwrócić uwagę na to, Ŝe bez względu czy to dane wejściowe czy teŝ wyjściowe mamy dwie rodziny typów danych: całkowite i zmiennoprzecinkowe. Czym typy danych, jak dane deklarować i jak je uŝywać? mgr inŝ. Adam Idźkowski 4
Metodyki i Techniki Programowania 1 5 Dane moŝna podzielić teŝ na stałe i zmienne. Stałe, raz zadeklarowane, nie juŝ zmieniają swojej wartości w całym programie. Dane zmienne zwykle swoją wartość zmieniają. DANE STAŁE, DEKLARACJA STAŁYCH W programie daną Są stałą moŝe być np. znana z matematyki liczba π. Jak takie stałe zadeklarować? dwa równowaŝne sposoby, jedna za pomocą instrukcji preprocesora # define, druga za pomocą słowa kluczowego const. #define PI 3.14 const PI=3.14 TYPY ZMIENNYCH, DEKLARACJA ZMIENNYCH KaŜda zmienna w pisanym przez nas programie musi być najpierw zadeklarowana, Zapis int x; (patrz przykład 1.) oznacza, Ŝe zmienna jest typu int (ang. integer liczba całkowita). Dane typu unsigned short int (bez znaku) mogą przechowywać liczby całkowite z zakresu <0; 65535>, a więc 65536 róŝnych wartości. Dane typu short int (ze znakiem) mogą przechowywać liczby całkowite z zakresu <-32768; 32768>, a więc równieŝ 65536 róŝnych wartości. W zaleŝności od kompilatora dane typu int zajmują 2 lub 4 bajty, czyli 16 lub 32 bity. A więc mogą przyjmować 2 16 =65536 lub 2 32 =4294967296 róŝnych wartości. Typy zmiennych prezentuje tabela 1. Tabela 1. Typy danych w języku C (kompilator DevC++ 5.0) Nazwa_typu Ile bajtów pami ci Zakres unsigned char 1 bajt 0 255 char 1 bajt -128 127 unsigned short int (lub unsigned short) 2 bajty 0 65535 short int (lub short) 2 bajty -32 768 32 767 unsigned int (lub unsigned long) 4 bajty 0 4 294 967 295 int (lub long) 4 bajty -2 147 483 648 2 147 483 647 long long (lub long long int) 8 bajtów jeszcze większy zakres... float 4 bajty 3.4 * (10-38 ) 3.4 * (10 38 ) (do 7 znaków po przecinku) double 8 bajtów 1.7 * (10-308 ) 1.7 * (10 308 ) (do 15 znaków po przecinku) long double 12 bajtów jeszcze więcej miejsc po przecinku... mgr inŝ. Adam Idźkowski 5
Metodyki i Techniki Programowania 1 6 Widzimy więc, Ŝe deklaracja zmiennej odbywa się poprzez zapisanie nazwy typu zmiennej oraz nazwy zmiennej. Taka deklaracja oznacza przydzielenie dla zmiennej w zaleŝności od typu określonej ilości bajtów pamięci. Deklaracja pojedynczej zmiennej: Nazwa_typu nazwa zmiennej; Deklaracja kilku zmiennych jednego typu: Nazwa_typu nazwa zmiennej_1, nazwa zmiennej_2, nazwa zmiennej_3 ; Typ char przechowuje wartości liczbowe od 0 do 255, co moŝe zostać przełoŝone na kod ASCII danego znaku (patrz tabele 2 i 3). Ogólnie, typy int i long uŝywane do deklaracji zmiennych będących liczbami całkowitymi natomiast float i double do deklaracji zmiennych będących liczbami rzeczywistymi (zmiennoprzecinkowymi). Wybór typu zaleŝy od tego jaką wartość moŝe osiągnąć zmienna. Tabela 2. Kody ASCII (Dec liczba w kodze dziesiętnym, Chr odpowiadający jej znak, Hx liczba w kodzie szesnastkowym, Oct liczba w kodze ósemkowym ) mgr inŝ. Adam Idźkowski 6
Metodyki i Techniki Programowania 1 7 Tabela 3. Tabela kodów ASCII pozostałe znaki od 128 do 255 OPERATORY ARYTMETYCZNE I PRZYPISANIA W przykładzie 1. spotkamy się z następującym zapisem: pole_kola = PI*r*r; gdzie: PI stała, r zmienna opisująca promień koła. Wykorzystano tu operator arytmetyczny mnoŝenia * oraz tzw. instrukcję przypisania =. Zmiennej pole_kola przypisaliśmy wartość PI*r*r. PoniŜej przedstawiony jest sposób zapisu operatorów arytmetycznych i przypisania w języku C. operatory arytmetyczne: + dodawanie odejmowanie mnoŝenie / dzielenie % reszta z dzielenia operatory przypisania: = zwykłe przypisanie x = 2; += przypisanie sumy x+=2; x = x + 2; = przypisanie róŝnicy x =2; x = x 2; = przypisanie iloczynu x =2; x = x 2; /= przypisanie ilorazu x /=2; x = x / 2; %= przypisanie reszty x%=2; x = x % 2; mgr inŝ. Adam Idźkowski 7
Metodyki i Techniki Programowania 1 8 Funkcje z biblioteki <stdio.h> FUNKCJA printf wysyła sformatowane dane do standardowego strumienia wyjściowego int printf ( tekst_sterujący, argument_1, argument_2,... ) ; tekst sterujący jest to stała łańcuchowa (w podwójnych cudzysłowach) zawierająca: zwykłe znaki (które po prostu kopiowane na ekran) kody formatuj ce kolejnych argumentów: %c pojedynczy znak %s łańcuch znaków %d liczba dziesiętna ze znakiem %f liczba zmiennoprzecinkowa (notacja dziesiętna) %e liczba zmiennoprzecinkowa (notacja wykładnicza) %g liczba zmiennoprzecinkowa (krótszy z formatów %f %e) %u liczba dziesiętna bez znaku %x liczba w kodzie szesnastkowym (bez znaku) %o liczba w kodzie ósemkowym (bez znaku) l przedrostek (long) stosowany przed: d u x o FUNKCJA scanf odczytuje dane ze standardowego strumienia wejściowego w/g zadanego formatu i zapamiętuje je pod zadanymi adresami pamięci int scanf ( tekst_sterujący, adres_1, adres_2,... ) ; tekst sterujący jest to stała łańcuchowa (w podwójnych cudzysłowach) zawierająca instrukcję jak traktować kolejne dane wczytywane ze strumienia (jakie typy zmiennych pod adresami adres_1, adres_2,... ) Kody formatuj ce (podobne jak dla printf() ): %c pojedynczy znak %s łańcuch znaków %d liczba dziesiętna ze znakiem %f lub %e liczba zmiennoprzecinkowa %u liczba dziesiętna bez znaku %x liczba w kodzie szesnastkowym (bez znaku) %o liczba w kodzie ósemkowym (bez znaku) l przedrostek stosowany przed: d u x o (long int) l przedrostek stosowany przed: f e (double) L przedrostek stosowany przed: f e (long double) & operator adresowania (zwraca adres zmiennej podanej po operatorze) mgr inŝ. Adam Idźkowski 8
Metodyki i Techniki Programowania 1 9 PRZYKŁAD #include <stdio.h> #include <conio.h> #include<stdlib.h> #define PI 3.14 int main(void) { system( cls ); //funkcja czyszczaca ekran (z stdlib.h) float pole_kola, r; //deklaracja zmiennych printf( Podaj promien kola r = ); // zastosowanie printf scanf( %f, &r ); // zastosowanie scanf printf( \n ); pole_kola = PI*r*r; //przypisanie printf( Wynik: %f, pole_kola); /* printf wyswietlenie wyniku we wlasciwym formacie */ } getch(); /* funkcja oczekujaca na nacisniecie dowolnego klawisza (z conio.h) */ PYTANIA 1. Jakich typów danych uŝyjesz do przedstawienia następujących danych? ładunek elektronu, najczęściej występująca litera w Twoim imieniu, liczba studentów w Twojej grupie, liczba mieszkańców Londynu. 2. Jak deklaruje się stałe? 3. Jak deklaruje się zmienne? 4. Jaka jest róŝnica pomiędzy stałą a zmienną? 5. Do czego słuŝą kody formatujące w funkcjach printf i scanf? 6. Jakie znasz operatory arytmetyczne? ZADANIA 1. Napisz program, na dodawanie dwóch liczb zmiennoprzecinkowych. Wynik wyświetl z dwoma miejscami po przecinku. 2. Napisz program liczący rezystancję połączenia równoległego dwóch rezystorów. 3. Napisz program, który przedstawi wybraną liczbę całkowitą w kodzie ósemkowym i szesnastkowym. 4. Napisz program, który pobierze dowolny znak z klawiatury i przedstawi jego wartość w kodzie dziesiętnym, ósemkowym i szesnastkowym. mgr inŝ. Adam Idźkowski 9