Visa elektrotehnicka skola, Beograd
Ласло Краус
Програмирање II
Допунски други колоквијум
15. 7. 1999

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

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

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

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

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

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

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

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

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

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


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


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

#include <stdio.h>

void zbir (char a[], char b[], char c[], int n    ) {
  int i; char p=0;
  for (i=n-1; i>=0; i--) {
    c[i] = a[i] + b[i] + p;
    if (a[i] > 9) {
      a[i] -= 10; p = 1;
    } else        p = 0;
  }
}

void citaj (char a[], int n) {
  int i, zn;
  for (i=0; i<n; i++) {
    zn = getchar ();
    a[i] = (zn == ' ') ? 0 : zn-'0';
  }
}

# define N 40
void main () {
  while (1) {
    char a[N], b[N], c[N]; int n, i;
    printf ("n? "); scanf ("%d", &n);
  if (n<0 || n>N) break;
    printf ("A? "); citaj (a, n);
    printf ("B? "); citaj (b, n);
    zbir (a, b, c, n);
    printf ("C= ");
    for (i=0; i<n; printf("%1d",c[i++])); putchar ('\n');
  }
}

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

/* dinniz.h */

typedef struct { int n; float *a; } DNiz;

DNiz citaj (void);
void reduk (DNiz *dn);
void brisi (DNiz *dn);

/* dinniz.c */

#include "dinniz.h"
#include <stdio.h>
#include <stdlib.h>

DNiz citaj (void) { DNiz dn; int i;
  scanf ("%d" &dn.n);
  dn.a = malloc (n*sizeof(float));
  for (i=0; i<dn.n; scanf("%f",&dn.a[i++]));
  return dn;
}

void brisi (DNiz *dn) {
  free (dn->a); dn->a = 0; dn->n = 0;
}

void reduk (DNiz *dn) {
  int i, j=-1;
  if (dn->n > 0)
    for (i=1, j=0; i<dn->n; i++)
      if (a[i] <> a[j]) a[++j] = a[i];
  dn->a = realloc (dn->a, (dn->n=j+1)*sizeof*float));
}

/* dinnizt.c */

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

void main () {
  while (1) { DNiz dn;
    printf ("Duzina i elementi niza? ");
    dn = citaj ();
  if (dn.n <= 0) break;
    reduk (&dn); printf ("Redukovano:");
    for (i=0; i<dn.n; printf (" %d", dn.a[i++]);
    putchar ('\n'); brisi (&dn);
  }
}

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

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

typedef struct elem {
  int broj;
  struct elem *sled;
} Elem;

Elem *uredi (Elem *lista) {
  Elem *tek=lista, *prvi=0;
  while (tek) {
    Elem *sled = tek->sled;
    Elem *ovaj = prvi, *preth = 0;
    while (ovaj && ovaj->broj <= tek->broj) {
      preth = ovaj;
      ovaj  = ovaj->sled;
    }
    if (preth == 0) prvi = tek;
      else          preth->sled = tek;
    tek->sled = ovaj;
    tek = sled;
  }
  return prvi;
}

void main () {
  while (1) { int n, i;
    Elem *lst=0, *tek=0, *novi;
    printf ("n? "); scanf ("%d", &n);
  if (n < 0) break;
    printf ("A? ");
    for (i=0; i<n; i++) {
      novi = malloc (sizeof (Elem));
      scanf ("%d", &novi->broj);
      novi->sled = 0;
      if (tek == 0) lst       = novi;
        else        tek->sled = novi;
      tek = novi;
    }
    lst = uredi (lst); printf ("A= ");
    for (tek=lst; lst; lst=lst->sled) printf ("%d ", lst->broj);
    putchar ('\n');
    while (lst) { Elem *stari = lst;
      lst = lst->sled; free (stari);
    }
  }
}
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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