zadaci
Select messages from
# through # FAQ
[/[Print]\]
Idite na 1, 2  Sljedeće  :| |:
Forum@DeGiorgi -> Objektno programiranje (C++)

#1: zadaci Autor/ica: charlotte PostPostano: 13:50 sub, 20. 3. 2010
    —
Pozdrav, rjesavala sam neke zad, ali ne rade kako treba. Pa da li bi mi netko mogao pomoci da ih ispravim?


/* Napisite program koji cita stringove sa standardnog ulaza ubacujuci pritom jedan po jedan vektor,
te nakon unosa EOF(^Z) ispisuje sadrzaj dobivenih vektora.*/

#include <iostream>
#include <vector>
#include<string>
using namespace std;



int main(){

vector<string> text;
string word;
int br=0;

for(br=0;br<100000;br++){

while(cin>>word){
text.push_back(word);

if(text[br] == "EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<'';
cout<<endl;
break;
}
}
}
system("pause");
return 0;
}

Javlja mi ovu gresku:error C2137: empty character constant



/*Napisi fju koja broji koliko se puta u nekoj rijeci pojavljuje par slova ab.
Npr. ab se pojavljuje 2x u rijeci "xabaacbaxabb" */

#include<iostream>
#include<string>
using namespace::std;

int f(string p){
int br1=0,gdje;
string q,m;

q=p;

if(q.size()==0) return br1=0;

gdje=q.find("ab",0);

if(gdje==string::npos) return br1=0;

while(gdje){
br1++;
m=q.substr(gdje,q.size()-gdje);
gdje=m.find("ab",0);
q=m;
if(gdje > q.size()) break;
}

return br1;
}

int main(){

string s1;
int B;

cin>>s1;

B=f(s1);

cout<<B<<endl;

system("pause");
return 0;

}

Uvijek mi ispisuje broj 1.


/* Napisite program koji ucitava i stavlja na kraj liste stringove sve dok se ne ucita
string "kraj". Ispisite sadrzaj dobivene liste pomocu pomocu pop_front() i front()
operacija, te pomocu iteratora.*/

#include<iostream>
#include<string>
#include<list>
using namespace::std;

int main(){

list<string> nova;
list<string>::iterator iter;
string s;

while(cin>>s){
while(s!="kraj")
nova.push_front(s);
}
for(iter=nova.begin();iter<nova.end();iter++)
cout<<*iter<<endl;

}
system("pause");
return 0;
}

Unaprijed hvala![/table]

#2:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 14:36 sub, 20. 3. 2010
    —
Evo za prvi zadatak koji sam sad pogledao:

Grešku ti javlja zbog ovog:

Kod:
cout<<text[i]<<'';


Tebi treba ovo:

Kod:
 cout<<text[i]<<" ";

ako si mislila razmak stavit između svaka dva stringa. ' ' Označava znak, a
" " oznacava string. Smile

Nadalje, i uz tu modifikaciju program ti neče radit, zašto:

1. U while petlji ti se nigdje ne mijenja br, dakle do got ti učitavaš riječi while petlja će se izvršavat i br će ti bit 0, što znači da ti je ona provjera u if uzaludna u tom slučaju (osim ako odmah naa početku ne upišeš EOF(^Z). To rješiš tako da povečaš br nakon if-a, a kad to napraviš, for ti više neće trebati...

2. Nisam siguran dali sam dobro skužio zadatak, dali ti trebaš ubacivat riječi u vektor ili moraš imati niz vektora, zadatak ti je malo čudno napisan?
Po tvom kodu ja sam zaključio da trebaš ubacivati rječi u vektor dok ne upišeš EOF(^Z). Smile

#3:  Autor/ica: charlotte PostPostano: 15:42 sub, 20. 3. 2010
    —
Da, jedan je vektor Laughing . Mislis ovako?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;


while((cin>>word) &(word!="EOF(^Z)"))
text.push_back(word);

if(text.end()=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
}



system("pause");
return 0;
}

Meni ni to ne radi Sad .

#4:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 16:39 sub, 20. 3. 2010
    —
Kod:
 #include <iostream>
#include <vector>
#include<string>

using namespace::std;


int main(){

  vector<string> text;
   string word;


       while( (cin>>word) && (word!="EOF(^Z)") )
                         text.push_back(word);



    cout<<"Procitane rijeci:"<<endl;

    for(unsigned int i=0; i!=text.size(); ++i)
                 cout<<text[i]<<" ";
                 cout<<endl;



scanf("%%");

return 0;
}


E sad:
Jesi ti uopće compilirala ovo šta si postala? Smile

Logičko and je &&, a ne & (ovo drugo je and po bitovima...)

text.end(), vrača iterator na kraj vektora, pa ti uspoređuješ iterator i string (tu bi ti se trebao i compiler bunit).

Ali da se i ne buni ovaj if je besmislen zato što stavljaš riječ u vektor samo ako ta riječ nije jednaka "EOF( ^Z)". Wink
Tako da u tvome primjeru se neće vrlo vjerojatno ništa ispisat. Smile

#5:  Autor/ica: charlotte PostPostano: 17:47 sub, 20. 3. 2010
    —
Pa jesam... Zakaj ovo ne radi?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}

#6:  Autor/ica: m00nblade PostPostano: 18:15 sub, 20. 3. 2010
    —
Problem ti je u ovome:
Kod:

it=text.end();
if(*it=="EOF(^Z)"){


vector::end() ne vraca iterator na zadnji element u vektoru, nego iterator koji označava kraj vektora i koji se ne smije dereferencirati.

Bilo bi ti bolje da umjesto
Kod:
if (*it == "EOF(^Z)") {

staviš
Kod:
if (word == "EOF(^Z)") {


I jos nesto, EOF(^Z) označava end-of-file znak, koji se na Unixu dobije s Ctrl+D, a na Windowsima s Ctrl+Z Smile

Tako da u kodu možeš staviti:
Kod:

while (cin >> word) {
    text.push_back(word);
}

cout << "Procitane rijeci: " << endl;
for (int i = 0; i < text.size(); ++i) {
    cout << text[i] << " ";
}


I onda kad želiš završiti unos riječi, stisneš Ctrl+Z Smile

#7:  Autor/ica: charlotte PostPostano: 13:47 ned, 21. 3. 2010
    —
Program mi radi i ako dodam it–. Na slican nacin sam ispravila i onaj sa listama Smile .

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
it–;
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}

Moze jos mala pomoc oko onog sa stringovima Laughing ? I kako napisati fju koja kao argument prima pokazivac na listi stringova ili listu stringova?
Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)

#8:  Autor/ica: ivo34 PostPostano: 18:36 ned, 21. 3. 2010
    —
charlotte (napisa):
Moze jos mala pomoc oko onog sa stringovima Laughing ?

Malo sam prepravio tvoju funkciju, ovo bi ti trebalo dobro raditi:
Kod:
int f(string p){
   int br1=0,gdje,duljina;
   string q;
   q=p;
   duljina=q.size();
   while (duljina) {
      gdje = q.find("ab",0);
      if(gdje==string::npos)
         break;
      else {
         ++br1;
         q = q.substr(gdje+2,duljina-2);
         duljina = q.size();
         if (gdje== duljina)
            break;
      }
   }
   return br1;
}

Mislim da ok radi, testiraj malo i pitaj ako nije nesto jasno... Smile

#9:  Autor/ica: CobsLokacija: Geto PostPostano: 23:03 ned, 21. 3. 2010
    —
charlotte (napisa):

Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)


nisam isprobavo, al ak nis ne sljaka od ove "obicne" sintakse, probo bi napravit klasu koja sadrzi listu stringova, a zatim ubacit pokazivac na tu klasu kao argument funkcije, pa si dobila skoro istu stvar koju si željela ( inace sam rjesil par tih prvih zadataka pa ak oces posaljem ti na pm )

#10:  Autor/ica: charlotte PostPostano: 13:17 pon, 22. 3. 2010
    —
Moze Very Happy to bi bilo super!

#11:  Autor/ica: bleki88 PostPostano: 16:40 pon, 19. 4. 2010
    —
U ovom zadatku s vjezbi koristili smo pomocnu klasu Broj_zbrajanje,
el mi moze ko objasnit cemu ona sluzi mislim zakaj smo bas to tak radili.
Evo rjesenja zadatka:

Kod:
#include <iostream>
#include <string>

 using namespace std;
 
 [color=red]struct broj_zbrajanje;[/color]
 
 struct broj {
 
   int* znamenke;
   int duljina;
   broj(){}
   broj( const string );
   broj( const broj& );
   broj( [color=red]const broj_zbrajanje& x[/color] ){ *this = x; }
   broj& operator=( [color=red]const broj_zbrajanje&[/color] );
   ~broj();
   friend [color=red]broj_zbrajanje[/color] operator+( const broj&, const broj& );         
       
       
 };
 
[color=red] struct broj_zbrajanje{
 
      const broj& a;
      const broj& b;
      broj_zbrajanje( const broj& a, const broj& b ): a( a ), b( b ) {}       
       
 };[/color]
 
 broj::broj( const string s ){
 
            duljina = s.size();
            znamenke = new int[ duljina ];
           
            for( int i = 0; i < duljina; i++ )
                znamenke[i] = s[i] - '0';     
                         
 }
 
 broj::broj( const broj& x ){
 
            znamenke = new int[ x.duljina ];
            duljina = x.duljina;
            for( int i = 0; i < duljina; i++ )
               znamenke[i] = x.znamenke[i];             
             
 }
 
 broj& broj::operator=([color=red] const broj_zbrajanje& x[/color] ){
 
       if( znamenke ) delete [] znamenke;
       int max = x.a.duljina;
       int a = x.a.duljina - 1,b = x.b.duljina - 1, c = 0;
       if( x.b.duljina > max ) max = x.b.duljina;
       znamenke = new int[ max + 1 ];
       duljina = max + 1;
       for( int i = max; i >= 0; i-- ){
           int suma_a = (a >= 0) ? x.a.znamenke[a] : 0;
           int suma_b = (b >= 0) ? x.b.znamenke[b] : 0;
           a--;b--;
           znamenke[i]=(suma_a+suma_b+c)%10;
           c = (suma_a+suma_b+c)/10;
           
       }
           
             
       
 }
 
 broj_zbrajanje operator+( const broj& x, const broj& y ){
               return [color=red]broj_zbrajanje( x, y )[/color];
     
 }
 
 void ispis( const broj& x ){
 
           if( x.znamenke[0] != 0 )
                cout << x.znamenke[0];
           for( int i = 1; i < x.duljina; i++ )
             
               cout << x.znamenke[i];
               cout << endl;
               
     
 }
 
 broj::~broj(){ if( znamenke ) delete [] znamenke; }
 
 
 
 int main(){
     
  broj a("99999999999999999999999999999");
  broj b("1");
 
  broj c = a + b;

  ispis( c );   
       
     
  system("pause");
  return 0;   
     
 }

#12:  Autor/ica: LuukaLokacija: Hakuna Matata PostPostano: 17:02 pon, 19. 4. 2010
    —
Usporedimo "normalno" zbrajanje i ovakvo sa pomoćnom klasom:

nek imamo naredbu C=A+B;

1. "normalno" zbrajanje
- imali bismo fju oblika
Kod:
broj operator+(const broj& a, const broj& b)

tu bi najprije konstruirali novi veiki broj C, napravili operaciju, i onda to vratili. Pri tom vraćanju se zove copy-konstruktor koji tu privremenu varijablu unutar fje kopira u privremenu van fje, i onda još jedan copy-konstruktor koji tu privremenu kopira u naš C iz maina. Dakle 2 kopiranja bezveze, i 2 destruktora bezveze (za te privremene varijable)

2. pomoću pomoćne klase.
Ideja je napraviti malu klasu, koja će se sama brinuti o zbrajanju, i da to bude bez nepotrebnog kopiranja.
Klasu_zbrajanje napravimo samo tako da čuva dvije reference na brojeve koje treba zbrojiti (reference su mali objekti). Operator + napravimo da vraća klasu_zbrajanje, a onda izraz C=A+B tumačimo kao da velikom broju pridružujemo klasu_zbrajanje (koju vrati +). Dakle, jedini posao koji se tu događe je na operatoru =, i fja
Kod:
broj& operator=( const broj_zbrajanje& x ){

vraća veliki broj, koji je dobiven kao zbroj referenci koje čuva klasa zbrajanje. Jer vraća referencu na broj, nema dodatnog kopiranja.



A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...

#13:  Autor/ica: bleki88 PostPostano: 17:34 pon, 19. 4. 2010
    —
Jos malo pitanja:

kaj znaci *this=x u onom konstruktoru koji prima broj_zbrajanje

i kaj onda radi operator jednako u npr B=A a A i B su već negdje prije definirani Brojevi

#14:  Autor/ica: LuukaLokacija: Hakuna Matata PostPostano: 17:43 pon, 19. 4. 2010
    —
Taj konstruktor tu uopće ne treba, ne znam zašto je stavljen...

a operator= se može preopteretiti baš kao i bilo koji drugi operator. Pa kada prima obični broj, da napravi pridruživanje na kakvo smo navikli, kad prima klasu_zbrajanje, da napravi zbrajanje itd.

A u ovom tvom primjeru sa A i B bi operator= na naredbi A=B napraviti:
1. obrisat kaj je prije bilo u A.
2. alocirat memoriju da stane sve iz B
3. kopirat sve iz B na tu novo alociranu memoriju

- kod A=A se ništa ne bi trebalo desit, to provjeri na početku inače ak napraviš dealokaciju sve gubiš

#15:  Autor/ica: bleki88 PostPostano: 17:46 pon, 19. 4. 2010
    —
e super, puno jasnije, fala

#16:  Autor/ica: matmihLokacija: {Zg, De , Ri} PostPostano: 19:26 pon, 19. 4. 2010
    —
Luuka (napisa):

A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...


Generalno je smart pointer parametrizirana klasa koja se brine za dealokaciju objekta na koji pokazuje. Ostalo će trebat odgovorit netko tko rješava zadaću.

Glede matrice, ima dosta smisla raditi posebnu klasu za dijagonalne matrice, zato šta ti je u tom slučaju dosta zapamtit samo elemente na dijagonali u jedno polje i možeš rekonstruirat cijelu matricu, a memorijska potrošnja je znatno smanjena.
Generalno (kolko ja znam) se u C++ matrice spremaju u polje, a onda je lako indekse izvuči iz njega. Smile

Naravno kod mješovitih operacija tipa zbrajanje između dijagonalne i full matrice rezultat će biti full matrica, s druge strane Hadamardov produkt će proizvesti dijagonalnu matricu... Smile

#17:  Autor/ica: LuukaLokacija: Hakuna Matata PostPostano: 19:42 pon, 19. 4. 2010
    —
Ma jasno da ima smisla radit dijagonalnu, ali ako implementuram kao dupli pointer, onda moram skroz razdvojit te dvije strukture, a na to se ne cilja, bar mislim da ne... a i ovako kak radim se compiler buni na sve i svašta, makar i najjednostavnije A[i][j]+B[i][j]... jel ima neka dobra duša da ukratko opiše pametne pointere u ovom slučaju i kako same strukture izgledaju, gdje ide koja provjera i slično?

#18: Zašto mi ovaj kod ne radi? klasa vektor. Autor/ica: jelenko* PostPostano: 19:07 uto, 20. 4. 2010
    —
Radi se o klasi vektor koja bi se trebala ponašati kao pametni pokazivač, dakle ima nekakvo brojanje referenci itd, itd.... većina toga mi je proradila, sve super, ali zanima me zašto mi funkcionira doljnji kod. Kopirao sam samo dio koji mislim da je bitan.

Zašto mi ne radi ova funkcionalnost kakvu želim postići u mainu?
Želim moći konstruirati objekt tipa vektor iz proizvoljnog polja brojeva.

Što moram promijeniti u klasi da bi mi to proradilo?


#include <vector>
using namespace std;

template<typename TIP>
class vektor
{
public:
typedef unsigned int index;

struct vektorRep
{
int m_refCount;
index _size;
TIP* _data;

template <typename T, index N>
vektorRep( index N, T* r )
:m_refCount(1), _size(N), _data( new TIP[N])
{
for(index i=0; i<_size; ++i) *(_data+i) = *(r+i);
}
};

private:
vektorRep* rep;

public:

template<typename T, index N>
vektor(T (&p)[N]) : rep(new vektorRep( N, p) ) { }


};

void main()
{
double p3[]={1,2,3,4,5};
vektor<double> v4(p3);

system("pause");
}

#19:  Autor/ica: bleki88 PostPostano: 18:24 čet, 13. 5. 2010
    —
se tko sjeca na vjezbama kako smo promijenili naslov prozora iz edit controla

#20:  Autor/ica: frances PostPostano: 17:48 sri, 19. 5. 2010
    —
da ne otvaram novu temu. dosli rezultati kolokvija klik



Forum@DeGiorgi -> Objektno programiranje (C++)


output generated using printer-friendly topic mod. Vremenska zona: GMT + 01:00.

Idite na 1, 2  Sljedeće  :| |:
Stranica 1 / 2.

Powered by phpBB © 2001,2002 phpBB Group
Theme created by Vjacheslav Trushkin