[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania

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

Wykład IV, 25 października 2011

Mówiliśmy o strukturach i wskaźnikach:

  1. Wskaźniki do funkcji i użycie bibliotecznej f. qsort (sortowanie tablic)

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 
   4 void ptab( double v[], int l, FILE * out ) {
   5         int i;
   6         for( i= 0; i < l; i++ )
   7                 fprintf( out, "%g ", v[i] );
   8         fprintf( out, "\n" );
   9 }
  10 
  11 void xtab( double *v, int l, FILE* out ) {
  12         int i;
  13         for( i= 0; i < l ; i++, v++ )
  14                 fprintf( out, "%g ", *v );
  15         fprintf( out, "\n" );
  16 }
  17 
  18 int fcmp( const void *a, const void *b ) {
  19         double *pa = (double *)a;
  20         double *pb = (double *)b;
  21 
  22         if( *pa < *pb )
  23                 return -1;
  24         else if( *pa == *pb )
  25                 return 0;
  26         else
  27                 return 1;
  28 }
  29 
  30 int
  31 main() {
  32         double t[] = { 9, 7, 6, 2, 3, 1, 4 };
  33         int n = sizeof t / sizeof t[0];
  34         int i;
  35 
  36   ptab( t, n, stdout );
  37         
  38         qsort( t, n, sizeof t[0], fcmp );
  39 
  40         ptab( t, n, stdout );
  41 
  42 
  43         return 0;
  44 }

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 
   4 int strlen( char *s ) {
   5         char *p= s;
   6         while( *s != '\0' )
   7                 s++;
   8         return s-p;
   9 }
  10 
  11 int strcmp( char *a, char *b ) {
  12         while( *a == *b && *b != '\0' && *a != '\0' ) { /* nadmiarowy! */
  13                 a++;
  14                 b++;
  15         }
  16         return *a - *b;
  17 }
  18 
  19 int fcmp( const void *a, const void *b ) {
  20         char **pa= (char**)a;
  21         char **pb= (char**)b;
  22 
  23         return strlen(*pa) - strlen(*pb);
  24 }
  25 
  26 int main( int argc, char **argv ) {
  27         int i;
  28 
  29         qsort( argv+1, argc-1, sizeof argv[0], fcmp );
  30 
  31         for( i= 0; i < argc; i++ )
  32                 printf( "%s - %d\n", argv[i], strlen( argv[i] ) );
  33 
  34         return 0;
  35 }
  1. Struktury:

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 
   4 struct para {
   5         double x;
   6         double y;
   7 };
   8 
   9 #define MAX_P 1000
  10 
  11 int porp( const void *a, const void *b ) {
  12         struct para *wa= (struct para *)a;
  13         struct para *wb= (struct para *)b;
  14 
  15         if( (*wa).x < (*wb).x )
  16                 return -1;
  17         else if( (*wa).x == (*wb).x )
  18                 return 0;
  19         else
  20                 return 1;
  21 }
  22 
  23 int pory( const void *a, const void *b ) {
  24         struct para *wa= (struct para *)a;
  25         struct para *wb= (struct para *)b;
  26 
  27         if( wa->y < wb->y )
  28                 return -1;
  29         else if( wa->y == wb->y )
  30                 return 0;
  31         else
  32                 return 1;
  33 }
  34 
  35 int main( int argc, char **argv ) {
  36         int n;
  37         int i;
  38 
  39         struct para punkty[MAX_P];
  40 
  41         FILE *in = argc < 2 ? stdin : fopen( argv[1], "r" );
  42 
  43   n= 0;
  44         while( n < MAX_P
  45       && fscanf( in, "%lf %lf", &(punkty[n].x), &(punkty[n].y) ) == 2 )
  46                 n++;
  47 
  48         qsort( punkty, n, sizeof punkty[0], porp );
  49 
  50         printf( "Posortowane po x:\n" );
  51         for( i= 0; i <n; i++ )
  52                 printf( "%g %g\n", punkty[i].x, punkty[i].y );
  53 
  54         qsort( punkty, n, sizeof punkty[0], pory );
  55 
  56         printf( "Posortowane po y:\n" );
  57         for( i= 0; i <n; i++ )
  58                 printf( "%g %g\n", punkty[i].x, punkty[i].y );
  59 
  60         return 0;
  61 }
  1. Przybliżone wyznaczanie pochodnej funkcji

   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 int
  17 main() {
  18         double a= 0;
  19         double b= 2 * M_PI;
  20         double n= 100;
  21         double dx= (b-a)/(n-1);
  22   double x;
  23 
  24         double (*fun)( double ) = jedenminuscos2x; 
  25 
  26         int i;
  27 
  28         for( i= 0; i < n; i++ ) {
  29                 x = a + i*dx;
  30                 printf( "%g %g %g\n", x, fun(x), dfdx( fun, x, 1e-6 ) );
  31         }
  32 
  33         return 0;
  34 }

2015-09-23 06:44