[WikiDyd] [TitleIndex] [WordIndex

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

Wykład IX: 1 grudnia 2010

lgrupa.h

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

lgrupa.c

   1 #include "lgrupa.h"
   2 #include <stdlib.h>
   3 
   4 #define INIT_SIZE 2
   5 
   6 void inicjuj_grupe( lgrupa_t * gr ) {
   7         gr->studenci = NULL;
   8     gr->n= 0;
   9 }
  10 
  11 int dodaj_stud( lgrupa_t *gr, char *imie, char *naz, int lp ) {
  12     lista_t nowy= malloc( sizeof * nowy );
  13         if( wypelnij_stud( &(nowy->s), imie, naz,  lp ) )
  14                 return 1;
  15     nowy->nast= gr->studenci;
  16     gr->studenci= nowy;
  17 #ifdef DEBUG
  18         fprintf( stderr, "ok - grupa liczy %d stud.\n", gr->n );
  19 #endif
  20     gr->n++;
  21     return 0;
  22 }
  23 
  24 void sortuj_grupe( lgrupa_t gr, int (*f)( const void *, const void * ) ) {
  25         int flaga;
  26         lista_t it;
  27     do {
  28                 flaga= 0;
  29         it= gr.studenci;
  30         while( it != NULL ) {
  31                 if( it != NULL && it->nast != NULL && f( &(it->s), &(it->nast->s) ) > 0 ) {
  32                                 stud_t tmp = it->s;
  33                 it->s = it->nast->s;
  34                 it->nast->s = tmp;
  35                 flaga = 1;
  36                 }
  37                 it= it->nast;
  38         }
  39     } while( flaga );
  40 }
  41 
  42 int wielkosc( lgrupa_t gr ) {
  43         return gr.n;
  44 }
  45 
  46 stud_t *podaj_stud( lgrupa_t gr, int i ) {
  47         if( i >= 0 && i < gr.n ) {
  48                 lista_t it = gr.studenci;
  49         int k;
  50         for( k= 0; k < i; k++ )
  51                         it = it->nast;
  52                 return &(it->s);
  53     } else
  54                 return NULL;
  55 }

ocen.c

   1 #ifndef _SKALA_H_
   2 #define _SKALA_H_
   3 
   4 int init( char * opis_skali );
   5 
   6 char * ocena( int liczba_punktow );
   7 
   8 #endif
   9 jstar@oer:~/pliki/tmp/jimp> cat ocen.c
  10 #include <stdio.h>
  11 #include <stdlib.h>
  12 #include "stud.h"
  13 #include "lgrupa.h"
  14 #include "skala.h"
  15 
  16 #define MAX_LEN 256
  17 
  18 int
  19 main( int argc, char **argv ) {
  20 
  21         char imie[MAX_LEN];
  22         char nazwisko[MAX_LEN];
  23 
  24         lgrupa_t grupa;
  25 
  26     int i; /* zmienna robocza */
  27 
  28         FILE *in = argc > 1 ? fopen( argv[1], "r" ) : stdin;
  29     FILE *ou = argc > 2 ? fopen( argv[2], "w" ) : stdout;
  30 
  31         if( in == NULL || ou == NULL ) {
  32                 fprintf( stderr, "%s: niedobrze!\n", argv[0] );
  33                 return 1;
  34         }
  35 
  36     inicjuj_grupe( &grupa );
  37 
  38     while( fscanf( in, "%s %s %i", imie, nazwisko, &i ) == 3 )  {
  39                 if( dodaj_stud( &grupa, imie, nazwisko, i ) ) {
  40                         fprintf( stderr, "%s: brak pamieci!\n", argv[0] );
  41                         return 1;
  42                 }
  43         }
  44 
  45         sortuj_grupe( grupa, por_pkt );
  46 
  47         for( i= 0; i < wielkosc( grupa ); i++ ) {
  48                 stud_t *s= podaj_stud( grupa, i );
  49                 wypisz_stud( *s, ou );
  50         }
  51 
  52         return 0;
  53 }

skala.h

   1 #ifndef _SKALA_H_
   2 #define _SKALA_H_
   3 
   4 int init( char * opis_skali );
   5 
   6 char * ocena( int liczba_punktow );
   7 
   8 #endif
   9 

skala.c

   1 #include "skala.h"
   2 
   3 typedef struct {
   4         int min_lp;
   5     char *oc;
   6 } step_t;
   7 
   8 static step_t skala[] = { { 0, "2"},
   9                           { 51, "3.0" },
  10                           { 61, "3.5" },
  11                           { 71, "4.0" },
  12                           { 81, "4.5" },
  13                           { 91, "5.0" }
  14                                                 };
  15 
  16 static char * out_of_nasza_skala_kochana = "?????????????";
  17 
  18 int init( char *opis ) {
  19         return 0;
  20 }
  21 
  22 char *ocena( int lp ) {
  23         int i;
  24         for( i= sizeof skala / sizeof skala[0] - 1; i >= 0; i-- )
  25                 if( lp >= skala[i].min_lp )
  26                         return skala[i].oc;
  27         return out_of_nasza_skala_kochana;
  28 }

2015-09-23 06:44