W katalogu domowym utworzyć podkatalog ipower. Utworzyć w nim pliki Makefile i ipower.c postaci:
/* * ipower.c * * Program z potegowaniem w liczbach calkowitych. */ #include <stdio.h> int ipower(int x, int n); /* x^n */ int main(void) { int i; for (i = 0; i < 10; ++i) printf("%d %d %d\n", i, ipower(2, i), ipower(-3, i)); return 0; } int ipower(int x, int n) { /* x^n */ int p; /* n jest zmienna lokalna w funkcji ipower() - mozna z niej korzystac */ for (p = 1; n > 0; --n) p *= x; return p; }
Skompilować i uruchomić program.
Dopisać nową funkcję dpower() i wykorzystać ją w main(). Deklaracja nowej funkcji jest następująca:
double dpower(double x, int n);
W katalogu domowym utworzyć podkatalog atrapa. Utworzyć w nim pliki Makefile, main.h, main.c i atrapa.c postaci:
# # Makefile (wersja podstawowa) # # Najpierw umieszczamy cel końcowy, potem cele pośrednie. atrapa : main.o atrapa.o Makefile gcc -Wall -ansi -pedantic main.o atrapa.o -o atrapa atrapa.o : atrapa.c main.h Makefile gcc -Wall -ansi -pedantic -c atrapa.c -o atrapa.o main.o : main.c main.h Makefile gcc -Wall -ansi -pedantic -c main.c -o main.o
# # Makefile (wersja rozbudowana) # # Kompilator CC = gcc # Bibioteki, np. -lm -lcurses LIBS = # Flagi kompilatora CFLAGS = -Wall -ansi -pedantic # Pliki obiektowe OBJECTS = main.o atrapa.o TARGET = atrapa # Definicja domyślnej reguły wzorcowej dla plików obiektowych. # $< oznacza nazwę pliku pierwszej zależności reguły. # $@ oznacza nazwę pliku celu w regule. %.o : %.c main.h Makefile $(CC) $(CFLAGS) -c $< -o $@ # Przepis na zbudowanie celu koncowego. $(TARGET) : $(OBJECTS) Makefile $(CC) $(CFLAGS) $(LIBS) $(OBJECTS) -o $(TARGET) # Nie musimy tworzyć zależności dla plików obiektowych. # Określenie celów sztucznych. .PHONY : clean clean : $(RM) $(TARGET) *.o core
/* * main.h * * Plik naglowkowy. */ #include <stdio.h> #define N_DEFINE 123 extern const int N_CONST; /* deklaracja N_CONST */ void atrapa(void);
/* * main.c */ #include "main.h" const int N_CONST = 456; /* definicja N_CONST */ int main(void) { printf("main: %d %d\n", N_DEFINE, N_CONST); atrapa(); return 0; }
/* * atrapa.c */ #include "main.h" void atrapa(void) { printf("atrapa: %d %d\n", N_DEFINE, N_CONST); return; }
Skompilować i uruchomić program.
W katalogu domowym utworzyć podkatalog rsilnia. Utworzyć w nim pliki Makefile i rsilnia.c postaci:
/* * rsilnia.c * * Wersja rekurencyjna funkcji silnia. */ #include <stdio.h> double rsilnia(int n); int main(void) { const int N = 15; int i; printf("Kilka kolejnych silni liczb naturalnych\n"); for (i = 0; i < N; ++i) printf("%d\t%.0f\n", i, rsilnia(i)); return 0; } double rsilnia(int n) { if (n == 0) return 1.0; return rsilnia(n-1) * (double)n ; }
Skompilować i uruchomić program. Napisać iteracyjną wersję funkcji obliczającej silnię w katalogu dsilnia.
W katalogu domowym utworzyć podkatalog rfibonacci. Utworzyć w nim pliki Makefile i rfibonacci.c, jeżeli jest dana tylko funkcja:
int rfibonacci(int n) { if ( n == 0 || n == 1 ) return n; else return rfibonacci(n-1) + rfibonacci(n-2) ; }
Program ma wypisywać nagłówek i kilkanaście kolejnych liczb ciągu Fibonacciego. Skompilować i uruchomić program.
Napisać iteracyjną wersję funkcji obliczającej wyrazy ciągu Fibonacciego w katalogu ifibonacci.
W katalogu domowym utworzyć podkatalog razem. Utworzyć w nim pliki Makefile, main.h oraz po jednym pliku dla każdej z funkcji (ipower, dpower, rsilnia, dsilnia, rfibonacci, ifibonacci) wg schematu z zadania 4.2. Skompilować i uruchomić program.