Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Vektor i datoteke

[es] :: C/C++ programiranje :: Vektor i datoteke

[ Pregleda: 3947 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

skijash
Nikola Petrović
Software engineer, Vast.com
BG

Član broj: 8511
Poruke: 344
*.146.eunet.yu.

Sajt: www.mafiamotorsport.org


+2 Profil

icon Vektor i datoteke29.11.2004. u 23:57 - pre 194 meseci
Pozdrav!
Potrebna mi je mala pomoc sa ovim sto sam naveo u naslovu. Imam klasu Vektor i hocu da upisujem Vektore u datoteke i da ih citam iz datoteka. Trebaju mi operatorske f-je >> i <<, tj. moram da preklopim originalne i da napisem druge. Valjda mi je deklaracija ovih operatorskih f-ja dobra (prilazem Vektor.h), ali ne znam kako da ih realizujem (poslednje dve).
pomoc! :)
Znaci koristio bih novu operaciju kao: datoteka<<Vektor
Code:

class Vektor {
    float x,y,z;

public:
    Vektor();
    Vektor(float x, float y, float z);
    float X() {return x;}
    float Y() {return y;}
    float Z() {return z;}
    friend float operator! (Vektor v);
    friend Vektor operator+ ( Vektor v1, Vektor v2);
    friend void operator+= ( Vektor v1, Vektor v2);
    friend Vektor operator* ( Vektor v1, float f);
    friend void operator*= ( Vektor v1, float f);
    friend Vektor operator* ( float f, Vektor v1);
    friend ofstream& operator<< (ofstream& os, Vektor v1);
    friend ifstream& operator>> (ifstream& is, Vektor v1);
};


Hvala!
...:::|skijash|:::...
www.beoprint.rs ::: www.mafiamotorsport.org
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Vektor i datoteke30.11.2004. u 11:23 - pre 194 meseci
Nikola, probaj ovako nesto (sa manjim ili vecim izmenama):
Code:

ostream &operator << (ostream &arg_ostream, Vektor &arg_vector)
{
  int w = arg_ostream.width();
  
  return(arg_ostream << '[' << arg_vector.x << ' ' << setw(w) 
      << arg_vector.y << ' ' << setw(w) << arg_vector.z << ']');
}

istream &operator >> (ostream &arg_ostream, Vektor &arg_vector)
{
  Vektor result;
  char c;
  
  // Ocekujemo ovakav format unutar fajla: [1 2 3]
  while (arg_ostream >> c && isspace(c))
  ;
  if (c == '[') 
  {
    arg_ostream >> result.x >> result.y >> result.z; 
    if (!s) 
    {
      cerr << "Greska: Ocekujem broj dok citam vektor\n";
      return(arg_ostream);
    }
    while (arg_ostream >> c && isspace(c))
    ;
    if (c != ']')
    {
      arg_ostream.clear(ios::failbit);
      cerr << "Greska: Ocekujem ']' dok citam vektor\n";
      return(arg_ostream);
    }
  }
  else
  {
    arg_ostream.clear(ios::failbit);
    cerr << "Greska: Ocekujem '[' dok citam vektor\n";
    return(arg_ostream);
  }
  arg_vector = result;
  return(arg_ostream);
}

Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

Riste Pejov
Team Leader/Senior Software Developer @
Ein-Sof ltd Skopje
Skopje, Macedonia

Član broj: 128
Poruke: 571
217.16.77.*

Jabber: richie@bagra.net.mk
ICQ: 154236769
Sajt: riste.softver.org.mk


Profil

icon Re: Vektor i datoteke30.11.2004. u 11:29 - pre 194 meseci
Kako ti zelis da se upise podatak u stream-u, tako ga upisi ... mislim to je sve tvoj izbor. Primer da u stream-u zelimo upisati to u ASCI formi onda bi bilo vako

Code:

  ostream& operator << (ostream& os, Vektor v1);
  {
    return os<<v1.X()<<'\t'<<v1.Y()<<'\t'<<v1.Z()<<'\t'<<endl;
  }


i onda kad bi u praznom fajlu uradio <<myvec onda bi dobio jedan red koji bi bio sa tri float-a u asci formatu podeljenim tabovima sa \r\n kao terminator informacije za jednog vectora.

Najbitnije ti je sam definiras koji ce biti format zapisa. Tako da onda za >> operator mozes stream isparsiras kako ti je volja i napunis vector.

People who think they know everything tend to irritate those of us who do.
 
Odgovor na temu

leka
Dejan Lekić
senior software engineer, 3Developers
Ltd.
London, UK

Član broj: 234
Poruke: 2534
..31.216.81.gus.vf.siwnet.net.

Sajt: dejan.lekic.org


+2 Profil

icon Re: Vektor i datoteke30.11.2004. u 19:06 - pre 194 meseci
Jasno. Ja sam se odlucio za [x y z] zato sto taj zapis podseca na matricu, a vektor jeste matrica, doduse ne horizontalna...
Dejan Lekic
software engineer, MySQL/PgSQL DBA, sysadmin
 
Odgovor na temu

overdose

Član broj: 33563
Poruke: 51
*.dialup.sezampro.yu.



Profil

icon Re: Vektor i datoteke01.12.2004. u 19:55 - pre 194 meseci
Evo primera:

Projektovati na jeziku C++ klasu vektora u prostoru predstavljenih pomoću komponenata u pravcu x, y i z osa. Koristiti operatorske funkcije kad je primereno. Predvideti:

* stvaranje vektora sa zadatim komponentama (podrazumevano (1,0,0)),
* dohvatanje komponenata vektora,
* izračunavanje intenziteta vektora (!v),
* izračunavanje zbira dva vektora (v1+v2, v1+=v2),
* izračunavanje proizvoda vektora i realnog broja (v*r, r*v, v*=r),
* čitanje vektora iz datoteke (dat>>v), i
* pisanje vektora u datoteku (dat<<v).

Sastaviti na jeziku C++ glavni program koji pročita dinamički niz vektora sa glavnog ulaza, izračuna aritmetičku srednju vrednost vektora u nizu, ispiše dobijeni rezultat na glavnom izlazu i ponavlja prethodne ko­rake sve dok za dužinu niza ne pročita nedozvoljenu vrednost.

vektor.h
Code:

#ifndef VEKTOR_H
#define VEKTOR_H
#include <iostream.h> // Moras sa .h jer ne sme namespace u hederu !!!

class Vektor {
    public:
    double x, y, z;
    Vektor(double a=1, double b=0, double c=0);
    void dohvati(char ch);
    double operator!();
    Vektor operator+(Vektor v_desni);
    void operator+=(Vektor v_desni);
    Vektor operator*(double r);
    void operator*=(double r);
    friend ostream& operator<<(ostream& os, const Vektor& v);
    friend istream& operator>>(istream& is, Vektor& v);
};

#endif // VEKTOR_H


vektor.cpp
Code:

#include <iostream>
#include <cmath>
#include "vektor.h"
using namespace std;

Vektor::Vektor(double a, double b, double c) { x=a; y=b; z=c; }
void Vektor::dohvati(char ch) {
    if (ch == 'x')
        cout << "x = " << x << endl;
    else if (ch == 'y')
        cout << "y = " << y << endl;
    else if (ch == 'z')
        cout << "z = " << z << endl;
    else
        cout << "Greska, unesite x, y ili z !";
}
double Vektor::operator!() {
    return sqrt(pow(x, 2) + pow(y, 2) + pow(y, 2));
}

Vektor Vektor::operator+(Vektor v_desni) {
    return Vektor(x+v_desni.x, y+v_desni.y, z+v_desni.z);
}

void Vektor::operator+=(Vektor v_desni) {
    x = x + v_desni.x;
    y = y + v_desni.y;
    z = z + v_desni.z;
}

Vektor Vektor::operator*(double r) {
    return Vektor(r*x, r*y, r*z);
}

void Vektor::operator*=(double r) {
    x = x * r;
    y = y * r;
    z = z * r;
}

ostream& operator<<(ostream& os, const Vektor& v) {
    return os << v.x << " " << v.y << " " << v.z << endl;
}

istream& operator>>(istream &is, Vektor& v) {
    return is >> v.x >> v.y >> v.z;
}


main.cpp
Code:

#include <iostream>
#include "vektor.h"
using namespace std;
const int N=50;

int main() {
    while (1) {
        cout << "Unesite broj elemenata niza: ";
        int n;
        cin >> n;
        if (n<=0 || n>N)
            break;
        Vektor* a = new Vektor [n];
        Vektor srvr(0,0,0);
        for (int i=0; i<n; i++) {
            cout << "Unesite x, y i z kordinatu za " << i << ". vektor: ";
            cin >> a[i].x >> a[i].y >> a[i].z;
            srvr += a[i];
        }
        srvr = srvr * (1 / (double)/*!!!*/n);
        cout << "Srednja vrednost ima kordinate: " << srvr << endl; 
        delete [] a;
    }
}

/* TESTIRANJE KLASE
#include <iostream>
#include <fstream>
#include "vektor.h"
using namespace std;

int main() {
    Vektor v1, v2(5, 7, 16.2), v3, v4, v5, v6, v7;
    ofstream izlaz("izlaz.txt");
    ifstream ulaz("ulaz.txt");
    v2.dohvati('z');
    cout << "Intenzitet vektora v2 je " << !v2 << endl;
    v3 = v1+v2;
    v3.dohvati('x');
    v3.dohvati('y');
    v3.dohvati('z');
    v4+=v2;
    v4.dohvati('x');
    v4.dohvati('y');
    v4.dohvati('z');
    v5 = v4 * 10;
    v5.dohvati('x');
    v5.dohvati('y');
    v5.dohvati('z');
    v5 *= 10;
    v5.dohvati('x');
    v5.dohvati('y');
    v5.dohvati('z');
    izlaz << v5;
    izlaz << v4;
    ulaz >> v6;
    v6.dohvati('x');
    v6.dohvati('y');
    v6.dohvati('z');
    ulaz >> v7;
    v7.dohvati('x');
    v7.dohvati('y');
    v7.dohvati('z');
}
*/


Program odlično radi, jedini "problem" je što pri kompajliranju gcc-om izbacuje sledeća upozorenja:


In file included from /usr/include/c++/3.3.4/backward/iostream.h:31,
from vektor.h:3,
from vektor.cpp:3:
/usr/include/c++/3.3.4/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
In file included from /usr/include/c++/3.3.4/backward/iostream.h:31,
from vektor.h:3,
from main.cpp:2:
/usr/include/c++/3.3.4/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <sstream> instead of the deprecated header <strstream.h>. To disable this warning use -Wno-deprecated.
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Vektor i datoteke01.12.2004. u 20:04 - pre 194 meseci
Moram da odreagujem na ovo:

Citat:

#include <iostream.h> // Moras sa .h jer ne sme namespace u hederu !!!


Tačno je da ne treba koristiti using direktvive u heder fajlovima, ali rešenje nije da se koriste stare i nestandardne ".h" biblioteke koje uostalom više i ne postoje na novijim kompajlerima (MSVC 7.x i noviji će jednostavno da prijavi grešku), već da se u hederima koriste puna imena sa namespaceom. Npr: std::ostream umesto samo ostream.
 
Odgovor na temu

overdose

Član broj: 33563
Poruke: 51
*.dialup.sezampro.yu.



Profil

icon Re: Vektor i datoteke01.12.2004. u 21:06 - pre 194 meseci
Pa to mi kaži :o)

Očekivao sam da će neko da me ispljuje (ali dobro sam prošao). Znao sam da tu pravim grešku, ali sam potpuno zaboravio da mogu da koristim puna imena sa namespace-om.

Ali nije mi baš jasno zašto je iostream.h zastarelo ? Zar to nije isto kao kad kažem iostream pa posle navedem using namespace std ?
 
Odgovor na temu

Dragi Tata
Malo ispod Kanade

Član broj: 1958
Poruke: 3906
66.228.70.*



+6 Profil

icon Re: Vektor i datoteke01.12.2004. u 21:33 - pre 194 meseci
iostream.h je iz vremena pre namespace-ova. Kad su namespace-ovi uvedeni u C++ doneta je odluka da cela standardna biblioteka bude u namespace-u std, pa je bilo neophodno promeniti imena heder fajlova da bi se omogućio postepen prelaz sa starog na novi sistem. Inače, tamo gde se ".h" fajlovi još uvek isporučuju, oni obično sadrže nešto kao:

Code:

// iostream.h
#include <iostream>
using namespace std;


Tako da ispadne svejedno da li u kodu imaš

Code:

#include <iostream>
using namespace std;

ili
Code:

#include <iostream.h>



 
Odgovor na temu

overdose

Član broj: 33563
Poruke: 51
195.252.80.*



Profil

icon Re: Vektor i datoteke01.12.2004. u 21:39 - pre 194 meseci
Ok, sad je sve jasno
 
Odgovor na temu

ivbrcic
Ivan Brcic
Siemens
Zagreb

Član broj: 38567
Poruke: 35
*.siemens.at.



Profil

icon Re: Vektor i datoteke02.12.2004. u 06:44 - pre 194 meseci
Ovo sam vec napisao na jednom forumu. Sada mi se neda prolagodavati, ali bitan je smisao. Evo unosa i citanja iz datoteke:

Code:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>

struct FileData {
    double f1;
    double f2;
    char c;
};

// ovo je operator>> koji nam sluzi za unos
std::istream& operator>>(std::istream& is, FileData &fd)
{
    is >> fd.f1 >> fd.f2 >> fd.c;
    return is;
}

// ovaj operator ti ne treba, on sluzi samo da bi vidio 
// da li je sve OK uneseno
std::ostream& operator<<(std::ostream& os, const FileData &fd)
{
    os << fd.f1 << ' ' << fd.f2 << ' ' << fd.c;
    return os;
}

int main ()
{
    int n;
    std::ifstream ifstr("file.txt");
    std::vector<FileData> v;

    ifstr >> n;

    while (n--)
    {
        FileData fd;
        ifstr >> fd;

        // ovo nam sluzi da unesemo stvarni broj redaka
        if (ifstr.fail()) {
            std::cout << "Some Error code!" << std::endl;
            break;
        }
        v.push_back(fd);
    }

    //ispisujemo samo ucitane podatke
    std::ostream_iterator<FileData> ispis(std::cout, "\n");
    std::copy(v.begin(), v.end(), ispis);
}

 
Odgovor na temu

[es] :: C/C++ programiranje :: Vektor i datoteke

[ Pregleda: 3947 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.