Podstawy informatyki
Elektrotechnika I rok
Język C
Podstawy programowania
Instrukcja do ćwiczenia
© Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH
Kraków 2006
JĘZYK C – PODSTAWY PROGRAMOWANIA
Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z krokami tworzenia programów (edycją,
kompilacją, konsolidacją i uruchamianiem) przy pomocy środowiska zintegrowanego
Dev-C++. Środowisko Dev-C++ jest darmowym środowiskiem programistycznym
można używać na warunkach licencji GNU – General Public License. Zadaniem studentów
jest napisanie kilku prostych programów w języku C wykorzystujących standardowe funkcje
wejścia/wyjścia języka C: scanf() i printf() oraz instrukcje warunkowe if
i if/else.
Wprowadzenie
Tworzenie programu komputerowego składa się z kilku kroków:
• analizy problemu i projektu algorytmu,
• kodowania algorytmu (napisanie kodu źródłowego) w przyjętym języku prog-
ramowania,
• kompilacji kodu źródłowego,
• konsolidacji (ang.: linking) modułów skompilowanych i bibliotecznych,
• uruchamiania i testowania programu (ang.: debugging).
Tok tworzenia programu komputerowego można również pokazać na schemacie
blokowym przedstawionym na rysunku 1.
Edytor
xx.cpp
Kompi-
lator
Konsoli-
dator
xx.o
xx.exe
yy.lib
Debugger
Biblioteka
funkcji
Kod
wykonywalny
Kod
relokowalny
Kod
źródłowy
Gdy występuję błędy
Rys. 1. Tworzenie programu komputerowego.
Analiza problemu i projekt algorytmu ma na celu wyspecyfikowanie zadań danego
programu, analizę możliwości i sposobów spełnienia tych zadań przez sprzęt, dla którego
dane oprogramowanie jest projektowane oraz na opracowaniu i zapisie algorytmu
rozwiązującego te zadania. Algorytm przedstawia się najczęściej w postaci sieci działania
(ang.: flow chart) lub pseudokodu. Następnie należy wybrać właściwe narzędzia programis-
tyczne pozwalające na sprawne napisanie i uruchomienie programu.
Kodowanie algorytmu programu polega na zapisie tego algorytmu w przyjętym języku
programowania (assembler, C, C++, C#, Pascal, Java, Fortran itd). Do kodowania używa się
programów do edycji tekstu zwanych edytorami. Edytory wykorzystywane do pisania tekstu
programu muszą być edytorami nieformatującymi, to jest takimi, które nie zapisują w zbiorze
wynikowym informacji o układzie tekstu (wielkości strony, wielkości marginesów, rodzaju
1
Środowisko Dev–C++ można ściągnąć ze strony internetowej projektu: www.bloodshed.net.
Katedra
Automatyki
Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
1
JĘZYK C – PODSTAWY PROGRAMOWANIA
i wielkości czcionki itp). W związku z tym nie należy używać edytorów tekstu takich jak
Word z pakietu Microsoft Office czy Writer z pakietu Open Office. W środowisku
MS-Windows do pisania tekstu programu wygodnie jest korzystać z edytora wbudowanego
w środowisko zintegrowane. Można też stosować edytory programistyczne będące
samodzielnymi programami np.: standardowy Notatnik (WordPad) lub TextPad w środowisku
MS-Windows albo vi, joe w środowisku UNIX. Wybór edytora należy do piszącego program
i zależy od jego upodobań i przyzwyczajeń.
Po edycji tekst programu zostaje zapisany jako zbiór na dysku. Zbiór ten jest nazywany
zbiorem źródłowym (ang.: source file). Dla zbiorów źródłowych programów w języku C
przyjęto stosować rozszerzenie nazwy .c, dla zbiorów źródłowych programów w języku C++
– rozszerzenie .cpp, .cp, .cc, .c++. Zbiorom nagłówkowym (ang.: header files) nadaje się
rozszerzenie .h. Należy tylko pamiętać, że w systemach operacyjnych, w których rozróżniana
jest wielkość liter w nazwach (np. UNIX, Linux, QNX) zasadniczo używa się małych liter.
Kompilacja programu polega przetłumaczeniu kodu źródłowego programu na
relokowalny kod maszynowy (binarny) za pomocą specjalnego programu zwanego
kompilatorem (ang.: compiler). Kompilatory języka C/C++ dokonują tłumaczenia w dwóch
etapach:
• etap wstępnego przetworzenia tekstu programu (ang.: preprocessing), którego
zadaniem jest usunięcie komentarzy z tekstu programu i przetworzenie tekstu
programu zgodnie z dyrektywami preprocesora tj. rozkazami rozpoczynającymi się
znakiem # (np. #include, #define, #ifdef, itd).
• etap właściwej kompilacji mającej na celu wygenerowanie kodu maszynowego dla
poszczególnych modułów programu. W tym etapie można wyróżnić dwa podetapy:
-
analizę tekstu programu pod względem poprawności składni języka C/C++
i wyodrębnienie poszczególnych jednostek leksykalny języka,
-
generację kodu dla poszczególnych instrukcji (bloków instrukcji) programu.
Ten podetap kompilacji jest już zależny od sprzętu (m. in. od typu procesora),
na którym program ma być wykonywany. Kod wynikowy może być dodatkowo
optymalizowany przez kompilator pod kątem pewnych kryteriów, np. szybkości
wykonywania programu albo wielkości kodu wynikowego. Możliwości
optymalizacji kodu wynikowego są dostępne w bardziej zaawansowanych
kompilatorach.
W wyniku kompilacji otrzymuje się binarny zbiór zawierający relokowalny kod danego
modułu programu (ang.: object file). Zbiór ten ma rozszerzenie .o lub .obj.
W przypadku zgłoszenia przez kompilator błędów w kodzie źródłowym programu należy
ten kod poprawić za pomocą edytora.
Konsolidacja programu jest procesem polegającym na połączeniu ze sobą
skompilowanych, relokowalnych modułów programu i modułów zawartych w zbiorach
bibliotecznych (ang.: library files) w celu otrzymania zbioru z kodem wykonywalnym
(ang.: executable file). Zbiory biblioteczne mają najczęściej rozszerzenia .lib lub .a, zbiory
wykonywalne .exe (MS-Windows) lub nie mają rozszerzenia (UNIX).
Do konsolidacji programu używa się specjalnego programu zwanego konsolidatorem
(ang.: linker).
W czasie konsolidacji mogą pojawić się błędy, które są wynikiem błędu w tekście
źródłowym programu lub skompilowaniu programu z użyciem niewłaściwych parametrów
kompilacji.
Uruchamianie i testowanie programu polega na sprawdzeniu poprawności działania
programu zarówno pod kątem zgodności z założeniami działania programu jak i poprawności
jego pracy w danym systemie (brak „zawieszania” się programu, prawidłowe reakcje
2
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JĘZYK C – PODSTAWY PROGRAMOWANIA
programu w sytuacjach nietypowych itp.). Do wykrywania błędów w czasie testowania służą
specjalne programy uruchomieniowe zwane odpluskwiaczami (ang.: debugger). Pozwalają
one na monitorowanie wartości poszczególnych zmiennych, pracę krokową, ustawianie
pułapek (ang.: breakpoint).
W celu umożliwienia testowania programu za pomocą odpluskwiacza należy w czasie
kompilacji i konsolidacji włączyć opcje, które powodują dodanie do zbioru wykonywalnego
informacji o nazwach zmiennych i kolejnych instrukcjach programu. W środowisku Dev-C++
należy w menu otworzyć okno opcji projektu: Project → Project options → Compier
→ Linker i opcję „Generate debugging information” ustawić na „Yes”. Używając kompilatora
wywoływanego z linii poleceń należy użyć odpowiedniego parametru kompilacji (najczęściej
–g, –g1, –g2 albo –g3).
Zintegrowane środowisko programistyczne Dev-C++ pozwala na wykonywanie wyżej
opisanych kroków tworzenia programu w wygodny sposób w obrębie jednego programu.
Zwalnia ono programistę od pisania często bardzo złożonych poleceń w celu skompilowania
i skonsolidowania programu. Środowisko Dev-C++ zawiera:
• edytor umożliwiający edycję kilku zbiorów jednocześnie,
• kompilator,
• konsolidator,
• odpluskwiacz,
• system aktualizacji zbioru wynikowego umożliwiający w razie poprawek
w programie kompilację tylko tych modułów, które zależą od niego. Skraca to
znacznie czas kompilacji programu w fazie jego testowania.
Poszczególne funkcje środowiska są dostępne z menu lub poprzez klawisze funkcyjne
(lub kombinacje klawiszy) w celu szybszego dostępu do najczęściej używanych.
W tabeli 1 zestawiono najczęściej wykorzystywane kombinacje klawiszy i przypisane im
funkcje środowiska Dev-C++, natomiast w tabeli 2 przedstawiono funkcje przypisane
kombinacjom klawiszy edytora środowiska Dev-C++.
Katedra
Automatyki
Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
3
JĘZYK C – PODSTAWY PROGRAMOWANIA
Program ćwiczenia
1. Uruchomić środowisko Dev-C++ klikając na odpowiednią ikonę na pulpicie Windows
i zapoznać się z jego elementami:
• menu,
• oknami,
• systemem pomocy.
2. Przeanalizować program przedstawiony poniżej. Słowa kluczowe języka C++ zostały
wytłuszczone. Program ten zachęca użytkownika do wprowadzenia liczby całkowitej,
czyta wprowadzoną liczbę, a następnie wyprowadza na ekran monitora liczbę o wartości
dwukrotnie większej. Należy zwrócić uwagę na specyfikator formatu w funkcjach
printf() i scanf(). Skrócony opis działania tych funkcji jest przedstawiony
w dokumentach: C_Printf.pdf i C_Scanf.pdf.
Aby móc wpisać kod źródłowy programu i następnie go kompilować, konsolidować
i uruchamiać należy w środowisku Dev-C++ otworzyć nowy projekt (menu File → New
→ Project). Jako typ projektu należy wybrać „Console Application” i nadać nazwę
projektowi według własnego uznania. Po zaakceptowaniu klawiszem „Ok”, pojawi się
okno pozwalające wybrać miejsce na dysku, w którym projekt będzie zapisany. Należy
wybrać katalog przeznaczony na prace studentów. Po zapisaniu projektu w oknie
edycyjnym pojawi się szablon głównego modułu programu zawierający szkielet funkcji
main(). Używając edytora należy tak zmodyfikować tekst modułu, aby uzyskać niżej
przedstawiony kod źródłowy.
#include <stdio.h>
#include <conio.h>
using
namespace std;
int
main(int argc, char *argv[])
{
int
liczba;
printf("Podaj
liczbę całkowitą: ");
scanf("%d",
&liczba);
printf("Dwukrotna
wartość liczby wynosi %d\n",
2 * liczba);
getch();
return
0;
}
Po wpisaniu należy zapisać tekst programu na dysku (menu File → Save lub kombinacja
klawiszy Ctrl+S). Otworzy się okno pozwalające nadać plikowi źródłowemu własną
nazwę. W celu skompilowania programu należy wybrać w menu Execute → Compile lub
nacisnąć kombinację klawiszy Ctrl+F9. Jeśli program skompiluje się bezbłędnie można
go uruchomić (menu Execute → Run lub naciskając Ctrl+F10) i zobaczyć wynik
działania programu w oknie.
4
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JĘZYK C – PODSTAWY PROGRAMOWANIA
3. Zobaczyć jak zmieni się sposób wyświetlania liczby całkowitej, jeśli specyfikator
formatu %d zamieni się na:
-
%6d
-
%8d
-
%-6d
-
%+6d
-
% 6d
(spacja po znaku %)
-
%06d
-
%+d
-
% d
(spacja po znaku %)
4. Zmodyfikować program uruchomiony w punktach 2 i 3 tak, aby zachęcał do
wprowadzenia dwóch liczb całkowitych, czytał je i wyprowadzał na ekran ich sumę,
różnicę, iloczyn i iloraz każdy w innym wierszu. Zwrócić uwagę na wyniki dodawanie
i mnożenia w przypadku wprowadzenia liczb o dużych wartościach bezwzględnych
(których suma bądź iloczyn będzie przekraczał 2
31
).
5. Program uruchomiony w punkcie 4 zmodyfikować tak, aby uniemożliwiał wykonanie
dzielenia przez 0 podczas obliczania ilorazu.
6. Napisać program służący do rozwiązywania równania kwadratowego w postaci:
0
2
=
+
⋅
+
⋅
c
x
b
x
a
o zadanych współczynnikach a, b i c.
Program powinien zachęcać użytkownika do wprowadzenia współczynników równania,
a następnie sprawdzić, czy opisują one równanie kwadratowe (a ≠ 0). Jeżeli
współczynniki są poprawne, program powinien obliczyć pierwiastki równania. Sposób
obliczania i wyświetlania wyników musi być uzależniony od znaku wyróżnika równania.
Jeżeli wprowadzone współczynniki nie opisują równania kwadratowego program
powinien wyświetlić odpowiedni komunikat.
Katedra
Automatyki
Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
5
JĘZYK C – PODSTAWY PROGRAMOWANIA
TABELA 1. Ważniejsze klawisze funkcyjne środowiska Dev–C++
KLAWISZ(E) FUNKCJA
Ctrl+F9
Kompilacja oraz konsolidacja całego projektu (ang.: Make)
Shift+Ctrl+F9
Kompilacja modułu otwartego w oknie edycyjnym (ang.: Compile)
Ctrl+F10
Uruchomienie programu (ang.: Run)
Alt+F2
Ponowne inicjowanie programu (ang.: Reset)
Shift+F4
Wykonanie programu do miejsca kursora (ang.: Go to cursor)
Shift+F7
Praca krokowa z wejściami do wnętrz (ang.: Trace into)
F7
Praca krokowa bez wchodzenia do wnętrz funkcji (ang.: Step)
Ctrl+W
F4
Monitorowanie wartości zmiennych (ang.: Inspect variable)
Ctrl+F5
Wstawianie / usuwanie pułapek dla debuggera (ang.: Toggle breakpoints)
Alt+F4
Zamknięcie okna edycyjnego (ang.: Close window)
TABELA 2. Klawisze funkcyjne edytora środowiska Dev–C++
Funkcje przesuwania kursora
KLAWISZ(E) FUNKCJA
← Przesunięcie kursora o jeden znak w lewo
→ Przesunięcie kursora o jeden znak w prawo
Ctrl+←
Przesunięcie kursora o jedno słowo w lewo
Ctrl+→
Przesunięcie kursora o jedno słowo w prawo
↑ Przesunięcie kursora o jeden wiersz w górę
↓ Przesunięcie kursora o jeden wiersz w dół
PgUp
Przesunięcie kursora o 1 stronę w górę
PgDn
Przesunięcie kursora o 1 stronę w dół
Home
Przesunięcie kursora do początku linii
End
Przesunięcie kursora do końca linii
Ctrl+Home
Przesunięcie kursora do początku tekstu
Ctrl+End
Przesunięcie kursora do końca tekstu
Funkcje wstawiania i usuwania znaków i tekstu
KLAWISZ(E) FUNKCJA
Del
Usunięcie znaku pod kursorem (ang.: Delete)
Backspace
Usunięcie znaku po lewej stronie kursora (ang.: Backspace)
Ctrl+Y Usunięcie całego wiersza (ang.: Delete line)
Ins
Przełączanie trybu wstawiania i nadpisywania (ang.: Insert mode,
Overwrite mode)
Operacje na blokach tekstu
KLAWISZ(E) FUNKCJA
Shift+←
Shift+↑
Shift+→
Shift+↓
Zaznaczanie bloku tekstu (ang.: Mark text)
Del
Usuwanie zaznaczonego bloku (ang.: Delete)
6
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
JĘZYK C – PODSTAWY PROGRAMOWANIA
KLAWISZ(E) FUNKCJA
Shift+Ctrl+I
Zwiększenie wcięcia bloku (ang.: Indent)
Shift+Ctrl+U
Zmniejszenie wcięcia bloku (ang.: Unindent)
Ctrl+C
Ctrl+Ins
Kopiowanie bloku do schowka (ang.: Copy)
Ctrl+X
Shift+Del
Przeniesienie bloku do schowka (ang.: Cut)
Ctrl+V
Shift+Ins
Wstawianie zawartości schowka do tekstu (ang.: Paste)
Różne
KLAWISZ(E) FUNKCJA
Ctrl+S
Zapisanie tekstu do zbioru (ang.: Save)
Ctrl+F12
Zapisanie tekstu zbioru pod nową nazwą (ang.: Save as)
Ctrl+O
Otwarcie zbioru do edycji (ang.: Open)
Ctrl+F
Szukanie (ang.: Find)
Ctrl+R
Zamiana (ang.: Replace)
F3
Ponowne szukanie (ang.: Find next)
Ctrl+I
Szukanie przyrostowe (ang.: Incremental search)
Ctrl+G
Przejdź do wiersza (ang.: Go to line)
Ctrl+Z
Cofnięcie ostatniej operacji (ang.: Undo)
Ctrl+Shift+Z
Powtórzenie ostatnio cofniętej operacji (ang.: Redo)
Katedra
Automatyki
Napędu i Urządzeń Przemysłowych AGH, Kraków 2006
7