[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania - kurs w sem. zimowym 2010/2011

Wykład VIII: 29 listopada 2010

grupa.h

   1 #ifndef _GRUPA_H_
   2 #define _GRUPA_H_
   3 
   4 #include "stud.h"
   5 
   6 typedef struct {
   7         stud_t * studenci;
   8         int n;
   9     int wielkosc;
  10 } grupa_t;
  11 
  12 void inicjuj_grupe( grupa_t * );
  13 
  14 int dodaj_stud( grupa_t *gr, char *, char *, int );
  15 
  16 void sortuj_grupe( grupa_t gr, int (*f)( const void *, const void * ) );
  17 
  18 int wielkosc( grupa_t );
  19 
  20 stud_t *podaj_stud( grupa_t, int );
  21 #endif
  22 

grupa.c

   1 #include "grupa.h"
   2 #include <stdlib.h>
   3 
   4 #define INIT_SIZE 2
   5 
   6 void inicjuj_grupe( grupa_t * gr ) {
   7         gr->studenci = malloc( INIT_SIZE * sizeof * gr->studenci );
   8     gr->wielkosc= INIT_SIZE;
   9     gr->n= 0;
  10 }
  11 
  12 int dodaj_stud( grupa_t *gr, char *imie, char *naz, int lp ) {
  13 #ifdef DEBUG
  14     fprintf( stderr, "Dodaje %s\n", naz );
  15 #endif
  16         if( gr->wielkosc <= gr->n ) {
  17                 stud_t *nt = realloc( gr->studenci, (size_t)(2*gr->wielkosc)*sizeof *nt );
  18         if( nt != NULL ) {
  19                         gr->studenci= nt;
  20             gr->wielkosc *= 2;
  21                 } else
  22                         return 1;
  23     }
  24         if( wypelnij_stud( gr->studenci+gr->n, imie, naz,  lp ) )
  25                 return 1;
  26 #ifdef DEBUG
  27         fprintf( stderr, "ok - grupa liczy %d stud.\n", gr->n );
  28 #endif
  29     gr->n++;
  30     return 0;
  31 }
  32 
  33 void sortuj_grupe( grupa_t gr, int (*f)( const void *, const void * ) ) {
  34         qsort( gr.studenci, (size_t)gr.n, sizeof gr.studenci[0], f );
  35 }
  36 
  37 int wielkosc( grupa_t gr ) {
  38         return gr.n;
  39 }
  40 
  41 stud_t *podaj_stud( grupa_t gr, int i ) {
  42         if( i >= 0 && i < gr.n )
  43                 return &gr.studenci[i];
  44     else
  45                 return NULL;
  46 }

ocen.c

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include "stud.h"
   4 #include "grupa.h"
   5 #include "skala.h"
   6 
   7 #define MAX_LEN 256
   8 
   9 int
  10 main( int argc, char **argv ) {
  11 
  12         char imie[MAX_LEN];
  13         char nazwisko[MAX_LEN];
  14 
  15         grupa_t grupa;
  16 
  17     int i; /* zmienna robocza */
  18 
  19         FILE *in = argc > 1 ? fopen( argv[1], "r" ) : stdin;
  20     FILE *ou = argc > 2 ? fopen( argv[2], "w" ) : stdout;
  21 
  22         if( in == NULL || ou == NULL ) {
  23                 fprintf( stderr, "%s: niedobrze!\n", argv[0] );
  24                 return 1;
  25         }
  26 
  27     inicjuj_grupe( &grupa );
  28 
  29     while( fscanf( in, "%s %s %i", imie, nazwisko, &i ) == 3 )  {
  30                 if( dodaj_stud( &grupa, imie, nazwisko, i ) ) {
  31                         fprintf( stderr, "%s: brak pamieci!\n", argv[0] );
  32                         return 1;
  33                 }
  34         }
  35 
  36         sortuj_grupe( grupa, por_pkt );
  37 
  38         for( i= 0; i < wielkosc( grupa ); i++ ) {
  39                 wypisz_stud( *podaj_stud( grupa, i ), ou );
  40         }
  41 
  42         return 0;
  43 }

2015-09-23 06:44