Kezdőoldal » Számítástechnika » Programozás » Miért nem működnek az alábbi...

Amanda88 kérdése:

Miért nem működnek az alábbi C++ programnak egyes részei?

Figyelt kérdés

A feladat:

Készíts mátrix adattárolási struktúrát int értékeket tárolásához. A tárolóban "flat" módon, azaz egydimenziós tömbben legyenek tárolva az adatok (pl. vector-ban). A mátrixnak legyenek konstruktorai; sorait, oszlopait, celláit lehessen elérni, módosítani; és a teljes mátrixnak is legyen kiíró és beolvasó eljárása.


A beolvasó operátornál hibát jelez: you cannot assign to a variable that is const


Ezen kívül nem működnek a set_oszlop, get_elem, get_oszlop függvények. A set_oszlop és get_oszlop függvényeket még nem volt időm debug-olni, a get_elem függvény debug-olásával viszont már sok időt eltöltöttem és még mindig nem értem, miért nem működik. Ebben is tudna segíteni valaki? Köszönöm!


Matrix.h:


#include <vector>

#include <iostream>

using namespace std;


class Matrix

{

vector<int> adat;

int sor;

int oszlop;


public:

Matrix(int s=1, int o=1): sor(s), oszlop(o)

{

for (int i=0; i<(sor*oszlop); i++)

{

adat.push_back(0);

}

}


void set_elem(int ertek, int s, int o)

{

adat[(((s-1)*oszlop)+o)-1]= ertek;

}


void set_sor(vector<int> v, int s)

{

for (int i=oszlop-1; i>=0; i--)

adat[(((s-1)*oszlop)+(oszlop-i))-1]= v[oszlop-(i+1)]; // a fuggvenynek atadott vektor elemeit ertekul adja a megadott sor elemeinek

}


void set_oszlop(vector<int> v, int o)

{

for (int i=0; i>sor; i++)

adat[((i*oszlop)+o)-1]= v[i]; // a fuggvenynek atadott vektor elemeit ertekul adja a megadott oszlop elemeinek

}


int get_elem(int s, int o)

{

return (adat[(((sor-1)*oszlop)+oszlop)-1]);

}


vector<int> get_sor(int s)

{

vector<int> v(oszlop,0);


for (int i=oszlop-1; i>=0; i--)

v[oszlop-(i+1)]= adat[(((s-1)*oszlop)+(oszlop-i))-1];


return v;

}


vector<int> get_oszlop(int o)

{

vector<int> v(sor,0);


for (int i=0; i>sor; i++)

v[i]= adat[((i*oszlop)+o)-1];


return v;

}


friend istream& operator>> (istream& is, const Matrix &m)

{

int adat_masolat;


for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<"Adatok: "<<endl;

cin>>adat_masolat;

m.adat[i]= 5;

}


return is;

}


friend ostream& operator<< (ostream& os, const Matrix &m)

{

for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<m.adat[i]<<" ";


if( (i+1) != 0 && m.oszlop != 1)

{

if ((i+1)%(m.oszlop)==0) /** sortores, ha tobb, mint 1 oszlop van es a sor vegere ert a kiiras */

cout<<endl;

}


else if (m.oszlop == 1)

cout<<endl;

}

return os;

}

};



main.cpp:



#include <vector>

#include <vector>

#include <vector>

#include <vector>

#include <iostream>

#include "Matrix.h"


using namespace std;


int main()

{

Matrix matrix1;

Matrix matrix2(5,6); // 5 sor, 6 oszlop

Matrix matrix3(3,4);


vector<int> v1(1,9);

vector<int> v2(6,9); /** 6 elemu, mind 9-es */

vector<int> v3(5,9);

int ertek1;

int ertek2;

int ertek3;


/* matrix1.set_elem(5,1,1); // mukodik

matrix2.set_elem(5,2,2);

matrix3.set_elem(5,2,2);


matrix1.set_sor(v1,1); // mukodik

matrix2.set_sor(v2,4); */


matrix1.set_oszlop(v1,1); // NEM mukodik

matrix2.set_oszlop(v3,4);


/* ertek1= matrix1.get_elem(1,1); // mukodik

ertek2= matrix2.get_elem(2,2); // NEM mukodik

ertek3= matrix2.get_elem(2,2); // NEM mukodik


cout<<"ertek1: "<<ertek1<<endl;

cout<<"ertek2: "<<ertek2<<endl;

cout<<"ertek3: "<<ertek3<<endl; */


/*v1= matrix1.get_sor(1); // mukodik

v2= matrix2.get_sor(4); */


/* v1= matrix1.get_oszlop(1); // NEM mukodik

v3= matrix2.get_oszlop(4); */


cin>>matrix3;


cout<<matrix1<<endl;

cout<<matrix2<<endl;

cout<<matrix3<<endl;


/* cout<<"v1 vektor: "<<endl;


for (vector<int>::iterator it=v1.begin(); it<v1.end(); it++)

cout<<*it<<" ";


cout<<endl<<endl;

cout<<"v2 vektor: "<<endl;


for (vector<int>::iterator it=v2.begin(); it<v2.end(); it++)

cout<<*it<<" ";


cout<<"v3 vektor: "<<endl;


for (vector<int>::iterator it=v3.begin(); it<v3.end(); it++)

cout<<*it<<" "; */


cout<<endl;

system("pause");


return 0;

}



2014. dec. 3. 14:36
 1/5 anonim ***** válasza:

"you cannot assign to a variable that is const"

Ez a hibaüzenet elég egyértelmű.

Konstansnak nem tudsz értéket adni.


int get_elem(int s, int o)

{

return (adat[(((sor-1)*oszlop)+oszlop)-1]);

}

Ezt meg komolyan kérdezed, hogy miért nem működik?

Ez le sem fordulhat. nem látsz valami furcsát a paraméterek és a felhasznált változónevek között?

2014. dec. 3. 14:40
Hasznos számodra ez a válasz?
 2/5 anonim ***** válasza:

1.


int get_elem(int s, int o)

{

return (adat[(((sor-1)*oszlop)+oszlop)-1]);

}


A paraméterek az "s" és az "o"!!!

(Tehát: return (adat[(((s-1)*oszlop)+o)-1]);)


Pedig a set_elem-nél jól írtad...

2014. dec. 3. 14:43
Hasznos számodra ez a válasz?
 3/5 anonim ***** válasza:

Szerintem sok hiba van benne.

Én átgondolnám az egészet újra:

- döntsd el, hogy mondjuk sorfolytonosan vagy oszlopfolytonosan akarod tárolni

- legyen mondjuk a sorfolytonos

- ezután gondold végig, hogy hogyan érsz el:

a) egy oszlopot

b) egy sort

c) egy elemet (a 3 közül ez a legegyszerűbb)


Módosításnál és lekérdezésnél ugyanúgy kell elérni, tehát csak egyszer kell jól meghatározni!


És végül jöhet a kiíratás+beolvasás. (Beolvasásnál a Matrix típusú paraméter nem lehet const, vedd ki azt a kulcsszót. Azon kívül lehet, hogy jó.)


Egyébként én nem a matrix.h-ban definiálnám a metódusokat, hanem egy matrix.cpp-ben.

2014. dec. 3. 14:59
Hasznos számodra ez a válasz?
 4/5 A kérdező kommentje:

Köszönöm, módosítottam, amiket írtatok.


A beolvasó operátor még mindig nem működik jól. Fogalmam sincs, miért lehet, de akármilyen számot írok be a mátrix elemeinek, mindig 5-re állítja az összes elemét (matrix3). Ez miért lehet?


Most így néz ki a Matrix.h:


#include <vector>

#include <iostream>

using namespace std;


class Matrix

{

vector<int> adat;

int sor;

int oszlop;


public:

Matrix(int s=1, int o=1): sor(s), oszlop(o)

{

for (int i=0; i<(sor*oszlop); i++)

{

adat.push_back(0);

}

}


void set_elem(int ertek, int s, int o)

{

adat[(((s-1)*oszlop)+o)-1]= ertek;

}


void set_sor(vector<int> v, int s)

{

for (int i=oszlop-1; i>=0; i--)

adat[(((s-1)*oszlop)+(oszlop-i))-1]= v[oszlop-(i+1)]; // a fuggvenynek atadott vektor elemeit ertekul adja a megadott sor elemeinek

}


void set_oszlop(vector<int> v, int o)

{

for (int i=0; i>sor; i++)

adat[((i*oszlop)+o)-1]= v[i]; // a fuggvenynek atadott vektor elemeit ertekul adja a megadott oszlop elemeinek

}


int get_elem(int s, int o)

{

return (adat[(((s-1)*oszlop)+o)-1]);

}


vector<int> get_sor(int s)

{

vector<int> v(oszlop,0);


for (int i=oszlop-1; i>=0; i--)

v[oszlop-(i+1)]= adat[(((s-1)*oszlop)+(oszlop-i))-1];


return v;

}


vector<int> get_oszlop(int o)

{

vector<int> v(sor,0);


for (int i=0; i>sor; i++)

v[i]= adat[((i*oszlop)+o)-1];


return v;

}


friend istream& operator>> (istream& is, Matrix &m)

{

int adat_masolat;


for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<"Adatok: "<<endl;

cin>>adat_masolat;

m.adat[i]= 5;

}


return is;

}


friend ostream& operator<< (ostream& os, const Matrix &m)

{

for (int i=0; i<(m.sor*m.oszlop); i++)

{

cout<<m.adat[i]<<" ";


if( (i+1) != 0 && m.oszlop != 1)

{

if ((i+1)%(m.oszlop)==0) /** sortores, ha tobb, mint 1 oszlop van es a sor vegere ert a kiiras */

cout<<endl;

}


else if (m.oszlop == 1)

cout<<endl;

}

return os;

}

};



És a main.cpp:



#include <vector>

#include <vector>

#include <vector>

#include <vector>

#include <iostream>

#include "Matrix.h"


using namespace std;


int main()

{

Matrix matrix1;

Matrix matrix2(5,6); // 5 sor, 6 oszlop

Matrix matrix3(3,4);


vector<int> v1(1,9);

vector<int> v2(6,9); /** 6 elemu, mind 9-es */

vector<int> v3(5,9);

int ertek1;

int ertek2;

int ertek3;


/* matrix1.set_elem(5,1,1); // mukodik

matrix2.set_elem(5,2,2);

matrix3.set_elem(5,2,2);


matrix1.set_sor(v1,1); // mukodik

matrix2.set_sor(v2,4); */


/* matrix1.set_oszlop(v1,1); // NEM mukodik

matrix2.set_oszlop(v3,4); */


/* ertek1= matrix1.get_elem(1,1); // mukodik

ertek2= matrix2.get_elem(2,2); // mukodik

ertek3= matrix2.get_elem(2,2); // mukodik


cout<<"ertek1: "<<ertek1<<endl;

cout<<"ertek2: "<<ertek2<<endl;

cout<<"ertek3: "<<ertek3<<endl; */


/*v1= matrix1.get_sor(1); // mukodik

v2= matrix2.get_sor(4); */


/* v1= matrix1.get_oszlop(1); // NEM mukodik

v3= matrix2.get_oszlop(4); */


cin>>matrix3;

cout<<endl<<endl;


cout<<matrix1<<endl;

cout<<matrix2<<endl;

cout<<matrix3<<endl;


/* cout<<"v1 vektor: "<<endl;


for (vector<int>::iterator it=v1.begin(); it<v1.end(); it++)

cout<<*it<<" ";


cout<<endl<<endl;

cout<<"v2 vektor: "<<endl;


for (vector<int>::iterator it=v2.begin(); it<v2.end(); it++)

cout<<*it<<" ";


cout<<"v3 vektor: "<<endl;


for (vector<int>::iterator it=v3.begin(); it<v3.end(); it++)

cout<<*it<<" "; */


cout<<endl;

system("pause");


return 0;

}

2014. dec. 3. 18:29
 5/5 anonim ***** válasza:

"A beolvasó operátor még mindig nem működik jól. Fogalmam sincs, miért lehet, de akármilyen számot írok be a mátrix elemeinek, mindig 5-re állítja az összes elemét (matrix3). Ez miért lehet?"

...

"m.adat[i]= 5;"


Most nyilván szopatsz csak...

2014. dec. 3. 18:44
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!