Nizovi

Peruzzi

Domaćin
Poruka
4.066
Paz sad, treba mi sledece:

korisnik (ili petlja, nebitno) unosi redom brojeve (sadrzane u promenljivoj a npr) u niz dok ne upise npr X ili 0

kako ja sad da definisem taj niz kad ne znam koliko ce da bude veliki?
da odredim maksimum na npr 30000 clanova, ne ide...mislim, moze ali nije to to

jedino sto mi palo na pamet je da dam petlju sa brojacem a=1, ,a++ koja se izvrsava sve dok neka vrednost ne bude true (npr n==0), napravim niz sa a clanova, ucitam u a-ti clan ucitanu promenljivu n, onda taj niz iskopiram u drugi, pa ponavljanjem petlje napravim niz za jedan veci od prethodnog, iskopiram u njega sadrzaj ovog drugog (backup) niza, i dodam nov clan n i tako u krug....

e sad tu ima jedna problem - da li ja mogu da menjam velicinu niza u petlji?
(ono - for (i=1, i<5, i++) { int niz ; }
ili se niz definise jednom i ostaje nepromenjiv?


ebem ga sad
 
Kod:
#include <iostream>
using namespace std;
int main()
{
char niz[_MAX_PATH];
int i = 0;
while((niz[i] != 'x') && (niz[i] != 'o'))
{
i++;
cin >> niz[i];
}
}
 
E sad sam nesto testirao i ovaj _MAX_PATH je ogranicen na odredjen cifara, mozda nekoliko stotina (neznam jel koristi _MAX_PATH trenutne lokacije), tako da ti nepreostaje nista drugo nego da ogranicis niz na neki broj, recimo niz[100], pa preko if petlje, ako je taj niz pun, da pocne korisnik da ukucava u drugi niz1[100] ilil da odmah stavis neki velik broj.
 
Pazi ovako posto radish sa neogranichenim brojem elemenata onda je najprirorodnije koristiti listu (dvostruku ili jednostruku stvar je stila). A ako bash morash da radish sa nizom onda morash stalno da radish realokaciju nove memorije za niz pri dodavanju svakog novog elementa.

NPR:

double*& myRealloc (double* niz, int duz) {
// Neki kod....
}

double *niz = NULL;
int duz = 0;
while(true){
double br; cin >> br;
if(br == 9999)break; // Recimo da ovaj broj koristish kao signal za kraj
niz = myRealloc (niz, ++duz);
niz[duz-1] = br;
}

Naravno ovo je dosta neefokasno jer stalno morash da alocirash novu memoriju pa da kopirash prethodni niz u taj novi shto dosta troshi procesorsko vreme koje je dragoceno. Tako da kada bi ja radio ovako neshto sigurno bi koristio listu. Tako da imash josh jednu varijantu; mozzesh da napunish listu potrebnim elementima pa da zatim tu listu transformishesh u niz. Nadam se da sam ti dao neku ideju.
 
Sorry, nisam prochitao tvoj post do kraja. Potpuno si u pravu to je jedan od nachina da se reshi tvoj problem, samo sa jednom malom promenom a to je da napravish funkciju koja cce da ti radi reallokaciju novog niza (chitaj: da se ne ponavljam pogledaj iznad)

pozdrav
 
Sucur:
Da i onaj sistem o povecavanju niza je nemoguc, zato sto moras deklarisaniz brojem.
Ovo je neispravno:
int i = 10;
int niz;
Dakle moras:
int niz[10];
Poz.



zasto je int niz ; neispravno?

mislim, zadajes niz tipa integer sa i clanova, pri cemu i vec ima neku vrednost

zasto ne bi moglo?


uostalom sad cu bas da probam
 
zasto ovaj kod ne valja?

kad ga pokrenem izbaci mi prvi red teksta i ceka da unesem neku vrednost, i onda kad ukucam izbaci onaj windowsow illegal operation prozor

#include <stdio.h>
#include <tgmath.h>

int i;
double a,b,c,n;
double niz[100];

int main()
{
printf("Unesi broj: ");
scanf("%d", a);
printf("\nU koji sistem se konvertuje: ");
scanf("%d", n);

for (i=1; b!=0; i++)
{
b = fmod(a, n);
niz = b;
a = trunc(a/n);
}

for (i=1; i<101; i++)
{
printf("%d",niz[101-i]);
}

return 0;
}


===============================================

Building main.obj.
complex.h included - no complex math support!
Building asdf.exe.
Building projdefs.tag.
Done.
 
Peruzzi:
zasto je int niz ; neispravno?

mislim, zadajes niz tipa integer sa i clanova, pri cemu i vec ima neku vrednost

zasto ne bi moglo?


uostalom sad cu bas da probam


To ne mozze iz prostog razloga shto "int i;" nije konstanta. Probaj sa const int i = x; i proradicce ali samo ako radish u c++ - u, dok u c - u const int i nije prava konstanta vecc ne promenljiva varijabla, pa morash napraviti pravu konstatntu a to se radi na sledecci nachin: posle svih "includova" dodash #define N 50 pa zatim negde u programu definishesh niz: int niz[N];
 
e sad tu ima jedna problem - da li ja mogu da menjam velicinu niza u petlji?

Vecina prethodnih odgovora je omashena totalno, narochito upotreba statichkih nizova.

1. Ako to shto radish, radish u C++u, samo 2 rechi : STL i vector<T>

2. Ako ne znash/ne zhelish STL, onda cesh morati da simulirash dinamichke nizove sam - jednostavno (re)alocirash "parche po parche" niza (recimo po 10-ak elemenata), koje kad napunish, realocirash sa dodatnom grupom elemenata, i tako u krug
 
Kod:
Пројектовати на језику C++ апстрактну класу за збирке целих бројева. Предвидети:

   1. уништавање збирке,
   2. дохватање броја података у збирци (+zbirka),
   3. додавање једног податка збирци (zbirka+=broj),
   4. додавање садржаја збирке збирци (zbirka1+=zbirka2),
   5. дохватање податка са датим редним бројем (zbirka[ind]),
   6. дохватање и избацивање податка са датим редним бројем (zbirka(ind)), и
   7. писање садржаја збирке у неки излазни ток (dat<<zbirka). 

Пројектовати на језику C++ класу за низове целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег попуњеног места у низу. Поред могућности основне калсе предвидети:

   1. стварање празог низа задатог капацитета (подразумевано 10),
   2. иницијализацију низа другим низом,
   3. иницијализацију низа збирком (капацитет треба да је једнак величини збирке), и
   4. додељивање низу вредност другог низа (niz1=niz2) и збирке (niz=zbirka). 

Пројектовати на језику C++ класу за листе целих бројеве као изведену класу из класе за збирке. Нови подаци се додају иза последњег елемента листе. Поред могућности основне класе предвидети:

   1. стварање празне листе,
   2. иницијализацију листе другом листом,
   3. иницијализацију листе збирком, и
   4. додељивање листи вредност друге листе (lista1=lista2) и збирке (lista=zbirka). 

За пријављивање конфликтних ситуација (нема места у низу, индекс изван опсега) изузецима, направити одговарајуће једноставне класе.

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

    * створи одређену врсту збирке
    * додај број збирци,
    * промени вредност броја на одређеном месту,
    * извади број са одређеног места (број се брише из збирке),
    * испиши садржај збирке,
    * претвори збирку у збирку задате врсте, и
    * заврши са радом. 

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

    * Испит траје 180 минута.
    * Решење задатка предаје се у облику три датотеке: дефиницје свих класа, дефиниције метода уз све класе и главни програм. Не стављати целокупно решење у једну датотеку.
    * Пожељно је да програм проради до краја испита.

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

// zbirka.h

#ifndef _zbirka_h_
#define _zbirka_h_
#include <iostream.h>

class Zbirka {
public:
  virtual ~Zbirka () {}
  virtual int operator+ () const =0;
  virtual Zbirka& operator+=(int k)=0;
  friend Zbirka& operator+= (Zbirka& z1, const Zbirka& z2);
  virtual int& operator[](int ind)=0;
  virtual const int& operator[] (int ind) const =0;
  virtual int operator() (int ind)=0;
  friend ostream& operator<< (ostream& d, const Zbirka& z);
};

class GZbirkaPuna {};

class GZbirkaIndeks {};

#endif

// zbirka.cpp

#include "zbirka.h"

Zbirka& operator+= (Zbirka& z1, const Zbirka& z2) {
  for(int i=0; i<+z2; i++) z1 += z2[i];
  return z1;
}

ostream& operator<< (ostream& d, const Zbirka& z) {
   d << '[';
  for (int i=0; i<+z; i++) { d << z[i]; if (i < +z-1) d << ','; }
  return d << ']';
}

// niz.h

#ifndef _niz_h_
#define _niz_h_
#include "zbirka.h"

class Niz: public Zbirka {
  int *niz, kap, vel;
  void kopiraj (const Niz& n);
  void brisi() { delete [] niz; vel = kap = 0; }
public:
  Niz (int k=10) { niz = new int [kap=k]; vel = 0; }
  Niz (const Niz& n) { kopiraj(n); }
  Niz (const Zbirka& z) { niz = new int[kap=+z]; vel = 0; *this += z; }
  ~Niz () { brisi (); }
  Niz& operator= (const Niz& n) {
    if (this != &n) { brisi (); kopiraj (n); }
    return *this;
  }
  Niz& operator= (const Zbirka& n) {
    if (this != &n) { brisi( ); niz=new int[kap=+n]; (*this) += n;}
    return *this;
  }
  int operator+ () const { return vel; }
  Niz& operator+= (int k) {
    if (vel == kap) throw GZbirkaPuna ();
    niz[vel++] = k;
    return *this;
  }
  int& operator[] (int ind) {
    if (ind<0 || ind >=vel) throw GZbirkaIndeks ();
    return niz[ind];
  }
  const int& operator[] (int ind) const {
    if (ind<0 || ind >=vel) throw GZbirkaIndeks ();
    return niz[ind];
  }
  int operator() (int ind);
};

#endif

// niz.cpp




#include "niz.h"

void Niz::kopiraj (const Niz& n) {
  niz = new int [kap=n.kap]; vel = n.vel;
  for (int i=0; i<vel; i++) niz[i] = n.niz[i];
}

int Niz::operator() (int ind) {
  if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
  int k = niz[ind];
  for (int i=ind; i<vel-1; i++) niz[i] = niz[i+1];
  vel--;
  return k;
}

// lista.h

#ifndef _lista_h_
#define _lista_h_
#include "zbirka.h"

class Lista: public Zbirka {
  struct Elem {
    int broj; Elem *sled;
    Elem(int b, Elem*s=0){broj=b;sled=s;}
  };
  Elem *prvi, *posl; int vel;
  void kopiraj (const Lista &lst);
  void brisi () ;
public:
  Lista () { prvi=posl=0; vel=0; }
  Lista (const Lista& lst){kopiraj(lst);}
  Lista (const Zbirka& z) { prvi = posl = 0; vel = 0; *this += z;}
  ~Lista () { brisi (); }
  Lista& operator= (const Lista& lst) {
    if (this != &lst) { brisi( ); kopiraj (lst); }
    return *this;
  }
  Lista& operator= (const Zbirka& lst) {
    if (this != &lst) { brisi (); *this += lst; }
    return *this;
  }
  int operator+() const { return vel; }
  Lista& operator+= (int k) {
    posl= (!prvi ? prvi : posl->sled) = new Elem(k);
    vel++;
    return *this;
  }
  int& operator[] (int ind);
  const int& operator[] (int ind) const {
    return ((Lista&)(*this))[ind];
  }
  int operator() (int ind);
};

#endif

// lista.cpp

#include "lista.h"

void Lista::kopiraj
  (const Lista& lst) {
  prvi = posl = 0; vel = lst.vel;
  for (Elem *tek=lst.prvi; tek; tek=tek->sled)
    posl = (!prvi ? prvi : posl->sled) = new Elem (tek->broj);
}

void Lista::brisi () {
  while (prvi) {Elem *stari = prvi; prvi = prvi->sled; delete stari; }
  posl = 0; vel = 0;
}

int& Lista::operator[] (int ind) {
  if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
  Elem *tek = prvi;
  for(int i=0;i<ind;i++) tek=tek->sled;
  return tek->broj;
}

int Lista::operator() (int ind) {
  if (ind<0 || ind>=vel) throw GZbirkaIndeks ();
  Elem *tek = prvi, *preth = 0;
  for (int i=0; i<ind; i++) { preth=tek; tek=tek->sled; }
  int broj = tek->broj; vel--;
  if(((!preth ? prvi : preth->sled) = tek->sled) == 0) posl = 0;
  return broj;
}

// glavni.cpp

#include "niz.h"
#include "lista.h"
#include <iostream.h>

Zbirka* nova () {
  cout << "Vrsta (N, L)? ";
  char vrs; cin >> vrs;
  switch (vrs) {
    case 'l': case 'L': return new Lista ();
    case 'n': case 'N': {
      int k; cout << "Kapacitet? "; cin >> k; return new Niz (k);
    } default: throw "Neispravna vrsta";
  }
}

int main () { Zbirka *z = new Niz;
  while (true) {
    cout <<
      "\nMoguce operacije su:\n\n"
      "1 Stvaranje nove zbirke\n"
      "2 Dodavanje broja zbirci\n"
      "3 Promena broja u zbirci\n"
      "4 Vadjenje broja iz zbirke\n"
      "5 Prikazivanje zbirke\n"
      "6 Promena vrste zbirke\n"
      "0 Kraj rada\n\n"
      "Unesite svoj izbor: ";
    int izbor; cin >> izbor;
  if (izbor == 0) break;
    try {
      switch (izbor) {
        case  1: {
          Zbirka *zz=nova (); delete z; z=zz; break;
        }case 2: {
          cout << "Broj? "; int b; cin >> b; *z += b; break;
        }case 3: {
          int i, b;
          cout<<"Indeks? "; cin>>i;
          cout<<"Broj? "; cin>>b;
          (*z)[i] = b; break;
        }case 4: { int i;
          cout<<"Indeks? "; cin>>i;
          cout << "Broj= " << (*z)(i) << endl;
          break;
        }case 5: {
          cout<<"Zbirka= " <<*z<<endl; break;
        }case  6: {
          Zbirka *zz=nova( ); *zz += *z; delete z; z=zz; break;
        }default: throw "Neispravan izbor";
      }
    } catch (GZbirkaPuna) {
      cout << "GRESKA: Zbirka je puna\n";
    } catch (GZbirkaIndeks) {
      cout << "GRESKA: Indeks izvan opsega\n";
    } catch (const char *g) {
      cout << "GRESKA: " << g << endl;
    }
  }
}


konkretno, klasa lista je magacin neogranicenog kapaciteta ( povezana lista)

ovo je resen rok iz objektnog programiranja kod prof Lasla Krausa.

pozdrav.
 

Back
Top