[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania I

Kartkówki z laboratorium (gr 3, rok akad. 2011/2012)

Pierwsza i druga (były identyczne): Proszę napisać funkcję, która policzy średnią z elementów wektora podanego jako argument.

   1 double avg( double v[], int n ) {
   2         double *c= v+n-1;
   3         double s= 0;
   4 
   5         while( c-v >= 0 ) {
   6                 s += *c;
   7                 c--;
   8         }
   9 
  10         return n < 1 ? 0.0 : s/n;
  11 }
  12 
  13 /* Niżej jest program testujący, którego nie trzeba było pisać */
  14 
  15 #include <stdio.h>
  16 
  17 int main() {  
  18         double v[] = { 1, 2, 3, 4, 5 };
  19 
  20         printf( "avg=%g\n", avg( v, sizeof v / sizeof v[0] ) );
  21 
  22         return 0;
  23 }

Trzecia: Proszę napisać program, który policzy i wypisze na stdout znaki w pliku, którego nazwę podano jako argument wywołania.

   1 #include <stdio.h>
   2 
   3 int
   4 main( int argc, char **argv ) {
   5         FILE *in= argc > 1 ? fopen( *++argv, "r" ) : stdin ;
   6         int c;
   7         unsigned long int n= 0;
   8         unsigned long int nl= 0;  /* to jest nadmiarowe w stosunku do polecenia:
   9                                      liczymy także linie
  10                                   */
  11 
  12         while ( (c= fgetc(in)) != EOF ) {
  13                 n++;
  14                 if( c == '\n' ) nl++;  /* zliczanie linii (nadmiarowe) */
  15         }
  16 
  17         printf( "liczba znaków: %ld\nliczba linii: %ld\n", n, nl );
  18 
  19         return 0;
  20 }

Czwarta: Proszę napisać funkcję, która jako argumenty otrzymuje wektor i zwraca indeks najmniejszego (dowolnego takiego, że nie ma mniejszych) elementu wektora. Funkcja powinna zwracać -1, jeśli otrzyma niedodatnią dług. wektora.

   1 int indx_min( double v[], int n ) {
   2     int i,m;
   3 
   4     if( n < 1 )
   5         return -1;
   6 
   7     for( m= 0, i= 1; i < n; i ++ )
   8         if( v[i] < v[m] )
   9             m= i;
  10 
  11     return m;
  12 }

Piąta: Proszę napisać funkcję, która jako argument otrzymuje napis i zwraca liczbę cyfr dziesiętnych w tym napisie.

   1 #include <ctype.h>
   2 
   3 int cyferki( char *s ) {
   4   int c= 0;
   5   while( *s )
   6     if( isdigit( *s++ ) )
   7       c++;
   8   return c;
   9 }
  10 
  11 #include <stdio.h>
  12 
  13 int
  14 main( int argc, char **argv ) {
  15   int i;
  16   for( i= 1; i < argc; i++ )
  17     printf( "%s -> %d\n", argv[i], cyferki( argv[i] ) );
  18 
  19   return 0;
  20 }

Szósta: Proszę napisać funkcję, która jako argument otrzymuje napis, zamienia w tym napisie wszystkie cyfry dziesiętne na znak gwiazdki i zwraca liczbę wykonanych zmian.

   1 #include <ctype.h>
   2 #include <stdio.h>
   3 
   4 int digit2star( char *s ) {
   5         int c= 0;
   6         while( *s ) {
   7                 if( isdigit(*s) ) {
   8                         *s= '*';
   9                         c++;
  10                 }
  11                 s++;
  12         }
  13         return c;
  14 }
  15 
  16 
  17 int main( int argc, char** argv) {
  18         while( --argc ) {
  19                 printf( "%s -> ", *(++argv) );
  20     printf( "%d zmian ->", digit2star( *argv ) );
  21     printf( "%s\n", *argv );
  22         }
  23         return 0;
  24 }

}}}


2015-09-23 06:43