Programowanie w C (index)


Programowanie w C (4) - funkcje, rekurencja

ZADANIE 4.1

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);

ZADANIE 4.2

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.

ZADANIE 4.3

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.

ZADANIE 4.4

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.

ZADANIE 4.5

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.


Programowanie w C (index)