[WikiDyd] [TitleIndex] [WordIndex

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

Wykład VII: 22 listopada 2010

Rozpoczęliśmy omawianie struktur. Rozważania ilustrowane są przykładem programu do oceny wyników kolokwium. Zrealizowaliśmy pierwszy moduł tego projektu - zarządzanie danymi pojedynczego studenta. Moduł składa się z dwóch plików - nagłówkowego stud.h i implementującego stud.c.

stud.h

   1 #ifndef _STUD_H_
   2 #define _STUD_H_
   3 
   4 #include <stdio.h>
   5 
   6 typedef struct {
   7         char *imie;
   8         char *nazw;
   9         int lp;
  10         double ocena;
  11 } stud_t;
  12 
  13 int wypelnij_stud( stud_t *s, char *imie, char *nazwisko, int lp );
  14 
  15 void wypisz_stud( stud_t , FILE * );
  16 
  17 int ile_pkt( stud_t  );
  18 
  19 void ocen( stud_t *, double );
  20 
  21 int por_alfa( const void *, const void * );
  22 
  23 int por_pkt( const void *, const void * );
  24 #endif
  25 

stud.c

   1 #include "stud.h"
   2 #include <stdlib.h>
   3 #include <string.h>
   4 
   5 int wypelnij_stud( stud_t *s, char *i, char *n, int lp ) {
   6         if( (s->imie = malloc( strlen(i) + 1 )) == NULL )
   7                 return 1;
   8         strcpy( s->imie, i );
   9         if( (s->nazw= malloc( strlen(n) + 1)) == NULL )
  10                 return 1;
  11         strcpy( s->nazw, n );
  12         s->lp = lp;
  13         s->ocena= 0;
  14         return 0;
  15 }
  16 
  17 void wypisz_stud( stud_t s, FILE *out ) {
  18         fprintf( out, "%s %s\t%d,\tocena: %.1f\n", s.imie, s.nazw, s.lp, s.ocena );
  19 }
  20 
  21 int ile_pkt( stud_t s ) {
  22         return s.lp;
  23 }
  24 
  25 void ocen( stud_t *s, double o ) {
  26         s->ocena= o;
  27 }
  28 
  29 int por_alfa( const void *a, const void *b ) {
  30         stud_t *sa = (stud_t*) a;
  31         stud_t *sb = (stud_t*) b;
  32     int pn= strcmp( sa->nazw, sb->nazw );
  33     if( pn != 0 )
  34                 return pn;
  35         else
  36                 return strcmp( sa->imie, sb->imie );
  37 }
  38 
  39 int por_pkt( const void *a, const void *b ) {
  40         stud_t *sa = (stud_t*) a;
  41         stud_t *sb = (stud_t*) b;
  42         return sa->lp - sb->lp;
  43 }

Napisaliśmy też program testowy dla tego modułu.

stud_test.c

   1 #include <stdio.h>
   2 #include <stdlib.h>
   3 #include "stud.h"
   4 
   5 #define MAX_STUD 1000
   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         stud_t grupa[MAX_STUD];
  16     int n= 0;
  17 
  18     int i; /* zmienna robocza */
  19 
  20         FILE *in = argc > 1 ? fopen( argv[1], "r" ) : stdin;
  21     FILE *ou = argc > 2 ? fopen( argv[2], "w" ) : stdout;
  22 
  23         if( in == NULL || ou == NULL ) {
  24                 fprintf( stderr, "%s: niedobrze!\n", argv[0] );
  25                 return 1;
  26         }
  27 
  28     while( fscanf( in, "%s %s %i", imie, nazwisko, &i ) == 3 )  {
  29                 if( wypelnij_stud( grupa+n, imie, nazwisko, i ) ) {
  30                         fprintf( stderr, "%s: brak pamieci!\n", argv[0] );
  31                         return 1;
  32                 }
  33         n++;
  34         }
  35 
  36         qsort( grupa, n, sizeof grupa[0], por_pkt );
  37 
  38         for( i= 0; i < n; i++ )
  39                 wypisz_stud( grupa[i], ou );
  40 
  41         return 0;
  42 }

Program testowaliśmy przy pomocy pliku kolo:

Jan Kowalski 28
Adam Nowak 33
Jose Perezbardzodlugienazwiskojaktonapoludniu 78
Zosia Samosia 8
Mis Puchatek 123
Prosiaczek Beznazwiska 43
Tygrysek Tezbeznazwiskaaleinnego 89
Klapouchy Osiolek 0
Myszka Miki 12
Minnie Miki 99
Kaczor Donald 67
I Wystarczy 89

Przykład:

$cc stud_test.c stud.c
$./a.out kolo
Klapouchy Osiolek       0,      ocena: 0.0
Zosia Samosia   8,      ocena: 0.0
Myszka Miki     12,     ocena: 0.0
Jan Kowalski    28,     ocena: 0.0
Adam Nowak      33,     ocena: 0.0
Prosiaczek Beznazwiska  43,     ocena: 0.0
Kaczor Donald   67,     ocena: 0.0
Jose Perezbardzodlugienazwiskojaktonapoludniu   78,     ocena: 0.0
Tygrysek Tezbeznazwiskaaleinnego        89,     ocena: 0.0
I Wystarczy     89,     ocena: 0.0
Minnie Miki     99,     ocena: 0.0
Mis Puchatek    123,    ocena: 0.0
$

2015-09-23 06:44