Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање - испити
Допунски четврти парцијални
23.6.1998

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

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

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

Саставити интерактивни главни програм на језику C који прихвата три команде:

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

Бинарна датотека о оценама студената за сваку оцену садржи шифру предмета (char[6]), број индекса студента (long, пет децималних цифара по шеми ggrrr, где су gg годинa уписа и rrr регистарски број), датум полагања испита (long, шест децималних цифара по шеми ggmmdd) и добијену оцену (char). Датотека је уређена по шифрама предмета. Саставити главни програм на језику C за табеларни приказ средњих оцена појединих студената. Табела треба да је уређена по бројевима индекса студената.

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

Дата је неуређена бинарна секвенцијална датотека чији записи садрже шифру (int) и податак (char[20]). Саставити главни програм на језику C који ће да препише записе те датотеке, у којима се податак по абецедном редоследу налази иза речи LEPTIR, у другу уређену бинарну секвенцијалну датотеку према вредностима шифара. Као међукорак, потребно је од одабраних записа почетне датотеке направити уређену линеарну листу. Имена датотека за обраду задају се у линији команде за извршавање програма.

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


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

/* red.h */

typedef struct elem {
  float broj, struct elem *sled;
} Elem;
typedef struct {Elem *prvi, *posl;} Red;

void  stavi  (Red *red, float  broj);
float uzmi   (Red *red);
int   prazan (Red red);

/* red.c */

#include "red.h"
#include <stdlib.h>

void  stavi  (Red *red, float  broj) {
  Elem *novi = malloc (sizeof (Elem));
  novi->broj = broj; novi->sled = 0;
  red->posl ? red->posl->sled = novi : red->prvi = novi;
  red->posl = novi;
}

float uzmi (Red *red) {
  if (red->prvi) {
    float broj = red->prvi->broj;
    Elem *stari=red->prvi;
    red->prvi = red->prvi->sled;
    free (stari);
    if (! red->prvi) red->posl = 0;
    return broj;
  } return 0;
}

int prazan(Red red) {return red.prvi==0;}

/* redt.c */

#include "red.h"
#include <stdio.h>

void main () {
  Red red={0,0}; int dalje=1;
  while(dalje) { char izb[2]; float broj;
    printf ("\nIzaberite (s=stavi, u=uzmi, k=kraj): ");
    scanf ("%s", izb);
    switch (izb[0]) {
    case 's': case 'S':
      printf("Broj? "); scanf ("%f", &broj);
      stavi (&red, broj);
      break;
    case 'u': case 'U':
      if (! prazan (red)) {
        broj = uzmi (&red);
        printf ("Broj= %.2f\n", broj);
      } else
        printf ("Red je prazan!\n");
      break;
    case 'k': case 'K':
      dalje = 0;
      break;
    default:
      printf ("Nedozvoljen izbor!\n");
    }
  }
}

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

#include <stdio.h>

typedef struct {
  char sifra[6], ocena;
  long br_ind, datum;
} Zap;

typedef struct {
  long br_ind; int zb_oc, br_oc;
} Stavka;

void main () {
  Zap zap;  Stavka tab[250];
  int i, j, dalje, n=0;
  double vr, uk=0;
  FILE *dat = fopen("magacin.dat","rb");

  /* Obrada uzastopnih zapisa */
  while (! feof (dat)) {
    fread (&zap, sizeof (Zap), 1, dat);

    /* Nadji broj indeksa u tabeli */
    for (i=0, dalje=1; i<n && dalje; i++)
      dalje = tab[i].br_ind < zap.br_ind;
    if(i==n || tab[i].br_ind>zap.br_ind){

      /* Jos nema u tabeli, ubaci */
      for(j=n++;j>i;j--) tab[j]=tab[j-1];
      tab[i].br_ind = zap.br_ind;
      tab[i].zb_oc  = tab[i].br_oc = 0;
    }

    /* Akumuliraj vrednost */
    tab[i].zb_oc += zap[i].ocena;
    tab[i].br_oc ++;
  }

  /* Prikaz tabele */
  for (i=0; i<n; i++)
    printf("%d/%d: %.2f\n",  tab[i].br_ind%1000,
      tab[i].br_ind/1000, (float)tab[i].zb_oc/tab[i].br_oc);
}

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

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

typedef struct{int sif;char pod[20];}Zap;
typedef struct elem {
  Zap zap; struct elem *sled;
} Elem;

void main (int barg, char *varg[]) {
  Zap zap;
  Elem *lst=0, *preth, *tek, *novi;
  FILE *ul  = fopen (varg[1], "rb"),
       *izl = fopen (varg[2], "rw");
  while (! feof (ul)) {
    fread (&zap, sizeof(Zap), 1, ul);
    if (strcmp (zap.pod, "LEPTIR") > 0) {
      for (tek=lst, preth=0;
           tek && tek->zap.sif < zap.sif;
           preth=tek, tek=tek->sled);
      novi = malloc (sizeof (Elem));
      novi->zap  = zap;
      novi->sled = tek;
      preth? preth->sled=novi : lst=novi;
    }
  }
  for (tek=lst; tek; tek=tek->sled) {
    zap = tek->zap;
    fwrite (&zap, sizeof(Zap), 1, izl);
  }
  fclose (izl); fclose (ul);
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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