Visa elektrotehnicka skola, Beograd
Ласло Краус
Објектно програмирање - колоквијуми
Први колоквијум
25. 11. 1999

Задатак | Напомене | Решење

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

Велики позитиван цео број представља се низом бајтова чији савки елемент сдржи вредност једне децималне цифре. Водећа цифра у броју никада није нула (осим ако број има вредност 0). Пројектовати на језику C++ класу за велике позитивне целе бројеве. Предвидети:
  1. иницијализацију великог целог броја обичним целим бројем (подразумевана вредност је 0),
  2. иницијализацију броја другим бројем,
  3. уништавање броја,
  4. додељивање вредности једног броја другом броју (I1=I2),
  5. израчунавање збира два броја (I1+I2),
  6. додавање једног броја на други број (I1+=I2),
  7. повећавање вредности броја за један (++I, I++),
  8. претварање великог целог броја у обичан цео број,
  9. читање броја (d>>I),
  10. исписивање броја (d<<I).
Саставити потпрограм на језику C++ за израчунавање n-тог Fibonacci-јевог броја (n<10000) дефинисаног са Fn=Fn-1+Fn-2 (n>1), F0=1, F1=1.

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


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


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

// 1999_k1.h - Definicija klase velikih celih brojeva (Int).

#include <iostream.h>

class Int {
  int duz; char *cif;
  void kopiraj (const Int &);
  void brisi () { delete [] cif; duz = 0; }
public:
  Int (long k=0);
  Int (const Int &I) { kopiraj (I); }
  ~Int () { brisi (); }
  Int & operator= (const Int &I) {
    if (this != &I) { brisi (); kopiraj (I); }
    return *this;
  }
  friend Int operator+ (const Int &, const Int &);
  Int & operator+= (const Int &I) { return *this = *this + I; }
  Int & operator++ () { return *this += 1; }
  Int   operator++ (int) { Int I = * this; ++*this; return I; }
  long vrednost ();
  friend istream & operator>> (istream &d,       Int &I);
  friend ostream & operator<< (ostream &d, const Int &I);
};


// 1999_k1.cpp - Definicije metoda uz klasu Int. #include "1999_k1.h" Int::Int (long k) { char c[10]; duz=0; do { c[duz++] = (char)(k % 10); k /= 10; } while (k); cif = new char [duz]; for (int i=0; i<duz; i++) cif[i] = c[i]; } void Int::kopiraj (const Int &I) { cif = new char [duz = I.duz]; for (int i=0; i<duz; i++) cif[i] = I.cif[i]; } Int operator+ (const Int &I1, const Int &I2) { int duz = (I1.duz > I2.duz ? I1.duz : I2.duz) + 1; char *cif = new char [duz]; for (int i=0, p=0; i<duz; i++) { int c = (i >= I1.duz && i >= I2.duz) ? p : (i >= I2.duz ) ? p + I1.cif[i] : (i >= I1.duz ) ? p + I2.cif[i] : p + I1.cif[i] + I2.cif[i]; cif[i] = c % 10; p = c / 10; } if (cif[duz-1] == 0) duz--; Int I; I.cif = new char [I.duz = duz]; for (i=0; i<duz; i++) I.cif[i] = cif[i]; delete [] cif; return I; } long Int::vrednost () { long k=0; for (int i=duz; i>0; (k*=10)+=cif[--i]); return k; } #include <string.h> istream & operator>> (istream &d, Int &I) { char *cif = new char [500]; d >> cif; I.brisi(); I.cif = new char [I.duz = strlen(cif)]; for (int i=0; i<I.duz; i++) I.cif[I.duz-i-1] = cif[i] - '0'; delete [] cif; return d; } ostream & operator<< (ostream &d, const Int &I) { for (int i=I.duz; i>0; d<<(int)I.cif[--i]); return d; }
// 1999_k1t.cpp - Izracunavanje Fibonaccijevih brojeva. #include "1999_k1.h" #include <iostream.h> Int fibo (int n) { Int f0 = 1, f1 = 1; for (int i=2; i<=n; i++) { Int f2 = f0 + f1; f0 = f1; f1 = f2; } return f1; } void main () { while (1) { cout << "n? "; int n; cin >> n; if (n < 0) break; cout << "f= " << fibo (n) << endl << endl; } }
(садржај)
         
Аутор: Ласло Краус
Е-пошта: kraus@etf.rs

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