[WikiDyd] [TitleIndex] [WordIndex

Języki i metodyka programowania 1

Kartkówki z laboratorium w sem. zimowym 2012/2013

   1 /* definicja listy */
   2 typedef struct l {
   3   int x;
   4   struct l *n;
   5 } * list_t;

Rozwiązanie:

   1 #include <stdio.h>
   2 
   3 typedef struct l {
   4         int x;
   5         struct l *n;
   6 } * list_t;
   7 
   8 void rev_print( list_t l ) {
   9         if( l != NULL ) {
  10                 rev_print( l->n );
  11                 printf( " %d", l->x );
  12         }
  13 }
  14 
  15 #include <stdlib.h>
  16 
  17 list_t add( list_t l, int x ) {
  18         if( l == NULL ) {
  19                 list_t n= malloc( sizeof *n );
  20                 n->x = x;
  21                 n->n = NULL;
  22                 return n;
  23         } else {
  24                 l->n = add( l->n, x );
  25                 return l;
  26         }
  27 }
  28 
  29 
  30 int main( int argc, char **argv ) {
  31         list_t l= NULL;
  32         int i;
  33 
  34         for( i= 1; i < argc; i++ )
  35                 l= add( l, atoi( argv[i] ) );
  36 
  37         rev_print( l );
  38         printf( "\n" );
  39 
  40         return 0;
  41 }
  • Proszę napisać funkcję, która otrzymuje wektor liczb double i jego długość, usuwa z wektora liczby ujemne i zwraca długość skróconego wektora.

   1 int rm_negatives( double v[], int n ) {
   2   int i,j;
   3 
   4   for( i=0, j=0; i < n; i++ )
   5     if( v[i] >=0 )
   6       v[j++]= v[i];
   7 
   8   return j;
   9 }
  • Napisz funkcję, która zwraca sumę wartości wektora liczb typu double. ( double suma(double t[], int n); )

   1 double sum( double t[],int n ) {
   2    double s= 0;
   3    while( n-- )
   4       s += t[n];
   5    return s;
   6 }
  • Proszę napisać funkcję, ktróra jako argumenty przyjmuje wektor typu int, jego długość oraz szukaną liczbę i zwraca pozycję pierwszego wystąpienia tej liczby w wektorze. W przypadku gdy liczba nie występuje, funkcja zwraca -1.

   1 int idx( int t[],int n, int x ) {
   2    int i;
   3    for( i= 0; i < n; i++ )
   4       if( t[i] == x )
   5          return i;
   6    return -1;
   7 }
  • Napisz funkcję która doda wektor liczb typu double b do wektora liczb typu double a (void add(double a[], double b[], int n)).

   1 void add(double a[], double b[], int n) {
   2    while( n-- )
   3      a[n] += b[n];
   4 }
  • Proszę napisać funkcję która, jako argumenty przyjmuje wektor typu double oraz jego długość. Funkcja znajduje maksymalny element wektora i zwraca wskaźnik do niego. W rozwiązaniu proszę użyć arytmetyki na wskaźnikach. (Operator indeksowania tablicy "[]" jest zabroniony)

   1 double *max(double*v, int n){                                                                               
   2      double *e = v + n;     /*wskaźnik do końca tablicy (pokazujący za ost. element)*/                                                     
   3      double *tmp = v++;   /*inicjalizacja wskaźnika pokazującego na aktualnie największy znaleziony element*/
   4                           /*tmp pokazuje teraz na zerowy element wektora a v na pierwszy*/                             
   5      while(v < e){        /*iterujemy dopóki v nie wyjdzie poza obręb tablicy*/                                                                   
   6          if(*v > *tmp)                                                           
   7              tmp =  v;                                                           
   8          v++;            /*przesunięcie wskaźnika na następny element tablicy*/                                                        
   9      }                                                                           
  10                                                                                  
  11      return tmp;                                                                 
  12  }  
  • Proszę napisać funkcję któa zapisuje do pliku wektor liczb typu double w poniższym formacie. Funkcja otrzymuje jako argument wskaźnik do struktury FILE.

n = 3 [2.3 4.1 8.2]

   1 void zapisz(FILE *f, double*v, int n){                                                                               
   2      int i;
   3      fprintf(f,"n = %d [");
   4      for (i = 0; i < n; i++) {
   5          fprintf(f,"%lf", v[i]);
   6          if (i < (n-1))
   7              fprintf(f," ");  
   8      }
   9      fprintf(f,"]");
  10  }  
  • Proszę napisać program, który jako argument wywołania przyjmuje nazwę pliku (zawierającego liczby). Program wczytuje liczby z pliku i oblicza ich sumę, którą wypisuje na standardowe wyjście.

   1 #include <stdio.h>                                                              
   2 #include <stdlib.h>                                                             
   3                                                                                 
   4 int main(int argc, char**argv)                                                  
   5 {                                                                               
   6     FILE *in= argc > 1 ? fopen(argv[1], "r") : stdin;                           
   7     double x;                                                                   
   8     double sum = 0.0;                                                           
   9                                                                                 
  10     if(in == NULL) {                                                            
  11         return EXIT_FAILURE;                                                    
  12     }                                                                           
  13     while(fscanf(in, "%lf", &x) == 1) {                                         
  14         sum += x;                                                               
  15     }                                                                           
  16                                                                                 
  17     printf("Sum %g\n", sum);                                                    
  18                                                                                 
  19     return EXIT_SUCCESS;                                                        
  20 }        
  • Proszę zdefiniować strukturę, która będzie zawierała podstawowe informacje o studencie:
    • imię(pole max. 15 znaków),
    • nazwisko(max. 25 znaków),
    • płeć studenta,
    • numer albumu,
    • średnia z ocen z ostatniego semestru,
    • czy student posiada aktywną rejestrację na studia;

Proszę zaproponować najbardziej odpowiednie Państwa zdaniem typy pól takiej struktury.

   1 struct student{                                                                 
   2     char imie[16];                                                              
   3     char nazwisko[26];                                                          
   4     char plec;                                                                  
   5     unsigned nr_albumu;                                                         
   6     double srednia;                                                             
   7     int rejestracja;                                                            
   8 };       

2015-09-23 06:43