Instrukcja 3

Transkrypt

Instrukcja 3
Język C, Laboratorium nr 3
Instrukcja
laboratoryjna nr
3
1/3
Programowanie w języku C
Temat: Pętle, liczby pseudolosowe i obsługa Debuggera GDB
Przygotował: dr inż. Grzegorz Łukawski
1) Pętle w języku C
1.1) Pętla „while”
Podstawowy rodzaj pętli z warunkiem na początku, instrukcja jest wykonywana tak długo,
jak długo warunek jest spełniony. Pętla może nie wykonać się ani razu jeżeli warunek był niespełniony
przy pierwszym przejściu:
while(warunek)
instrukcja;
Np. szukanie największej wielokrotności liczby 2 mniejszej lub równej podanej wartości:
int szukana = 1;
while(szukana*2 < wartosc)
szukana = szukana * 2;
1.2) Pętla „do ... while”
Pętla z warunkiem na końcu, instrukcja jest wykonywana tak długo, jak długo warunek
jest spełniony. Pętla zawsze wykona się co najmniej raz, nawet gdy warunek jest niespełniony przy
pierwszym przejściu:
do
instrukcja;
while(warunek);
Np. wczytywanie zmiennej o określonym zakresie:
int punkty;
do
scanf(”%d”, &punkty);
while(punkty < 0 || punkty > 100);
1.3) Pętla „for”
Pętla powtarzająca z warunkiem na początku, instrukcja jest wykonywana tak długo, jak
długo warunek jest spełniony.
for(start;warunek;koniec)
instrukcja;
gdzie:
start
– operacja wykonywana raz na początku pętli
koniec
– operacja wykonywana po każdym przejściu pętli
Np. wielokrotne wyświetlenie tekstu:
int n;
for(n=0;n < 10;n=n+1)
puts(”Ten tekst zobaczysz 10 razy!”);
Język C, Laboratorium nr 3
2/3
1.4) Pętla (teoretycznie) nieskończona
Pętla, której warunek jest zawsze spełniony, np.:
while(1) instrukcja;
for(;;)
instrukcja;
Jeżeli dowolna z pętli ma wykonywać więcej niż jedną instrukcję, stosujemy konstrukcję bloku.
1.5) Dodatkowe instrukcje sterujące pętlami
• break
– przerywa wykonywanie najciaśniej otaczającej pętli (skok do pierwszej
instrukcji umieszczonej za pętlą);
• continue
– wymusza kolejną iterację pętli (skok do początku pętli i rozpoczęcie
wykonywania kolejnej iteracji).
Np.: sumowanie liczb podawanych przez użytkownika. Ciąg liczb zakończony wartością 0, wartości
ujemne ignorowane:
int liczba;
long suma = 0;
for(;;) {
scanf(”%d”, &liczba);
if(liczba == 0)
break;
// Koniec pętli
if(liczba < 0)
continue;
// Kolejna iteracja
suma = suma + liczba;
}
printf(”Suma = %ld\n”, suma);
2) Generowanie liczb pseudolosowych
•
•
•
•
Inicjalizacja generatora liczb pseudolosowych – raz na początku programu:
srand(time(NULL));
Funkcja generująca kolejne wartości:
rand()
Zakres generowanych liczb:
0..RAND_MAX (co najmniej 32767)
Najprostszy sposób zawężania zakresu generowanych liczb – wykorzystanie funkcji dzielenia modulo
(reszty z dzielenia całkowitego), np.:
rand() % 10
->
0..9
Język C, Laboratorium nr 3
3/3
3) Obsługa debuggera GDB (GNU Debugger)
3.1) Kompilacja programu i uruchomienie
Program który chcemy poddać analizie z pomocą debuggera, należy skompilować dodając do
polecenia przełącznik „-g”, np.:
gcc -g programik.c -o programik
Debugger uruchamiamy poleceniem:
gdb programik
3.2) Podstawowe komendy GDB
• Wykonywanie programu:
Komenda
run <arg>
Wykonanie jednego kroku programu z „wchodzeniem” do funkcji;
next
n
Wykonanie jednego kroku programu, funkcje wykonywane są natychmiastowo (bez
„wchodzenia” do ich wnętrza);
continue
c
where
Natychmiastowe dokończenie aktualnie wykonywanej funkcji;
Kontynuacja wykonywania programu aż do napotkania kolejnej pułapki lub końca
programu;
Wyświetlenie trasy wywołań funkcji dla bieżącego miejsca programu;
Pułapki:
break <gdzie> Ustawienie w programie pułapki (breakpoint). Gdy wykonywanie dojdzie do
wskazanego miejsca, program zostanie wstrzymany.
Miejsce <gdzie> można podać jako nazwę funkcji lub numer linii w kodzie
źródłowym;
info break
delete N
delete
•
Uruchomienie programu z opcjonalnie podanymi argumentami;
step
s
finish
•
Opis
Wyświetla informacje o ustawionych pułapkach;
Usunięcie pułapki nr N;
Usunięcie wszystkich pułapek;
Wyświetlanie:
list <gdzie> Wyświetlenie 10 wierszy kodu źródłowego programu. Opcjonalny parametr (numer
l <gdzie>
wiersza lub nazwa funkcji) wyświetla określony fragment kodu programu;
print <zm>
p <zm>
Jednorazowo wyświetla wartość podanej zmiennej;
display <zm> Wyświetla wartość podanej zmiennej na bieżąco aktualizując jej wartość wraz ze
disp <zm> zmianami w programie;
•
Komendy dodatkowe:
quit
Wyjście;
help
Lista tematów pomocy;
help <nazwa> Wyświetla pomoc na temat komendy o podanej nazwie.