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.