[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania I

Sprawy bieżące: Rozwiązania wybranych zadań lab. w gr. 3 na jesieni 2011

Zadanie 6: Proszę napisać program, który z podanego jako argument pliku wybiera wszystkie linie, w których liczba cyfr dziesiętnych jest nie mniejsza niż 10 i nie większa niż 20, sortuje te linie alfabetycznie i zapisuje do pliku wynikowego (nazwa jest podana jako drugi argument wywołania programu).

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include <string.h>
   4 #include <ctype.h>
   5 
   6 /* test1
   7 111111111111
   8 */
   9 
  10 int cyferki( char *s ) {
  11   int c= 0;
  12   while( *s )
  13     if( isdigit( *s++ ) )
  14       c++;
  15   return c;
  16 }
  17 
  18 /* test2 22222222222222222222 */
  19 /* test3
  20  1111111111111111
  21  1211111111111111
  22  1131111111111111
  23  1114111111111111
  24  1111511111111111
  25  1111161111111111
  26  1111117111111111
  27  1111111811111111
  28 */
  29 
  30 #define MIN_CYFERKI 10
  31 #define MAX_CYFERKI 21
  32 
  33 #define MAX_BUF 2048
  34 
  35 typedef struct {
  36         char **l;
  37         int n;
  38         int s;
  39 } sklad_t;
  40 
  41 #define MIN_SKLAD 8
  42 
  43 void dodaj( sklad_t *s, char *linia ) {
  44         if( s->n == s->s ) {
  45 #ifdef DEBUG
  46                 fprintf( stderr, "dodaj: s->s=%d, powiekszam\n", s->s );
  47 #endif
  48                 char **nl= realloc( s->l, (s->s == 0 ? MIN_SKLAD : 2*s->s)* sizeof *nl );
  49                 if( nl == NULL ) {
  50                         fprintf( stderr, "Brak pamieci w dodaj\n" );
  51                         exit( EXIT_FAILURE );
  52                 }       
  53                 s->l = nl;
  54                 s->s = s->s == 0 ? MIN_SKLAD : 2*s->s;
  55 #ifdef DEBUG
  56                 fprintf( stderr, "powiekszony: s->s = %d\n", s->s );
  57 #endif
  58         }
  59         s->l[s->n]= malloc( strlen( linia ) + 1 );
  60         if( s->l[s->n] == NULL ) {
  61                 fprintf( stderr, "Brak pamieci w dodaj\n" );
  62     exit( EXIT_FAILURE );
  63   }
  64         strcpy( s->l[s->n], linia );
  65         s->n++;
  66 }
  67 
  68 void wypisz_sklad( sklad_t* s, FILE *out ) {
  69         int i;
  70         for( i= 0; i < s->n; i++ )
  71                 fprintf( out, "%s", s->l[i] );
  72 }
  73 
  74 int fpor( const void *a, const void *b ) {
  75         return strcmp( *((char**)a), *((char**)b) );
  76 }
  77 
  78 void sortuj_sklad( sklad_t *s ) {
  79         qsort( s->l, s->n, sizeof s->l[0], fpor );
  80 }
  81         
  82 int main( int argc, char **argv ) {
  83         FILE *in = argc > 1 ? fopen( argv[1], "r" ) : stdin;
  84         FILE *ou = argc > 2 ? fopen( argv[2], "w" ) : stdout;
  85 
  86         char buf[MAX_BUF];
  87 
  88         sklad_t sklad;
  89         sklad.s= 0;
  90         sklad.n= 0;
  91         sklad.l= NULL;
  92 
  93         while( fgets( buf, MAX_BUF, in ) != NULL ) {
  94                 int c = cyferki( buf );
  95                 if( c >= MIN_CYFERKI && c < MAX_CYFERKI ) {
  96 #ifdef DEBUG
  97                         fprintf( stderr, "Dodaje linie:\n%s\t->c=%d\n", buf, c );
  98 #endif
  99                         dodaj( &sklad, buf );
 100                 }
 101         }
 102         fclose( in );
 103 
 104         sortuj_sklad( &sklad );
 105 
 106         fprintf( ou, "WYNIK:\n" );
 107         wypisz_sklad( &sklad, ou );
 108 
 109         return EXIT_SUCCESS;
 110 }

2015-09-23 06:43