[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania

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

Wykład VII, 29 listopada 2011

Rozmawialiśmy o dynamicznych tablicach - jako przykład pisaliśmy program, który wybiera z pliku tekstowego linie zawierające podany tekst, sortuje je (jeśli użytkownik tego zarząda) i wypisuje na stdout.

  szukaj [-s] <wzorzec> [ <plik_wejsciowy> ]

Oto szkic programu:

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include "sklad.h"
   4 #include "wyszukaj.h"
   5 
   6 #define MAX_BUF 4096
   7 
   8 int fcmp( const void *, const void * );
   9 
  10 int main( int argc, char **argv ) {
  11         FILE *in = stdin;
  12         char buf[MAX_BUF];
  13         int sort = 0;
  14         char *wzorzec = NULL;
  15 
  16         sklad_t sklad = inicjuj_sklad();
  17 
  18         if( sklad == NULL ) 
  19                 return EXIT_FAILURE;
  20 
  21         sprawdz_opcje( argc, argv, &in, &sort, &wzorzec );
  22 
  23         if( in == NULL || wzorzec == NULL )
  24                 return EXIT_FAILURE;
  25 
  26         while( fgets( buf, MAX_BUF, in ) != NULL )
  27                 if( jest_wzorzec( wzorzec, buf ) )
  28                         if( ! skopiuj( buf, sklad ) )
  29                                 return EXIT_FAILURE;
  30 
  31         if( sort )
  32                 sortuj_sklad( sklad, fcmp );
  33 
  34         wypisz_sklad( sklad, stdout );
  35 
  36         return EXIT_SUCCESS;
  37 }

Oto moduł wyszukiwania (pliki wyszukaj.h i wyszukaj.c):

   1 #ifndef _WYSZUKAJ_H_
   2 #define _WYSZUKAJ_H_
   3 
   4 int jest_wzorzec( char *, char * );
   5 
   6 #endif
   7 

   1 #include "wyszukaj.h"
   2 #include <string.h>
   3 
   4 int jest_wzorzec( char *buf, char *pat ) {
   5         return strstr( buf, pat ) != NULL;
   6 }

Oto moduł do przechowywania linii (sklad.h i sklad.c) - implementacja tablicy dynamicznej:

   1 #ifndef _SKLAD_H_
   2 #define _SKLAD_H_
   3 
   4 #include <stdio.h>
   5 
   6 typedef struct {
   7                 char **linie;   /* linie */
   8                 int n;          /* ile linii jest w tej chwili */
   9                 int wlk;        /* na ile linii mam miejsce */
  10 } * sklad_t;
  11 
  12 sklad_t inicjuj_sklad( void );
  13 
  14 int skopiuj( char *, sklad_t );
  15 
  16 void sortuj_sklad( sklad_t, int (*)( const void *, const void * ) );
  17 
  18 void wypisz_sklad( sklad_t, FILE * );
  19 
  20 #endif
  21 

   1 #ifndef _SKLAD_H_
   2 #define _SKLAD_H_
   3 
   4 #include <stdio.h>
   5 
   6 typedef struct {
   7                 char **linie;   /* linie */
   8                 int n;          /* ile linii jest w tej chwili */
   9                 int wlk;        /* na ile linii mam miejsce */
  10 } * sklad_t;
  11 
  12 sklad_t inicjuj_sklad( void );
  13 
  14 int skopiuj( char *, sklad_t );
  15 
  16 void sortuj_sklad( sklad_t, int (*)( const void *, const void * ) );
  17 
  18 void wypisz_sklad( sklad_t, FILE * );
  19 
  20 #endif
  21 jstar-lap:~/jimp/w7> cat sklad.c
  22 #include "sklad.h"
  23 
  24 #include <stdlib.h>
  25 #include <string.h>
  26 
  27 #define SKLAD_NA_DZIENDOBRY 512
  28 
  29 sklad_t inicjuj_sklad( void ) {
  30         sklad_t nowy = malloc( sizeof *nowy );
  31         
  32         if( nowy == NULL )
  33                 return NULL;
  34 
  35         nowy->linie = malloc( SKLAD_NA_DZIENDOBRY * sizeof * nowy->linie );
  36 
  37         if( nowy->linie == NULL ) {
  38                 free( nowy );
  39                 return NULL;
  40         }
  41 
  42         nowy->n = 0;
  43         nowy->wlk = SKLAD_NA_DZIENDOBRY;
  44 
  45         return nowy;
  46 }
  47 
  48 static int powieksz_sklad( sklad_t s ) {
  49         char** nl = realloc( s->linie, s->wlk*2 * sizeof *nl );
  50         if( nl == NULL )
  51                 return 0;
  52         s->wlk *= 2;
  53         return 1;
  54 }       
  55 
  56 int skopiuj( char *nap, sklad_t s ) {
  57         if( s->n == s->wlk )
  58                 if( ! powieksz_sklad( s ) )
  59                         return 0;
  60         
  61   s->linie[s->n] = malloc( (strlen(nap)+1)*sizeof *s->linie[s->n] );
  62         if( s->linie[s->n] == NULL )
  63                 return 0;
  64 
  65         strcpy( s->linie[s->n], nap );
  66         s->n++;
  67         return 1;
  68 }
  69 
  70 void sortuj_sklad( sklad_t s, int (*f)( const void *, const void * ) ) {
  71         qsort( s->linie, s->n, sizeof s->linie[0], f );
  72 }
  73 
  74 void wypisz_sklad( sklad_t s, FILE *out ) {
  75         int i;
  76         for( i= 0; i < s->n; i++ )
  77                 fprintf( out, "%s\n", s->linie[i] );
  78 }

2015-09-23 06:44