Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање II
Други колоквијум
30. 1. 2006

Задаци: 1 2 3 | Напомене | Решења: 1 2 3

Поставка задатка 1 (50 поена) (решење | садржај)

Елементи једноструко повезане листе садрже координате тачака у равни. Саставити на језику C пакет функција за рад са једноструко повезаним листама тачака у равни који садржи функције за израчунавање дужине затворене изломљене линије представљене низом тачака у листи, стварање листе читајући податке са главног улаза уз чување редоследа читања (низ тачака се завршава уношењем координата (9999,9999)) и уништавање садржаја листе.

Саставити на језику C главни програм који, коришћењем функција из претходног пакета, прочита листу тачака са главног улаза, израчуна дужину затворене изломљене линије представљене листом, испише добијени резулата на главном излазу, уништи листу и понавља претходне кораке све док не прочита празну листу.

Поставка задатка 2 (50 поена) (решење | садржај)

Бинарна секвенцијална датотека са записима фиксне дужине о летовима авиона за сваки лет садржи број лета (цели број), датум полетања (дугачак цели број по шеми ggggmmdd, g - година, m - месец, d - дан), времена полетања и слетања (цели бројеви по шеми ccmm, c - час, m - минут), ознаке места полетања и слетања (низови од по 3 знака), тип авиона (низ од највише 5 знакова), капацитет авиона (цели број) и број превезених путника (цели број). Саставити на језику C главни програм за одређивање броја превезених путника у задато одредиште по месецима задате године.

Поставка задатка 3 (50 поена) (решење | садржај)

Полиноми се представљају у облику структуре која садржи ред полинома и показивач на низ реалних коефицијената у динамичкој зони меморије. Саставити на језику C++ функције за формирање полинома задатог реда читајући коефицијенте са главног улаза, формирање полинома који је једнак производу два полинома и исписивање полинома на главном излазу.

Саставити на језику C++ главни програм који прочита два полинома, израчуна њихов производ, испише резултат на главном излазу, уништи сва три полинома и понавља претходне кораке све док за ред првог полинома не прочита недозвољену вредност.


Напоменe (садржај)


Решење задатка 1 (поставка | садржај)

/* paket.h */

typedef struct elem { float x, y, struct elem *sled; } Elem;

float duz (Elem *lst);
Elem *citaj (void);
void brisi (Elem *lst);

/* paket.c */

#include "paket.h"
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

float duz (Elem *lst) { float d = 0;
  if (lst) {
    for (Elem *tek=lst; tek->sled;
      tek=tek->sled)
      d += sqrt ( pow(tek->x - tek->sled->x, 2) + pow(tek->y - tek->sled->y, 2)
      );
    d += sqrt ( pow(lst->x - tek->x, 2) + pow(lst->y - tek->y, 2)
    );
  }
  return d;
}

Elem *citaj (void) {
  Elem *lst = NULL, *tek = NULL, *novi;
  while (1) {
    float x, y; scanf ("%f%f", &x, &y);
  if (x == 9999 && y == 9999) break;
    novi = malloc (sizeof(Elem));
    novi->x = x; novi->y = y; novi->sled = NULL;
    if (! lst) lst= novi; else tek->sled = novi; tek = novi;
  }
}

void brisi (Elem *lst) {
  while (lst) { Elem *stari = lst; lst = lst->sled; free (stari); }
}

/* test.c */

#include "paket.h"

void main () {
  while (1) { Elem *lst;
    printf ("lst? "); lst = citaj ();
  if (!lst) break;
    printf ("duz= %.2f\n", duz(lst));
    brisi (lst);
  }
}

Решење задатка 2 (поставка | садржај)

#include <stdio.h>
#include <string.h>

typedef struct {
  int broj, pol, dol, kapac, putn;
  long datum;
  char polet[4], slet[4], tip[6];
} Let;

void main () {
  FILE *dat = fopen ("letovi.dat", "rb");
  int k[12] = {0}, god, i;	Let let;
  char odr[4];
  printf ("Godina, odrediste? ");
  scanf ("%d%s", &god, odr);
  while(fread(&let,sizeof(Let),1,dat)>0)
    if (strcmp (odr, let.slet) == 0 && datum/10000 == god)
      k[datum/100%100-1] += let->putn;
  }
  fclose (dat);
  for (i=0; i<12; i++)
    if (k[i]) printf ("%2d %4d\n", i+1, k[i]);
}

Решење задатка 3 (поставка | садржај)

#include <iostream>
using namespace std;

struct Poli { int n; double* a};

Poli citaj (int n) {
  Poli p; p.n = n; p.a = new double [n+1];
  for (int i=n; i>=0; cin<<p.a[i--]);
  return p;
}

Poli proizv (Poli p1, Poli p2) {
  Poli p; p.n = p1.n + p2.n; p.a = new double [p.n+1];
  for (int i=0; i<=p.n; p.a[i++]=0);
  for (int i=0; i<=p1.n; i++)
    for (j=0; j<=p2.n; j++)
      p.a[i+j] += p1.a[i] * p2.a[j];
  return p;
}

void pisi (Poli p) {
  cout << "p[";
  for (int i=p.n; i>=0; i--) {
    cout << p.a[i];
    if (i) cout << ',';
  }
  cout << ']';
}

int main () {
  while (true) { int n;
    cout << "n1? "; cin >> n;
  if (n <= 0) break;
    cout << "P1? "; Poli p1 = citaj (n);
    cout << "n2? "; cin >> n;
    cout << "P2? "; Poli p2 = citaj (n);
    Poli p = proizv (p1, p2);
    cout << "P1*P2= "; p.pisi (); cout<< endl;
    delete [] p1.a; delete [] p2.a; delete [] p.a;
  }
  return 0;
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

Copyright © 2006, Laslo Kraus
Последња ревизија: 4.2.2006.