jazykc  2013.3
upoljazykc
 All Classes Files Functions Variables Typedefs Macros Pages
Macros | Functions | Variables
mapovani-pole-funkci.c File Reference
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <assert.h>

Go to the source code of this file.

Macros

#define NELEM(pole)   (sizeof pole/sizeof *pole)
 

Functions

double na2 (double x)
 
double na3 (double x)
 
double ** map (double(*fce[])(double), double *vstup, int pocet_fce, int pocet_vstup)
 
int main (void)
 

Variables

double vstup [] = {1,2,3,4,5, 10}
 
double ludolf [] = {0.0, M_PI_4, M_PI_2, M_PI}
 
double(* fce [])(double) = {na2, na3, sqrt}
 

Detailed Description

Mapování pole funkcí

Téma: Ukazatele na funkce

Procvičované učivo: ukazatele na funkce, dynamická alokace paměti, funkce, pole Napište v jazyku C funkci double **map(double(*fce[])(double),double *vstup,int pocet_fce, int pocet_vstup),

která na prvky pole vstup (definiční obor) mapuje postupně jednotlivé funkce z pole fce.

Z vypočtených hodnot vytvoří dvourozměrné pole, které bude návratovu hodnotou z této funkce. První řádek výstupního pole bude odpovídat definičnímu oboru, druhý řádek hodnotám první funkce a tak dále, až poslední řádek bude odpovídat hodnotám poslední předané funkce.

h0nza: "dvojrozmerne" pole bude pole double* pointeru!!! tj. vraci se ukazatel na zacatek pole double* pointeru, tj. double**

                                     __________________
                                    v                  \

h0nza: argumenty se divne stridaji: fce_pole, vstup_pole, pocet_fce, pocet_vstup ^___________________|

h0nza: je spravny/lepsi uzuz pole, pocet nebo argc, argv? hmm, qsort() bsearch() pouzivaji void*base, size_t nmemb h0nza: pocet_neco by mel byt typu sizeof_t? h0nza: pole funkcnich pointeru muze byt predano bez poctu: pomoci zarazky NULL

Počet funkcí je specifikován parametrem pocet_fce, velikost definičního oboru pak parametrem pocet_vstup.

Příklad použití:

double na2(double x){ return x*x; }
double na3(double x){ return x*x*x; }
int main(){
...
pole_fci[0] = na2;
pole_fci[1] = na3;
...
pole_vysledku = map(pole_fci, pole, 2, 5);
...
}

Příklad výstupu:

Hodnoty vystupniho pole:
1   2   3   4   5
1   4   9  16  25
1   8  27  64 125

Povolené knihovny: stdio.h, stdlib.h, math.h

Definition in file mapovani-pole-funkci.c.

Function Documentation

double** map ( double(*[])(double)  fce,
double *  vstup,
int  pocet_fce,
int  pocet_vstup 
)

namalovat!!!

alokuje pole pointeru na double[] (taky alokuje), volajici free()!

Definition at line 68 of file mapovani-pole-funkci.c.

68  {
69  int radku;//kolik radku ma vystup: 1+pocet_fce
70  double **vysledky;
71  double *vysledek;
72  double (*f)(double);
73  int i, j;
74 
75  assert(pocet_fce>=0);
76  assert(pocet_vstup>0);
77  assert(vstup);
78 
79  radku = pocet_fce+1;//+1 : prvni (nulty) radek opakuje/obsahuje vstup
80  vysledky = (double **)malloc(radku * sizeof(double *));
81 //naalokujeme radky pro vysledky
82  for (i=0; i<radku; i++) {
83  vysledky[i] = (double *)malloc(pocet_vstup * sizeof(double));
84  }
85 //vysledky[0] obsahuje kopii vstup:
86  for(i=0; i<pocet_vstup; i++) {
87  vysledky[0][i] = vstup[i];
88  }
89  for(i=0; i<pocet_fce; i++) {
90  vysledek = vysledky[i+1];//+1, vysledky[0] obsahuje kopii vstupu!
91  f = fce[i];
92  for(j=0; j<pocet_vstup; j++) {
93  vysledek[j] = f(vstup[j]);
94  }
95  }
96  return vysledky;
97 }