Elektrotehnicki fakultet, Beograd  Ласло Краус Програмски језици (ЕГ)
Испит
14. 2. 2004.

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

Поставка задатка 1 (25 поена) ( решење | почетак)

Саставити на језику C функцију за изостављање сваког k-тог елемента из низа целих бројева. На пример, изостављањем сваког трећег елемента из низа 1, 2, 3, 4, 5, 6, 7, 8 добија се низ 1, 2, 4, 5, 7, 8.

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

Поставка задатка 2 (25 поена) ( решење | почетак)

Саставити на језику C главни програм за израчунавање производа две симетричне квадратне матрице реалних бројева (за сваки елемент важи да је aij=aji). Подаци о почетним матрицама се налазе у секвенцијалним текстуалним датотекама. У првом реду се налази димензија матрице, а у преосталим редовима по једна врсте матрице. У датотеци се налазе само елементи на главној дијагонали и испод главне дијагонале (за које важи i>=j). Резултат уписати у нову секвенцијалну текстуалну датотеку по узору на почетне матрице. Ако се димензије почетних матрица не слажу, исписати поруку о томе на главном излазу без стварања нове датотеке. Имена датотека читати преко главног улаза рачунара.

Поставка задатка 3 (30 поена) ( решење | почетак)

Саставити на језику FORTRAN потпрограм за налажење првог и последњег појављивања датог броја у уређеном низу реалних бројева. Применити поступак бинарног претраживања. У случају неуспеха оба резултата треба да буду једнаки нули.

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


Напомене ( почетак)


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

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

void izost (int a[], int *n, int k) {
  int i, j=0;
  for (i=0; i<m; i++)
    if (i%k != k-1) a[j++] = a[i];
  *n = j;
}

main () {
  int *a, n, i;
  while (1) {
    printf ("\nn? "); scanf ("%d", &n);
  if (n<=0) break;
    a = malloc (n * sizeof(int));
    printf ("A? ");
    for (i=0; i<=m; scanf("%d",&a[i++]));
    printf ("k? "); scanf ("%d", &k);
    izost (a, &n, k);
    for (i=0; i<n; printf("%d ", a[i++]);
    putchar ('\n');
    free (a);
  }
}

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

#include <stdio.h>
#define N 50

main () {
  float a[N][N], b[N][N], c[N][N];
  int na, nb, nc, i, j, k;
  FILE *dat;
  char ime[31];
  printf ("Ulaz A? "); scanf ("%s", ime);
  dat = fopen (ime, "r");
  fscanf (dat, "%d", &na);
  for (i=0; i<na; i++)
    for (j=0; j<=i; fscanf(dat,"%d",&a[i][j++]));
  fclose (dat);
  printf ("Ulaz B? "); scanf ("%s", ime);
  dat = fopen (ime, "r");
  fscanf (dat, "%d", &nb);
  for (i=0; i<nb; i++)
    for (j=0; j<=i; fscanf(dat,"%d",&b[i][j++]));
  fclose (dat);
  if (na == nb) {
    nc = na;
    for (i=0; i<na; i++)
      for (k=0; k<=i; k++) {
        c[i][k] = 0;
        for (j=0; j<na; j++)
          c[i][k] += (i>j?a[i][j]:a[j][i]) * (j>k?b[j][k]:b[k][j]);
      }
    printf ("Izlaz? "); scanf ("%s",ime);
    dat = fopen (ime, "w");
    fprintf (dat, "%d\n", nc);
    for (i=0; i<nc; i++) {
      for (j=0; j<=i; fprintf(dat,"%d ",c[i][j++]));
      fprintf (dat, "\n");
    }
    fclose (dat);
  } else
    printf ("Neusaglasene dimenzije!\n");
}

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

      SUBROUTINE bintra (A, n, b, p, q)
      INTEGER A(n), b, p, q, d, g, s
      LOGICAL ima
      d = 1
      g = n
      ima = .false.
      DO WHILE (d.le.g .and. .not. ima)
        s = (d + g) / 2
        if      (a(i) .gt. b) THEN
          d = s + 1
        ELSE IF (a(i) .lt. b) THEN
          g = s - 1
        ELSE
          ima = .true.
        END IF
      END DO
      IF (ima) THEN
        p = s
        DO WHILE (p.gt.1 .and. a(p-1).eq.b)
          p = p - 1
        END DO
        q = s
        DO WHILE (q.lt.n .and. a(q+1).eq.b)
          q = q + 1
        END DO
      ELSE
        p = 0
        q = 0
      END IF
      END

      PROGRAM Trazi
      PARAMETER (max = 40)
      INTEGER A(max), b, p, q
   10 CONTINUE
        PRINT *, 'n?'
        READ *, n
      IF (n.lt.0) GO TO 99
        PRINT *, 'A?'
        READ *, (a(i), i=1,n)
        PRINT *, 'b?'
        READ *, b
        bintra (a, n, b, p, q)
        IF (p .gt. 0) THEN
          PRINT *, p, q
        ELSE
          PRINT *, 'Nema broja!'
        END IF
        GO TO 10
   99 CONTINUE
      END
( почетак)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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