[WikiDyd] [TitleIndex] [WordIndex

Przykład z wykładu 12 marca 2007

   1 include <stdio.h>
   2 #include <stdlib.h>
   3 #include <string.h>
   4 
   5 #define MAX_DLUG_NAZWISKA     100
   6 #define MAX_DLUG_LINII        (MAX_DLUG_NAZWISKA+20)
   7 #define MAX_LICZBA_STUDENTOW  256
   8 
   9 #define PROG_ZALICZENIA 50
  10 
  11 struct wynEgzam {                /* pojedynczy student */
  12   char imnaz[MAX_DLUG_NAZWISKA]; /* imie + nazwisko */
  13   int wynik;                     /* uzyskana liczba punktow */
  14 };
  15 
  16 /* zmienna globalna sluzaca do przekazywania linii
  17    w ktorej napotkano blad przy czytaniu danych */
  18 char bledna_linia[MAX_DLUG_LINII];
  19 
  20 void wypiszWszystko( struct wynEgzam l[], int n ) {
  21 /* dostaje liste z wynikami egzaminu
  22    wypisuje ja na stdout
  23 */
  24   int i;
  25   for( i= 0; i < n; i++ )
  26       printf( "%30s : %5d\n", l[i].imnaz, l[i].wynik );
  27 }
  28 
  29 void wypiszTychKtorzyZdali( struct wynEgzam l[], int n ) {
  30 /* dostaje liste z wynikami egzaminu
  31    wypisuje tych, ktorych wynik przekracza prog zaliczenia
  32 */
  33   int i;
  34   for( i= 0; i < n; i++ )
  35     if( l[i].wynik > PROG_ZALICZENIA )
  36       printf( "%s\n", l[i].imnaz );
  37 }
  38 
  39 int wczytajWyniki( FILE *f, struct wynEgzam l[], int max ) {
  40   char buf[MAX_DLUG_LINII];
  41   char imie[MAX_DLUG_LINII];
  42   char nazw[MAX_DLUG_LINII];
  43   int n= 0;
  44   while( fgets( buf, MAX_DLUG_LINII, f ) != NULL && n < max ) {
  45     int pkt;
  46     if( sscanf( buf, "%s %s %d", imie, nazw, &pkt ) != 3 ) {
  47       strcpy( bledna_linia, buf );
  48       return -n;
  49     }
  50     /* wykorzystujemy buf (zawartosc mozna juz zamazac)
  51        do sklejenia imienia i nazwiska */
  52     strcpy( buf, imie );
  53     strcat( buf, " " );
  54     strcat( buf, nazw );
  55     /* teraz kopiujemy bufor do struktury, zabezpieczajac sie
  56        przed jej przepelnieniem */
  57     strncpy( l[n].imnaz, buf, MAX_DLUG_NAZWISKA );
  58     l[n].wynik = pkt;
  59     n++;
  60   }
  61   return n;
  62 }
  63 
  64 void sortuj( struct wynEgzam l[], int n ) {
  65 /* sortowanie wg malejacej liczby punktow,
  66    algorytmem przez wstawianie
  67 */
  68   int i,j;
  69   struct wynEgzam tmp;
  70   for( i= 1; i < n; i++ ) {
  71     tmp= l[i];
  72     for( j= i; j > 0 && l[j-1].wynik < tmp.wynik; j-- )
  73       l[j]= l[j-1];
  74     l[j]= tmp;
  75   }
  76 }
  77 
  78 int mojeStrcmp( const char *s1, const char *s2 ) {
  79   char * ns1= s1;
  80   char * ns2= s2;
  81   int porNazw;
  82 
  83   while( *ns1 != '\0' && *ns1 != ' ' )
  84     ns1++;
  85   ns1++;
  86 
  87   while( *ns2 != '\0' && *ns2 != ' ' )
  88     ns2++;
  89   ns2++;
  90 
  91   if( (porNazw= strcmp( ns1, ns2 )) != 0 )
  92     return porNazw;
  93 
  94   return strcmp( s1, s2 );
  95 }
  96 
  97 void sortujAlfabetycznie( struct wynEgzam l[], int n ) {
  98 /* sortowanie alfabetyczne
  99    algorytmem przez wstawianie
 100 */
 101   int i,j;
 102   struct wynEgzam tmp;
 103   for( i= 1; i < n; i++ ) {
 104     tmp= l[i];
 105     for( j= i; j > 0 && mojeStrcmp( l[j-1].imnaz, tmp.imnaz ) > 0; j-- )
 106       l[j]= l[j-1];
 107     l[j]= tmp;
 108   }
 109 }
 110 
 111 int main( int argc, char **argv ) {
 112   struct wynEgzam grupa[MAX_LICZBA_STUDENTOW];
 113   int n;
 114 
 115   /* program mozna wywolac z jednym argumentem: nazwa pliku z wynikami
 116      jesli argumentu nie ma, to program bedzie czytal wyniki z stdin
 117   */
 118   FILE *input= argc > 1 ? fopen( argv[1], "r" ) : stdin;
 119 
 120   if( input == NULL ) {
 121     fprintf( stderr, "\n%s: BLAD: brak dostepu do pliku wejsciowego \"%s\"\n\n",
 122              argv[0], argv[1] );
 123     exit( 1 );
 124   }
 125 
 126   n= wczytajWyniki( input, grupa, MAX_LICZBA_STUDENTOW );
 127 
 128   if( n < 0 ) {
 129     fprintf( stderr, "\n%s: Ostrzezenie: wczytano %d studentow,"
 130                      " po czym napotkano bledne dane w strumieniu wejsciowym\n",
 131                      argv[0], -n );
 132     fprintf( stderr, "%s: Bledna linia:\n%s\n\n", argv[0], bledna_linia );
 133     n= -n;
 134   }
 135 
 136   sortujAlfabetycznie( grupa, n );
 137 
 138   printf( "Wszyscy studenci i ich wyniki:\n" );
 139 
 140   wypiszWszystko( grupa, n );
 141 
 142   printf( "Studenci, ktorzy zaliczyli:\n" );
 143 
 144   wypiszTychKtorzyZdali( grupa, n );
 145 
 146   return 0;
 147 }

2015-09-23 06:43