Miért nem működnek az alábbi C++ programnak egyes részei?
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;
}
"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?
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...
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.
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;
}
"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...
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!