[WikiDyd] [TitleIndex] [WordIndex

Jimp1: Pytania z zaliczeń w roku 2009

A1. Dana jest struktura opisująca listę liniową jednokierunkową

typedef struct e {
   double liczba;
   struc e * nast;
} * lista_t;

Proszę napisać funkcję, która otrzymuje jako argument wskaźnik do takiej struktury i oblicza sumę liczb przechowywanych w liście:

double suma( lista_t list );

Jeśli lista jest pusta, to funkcja powinna zwrócić 0.

Odpowiedź

#include <stdlib.h> /* ze względu na NULL */
double suma( lista_t list )
{
   double s= 0;
   while( list != NULL ) {
      s += list->liczba;
      list = list->nast;
   }
   return s;
}

B1. Dana jest struktura opisująca listę liniową jednokierunkową

typedef struct e {
   char * napis;
   struc e * nast;
} * lista_t;

Proszę napisać funkcję, która otrzymuje jako argument wskaźnik do takiej struktury i oblicza sumę długości napisów przechowywanych w liście:

int sumaStrlen( lista_t list );

Jeśli lista jest pusta, to funkcja powinna zwrócić 0.

Odpowiedź

#include <string.h>

int sumaStrlen( lista_t list )
{
   int s= 0;
   while( list != NULL ) {
      s += strlen( list->napis );
      list = list->nast;
   }
   return s;
}

A2. Proszę zaprojektować strukturę danych przechowującą wiele par składających się z napisu i odp. mu liczby (np. {"M_PI",3.14}). Proszę napisac funkcję, która dopisze do tej struktury nową parę.

Odpowiedź

#include <stdlib.h> /* malloc, realloc, NULL */
#include <string.h> /* string */
#include <assert.h>

typedef struct {
   char *n;
   double d;
} para_t;

typedef struct {
   para_t *p;
   int n;      /* ile jest par */
   int size;   /* ile jest miejsca */
} kontener_t;

int dodajPare( kontener_t *k, para_t *p )
{
   assert( k->size >= k->n );
   if( k->size == k->n ) {
      para_t *np = realloc( k->p, k->size * 2 * sizeof *np );
      if( np == NULL )
         return 0; /* nie udalo sie dodac */
      k->p = np;
   }
   if( (k->p[k->n].n = malloc( strlen( p->n ) + 1 )) == NULL )
      return 0; /* nie udalo sie dodac */
   strcpy( k->p[k->n].n, p->d );
   k->p[k->n].d = p->d;
   k->n++;
   return 1;  /* ok */
}

B2. Proszę zaprojektować strukturę danych przechowującą wiele par liczb (np. {1,3.14}). Taka para może reprezentować np. liczbę zespoloną. Proszę napisać funkcję, która znajdzie w strukturze parę najbliższą (w sensie odległości euklidesowej) zadanej liczbie i zwróci odległość pomiędzy liczbami.

Odpowiedź

#include <math.h>   /* sqrt */
#include <stdlib.h> /* NULL */
#include <assert.h>

typedef struct {
  double    re;
  double    im;
}   cmplx_t;

typedef struct {
  cmplx_t        *p;
  int   n;  /* ile jest par */
  int   size; /* ile jest miejsca */
}   kontener_t;

#define SQR( X ) ((X)*(X))
#define DIST( A, B ) (sqrt(SQR((A).re - (B).re)+SQR((A).im - (B).im)))

double
minOdleglosc(kontener_t * k, cmplx_t * c)
{
  assert(k != NULL);
  if (k->n == 0)
    return -1;
  else {
    double    md = DIST(k->p[0], *c);
    int   i;
    for (i = 1; i < k->n; i++) {
      double    d = DIST(k->p[i], *c);
      if (d < md)
        md = d;
    }
    return md;
  }
}

Reszta w poniedziałek. Ale tymczasem proszę koniecznie zajrzeć tutaj.


2015-09-23 06:44