background image

Laboratorium nr 3 

1/9 

 

1) 

Makefile. 

 
Program make służy do automatyzacji, usprawnienia oraz przyspieszenia kompilacji 

programów  z  wykorzystanie  kompilatora  GCC.  Program  został  pierwotnie  stworzony  przez 

dr.  Stuarta  I.  Feldmana  w  1977  roku,  który  pracował  w  Bell  Labs.  Obecnie  istnieje  kilka 

implementacji programu Make: GNU Make, BSD Make, Microsoft Make. 

Aby móc wykorzystać program Make do automatyzacji kompilacji, należy stworzyć w 

katalogu  (w  którym  znajdują  się  nasze  pliki  źródłowe  *.c,  *.h)  plik  Makefile.  Plik  Makefile 

(zwykły  plik  ASCII  bez  prawa  wykonywania)  jest  rodzajem  pliku  skryptowego, 

wykonywanego  (interpretowanego)  przez  program  make.  Plik  Makefile  zwiera  definicje 

zmiennych  oraz  czynności  jakie  wykona  program  make  w  celu  automatyzacji  kompilacji. 

Ogólna budowa pliku Makefile: 

 
[Reguła:] [Składnik] 
[Tabulacja] [Polecenie1] 
... 
[Tabulacja] [PolecenieN] 
 
 
Przykład: 
 
hello: hello.o aux.o 

gcc hello.o aux.o -o hello 

hello.o: hello.c 

gcc -c hello.c -o hello.o 

aux.o: aux.c 

gcc -c aux.c -o aux.o 

 
 
Przykład: 
 
CC=gcc 
CFLAGS=-g -Wall 
LFLAGS= 
OBJS=hello.o aux.o 
 
hello: $(OBJS) 

$(CC) $(LFLAGS) $(OBJS) -o hello 

hello.o: hello.c 

$(CC) $(CFLAGS) -c hello.c -o hello.o 

aux.o: aux.c 

$(CC) $(CFLAGS) -c aux.c -o aux.o 

 
 

Język C 

Temat: Makefile, instrukcje warunkowe, pętle. 

 

Instrukcja 

laboratoryjna 

Przygotował: mgr inż. Maciej Lasota 

background image

Laboratorium nr 3 

2/9 

 

Przykład: 
 
CC=gcc 
CFLAGS=-g -Wall 
LFLAGS= 
OBJS=hello.o aux.o 
 
hello: $(OBJS) 

$(CC) $(LFLAGS) $(OBJS) -o hello 

hello.o: hello.c 

$(CC) $(CFLAGS) -c hello.c -o hello.o 

aux.o: aux.c 

$(CC) $(CFLAGS) -c aux.c -o aux.o 

 
all: hello 
 
clean: 

rm hello 

 

2) 

Instrukcje warunkowe. 

 

Instrukcje  warunkowe  pozwalają  zdefiniować  warianty  wykonywania  określonego 

bloku  instrukcji  programu.  W  języku  C  wyróżniamy  kilka  rodzajów  instrukcji  warunkowych: 

IF, IF-ELSE, IF-ELSE-IF, SWITCH. 

 

Instrukcja warunkowa „IF”

 

if(warunek) 

instrukcja; 
... 


 

Instrukcja warunkowa „IF-ELSE”

 

if(warunek) 

instrukcja1; 
... 

} else 

instrukcja2; 

 

... 


 

 

 

background image

Laboratorium nr 3 

3/9 

 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
 
void main() 

int a; 
 
printf("Podaj liczbe a: "); 
scanf("%d",&a); 
 
if (a < 0) 

printf("Liczba a jest liczba ujemna!\n"); 
exit(0); 

 

if ( a > 0) 

printf("Liczba a jest liczba dodatnia!\n"); 
exit(0); 


printf("Liczba a jest rowna 0 lub nie podales liczby\n"); 


 

Instrukcja warunkowa „IF-ELSE-IF”

 

if(warunek1) 

instrukcja1; 
... 

} else if(warunek2) 

 

instrukcja2; 

 

... 

} else if(warunek3) 

instrukcja3; 
... 


 

 

 

 

 

 

 

 

background image

Laboratorium nr 3 

4/9 

 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
 
int main() 

char c; 
 
printf("Podaj litere A,B lub C: "); 
c = getchar(); 

 

if (c == 'a') 

printf("A\n"); 

} else if (c == 'b') 

printf("B\n"); 

} else if (c == 'c') 

printf("C\n"); 

} else 

printf("Podales zla litere\n"); 


return (0); 


 

Instrukcja warunkowa „SWITCH”

 

switch(wyrażenie) 

case stala1: 

instrukcja; 
... 
break; 

case stala2: 

instrukcja; 
... 
break; 

... 
... 
... 
 
default: 

instrukcja; 
... 
break; 


 

 

 

background image

Laboratorium nr 3 

5/9 

 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
 
int main() 

char c; 
 
printf("Podaj znak: "); 
 
switch(c = getchar()) 

case 'a': 

printf("A\n"); 
break; 

case 'b': 

printf("B\n"); 
break; 

default: 

printf("Blad\n"); 
break; 


return (0); 


 

3) 

Instrukcje pętli. 

 

Instrukcje  pętli  umożliwiają  powtarzanie  dowolną  ilość  razy  lub  do  momentu 

wystąpienia jakiegoś warunku określony blok instrukcji programu. 

 

Instrukcja pętli „WHILE”

 

while(warunek) 

instrukcja; 


 

Instrukcja pętli „DO-WHILE”

 

do 

instrukcja; 
... 


while(warunek); 
 

 

background image

Laboratorium nr 3 

6/9 

 

Instrukcja pętli „FOR”

 

for (wyrażenie początkowe; warunek; inkrementacja) 

instrukcja; 
... 


 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
 
int main() 

int licznik=1; 

 

while(licznik <= 10) 

printf("Licznik wynosi: %d\n",licznik); 
licznik++;  

 

//licznik=licznik+1 

sleep(2);   

 

//sleep przyjmuje jako parametr  
//czas w sekundach 

 

licznik=1; 

 

while(1) 

printf("Licznik wynosi: %d\n",licznik); 
 
if (licznik == 10) 

break; 

 

licznik++;  

 

//licznik=licznik+1 

sleep(2);   

 

//sleep przyjmuje jako parametr  
//czas w sekundach 

 
return (0); 

 

 

 

 

 

 

background image

Laboratorium nr 3 

7/9 

 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
 
int main() 

int licznik=1; 
int i; 

 

while(licznik <= 10) 

printf("Licznik wynosi: %d\n",licznik); 
licznik++;  

//licznik=licznik+1 

sleep(2);   

//sleep przyjmuje jako parametr  
//czas w sekundach 

 

for(i=1; i<=10; i++) 

printf("Licznik wynosi: %d\n",i); 
sleep(2);   

//sleep przyjmuje jako parametr 
//czas w sekundach 

 

 

return(0); 


 

4) 

Funkcje matematyczne. 

 

Standardowa  biblioteka  języka  C,  zawiera  szereg  gotowych  funkcji  służących  do 

wykonywania obliczeń matematycznych. Plik nagłówkowy, w którym znajdują się deklaracje 

funkcji  oraz  makr  matematycznych  to  <math.h>.  Funkcje  matematyczne  dostępne  w 

standardowej bibliotece języka C: 

 

sin(x);  

 

sinus x 

cos(x);  

 

cosinus x 

tan(x);  

 

tangens x 

asin(x);    

arcus sinus x 

acos(x);    

arcus cos x 

atan(x);    

arcus tangens x 

atan2(x,y);  

arcus tangens x/y 

sinh(x);    

sinus hiperboliczny 

cos(x);  

 

cosinus hiperboliczny 

tanh(x);    

tangens hiperboliczny 

 

 

background image

Laboratorium nr 3 

8/9 

 

exp(x);  

 

funkcja wykładnicza e^x 

log(x);  

 

logarytm naturalny 

log10(x);   

logarytm o podstawie 10 

 

pow(x,y);   

podniesienie x^y 

sqrt(x);    

pierwiastek z x, x>=0 

 

ceil(x);    

najmniejsza liczba całkowita 

nie mniejsza niż x 

floor(x,y);  

największa liczba całkowita 

nie większa niż x 

 

fabs(x); wartość bezwzględna z |x| 

 

Aby  skompilować  plik  źródłowy,  w  którym  wykorzystujemy  funkcje  matematyczne 

należy do kompilatora GCC dodać przełącznik „- lm” np. gcc -lm -o test test.c 

 

5) 

Generator liczba pseudolosowych. 

 

Generator liczb pseudolosowych (Pseudo-Random Number Generator, lub PRNG

to  program  lub  biblioteka,  która  na  podstawie  niewielkiej  ilości  informacji  (ziarno,  zarodek, 

ang.  seed)  generuje  deterministycznie  ciąg  bitów,  który  pod  pewnymi  względami  jest 

nieodróżnialny od ciągu uzyskanego z prawdziwie losowego źródła. 

Generatory  liczb  pseudolosowych  nie  generują  ciągów  prawdziwie  losowych  – 

generator  inicjowany  ziarnem,  które  może  przyjąć  k  różnych  wartości,  jest  w  stanie 

wyprodukować co najwyżej k różnych ciągów liczb. 

 

Przykłady bibliotek napisanych w C/C++ do generowani liczb pseudolosowych: 

 

 Hasard (C)   

http://haypo.hachoir.org/trac/wiki/hasard 

 Boost (C++)  

http://www.boost.org/ 

 GSL (C)  

 

http://www.gnu.org/software/gsl/ 

 

Standardowa  biblioteka  języka  C  w  pliku  nagłówkowym  <stdlib.h>  posiada 

zadeklarowane dwie funkcje służące do generowania liczb pseudolosowych. 

 

srand(seed); 

rand(void); 

 

background image

Laboratorium nr 3 

9/9 

 

Funkcja  srand()  jako  parametr  przyjmuje  seed,  czyli  tzw.  ziarno/zarodek  jest  to 

zmienna  liczba  (unsigned  int)  na  podstawie,  której  inicjowany  jest  generator  liczb  dla 

nowego ciągu liczb pseudolosowych. 

 

Funkcja  rand()  służy  do  losowania  liczb  pseudolosowych,  zwraca  ona  liczbę 

całkowitą  (int)  z  przedziału  między  0  a  stałą  RAND_MAX.  RAND_MAX  jest  to  stała 

zadeklarowana w pliku nagłówkowym <stdlib.h> wynosi ona co najmniej 32767. 

 

Przykład: 

 

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
 
int main() 

int i,c; 
/* Uruchamiamy generator liczb pseudolosowych jako 

        parametr podajemy funkcje time(NULL) zwraca ona czas  
        w sekundach liczony od 1970 roku */ 
 

srand(time(NULL)); 

 

for(i=0; i<=9; i++) 

c = (rand() % 25) + 65; 

//losowanie liczb 
//z przedzialu 65 – 90 
// czyli kody ASCII A-Z 
 

printf("Wylosowana liczba nr [%d]: %d  

odpowiada jej znak ASCII %c\n",i,c,c); 


return (0); 


 

Aby  wygenerować  liczbę  z  dowolnego  przedziału  wynik  funkcji  rand()  poddajemy 

operacji modulo np. rand() % 10 losuje nam liczby z przedziału od 0 do 9.