[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania

Przykłady z wykładów w semestrze jesiennym 2011

Wykład V, 8 listopada 2011

Kontynuujemy rozważania o strukturach i wskaźnikach

  1. Poprawiamy program tablicujący funkcję i jej pochodną - korzystamy z tablicy struktur (nowość: deklaracja typedef)

   1 #include <stdio.h>
   2 #include <math.h>
   3 
   4 double dfdx( double (*f)( double ), double x, double eps ) {
   5         return (f(x+eps)-f(x))/eps;
   6 }
   7 
   8 double myfun( double x ) {
   9         return cos(x);
  10 }
  11 
  12 double jedenminuscos2x( double x ) {
  13         return 1 - cos(x)*cos(x);
  14 }
  15 
  16 typedef struct it {
  17         double x;
  18         double y;
  19         double yp;
  20 } item_t;
  21 
  22 void mktab( item_t t[], double a, double b, int n, double (*f)( double ) ) {
  23         double dx= (b-a)/(n-1);
  24         double x;
  25         int i;
  26 
  27         for( i= 0; i < n; i++ ) {
  28                 x = a + i*dx;
  29                 t[i].x = x;
  30     t[i].y = f(x);
  31     t[i].yp = dfdx( f, x, 1e-6 );
  32         }
  33 }
  34 
  35 int
  36 main() {
  37         double a= 0;
  38         double b= 2 * M_PI;
  39         double n= 100;
  40 
  41         item_t tab[10000];
  42 
  43         double (*fun)( double ) = jedenminuscos2x; 
  44 
  45         int i;
  46 
  47         mktab( tab, a, b, n, fun );
  48 
  49         for( i= 0; i < n; i++ )
  50                 printf( "%g %g %g\n", tab[i].x, tab[i].y, tab[i].yp );
  51 
  52         return 0;
  53 }
  1. Dynamiczna alokacja pamięci: funkcja malloc

   1 #include <stdio.h>
   2 #include <stdlib.h>  /* malloc */
   3 #include <math.h>
   4 
   5 double dfdx( double (*f)( double ), double x, double eps ) {
   6         return (f(x+eps)-f(x))/eps;
   7 }
   8 
   9 double myfun( double x ) {
  10         return cos(x);
  11 }
  12 
  13 double jedenminuscos2x( double x ) {
  14         return 1 - cos(x)*cos(x);
  15 }
  16 
  17 typedef struct it {
  18         double x;
  19         double y;
  20         double yp;
  21 } item_t;
  22 
  23 item_t* mktab( double a, double b, int n, double (*f)( double ) ) {
  24         double dx= (b-a)/(n-1);
  25         double x;
  26         int i;
  27 
  28         item_t *t = malloc( n * sizeof( item_t ) );
  29 
  30         for( i= 0; i < n; i++ ) {
  31                 x = a + i*dx;
  32                 t[i].x = x;
  33     t[i].y = f(x);
  34     t[i].yp = dfdx( f, x, 1e-6 );
  35   }
  36 #ifdef DEBUG
  37         for( i= 0; i < n; i++ ) {
  38                 fprintf( stderr, "%g %g %g\n", t[i].x, t[i].y, t[i].yp );
  39         }
  40 #endif
  41         return t;
  42 }
  43 
  44 int
  45 main( int argc, char **argv) {
  46         double a= argc < 2 ? 0 : atof( argv[1] );
  47         double b= argc < 3 ? 2 * M_PI : atof( argv[2] );
  48         double n= argc < 4 ? 100 : atoi( argv[3] );
  49 
  50         item_t *tab = NULL;
  51 
  52         double (*fun)( double ) = jedenminuscos2x; 
  53 
  54         int i;
  55 
  56 #ifdef DEBUG
  57         fprintf( stderr, "przed: tab=%p\n", tab );
  58 #endif
  59 
  60        tab= mktab( a, b, n, fun );
  61 
  62 #ifdef DEBUG
  63         fprintf( stderr, "po: tab=%p\n", tab );
  64 #endif
  65 
  66         for( i= 0; i < n; i++ )
  67                 printf( "%g %g %g\n", tab[i].x, tab[i].y, tab[i].yp );
  68 
  69         return 0;
  70 }
  1. Po drobnych modyfikacjach (dodaliśmy makro zamieniające a i b jeśli a > b) i sortowanie tab po niemalejących wartościach y

   1 #include <stdio.h>
   2 #include <stdlib.h>  /* malloc */
   3 #include <math.h>
   4 
   5 double dfdx( double (*f)( double ), double x, double eps ) {
   6         return (f(x+eps)-f(x))/eps;
   7 }
   8 
   9 double myfun( double x ) {
  10         return cos(x);
  11 }
  12 
  13 double jedenminuscos2x( double x ) {
  14         return 1 - cos(x)*cos(x);
  15 }
  16 
  17 typedef struct it {
  18         double x;
  19         double y;
  20         double yp;
  21 } item_t;
  22 
  23 item_t* mktab( double a, double b, int n, double (*f)( double ) ) {
  24         double dx= (b-a)/(n-1);
  25         double x;
  26         int i;
  27 
  28         item_t *t = malloc( n * sizeof( item_t ) );
  29 
  30         for( i= 0; i < n; i++ ) {
  31                 x = a + i*dx;
  32                 t[i].x = x;
  33     t[i].y = f(x);
  34     t[i].yp = dfdx( f, x, 1e-6 );
  35   }
  36 #ifdef DEBUG
  37         for( i= 0; i < n; i++ ) {
  38                 fprintf( stderr, "%g %g %g\n", t[i].x, t[i].y, t[i].yp );
  39         }
  40 #endif
  41         return t;
  42 }
  43 
  44 #define SWAP(A,B) {double tmp=(A); (A)=(B); (B)=tmp;}
  45 
  46 int fporpoy( const void *a, const void *b ) {
  47         item_t *pa= (item_t*) a;
  48         item_t *pb= (item_t*) b;
  49         if( pa->y < pb->y )
  50                 return -1;
  51         else if( pa->y == pb->y )
  52                 return 0;
  53         else
  54                 return 1;
  55 }
  56 
  57 int
  58 main( int argc, char **argv) {
  59         double a= argc < 2 ? 0 : atof( argv[1] );
  60         double b= argc < 3 ? 2 * M_PI : atof( argv[2] );
  61         double n= argc < 4 ? 100 : atoi( argv[3] );
  62 
  63         if( b < a ) SWAP( a, b );
  64 
  65         item_t *tab = NULL;
  66 
  67         double (*fun)( double ) = jedenminuscos2x; 
  68 
  69         int i;
  70 
  71 #ifdef DEBUG
  72         fprintf( stderr, "przed: tab=%p\n", tab );
  73 #endif
  74 
  75   tab= mktab( a, b, n, fun );
  76 
  77 #ifdef DEBUG
  78         fprintf( stderr, "po: tab=%p\n", tab );
  79 #endif
  80 
  81         /* sortujemy tab niemalejaco wg y */
  82         qsort( tab, n, sizeof *tab, fporpoy );
  83 
  84         for( i= 0; i < n; i++ )
  85                 printf( "%g %g %g\n", tab[i].x, tab[i].y, tab[i].yp );
  86 
  87         return 0;
  88 }

2015-09-23 06:44