Problem z macierzami

0

Witam, mam do napisania program w języku C++
Niebawem zamierzam się za niego zabrać, jednak potrzebuje wsparcia.
Nie jestem jakimś orłem z tego dlatego proszę o pomoc.
Oto jest treść polecenia:

Stwórz klasę definiującą macierz jako tablicę wielowymiarową. Wszystkie jej zmienne mają być
typu private.
 Zdefiniuj konstruktory i destruktor dla stworzonej klasy. Podczas tworzenia macierzy
użytkownik ma mieć możliwość określenia wymiarów macierzy.
 Wczytuj i zapisuj macierze z / do pliku zewnętrznego oraz wyświetlaj ich zawartość na
ekranie.
 Zaimplementuj funkcje umożliwiające szybkie wyświetlenie wybranego wiersza bądź
kolumny macierzy.
 Zaimplementuj niezbędne operacja na macierzach – na ocenę będzie miała wpływ ilość
zaimplementowanych operacji jak i ich wybór (im mniej trywialne tym lepiej). Pamiętaj aby
były one zgodne z zasadami algebry oraz o zabezpieczeniach przed niechcianymi skutkami
działań użytkownika.

Mógłby mi ktoś z tym pomóc?
Mam problem z tymi operacjami na plikach. Wiem jak się wczytuje coś z tego, ale tutaj nie wiem.
Również nie wiem jak się odwoływać do zmiennych w klasie typu private.
Także z tablicami mam problem. Mają być dynamiczne?

Proszę o pomoc w tym programie!

Witam,

Zacząłem pisać ten program i od razu mam problemy...

Chciałem zrobić klase, konstruktor w klasie, który przypisuje wartości do private podane przez użytkownika.
Jednak ta tablica mi się krzaczy. Nie wiem też czemu nie chce wyświetlić mi na ekranie wartości, które są w private. Czy też mam robić jakąś funkcję, która będzie mi je wyświetlałą i wsadzić ją do public?

// LAB5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


class macierz
{
private:
	int szer;
	int wys;
//	int matrix[szer][wys];

public:
	macierz(int szer1, int wys1);
};


	macierz::macierz(int szer1, int wys1)
	{
		szer = szer1;
		wys = wys1;
	}

int _tmain(int argc, _TCHAR* argv[])
{
	int a, b;
	a=2;
	b=3;

	macierz pierwsza(a,b);
	

	cout << pierwsza.szer << endl << pierwsza.wys << endl;
	

	system("pause");
	return 0;
}

Jak mam niby cokolwiek robić na tych private'ach jak nie mogę nic z tym zrobić bo to jest prywatne...

0

Utworzyć akcesory.

0

Poczytaj o dynamicznej alokacji pamięci, klasach, hermetyzacji.

0
xeo545x39 napisał(a):

Utworzyć akcesory.

Może coś więcej?

0

http://xion.org.pl/2009/11/16/styl-akcesorow/

albo w Google "c++ akcesory"

0

Hmmm, dobra. Zajmijmy się najpierw tym private, potem tablicą.

zrobiłem coś takiego póki co:

// LAB5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


class macierz
{
private:
	int szer;
	int wys;
//	int matrix[szer][wys];

public:
	macierz(int szer1, int wys1);

	int pokazszer(int szer) {return szer;}
	int pokazwys(int wys) {return wys;}

	//~macierz();
};



	macierz::macierz(int szer1, int wys1)
	{
		szer = szer1;
		wys = wys1;
	}

	

int _tmain(int argc, _TCHAR* argv[])
{
	int a, b;
	a=2;
	b=3;

	macierz pierwsza(a,b);
	

	cout << pierwsza.pokazszer(a) << endl << pierwsza.pokazwys(b) << endl;
	

	system("pause");
	return 0;
}

Niby wszystko ok, konstruktor wpisuje wartości a i b do wysokości i szerokości, a także wypisuje je na ekranie korzystając z funkcji pokazszer i pokazwys.
Jednak do tych funkcji muszę podać parametr i podaje a oraz b. To jest trochę bez sensu... Nie powinienem jakoś podawać tam właśnie ego wys oraz szer? Oczywiście się tego nie da zrobić. Chcę po prostu mieć dostęp do tych plików private tak po prostu...
Jak to zrobić? Może przypisać ich do jakiejś zmiennej publicznej i ona będzie reprezentowała te wartości?

0

A po cholerę Ci te parametry? Wystarczy int pokazszer() { return this->szer; }. I akcesor dostępu powinien być też opatrzony w const tuż po deklaracji, czyli int pokazszer() const { return this->szer; }, po to, aby zapewnić, że metoda nie zmienia żadnych wartości, a jedynie pobiera.

0

Dobra, udało mi się jak na razie dowiedzieć jak wywoływać te durne private w mainie.
Teraz chciałem zrobić dynamiczną tablicę dwuwymiarową, ale oczywiście pojawia mi się masa błędów i nic się nie kompiluje...
Czemu?

// LAB5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


class macierz
{
private:
	int szer;
	int wys;

	int **tab = new int*[szer];
	for (int x = 0 ; x < szer ; x++) 
	{
		tab[x] = new int[wys];
	}
	

public:
	macierz(int szer1, int wys1);
	macierz();

	int pobierzSzerokosc()
	{
     return szer;
	}

	int pobierzWysokosc()
	{
     return wys;
	}
	//~macierz();



};



	macierz::macierz(int szer1, int wys1) 
	{
		szer = szer1;
		wys = wys1;
	}

	
	macierz::macierz() //domyslny konstruktor
	{
		szer = 5;
		wys = 5;
	}
	

int _tmain(int argc, _TCHAR* argv[])
{
	int a, b;
	cin >> a >> b;

	macierz pierwsza(a,b);
	

	cout << pierwsza.pobierzSzerokosc() << pierwsza.pobierzWysokosc() << endl;
	

	system("pause");
	return 0;
}
0
class A
{
public:
    A(size_t w, size_t h): w(w), h(h)
    {
        tab = new int*[w];
        for(size_t i = 0; i < w; ++i)
            tab[i] = new int[h];
    }
    
    ~A()
    {
        for(size_t i = 0; i < w; ++i)
            delete[] tab[i];
        delete[] tab;
    }
    
private:
    int** tab;
    size_t w;
    size_t h;
};

Moze siegnij po jakis kurs?

0

Póki co mam coś takiego:

 

// LAB5.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

class macierz
{
private:
int szer;
int wys;
int **tab;

public:
macierz(int szer1, int wys1);
macierz();

int pobierzSzerokosc()
{
	return szer;
}



int pobierzWysokosc()
{
	return wys;
}

void zapiszPlik()
{
	ofstream mojplik;
	mojplik.open("macierz.txt");
	mojplik << tab;
	mojplik.close();
}

~macierz()
{
	for (int x = 0; x < szer; x++)
	delete [] tab[x];
	delete [] tab;
}

};

macierz::macierz(int szer1, int wys1) 
{
		szer = szer1;
		wys = wys1;

		int **tab = new int*[szer]; 
		for (int x = 0 ; x < szer ; x++) 
	{ 
		tab[x] = new int[wys]; 
	} 
}


macierz::macierz() //domyslny konstruktor
{
	szer = 5;
	wys = 5;

		int **tab = new int*[szer]; 
		for (int x = 0 ; x < szer ; x++) 
	{ 
		tab[x] = new int[wys]; 
	} 
}

int _tmain(int argc, _TCHAR* argv[])
{
int a, b;
cin >> a >> b;

macierz pierwsza(a,b);

pierwsza.zapiszPlik();

cout << pierwsza.pobierzSzerokosc() << pierwsza.pobierzWysokosc() << endl; 



   



system("pause");
return 0;

}

 

Rzekomo tworzy mi tę tablicę, jednak nie wiem jak wczytać i zapisać te dane z/do pliku za bardzo, żeby były w formie macierzy w tym pliku...
Zrobiłem jakieś fstream ale nie działa poprawnie.
Również nie wiem czy dobrze wpisałem definicje tablicy, bo wpisałem ją w konstruktorze.

1

Analizuj: http://pastebin.com/DQepYSZP

P.S. przepraszam, ze sie troche rozjechalo...

0
n0name_l napisał(a):

Analizuj: http://pastebin.com/DQepYSZP

P.S. przepraszam, ze sie troche rozjechalo...

Cośtam rozjaśnia, a mógłbyś to zrobić w C++, bez tym malloców i innych cudów których nie znam?
Oraz zapisując do pliku chciałbym korzystać z tego "ofstream"

Może mi ktoś napisać na podstawie tego mojego nieszczęsnego kodu funkcję, która wczyta pliki z pliku tekstowego który będzie napisany w takiej formie

4 3
3 2 4 5
6 7 3 8
5 3 1 0

gdzie 4 i 3 to odpowiednio szer oraz wys,
a także, która zapisze te dane do innego pliku
oraz wyświetli je na ekranie?

http://pastebin.com/MJup1DFK

0

Odpowiednik malloc w C++ to new T, gdzie T to typ. Dla free to delete. Odpowiednik dla FILE to np. ofstream, do którego przykłady są tu: http://programmuj.blogspot.com/2011/01/c-ofstream.html. Dla printf jest strumień cout. Wywal typedef, zamień nagłówek cstdio na iostream i masz kod w C++.

0

Ponawiam. Dalej nie uporałem się z tym programem niestety. Pomoże ktoś?

Zacząłem pisać ten program, jednak mam z nim wielkie problemy...
Teraz to już w ogóle wygląda jak śmietnik, kompiluje się ale zaraz wywalają jakieś błędy i już sam nie wiem co jest nie tak...
Stworzyłem nowy projekt i krok po kroku przerzucam z wcześniejszego projektu to co powinno działać.
Na sam początek chce wiedzieć czy dobrze uporałem się z stworzeniem macierzy.

class macierz
{
private:
	int szer;
	int wys;
	int **tab;

public:
	macierz(int szer1, int wys1);
	macierz();


	int pobierzSzerokosc()
	{
		return szer;
	}



	int pobierzWysokosc()
	{
		return wys;
	}
};


macierz::macierz() //domyslny konstruktor
	{
		szer = 5;
		wys = 5;

			int **tab = new int*[szer]; 
			for (int x = 0 ; x < szer ; x++) 
		{ 
			tab[x] = new int[wys]; 
		} 
	} 

Czy to jest dobrze? Czy ten fragment podczas tworzenia nowego obiektu typu macierz stworzy mi automatycznie w tym obiekcie tablice 2D o rozmiarach 5 x 5?
Jeżeli tak, to czy jeżeli zrobię z tego domyślnego konstruktora własny konstruktor i jako parametry wstawię liczby podane przez użytkownika to będę mógł stworzyć macierz o własnych rozmiarach?

0

To co chcesz zrobic nazywam "bezmyslnym powielaniem kodu", a mianowicie starasz sie napisac 2 wersje konstruktorow, ktore by wygladaly mniej wiecej tak:

A::A()
{
    w=5;
    h=5;
    tab = new int*[w];
    for(int i=0;i<w;++i) tab[i] = new int[h];
}

A::A(int a, int b)
{
    w=a;
    h=b;
    tab = new int*[w];
    for(int i=0;i<w;++i) tab[i] = new int[h];
}

Poza tymi parametrami wygladaja one identycznie, dlatego tez lepiej napisac:

A(int a=5,int b=5)
{
    w=a;
    h=b;
    tab=new int*[w];
    for(int i=0;i<w;++i) tab[i] = new int[h];
}

A co do Twojego kodu to on nie ma prawa zadzialac, ze wzgledu na deklaracje

int** tab;

W ciele konstruktora, co tworzy zmienna lokalna przeslaniajaca pole tablicy. Nie musisz deklarowac tego pointera skoro jest on Twoim polem, tak samo jak zrobiles z szer, wys

0

Mam mały problem.
Nie wiem czemu, ale macierz którą ustalam nie tworzy się dobrze.
Ustawiam szerokość i wysokość, a to pojawia się odwrotnie. Tzn szerokość zamienia się z wysokością...
http://pastebin.com/4jYD08BE

0

Witam, to znowu ja.
Chciałem napisać funkcję która robi różne operacje na macierzach. Mianowicie dodaje dwie macierze, odejmuje, transponuje i mnoży.
Te 2 pierwsze działania wydają się najprostsze więc na razie skupię się na nich.
Czy tę funkcję mam napisać w klasie czy poza nią?
Funkcja mam dodawać 2 macierze, czyli dwa obiekty typu macierz, prawda?
Tak więc muszę stworzyć 2 obiekty i dodać ich tablicę do siebie, każdy składnik do każdego składnika?

Cały program póki co: http://ideone.com/FknhdV

0

Przeciąż operatory. Dla transpozycji napisz osobną metodę.

0

Nie wiem w jaki sposób dodać/odjąć te macierze...
Macierze jak widzicie to tablice. Tablice się tworzą gdy zrobimy obiekty tej klasy macierz. Mam tam macierz pierwsza, oraz macierz druga.

No i na tych macierzach, obiektach mam pracować. Nie zabardzo wiem jak to zrobić...
Korzystając z np: druga.tab???
Muszę zrobić funkcję, która będzie przyjmować chyba jako argumenty te 2 obiekty i w tej funkcji wykonań obliczenia. Ewentualnie mogę zrobić jakiegoś bezparametrowego voida i tam zmusić żeby się to zrobiło i wyświetliło...
Jednak nie wiem jak to zrobić. Czy funkcję DODAJmam stworzyć w klasie czy poza nią? Jak działać na tych obiektach? Muszę zrobić dodatkową tablicę, która będzie wynikiem dodawania/odejmowania tamtych macierzy?

Oto mój program i na podstawie niego chcę sie dowiedzieć jak mam to zrobić.
Jakby ktoś dopisał mi do tego mojego programu jak ma wyglądać to dodawania macierzy, czyli odnoszenie się do obiektów wiele by mi to rozjaśniło :)
http://pastebin.com/Gb8eeLqy

0

Ok, ostatnia prosta.
Chcę tę macierz wczytać z pliku. Nie wiem jak to zrobić. Udało mi się zrobić funkcję, która zapisuje macierz do pliku i działa znakomicie

void zapiszplik()
			{
				ofstream plik;
				plik.open("plik.txt");

				for(int i = 0 ; i < wys ; i++)
                {
                        
                        for (int j = 0; j < szer ; j++)
                                plik << tab[i][j] << " ";

						plik << endl;
                }
				plik.close();
			}
 

Natomiast wczytać z pliku nie potrafię :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1