Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z krokami tworzenia programów (edycją, kompilacją, konsolidacją i uruchamianiem) przy pomocy środowiska zintegrowanego Borland C/C++ wer. 3.1 na przykładzie prostego programu w języku C wykorzystującego standardowe funkcje wejścia/wyjścia w języku C: scanf() i printf() oraz instrukcję warunkową 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 programowania,
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 następującym schemacie blokowym:
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 (flow chart'u) lub pseudokodu. Następnie należy wybrać właściwe narzędzia programistyczne 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++, Pascal, 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 (marginesów, wielkości strony itp). W związku z tym nie należy używać edytorów tekstu takich jak Word z pakietu Microsoft Office czy Ami Pro firmy Lotus. W środowisku MS-DOS do pisania tekstu programu wygodnie jest korzystać z edytora wbudowanego w środowisko zintegrowane Borland C/C++. Można też stosować edytory będące samodzielnymi programami np.: Norton Editor, MultiEdit, Brief w środowisku MS-DOS, vi, joe w środowisku UNIX. Wybór edytora należy do piszącego program i zależy od jego upodonań i przyzwyczajeń.
Po edycji tekst programu zostaje zapisany jako zbiór na dysku. W środowisku MS-DOS dla tekstów programów w języku C przyjęto stosować rozszerzenie nazwy .C, dla tekstów programów w języku C++ - rozszerzenie .CPP, a zbiorom nagłówkowym nadaje się rozszerzenie .H. W środowisku UNIX dla tekstów programów w języku C przyjęto stosować sufiks nazwy .c, dla tekstów programów w języku C++ - sufiks .cpp lub .cc, a zbiorom nagłówkowym nadaje się sufiks .h.
Kompilacja programu polega przetłumaczenia kodu źródłowego programu na relokowalny kod maszynowy (binarny) za pomocą specjalnego programu zwanego kompilatorem. Kompilatory języka C/C++ dokonują tłumaczenia w dwóch etapach:
etap wstępnego przetworzenia tekstu programu (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ę binarne zbiory zawierające relokowalny kod danego modułu programu (ang.: object file). W środowisku MS-DOS mają one rozszerzenie .OBJ, natomiast w środowisku systemu UNIX - .o.
W przypadku zgłoszenia przez kompilator błędów w tekście źródłowym programu należy ten tekst poprawić za pomocą edytora.
W celu umożliwienia testowania programu za pomocą debuggera należy w czasie kompilacji włączyć opcje kompilatora, które powodują dodanie do zbioru wykonywalnego informacji o nazwach zmiennych i kolejnych instrukcjach programu. Gdy używa się kompilatora wbudowanego w środowisko zintegrowane należy wybrać z menu: Options | Debbuger i w polu „Source Dubugging” ustawić opcję „On”. Używając kompilatora wywoływanego z linii poleceń (bcc) należy użyć parametru -v.
Konsolidacja programu jest procesem polegającym na połączeniu ze sobą skompilowanych, relokowalnych modułów programu i modułów zawartych w bibliotekach w celu otrzymania zbioru wykonywalnego. Do konsolidacji programu używa się specjalnego programu zwanego konsolidatorem (linkerem). 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 programu w sytuacjach nietypowych itp.). Do wykrywania błędów w czasie testowania służą specjalne programy uruchomieniowe zwane debuggerami. Pozwalają one na monitorowanie wartości poszczególnych zmiennych, pracę krokową, ustawianie pułapek (ang.: breakpoint).
Zintegrowane środowisko programistyczne Borland C/C++ wer. 3.1 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 Borland C/C++ zawiera:
edytor umożliwiający edycję kilku zbiorów jednocześnie,
kompilator,
konsolidator (linker),
debugger,
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 Borland C/C++, natomiast w tabeli 2 przedstawiono funkcje przypisane kombinacjom klawiszy edytora środowiska Borland C/C++.
Program ćwiczenia
Uruchomić środowisko Borland C/C++ poleceniem bc i zapoznać się z jego elementami:
menu
oknami: edycyjnym (edit window), komunikatów (message window), wyjściowym (output window), ekranem użytkownika (user screen), rejestrów procesora (register window), projektu (project window).
systemem pomocy
Przeanalizować program przedstawiony poniżej. Program ten zachęca użytkownika do wprowadzenia liczby całkowitej, czyta wprowadzoną liczbę, a następnie wyprowadza na terminal liczbę o wartości dwukrotnie większej. Zwrócić uwagę na specyfikator formatu w funkcjach printf() i scanf(). Skrócony opis działania tych funkcji jest przedstawiony w dokumentach „Funkcja printf( )” i „Funkcja scanf( )”.
Wpisać kod tego programu używając edytora środowiska Borland C/C++, skompilować go i uruchomić.
#include <stdio.h>
int main()
{
int liczba;
printf("Podaj liczbę całkowitą: ");
scanf("%d", &liczba);
printf("Dwukrotna wartość liczby wynosi %d\n",
2 * liczba);
return 0;
}
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 %)
Zmodyfikować program uruchomiony w punkcie 1 tak, aby zachęcał do wprowadzenia dwóch liczb całkowitych, czytał je i wyprowadzał na terminal ich sumę, różnicę, iloczyn i iloraz każdy w innym wierszu. Zwrócić uwagę na wyniki w przypadku wprowadzenia liczb o dużych wartościach bezwzględnych (20000 ÷ 32000).
Program uruchomiony w punkcie 4 zmodyfikować tak, aby uniemożliwiał wykonanie dzielenia przez 0 podczas obliczania ilorazu.
Napisać program służący do rozwiązywania równania kwadratowego o zadanych współczynnikach. Uzależnić sposób rozwiązania i wyświetlania wyników od znaku wyróżnika równania.
TABELA 1. Ważniejsze klawisze funkcyjne środowiska BORLAND C/C++
KLAWISZ(E) |
FUNKCJA |
Alt+X |
Wyjście ze środowiska do DOS'u |
F1 |
Pomoc (Help) |
Shift+F1 |
Indeks pomocy (spis treści) |
F9 |
Kompilacja oraz konsolidacja całego projektu (make) |
Alt+F9 |
Kompilacja modułu otwartego w oknie edycyjnym |
Ctrl+F9 |
Uruchomienie programu |
Ctrl+F2 |
Ponowne inicjowanie programu (reset) |
F4 |
Wykonanie programu do miejsca kursora (debugger) |
F7 |
Praca krokowa z wejściami do wnętrz funkcji (debugger) |
F8 |
Praca krokowa bez wchodzenia do wnętrz funkcji (debugger) |
Ctrl+F4 |
Monitorowanie wartości zmiennych (debugger) |
Ctrl+F8 |
Wstawianie / usuwanie pułapek (break point'ów) dla debuggera |
F6 |
Przełączanie okien |
F5 |
Zwiększanie / zmniejszanie okna |
Alt+F3 |
Zamknięcie okna |
Alt+F3 |
Otwarcie wyjściowego okna użytkownika (user screen) |
Alt+0 |
Wyświetlanie listy otwartych okien |
TABELA 2. Klawisze funkcyjne edytora środowiska BORLAND C/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ół |
Ctrl+W |
Przesunięcie ekranu (scrolling) o jedną linię w górę |
Ctrl+Z |
Przesunięcie ekranu (scrolling) o jedną linię 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+PgUp |
Przesunięcie kursora do początku tekstu |
Ctrl+PgDn |
Przesunięcie kursora do końca tekstu |
Funkcje wstawiania i usuwania znaków i tekstu
KLAWISZ(E) |
FUNKCJA |
Del |
Usunięcie znaku pod kursorem |
Backspace |
Usunięcie znaku po lewej stronie kursora |
Ctrl+Y |
Usunięcie całego wiersza |
Ctrl+Q Y |
Usunięcie tekstu od kursora do końca linii |
Ctrl+T |
Usunięcie słowa |
Ctrl+N |
Wstawienie pustego wiersza |
Ins |
Przełączanie trybu Insert / Overwrite |
Operacje na blokach tekstu
KLAWISZ(E) |
FUNKCJA |
Ctrl+K B |
Zaznaczenie początku bloku |
Ctrl+K K |
Zaznaczenie końca bloku |
Shift+← Shift+↑ Shift+→ Shift+↓ |
Zaznaczanie bloku (inny sposób) |
Ctrl+Q B |
Przesunięcie kursora na początek bloku |
Ctrl+Q K |
Przesunięcie kursora na koniec bloku |
Ctrl+K H |
Załączanie / wyłączanie podświetlenia zaznaczonego bloku |
Ctrl+K L |
Zaznaczanie linii tekstu jako blok |
Ctrl+K T |
Zaznaczanie słowa jako blok |
Ctrl+K P |
Drukowanie bloku |
Ctrl+K Y |
Usuwanie bloku |
Ctrl+K C |
Kopiowanie bloku |
Ctrl+K V |
Przenoszenie bloku |
Ctrl+K I |
Zwiększenie wcięcia (indent) bloku o 1 kolumnę |
Ctrl+K U |
Zwiększenie wcięcia (unindent) bloku o 1 kolumnę |
Ctrl+K W |
Zapisanie bloku do zbioru na dysku |
Ctrl+K R |
Czytanie bloku ze zbioru na dysku |
Ctrl+Ins |
Kopiowanie bloku do notatnika (clipboard'u) |
Schift+Del |
Przeniesienie bloku do notatnika (clipboard'u) |
Schift+Ins |
Kopiowanie zawartości notatnika (clipboard'u) do edytowanego tekstu |
Ctrl+Del |
Usuwanie bloku |
Różne
KLAWISZE |
FUNKCJA |
F2 |
Zapisanie tekstu do zbioru |
F3 |
Otwarcie zbioru do edycji |
Ctrl+F1 |
Pomoc dotycząca słowa kluczowego lub funkcji języka C/C++ |
Alt+S F |
Szukanie |
Alt+S R |
Szukanie i zamiana |
Ctrl+L |
Ponowne szukanie lub zamiana |
Alt+F7 |
Skok do poprzedniego błędu wykrytego w czasie kompilacji |
Alt+F8 |
Skok do następnego błędu wykrytego w czasie kompilacji |
Alt+Backspace |
Cofnięcie ostatniej operacji (undo) |
Ctrl+Q [ Ctrl+Q ] |
Znajdowanie par nawiasów ( ), [ ], { } |
JĘZYK C, ĆWICZENIE 1 - PODSTAWY PROGRAMOWANIA 4
Katedra Automatyki Napędu i Urządzeń Przemysłowych AGH